blob: 64a73084551ca0498f2d6d41d51a716218ec10d5 [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 Madillb980c562018-11-27 11:34:27 -0500615Context::~Context() {}
Jamie Madill70ee0f62017-02-06 16:04:20 -0500616
Geoff Lang75359662018-04-11 01:42:27 -0400617void Context::setLabel(EGLLabelKHR label)
618{
619 mLabel = label;
620}
621
622EGLLabelKHR Context::getLabel() const
623{
624 return mLabel;
625}
626
Jamie Madill4928b7c2017-06-20 12:57:39 -0400627egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000628{
Jamie Madill61e16b42017-06-19 11:13:23 -0400629 mCurrentDisplay = display;
630
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000631 if (!mHasBeenCurrent)
632 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400633 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000634 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500635 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400636 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000637
Corentin Wallezc295e512017-01-27 17:47:50 -0500638 int width = 0;
639 int height = 0;
640 if (surface != nullptr)
641 {
642 width = surface->getWidth();
643 height = surface->getHeight();
644 }
645
646 mGLState.setViewportParams(0, 0, width, height);
647 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000648
649 mHasBeenCurrent = true;
650 }
651
Jamie Madill1b94d432015-08-07 13:23:23 -0400652 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700653 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400654 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400655
Jamie Madill4928b7c2017-06-20 12:57:39 -0400656 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500657
658 Framebuffer *newDefault = nullptr;
659 if (surface != nullptr)
660 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400661 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500662 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400663 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500664 }
665 else
666 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400667 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500668 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000669
Corentin Wallez37c39792015-08-20 14:19:46 -0400670 // Update default framebuffer, the binding of the previous default
671 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400672 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400673 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700674 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400675 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400676 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400677 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700678 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400679 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400680 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400681 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400682 }
Ian Ewell292f0052016-02-04 10:37:32 -0500683
Jamie Madill32643ce2018-10-19 11:38:03 -0400684 // Notify the renderer of a context switch.
685 // TODO(jmadill): Fix this error handling. http://anglebug.com/2491
686 (void)(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400687 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000688}
689
Jamie Madill4928b7c2017-06-20 12:57:39 -0400690egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400691{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400692 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400693
Geoff Langbf7b95d2018-05-01 16:48:21 -0400694 // Remove the default framebuffer
695 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500696 {
697 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400698 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500699 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400700
701 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500702 {
703 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400704 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500705 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400706
707 if (defaultFramebuffer)
708 {
709 defaultFramebuffer->onDestroy(this);
710 delete defaultFramebuffer;
711 }
712
Corentin Wallezc295e512017-01-27 17:47:50 -0500713 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
714
715 if (mCurrentSurface)
716 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400717 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500718 mCurrentSurface = nullptr;
719 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400720
721 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400722}
723
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000724GLuint Context::createBuffer()
725{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500726 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000727}
728
729GLuint Context::createProgram()
730{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500731 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000732}
733
Jiawei Shao385b3e02018-03-21 09:43:28 +0800734GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000735{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500736 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000737}
738
739GLuint Context::createTexture()
740{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500741 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000742}
743
744GLuint Context::createRenderbuffer()
745{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500746 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000747}
748
Jamie Madill13951342018-09-30 15:24:28 -0400749void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
750{
Jamie Madill526392d2018-11-16 09:35:14 -0500751 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(this, range, createdOut));
Jamie Madill13951342018-09-30 15:24:28 -0400752}
753
Brandon Jones59770802018-04-02 13:18:42 -0700754GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300755{
Jamie Madill13951342018-09-30 15:24:28 -0400756 GLuint created = 0;
757 tryGenPaths(range, &created);
758 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300759}
760
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000761// Returns an unused framebuffer name
762GLuint Context::createFramebuffer()
763{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500764 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000765}
766
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500767void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000768{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500769 for (int i = 0; i < n; i++)
770 {
771 GLuint handle = mFenceNVHandleAllocator.allocate();
772 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
773 fences[i] = handle;
774 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000775}
776
Yunchao Hea336b902017-08-02 16:05:21 +0800777GLuint Context::createProgramPipeline()
778{
779 return mState.mPipelines->createProgramPipeline();
780}
781
Jiawei Shao385b3e02018-03-21 09:43:28 +0800782GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800783{
784 UNIMPLEMENTED();
785 return 0u;
786}
787
James Darpinian4d9d4832018-03-13 12:43:28 -0700788void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000789{
James Darpinian4d9d4832018-03-13 12:43:28 -0700790 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
791 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000792 {
793 detachBuffer(buffer);
794 }
Jamie Madill893ab082014-05-16 16:56:10 -0400795
James Darpinian4d9d4832018-03-13 12:43:28 -0700796 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000797}
798
799void Context::deleteShader(GLuint shader)
800{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500801 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000802}
803
804void Context::deleteProgram(GLuint program)
805{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500806 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000807}
808
809void Context::deleteTexture(GLuint texture)
810{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500811 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000812 {
813 detachTexture(texture);
814 }
815
Jamie Madill6c1f6712017-02-14 19:08:04 -0500816 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000817}
818
819void Context::deleteRenderbuffer(GLuint renderbuffer)
820{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500821 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000822 {
823 detachRenderbuffer(renderbuffer);
824 }
Jamie Madill893ab082014-05-16 16:56:10 -0400825
Jamie Madill6c1f6712017-02-14 19:08:04 -0500826 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000827}
828
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400829void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400830{
831 // The spec specifies the underlying Fence object is not deleted until all current
832 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
833 // and since our API is currently designed for being called from a single thread, we can delete
834 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400835 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400836}
837
Yunchao Hea336b902017-08-02 16:05:21 +0800838void Context::deleteProgramPipeline(GLuint pipeline)
839{
840 if (mState.mPipelines->getProgramPipeline(pipeline))
841 {
842 detachProgramPipeline(pipeline);
843 }
844
845 mState.mPipelines->deleteObject(this, pipeline);
846}
847
Sami Väisänene45e53b2016-05-25 10:36:04 +0300848void Context::deletePaths(GLuint first, GLsizei range)
849{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500850 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300851}
852
Brandon Jones59770802018-04-02 13:18:42 -0700853bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300854{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500855 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300856 if (pathObj == nullptr)
857 return false;
858
859 return pathObj->hasPathData();
860}
861
Brandon Jones59770802018-04-02 13:18:42 -0700862bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300863{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500864 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300865}
866
Brandon Jones59770802018-04-02 13:18:42 -0700867void Context::pathCommands(GLuint path,
868 GLsizei numCommands,
869 const GLubyte *commands,
870 GLsizei numCoords,
871 GLenum coordType,
872 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300873{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500874 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300875
876 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
877}
878
Jamie Madill007530e2017-12-28 14:27:04 -0500879void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300880{
Jamie Madill007530e2017-12-28 14:27:04 -0500881 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300882
883 switch (pname)
884 {
885 case GL_PATH_STROKE_WIDTH_CHROMIUM:
886 pathObj->setStrokeWidth(value);
887 break;
888 case GL_PATH_END_CAPS_CHROMIUM:
889 pathObj->setEndCaps(static_cast<GLenum>(value));
890 break;
891 case GL_PATH_JOIN_STYLE_CHROMIUM:
892 pathObj->setJoinStyle(static_cast<GLenum>(value));
893 break;
894 case GL_PATH_MITER_LIMIT_CHROMIUM:
895 pathObj->setMiterLimit(value);
896 break;
897 case GL_PATH_STROKE_BOUND_CHROMIUM:
898 pathObj->setStrokeBound(value);
899 break;
900 default:
901 UNREACHABLE();
902 break;
903 }
904}
905
Jamie Madill007530e2017-12-28 14:27:04 -0500906void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300907{
Jamie Madill007530e2017-12-28 14:27:04 -0500908 // TODO(jmadill): Should use proper clamping/casting.
909 pathParameterf(path, pname, static_cast<GLfloat>(value));
910}
911
912void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
913{
914 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300915
916 switch (pname)
917 {
918 case GL_PATH_STROKE_WIDTH_CHROMIUM:
919 *value = pathObj->getStrokeWidth();
920 break;
921 case GL_PATH_END_CAPS_CHROMIUM:
922 *value = static_cast<GLfloat>(pathObj->getEndCaps());
923 break;
924 case GL_PATH_JOIN_STYLE_CHROMIUM:
925 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
926 break;
927 case GL_PATH_MITER_LIMIT_CHROMIUM:
928 *value = pathObj->getMiterLimit();
929 break;
930 case GL_PATH_STROKE_BOUND_CHROMIUM:
931 *value = pathObj->getStrokeBound();
932 break;
933 default:
934 UNREACHABLE();
935 break;
936 }
937}
938
Jamie Madill007530e2017-12-28 14:27:04 -0500939void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
940{
941 GLfloat val = 0.0f;
942 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
943 if (value)
944 *value = static_cast<GLint>(val);
945}
946
Brandon Jones59770802018-04-02 13:18:42 -0700947void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300948{
949 mGLState.setPathStencilFunc(func, ref, mask);
950}
951
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000952void Context::deleteFramebuffer(GLuint framebuffer)
953{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500954 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000955 {
956 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000957 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500958
Jamie Madill6c1f6712017-02-14 19:08:04 -0500959 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000960}
961
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500962void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000963{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500964 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000965 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500966 GLuint fence = fences[i];
967
968 FenceNV *fenceObject = nullptr;
969 if (mFenceNVMap.erase(fence, &fenceObject))
970 {
971 mFenceNVHandleAllocator.release(fence);
972 delete fenceObject;
973 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000974 }
975}
976
Geoff Lang70d0f492015-12-10 17:45:46 -0500977Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000978{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500979 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000980}
981
Geoff Lang70d0f492015-12-10 17:45:46 -0500982Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000983{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500984 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000985}
986
Jamie Madill70b5bb02017-08-28 13:32:37 -0400987Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400988{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400989 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400990}
991
Jamie Madill57a89722013-07-02 11:57:03 -0400992VertexArray *Context::getVertexArray(GLuint handle) const
993{
Jamie Madill96a483b2017-06-27 16:49:21 -0400994 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400995}
996
Jamie Madilldc356042013-07-19 16:36:57 -0400997Sampler *Context::getSampler(GLuint handle) const
998{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500999 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -04001000}
1001
Geoff Langc8058452014-02-03 12:04:11 -05001002TransformFeedback *Context::getTransformFeedback(GLuint handle) const
1003{
Jamie Madill96a483b2017-06-27 16:49:21 -04001004 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -05001005}
1006
Yunchao Hea336b902017-08-02 16:05:21 +08001007ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
1008{
1009 return mState.mPipelines->getProgramPipeline(handle);
1010}
1011
Geoff Lang75359662018-04-11 01:42:27 -04001012gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001013{
1014 switch (identifier)
1015 {
1016 case GL_BUFFER:
1017 return getBuffer(name);
1018 case GL_SHADER:
1019 return getShader(name);
1020 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04001021 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -05001022 case GL_VERTEX_ARRAY:
1023 return getVertexArray(name);
1024 case GL_QUERY:
1025 return getQuery(name);
1026 case GL_TRANSFORM_FEEDBACK:
1027 return getTransformFeedback(name);
1028 case GL_SAMPLER:
1029 return getSampler(name);
1030 case GL_TEXTURE:
1031 return getTexture(name);
1032 case GL_RENDERBUFFER:
1033 return getRenderbuffer(name);
1034 case GL_FRAMEBUFFER:
1035 return getFramebuffer(name);
1036 default:
1037 UNREACHABLE();
1038 return nullptr;
1039 }
1040}
1041
Geoff Lang75359662018-04-11 01:42:27 -04001042gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001043{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001044 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001045}
1046
Martin Radev9d901792016-07-15 15:58:58 +03001047void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1048{
Geoff Lang75359662018-04-11 01:42:27 -04001049 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001050 ASSERT(object != nullptr);
1051
1052 std::string labelName = GetObjectLabelFromPointer(length, label);
1053 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001054
1055 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1056 // specified object is active until we do this.
1057 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001058}
1059
1060void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1061{
Geoff Lang75359662018-04-11 01:42:27 -04001062 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001063 ASSERT(object != nullptr);
1064
1065 std::string labelName = GetObjectLabelFromPointer(length, label);
1066 object->setLabel(labelName);
1067}
1068
1069void Context::getObjectLabel(GLenum identifier,
1070 GLuint name,
1071 GLsizei bufSize,
1072 GLsizei *length,
1073 GLchar *label) const
1074{
Geoff Lang75359662018-04-11 01:42:27 -04001075 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001076 ASSERT(object != nullptr);
1077
1078 const std::string &objectLabel = object->getLabel();
1079 GetObjectLabelBase(objectLabel, bufSize, length, label);
1080}
1081
1082void Context::getObjectPtrLabel(const void *ptr,
1083 GLsizei bufSize,
1084 GLsizei *length,
1085 GLchar *label) const
1086{
Geoff Lang75359662018-04-11 01:42:27 -04001087 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001088 ASSERT(object != nullptr);
1089
1090 const std::string &objectLabel = object->getLabel();
1091 GetObjectLabelBase(objectLabel, bufSize, length, label);
1092}
1093
Jamie Madilldc356042013-07-19 16:36:57 -04001094bool Context::isSampler(GLuint samplerName) const
1095{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001096 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001097}
1098
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001099void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001100{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001101 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001102
Jamie Madilldedd7b92014-11-05 16:30:36 -05001103 if (handle == 0)
1104 {
1105 texture = mZeroTextures[target].get();
1106 }
1107 else
1108 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001109 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001110 }
1111
1112 ASSERT(texture);
Jamie Madill14246812018-10-03 17:51:16 -04001113 ANGLE_CONTEXT_TRY(mGLState.setSamplerTexture(this, target, texture));
Jamie Madilld84b6732018-09-06 15:54:35 -04001114 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001115}
1116
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001117void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001118{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001119 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1120 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001121 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001122 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001123}
1124
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001125void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001126{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001127 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1128 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001129 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001130 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001131 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001132}
1133
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001134void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001135{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001136 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001137 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001138 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001139 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001140}
1141
Shao80957d92017-02-20 21:25:59 +08001142void Context::bindVertexBuffer(GLuint bindingIndex,
1143 GLuint bufferHandle,
1144 GLintptr offset,
1145 GLsizei stride)
1146{
1147 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001148 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001149 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001150}
1151
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001152void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001153{
Geoff Lang76b10c92014-09-05 16:28:14 -04001154 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001155 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001156 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001157 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001158 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001159}
1160
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001161void Context::bindImageTexture(GLuint unit,
1162 GLuint texture,
1163 GLint level,
1164 GLboolean layered,
1165 GLint layer,
1166 GLenum access,
1167 GLenum format)
1168{
1169 Texture *tex = mState.mTextures->getTexture(texture);
1170 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1171}
1172
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001173void Context::useProgram(GLuint program)
1174{
Jamie Madille3bb6b72018-10-03 17:51:15 -04001175 ANGLE_CONTEXT_TRY(mGLState.setProgram(this, getProgramResolveLink(program)));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001176 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001177}
1178
Jiajia Qin5451d532017-11-16 17:16:34 +08001179void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1180{
1181 UNIMPLEMENTED();
1182}
1183
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001184void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001185{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001186 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001187 TransformFeedback *transformFeedback =
1188 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001189 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Jamie Madilld84b6732018-09-06 15:54:35 -04001190 mStateCache.onTransformFeedbackChange(this);
Geoff Langc8058452014-02-03 12:04:11 -05001191}
1192
Yunchao Hea336b902017-08-02 16:05:21 +08001193void Context::bindProgramPipeline(GLuint pipelineHandle)
1194{
1195 ProgramPipeline *pipeline =
1196 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1197 mGLState.setProgramPipelineBinding(this, pipeline);
1198}
1199
Corentin Wallezad3ae902018-03-09 13:40:42 -05001200void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001201{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001202 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001203 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001204
Geoff Lang5aad9672014-09-08 11:10:42 -04001205 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001206 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001207
1208 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001209 mGLState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001210 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001211}
1212
Corentin Wallezad3ae902018-03-09 13:40:42 -05001213void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001214{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001215 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001216 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001217
Jamie Madill5188a272018-07-25 10:53:56 -04001218 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001219
Geoff Lang5aad9672014-09-08 11:10:42 -04001220 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001221 mGLState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001222 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001223}
1224
Corentin Wallezad3ae902018-03-09 13:40:42 -05001225void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001226{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001227 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001228
1229 Query *queryObject = getQuery(id, true, target);
1230 ASSERT(queryObject);
1231
Jamie Madill5188a272018-07-25 10:53:56 -04001232 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001233}
1234
Corentin Wallezad3ae902018-03-09 13:40:42 -05001235void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001236{
1237 switch (pname)
1238 {
1239 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001240 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001241 break;
1242 case GL_QUERY_COUNTER_BITS_EXT:
1243 switch (target)
1244 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001245 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001246 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1247 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001248 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001249 params[0] = getExtensions().queryCounterBitsTimestamp;
1250 break;
1251 default:
1252 UNREACHABLE();
1253 params[0] = 0;
1254 break;
1255 }
1256 break;
1257 default:
1258 UNREACHABLE();
1259 return;
1260 }
1261}
1262
Corentin Wallezad3ae902018-03-09 13:40:42 -05001263void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001264 GLenum pname,
1265 GLsizei bufSize,
1266 GLsizei *length,
1267 GLint *params)
1268{
1269 getQueryiv(target, pname, params);
1270}
1271
Geoff Lang2186c382016-10-14 10:54:54 -04001272void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001273{
Jamie Madill5188a272018-07-25 10:53:56 -04001274 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001275}
1276
Brandon Jones59770802018-04-02 13:18:42 -07001277void Context::getQueryObjectivRobust(GLuint id,
1278 GLenum pname,
1279 GLsizei bufSize,
1280 GLsizei *length,
1281 GLint *params)
1282{
1283 getQueryObjectiv(id, pname, params);
1284}
1285
Geoff Lang2186c382016-10-14 10:54:54 -04001286void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001287{
Jamie Madill5188a272018-07-25 10:53:56 -04001288 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001289}
1290
Brandon Jones59770802018-04-02 13:18:42 -07001291void Context::getQueryObjectuivRobust(GLuint id,
1292 GLenum pname,
1293 GLsizei bufSize,
1294 GLsizei *length,
1295 GLuint *params)
1296{
1297 getQueryObjectuiv(id, pname, params);
1298}
1299
Geoff Lang2186c382016-10-14 10:54:54 -04001300void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001301{
Jamie Madill5188a272018-07-25 10:53:56 -04001302 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001303}
1304
Brandon Jones59770802018-04-02 13:18:42 -07001305void Context::getQueryObjecti64vRobust(GLuint id,
1306 GLenum pname,
1307 GLsizei bufSize,
1308 GLsizei *length,
1309 GLint64 *params)
1310{
1311 getQueryObjecti64v(id, pname, params);
1312}
1313
Geoff Lang2186c382016-10-14 10:54:54 -04001314void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001315{
Jamie Madill5188a272018-07-25 10:53:56 -04001316 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001317}
1318
Brandon Jones59770802018-04-02 13:18:42 -07001319void Context::getQueryObjectui64vRobust(GLuint id,
1320 GLenum pname,
1321 GLsizei bufSize,
1322 GLsizei *length,
1323 GLuint64 *params)
1324{
1325 getQueryObjectui64v(id, pname, params);
1326}
1327
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001328Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001329{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001330 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001331}
1332
Jamie Madill2f348d22017-06-05 10:50:59 -04001333FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001334{
Jamie Madill96a483b2017-06-27 16:49:21 -04001335 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001336}
1337
Corentin Wallezad3ae902018-03-09 13:40:42 -05001338Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001339{
Jamie Madill96a483b2017-06-27 16:49:21 -04001340 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001341 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001342 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001343 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001344
1345 Query *query = mQueryMap.query(handle);
1346 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001347 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001348 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001349 query = new Query(mImplementation->createQuery(type), handle);
1350 query->addRef();
1351 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001352 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001353 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001354}
1355
Geoff Lang70d0f492015-12-10 17:45:46 -05001356Query *Context::getQuery(GLuint handle) const
1357{
Jamie Madill96a483b2017-06-27 16:49:21 -04001358 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001359}
1360
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001361Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001362{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001363 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1364 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001365}
1366
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001367Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001368{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001369 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001370}
1371
Geoff Lang492a7e42014-11-05 13:27:06 -05001372Compiler *Context::getCompiler() const
1373{
Jamie Madill2f348d22017-06-05 10:50:59 -04001374 if (mCompiler.get() == nullptr)
1375 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001376 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001377 }
1378 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001379}
1380
Jamie Madillc1d770e2017-04-13 17:31:24 -04001381void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001382{
1383 switch (pname)
1384 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001385 case GL_SHADER_COMPILER:
1386 *params = GL_TRUE;
1387 break;
1388 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1389 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1390 break;
1391 default:
1392 mGLState.getBooleanv(pname, params);
1393 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001394 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001395}
1396
Jamie Madillc1d770e2017-04-13 17:31:24 -04001397void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001398{
Shannon Woods53a94a82014-06-24 15:20:36 -04001399 // Queries about context capabilities and maximums are answered by Context.
1400 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001401 switch (pname)
1402 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001403 case GL_ALIASED_LINE_WIDTH_RANGE:
1404 params[0] = mCaps.minAliasedLineWidth;
1405 params[1] = mCaps.maxAliasedLineWidth;
1406 break;
1407 case GL_ALIASED_POINT_SIZE_RANGE:
1408 params[0] = mCaps.minAliasedPointSize;
1409 params[1] = mCaps.maxAliasedPointSize;
1410 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001411 case GL_SMOOTH_POINT_SIZE_RANGE:
1412 params[0] = mCaps.minSmoothPointSize;
1413 params[1] = mCaps.maxSmoothPointSize;
1414 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001415 case GL_SMOOTH_LINE_WIDTH_RANGE:
1416 params[0] = mCaps.minSmoothLineWidth;
1417 params[1] = mCaps.maxSmoothLineWidth;
1418 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001419 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1420 ASSERT(mExtensions.textureFilterAnisotropic);
1421 *params = mExtensions.maxTextureAnisotropy;
1422 break;
1423 case GL_MAX_TEXTURE_LOD_BIAS:
1424 *params = mCaps.maxLODBias;
1425 break;
1426
1427 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1428 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1429 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001430 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1431 // GLES1 constants for modelview/projection matrix.
1432 if (getClientVersion() < Version(2, 0))
1433 {
1434 mGLState.getFloatv(pname, params);
1435 }
1436 else
1437 {
1438 ASSERT(mExtensions.pathRendering);
1439 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1440 memcpy(params, m, 16 * sizeof(GLfloat));
1441 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001442 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001443 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001444
Jamie Madill231c7f52017-04-26 13:45:37 -04001445 default:
1446 mGLState.getFloatv(pname, params);
1447 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001448 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001449}
1450
Jamie Madillc1d770e2017-04-13 17:31:24 -04001451void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001452{
Shannon Woods53a94a82014-06-24 15:20:36 -04001453 // Queries about context capabilities and maximums are answered by Context.
1454 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001455
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001456 switch (pname)
1457 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001458 case GL_MAX_VERTEX_ATTRIBS:
1459 *params = mCaps.maxVertexAttributes;
1460 break;
1461 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1462 *params = mCaps.maxVertexUniformVectors;
1463 break;
1464 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001465 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001466 break;
1467 case GL_MAX_VARYING_VECTORS:
1468 *params = mCaps.maxVaryingVectors;
1469 break;
1470 case GL_MAX_VARYING_COMPONENTS:
1471 *params = mCaps.maxVertexOutputComponents;
1472 break;
1473 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1474 *params = mCaps.maxCombinedTextureImageUnits;
1475 break;
1476 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001477 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001478 break;
1479 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001480 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001481 break;
1482 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1483 *params = mCaps.maxFragmentUniformVectors;
1484 break;
1485 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001486 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001487 break;
1488 case GL_MAX_RENDERBUFFER_SIZE:
1489 *params = mCaps.maxRenderbufferSize;
1490 break;
1491 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1492 *params = mCaps.maxColorAttachments;
1493 break;
1494 case GL_MAX_DRAW_BUFFERS_EXT:
1495 *params = mCaps.maxDrawBuffers;
1496 break;
1497 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1498 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1499 case GL_SUBPIXEL_BITS:
1500 *params = 4;
1501 break;
1502 case GL_MAX_TEXTURE_SIZE:
1503 *params = mCaps.max2DTextureSize;
1504 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001505 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1506 *params = mCaps.maxRectangleTextureSize;
1507 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001508 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1509 *params = mCaps.maxCubeMapTextureSize;
1510 break;
1511 case GL_MAX_3D_TEXTURE_SIZE:
1512 *params = mCaps.max3DTextureSize;
1513 break;
1514 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1515 *params = mCaps.maxArrayTextureLayers;
1516 break;
1517 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1518 *params = mCaps.uniformBufferOffsetAlignment;
1519 break;
1520 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1521 *params = mCaps.maxUniformBufferBindings;
1522 break;
1523 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001524 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001525 break;
1526 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001527 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001528 break;
1529 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1530 *params = mCaps.maxCombinedTextureImageUnits;
1531 break;
1532 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1533 *params = mCaps.maxVertexOutputComponents;
1534 break;
1535 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1536 *params = mCaps.maxFragmentInputComponents;
1537 break;
1538 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1539 *params = mCaps.minProgramTexelOffset;
1540 break;
1541 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1542 *params = mCaps.maxProgramTexelOffset;
1543 break;
1544 case GL_MAJOR_VERSION:
1545 *params = getClientVersion().major;
1546 break;
1547 case GL_MINOR_VERSION:
1548 *params = getClientVersion().minor;
1549 break;
1550 case GL_MAX_ELEMENTS_INDICES:
1551 *params = mCaps.maxElementsIndices;
1552 break;
1553 case GL_MAX_ELEMENTS_VERTICES:
1554 *params = mCaps.maxElementsVertices;
1555 break;
1556 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1557 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1558 break;
1559 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1560 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1561 break;
1562 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1563 *params = mCaps.maxTransformFeedbackSeparateComponents;
1564 break;
1565 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1566 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1567 break;
1568 case GL_MAX_SAMPLES_ANGLE:
1569 *params = mCaps.maxSamples;
1570 break;
1571 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001572 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001573 params[0] = mCaps.maxViewportWidth;
1574 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001575 }
1576 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001577 case GL_COMPRESSED_TEXTURE_FORMATS:
1578 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1579 params);
1580 break;
1581 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1582 *params = mResetStrategy;
1583 break;
1584 case GL_NUM_SHADER_BINARY_FORMATS:
1585 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1586 break;
1587 case GL_SHADER_BINARY_FORMATS:
1588 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1589 break;
1590 case GL_NUM_PROGRAM_BINARY_FORMATS:
1591 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1592 break;
1593 case GL_PROGRAM_BINARY_FORMATS:
1594 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1595 break;
1596 case GL_NUM_EXTENSIONS:
1597 *params = static_cast<GLint>(mExtensionStrings.size());
1598 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001599
Geoff Lang38f24ee2018-10-01 13:04:59 -04001600 // GL_ANGLE_request_extension
1601 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1602 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1603 break;
1604
Jamie Madill231c7f52017-04-26 13:45:37 -04001605 // GL_KHR_debug
1606 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1607 *params = mExtensions.maxDebugMessageLength;
1608 break;
1609 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1610 *params = mExtensions.maxDebugLoggedMessages;
1611 break;
1612 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1613 *params = mExtensions.maxDebugGroupStackDepth;
1614 break;
1615 case GL_MAX_LABEL_LENGTH:
1616 *params = mExtensions.maxLabelLength;
1617 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001618
Martin Radeve5285d22017-07-14 16:23:53 +03001619 // GL_ANGLE_multiview
1620 case GL_MAX_VIEWS_ANGLE:
1621 *params = mExtensions.maxViews;
1622 break;
1623
Jamie Madill231c7f52017-04-26 13:45:37 -04001624 // GL_EXT_disjoint_timer_query
1625 case GL_GPU_DISJOINT_EXT:
1626 *params = mImplementation->getGPUDisjoint();
1627 break;
1628 case GL_MAX_FRAMEBUFFER_WIDTH:
1629 *params = mCaps.maxFramebufferWidth;
1630 break;
1631 case GL_MAX_FRAMEBUFFER_HEIGHT:
1632 *params = mCaps.maxFramebufferHeight;
1633 break;
1634 case GL_MAX_FRAMEBUFFER_SAMPLES:
1635 *params = mCaps.maxFramebufferSamples;
1636 break;
1637 case GL_MAX_SAMPLE_MASK_WORDS:
1638 *params = mCaps.maxSampleMaskWords;
1639 break;
1640 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1641 *params = mCaps.maxColorTextureSamples;
1642 break;
1643 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1644 *params = mCaps.maxDepthTextureSamples;
1645 break;
1646 case GL_MAX_INTEGER_SAMPLES:
1647 *params = mCaps.maxIntegerSamples;
1648 break;
1649 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1650 *params = mCaps.maxVertexAttribRelativeOffset;
1651 break;
1652 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1653 *params = mCaps.maxVertexAttribBindings;
1654 break;
1655 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1656 *params = mCaps.maxVertexAttribStride;
1657 break;
1658 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001659 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001660 break;
1661 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001662 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001663 break;
1664 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001665 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001666 break;
1667 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001668 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001669 break;
1670 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001671 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001672 break;
1673 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001674 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001675 break;
1676 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001677 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001678 break;
1679 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001680 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001681 break;
1682 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1683 *params = mCaps.minProgramTextureGatherOffset;
1684 break;
1685 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1686 *params = mCaps.maxProgramTextureGatherOffset;
1687 break;
1688 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1689 *params = mCaps.maxComputeWorkGroupInvocations;
1690 break;
1691 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001692 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001693 break;
1694 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001695 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001696 break;
1697 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1698 *params = mCaps.maxComputeSharedMemorySize;
1699 break;
1700 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001701 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001702 break;
1703 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001704 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001705 break;
1706 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001707 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001708 break;
1709 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001710 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001711 break;
1712 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001713 *params =
1714 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001715 break;
1716 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001717 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001718 break;
1719 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1720 *params = mCaps.maxCombinedShaderOutputResources;
1721 break;
1722 case GL_MAX_UNIFORM_LOCATIONS:
1723 *params = mCaps.maxUniformLocations;
1724 break;
1725 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1726 *params = mCaps.maxAtomicCounterBufferBindings;
1727 break;
1728 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1729 *params = mCaps.maxAtomicCounterBufferSize;
1730 break;
1731 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1732 *params = mCaps.maxCombinedAtomicCounterBuffers;
1733 break;
1734 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1735 *params = mCaps.maxCombinedAtomicCounters;
1736 break;
1737 case GL_MAX_IMAGE_UNITS:
1738 *params = mCaps.maxImageUnits;
1739 break;
1740 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1741 *params = mCaps.maxCombinedImageUniforms;
1742 break;
1743 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1744 *params = mCaps.maxShaderStorageBufferBindings;
1745 break;
1746 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1747 *params = mCaps.maxCombinedShaderStorageBlocks;
1748 break;
1749 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1750 *params = mCaps.shaderStorageBufferOffsetAlignment;
1751 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001752
1753 // GL_EXT_geometry_shader
1754 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1755 *params = mCaps.maxFramebufferLayers;
1756 break;
1757 case GL_LAYER_PROVOKING_VERTEX_EXT:
1758 *params = mCaps.layerProvokingVertex;
1759 break;
1760 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001761 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001762 break;
1763 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001764 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001765 break;
1766 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001767 *params =
1768 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001769 break;
1770 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1771 *params = mCaps.maxGeometryInputComponents;
1772 break;
1773 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1774 *params = mCaps.maxGeometryOutputComponents;
1775 break;
1776 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1777 *params = mCaps.maxGeometryOutputVertices;
1778 break;
1779 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1780 *params = mCaps.maxGeometryTotalOutputComponents;
1781 break;
1782 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1783 *params = mCaps.maxGeometryShaderInvocations;
1784 break;
1785 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001786 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001787 break;
1788 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001789 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001790 break;
1791 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001792 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001793 break;
1794 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001795 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001796 break;
1797 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001798 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001799 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001800 // GLES1 emulation: Caps queries
1801 case GL_MAX_TEXTURE_UNITS:
1802 *params = mCaps.maxMultitextureUnits;
1803 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001804 case GL_MAX_MODELVIEW_STACK_DEPTH:
1805 *params = mCaps.maxModelviewMatrixStackDepth;
1806 break;
1807 case GL_MAX_PROJECTION_STACK_DEPTH:
1808 *params = mCaps.maxProjectionMatrixStackDepth;
1809 break;
1810 case GL_MAX_TEXTURE_STACK_DEPTH:
1811 *params = mCaps.maxTextureMatrixStackDepth;
1812 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001813 case GL_MAX_LIGHTS:
1814 *params = mCaps.maxLights;
1815 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001816 case GL_MAX_CLIP_PLANES:
1817 *params = mCaps.maxClipPlanes;
1818 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001819 // GLES1 emulation: Vertex attribute queries
1820 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1821 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1822 case GL_COLOR_ARRAY_BUFFER_BINDING:
1823 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1824 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1825 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1826 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1827 break;
1828 case GL_VERTEX_ARRAY_STRIDE:
1829 case GL_NORMAL_ARRAY_STRIDE:
1830 case GL_COLOR_ARRAY_STRIDE:
1831 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1832 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1833 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1834 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1835 break;
1836 case GL_VERTEX_ARRAY_SIZE:
1837 case GL_COLOR_ARRAY_SIZE:
1838 case GL_TEXTURE_COORD_ARRAY_SIZE:
1839 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1840 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1841 break;
1842 case GL_VERTEX_ARRAY_TYPE:
1843 case GL_COLOR_ARRAY_TYPE:
1844 case GL_NORMAL_ARRAY_TYPE:
1845 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1846 case GL_TEXTURE_COORD_ARRAY_TYPE:
1847 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1848 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1849 break;
1850
jchen1082af6202018-06-22 10:59:52 +08001851 // GL_KHR_parallel_shader_compile
1852 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1853 *params = mGLState.getMaxShaderCompilerThreads();
1854 break;
1855
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001856 // GL_EXT_blend_func_extended
1857 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
1858 *params = mExtensions.maxDualSourceDrawBuffers;
1859 break;
1860
Jamie Madill231c7f52017-04-26 13:45:37 -04001861 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001862 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001863 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001864 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001865}
1866
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001867void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001868{
Shannon Woods53a94a82014-06-24 15:20:36 -04001869 // Queries about context capabilities and maximums are answered by Context.
1870 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001871 switch (pname)
1872 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001873 case GL_MAX_ELEMENT_INDEX:
1874 *params = mCaps.maxElementIndex;
1875 break;
1876 case GL_MAX_UNIFORM_BLOCK_SIZE:
1877 *params = mCaps.maxUniformBlockSize;
1878 break;
1879 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001880 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001881 break;
1882 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001883 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001884 break;
1885 case GL_MAX_SERVER_WAIT_TIMEOUT:
1886 *params = mCaps.maxServerWaitTimeout;
1887 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001888
Jamie Madill231c7f52017-04-26 13:45:37 -04001889 // GL_EXT_disjoint_timer_query
1890 case GL_TIMESTAMP_EXT:
1891 *params = mImplementation->getTimestamp();
1892 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001893
Jamie Madill231c7f52017-04-26 13:45:37 -04001894 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1895 *params = mCaps.maxShaderStorageBlockSize;
1896 break;
1897 default:
1898 UNREACHABLE();
1899 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001900 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001901}
1902
Geoff Lang70d0f492015-12-10 17:45:46 -05001903void Context::getPointerv(GLenum pname, void **params) const
1904{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001905 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001906}
1907
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001908void Context::getPointervRobustANGLERobust(GLenum pname,
1909 GLsizei bufSize,
1910 GLsizei *length,
1911 void **params)
1912{
1913 UNIMPLEMENTED();
1914}
1915
Martin Radev66fb8202016-07-28 11:45:20 +03001916void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001917{
Shannon Woods53a94a82014-06-24 15:20:36 -04001918 // Queries about context capabilities and maximums are answered by Context.
1919 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001920
1921 GLenum nativeType;
1922 unsigned int numParams;
1923 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1924 ASSERT(queryStatus);
1925
1926 if (nativeType == GL_INT)
1927 {
1928 switch (target)
1929 {
1930 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1931 ASSERT(index < 3u);
1932 *data = mCaps.maxComputeWorkGroupCount[index];
1933 break;
1934 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1935 ASSERT(index < 3u);
1936 *data = mCaps.maxComputeWorkGroupSize[index];
1937 break;
1938 default:
1939 mGLState.getIntegeri_v(target, index, data);
1940 }
1941 }
1942 else
1943 {
1944 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1945 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001946}
1947
Brandon Jones59770802018-04-02 13:18:42 -07001948void Context::getIntegeri_vRobust(GLenum target,
1949 GLuint index,
1950 GLsizei bufSize,
1951 GLsizei *length,
1952 GLint *data)
1953{
1954 getIntegeri_v(target, index, data);
1955}
1956
Martin Radev66fb8202016-07-28 11:45:20 +03001957void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001958{
Shannon Woods53a94a82014-06-24 15:20:36 -04001959 // Queries about context capabilities and maximums are answered by Context.
1960 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001961
1962 GLenum nativeType;
1963 unsigned int numParams;
1964 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1965 ASSERT(queryStatus);
1966
1967 if (nativeType == GL_INT_64_ANGLEX)
1968 {
1969 mGLState.getInteger64i_v(target, index, data);
1970 }
1971 else
1972 {
1973 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1974 }
1975}
1976
Brandon Jones59770802018-04-02 13:18:42 -07001977void Context::getInteger64i_vRobust(GLenum target,
1978 GLuint index,
1979 GLsizei bufSize,
1980 GLsizei *length,
1981 GLint64 *data)
1982{
1983 getInteger64i_v(target, index, data);
1984}
1985
Martin Radev66fb8202016-07-28 11:45:20 +03001986void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1987{
1988 // Queries about context capabilities and maximums are answered by Context.
1989 // Queries about current GL state values are answered by State.
1990
1991 GLenum nativeType;
1992 unsigned int numParams;
1993 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1994 ASSERT(queryStatus);
1995
1996 if (nativeType == GL_BOOL)
1997 {
1998 mGLState.getBooleani_v(target, index, data);
1999 }
2000 else
2001 {
2002 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
2003 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04002004}
2005
Brandon Jones59770802018-04-02 13:18:42 -07002006void Context::getBooleani_vRobust(GLenum target,
2007 GLuint index,
2008 GLsizei bufSize,
2009 GLsizei *length,
2010 GLboolean *data)
2011{
2012 getBooleani_v(target, index, data);
2013}
2014
Corentin Wallez336129f2017-10-17 15:55:40 -04002015void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002016{
2017 Buffer *buffer = mGLState.getTargetBuffer(target);
2018 QueryBufferParameteriv(buffer, pname, params);
2019}
2020
Brandon Jones59770802018-04-02 13:18:42 -07002021void Context::getBufferParameterivRobust(BufferBinding target,
2022 GLenum pname,
2023 GLsizei bufSize,
2024 GLsizei *length,
2025 GLint *params)
2026{
2027 getBufferParameteriv(target, pname, params);
2028}
2029
He Yunchao010e4db2017-03-03 14:22:06 +08002030void Context::getFramebufferAttachmentParameteriv(GLenum target,
2031 GLenum attachment,
2032 GLenum pname,
2033 GLint *params)
2034{
2035 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002036 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002037}
2038
Brandon Jones59770802018-04-02 13:18:42 -07002039void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2040 GLenum attachment,
2041 GLenum pname,
2042 GLsizei bufSize,
2043 GLsizei *length,
2044 GLint *params)
2045{
2046 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2047}
2048
He Yunchao010e4db2017-03-03 14:22:06 +08002049void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2050{
2051 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2052 QueryRenderbufferiv(this, renderbuffer, pname, params);
2053}
2054
Brandon Jones59770802018-04-02 13:18:42 -07002055void Context::getRenderbufferParameterivRobust(GLenum target,
2056 GLenum pname,
2057 GLsizei bufSize,
2058 GLsizei *length,
2059 GLint *params)
2060{
2061 getRenderbufferParameteriv(target, pname, params);
2062}
2063
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002064void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002065{
Till Rathmannb8543632018-10-02 19:46:14 +02002066 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002067 QueryTexParameterfv(texture, pname, params);
2068}
2069
Brandon Jones59770802018-04-02 13:18:42 -07002070void Context::getTexParameterfvRobust(TextureType target,
2071 GLenum pname,
2072 GLsizei bufSize,
2073 GLsizei *length,
2074 GLfloat *params)
2075{
2076 getTexParameterfv(target, pname, params);
2077}
2078
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002079void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002080{
Till Rathmannb8543632018-10-02 19:46:14 +02002081 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002082 QueryTexParameteriv(texture, pname, params);
2083}
Jiajia Qin5451d532017-11-16 17:16:34 +08002084
Till Rathmannb8543632018-10-02 19:46:14 +02002085void Context::getTexParameterIiv(TextureType target, GLenum pname, GLint *params)
2086{
2087 const Texture *const texture = getTargetTexture(target);
2088 QueryTexParameterIiv(texture, pname, params);
2089}
2090
2091void Context::getTexParameterIuiv(TextureType target, GLenum pname, GLuint *params)
2092{
2093 const Texture *const texture = getTargetTexture(target);
2094 QueryTexParameterIuiv(texture, pname, params);
2095}
2096
Brandon Jones59770802018-04-02 13:18:42 -07002097void Context::getTexParameterivRobust(TextureType target,
2098 GLenum pname,
2099 GLsizei bufSize,
2100 GLsizei *length,
2101 GLint *params)
2102{
2103 getTexParameteriv(target, pname, params);
2104}
2105
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002106void Context::getTexParameterIivRobust(TextureType target,
2107 GLenum pname,
2108 GLsizei bufSize,
2109 GLsizei *length,
2110 GLint *params)
2111{
2112 UNIMPLEMENTED();
2113}
2114
2115void Context::getTexParameterIuivRobust(TextureType target,
2116 GLenum pname,
2117 GLsizei bufSize,
2118 GLsizei *length,
2119 GLuint *params)
2120{
2121 UNIMPLEMENTED();
2122}
2123
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002124void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002125{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002126 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002127 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002128}
2129
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002130void Context::getTexLevelParameterivRobust(TextureTarget target,
2131 GLint level,
2132 GLenum pname,
2133 GLsizei bufSize,
2134 GLsizei *length,
2135 GLint *params)
2136{
2137 UNIMPLEMENTED();
2138}
2139
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002140void Context::getTexLevelParameterfv(TextureTarget target,
2141 GLint level,
2142 GLenum pname,
2143 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002144{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002145 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002146 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002147}
2148
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002149void Context::getTexLevelParameterfvRobust(TextureTarget target,
2150 GLint level,
2151 GLenum pname,
2152 GLsizei bufSize,
2153 GLsizei *length,
2154 GLfloat *params)
2155{
2156 UNIMPLEMENTED();
2157}
2158
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002159void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002160{
Till Rathmannb8543632018-10-02 19:46:14 +02002161 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002162 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002163 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002164}
2165
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002166void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002167{
Till Rathmannb8543632018-10-02 19:46:14 +02002168 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002169 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002170 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002171}
2172
Brandon Jones59770802018-04-02 13:18:42 -07002173void Context::texParameterfvRobust(TextureType target,
2174 GLenum pname,
2175 GLsizei bufSize,
2176 const GLfloat *params)
2177{
2178 texParameterfv(target, pname, params);
2179}
2180
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002181void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002182{
Till Rathmannb8543632018-10-02 19:46:14 +02002183 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002184 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002185 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002186}
2187
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002188void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002189{
Till Rathmannb8543632018-10-02 19:46:14 +02002190 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002191 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002192 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002193}
2194
Till Rathmannb8543632018-10-02 19:46:14 +02002195void Context::texParameterIiv(TextureType target, GLenum pname, const GLint *params)
2196{
2197 Texture *const texture = getTargetTexture(target);
2198 SetTexParameterIiv(this, texture, pname, params);
2199 onTextureChange(texture);
2200}
2201
2202void Context::texParameterIuiv(TextureType target, GLenum pname, const GLuint *params)
2203{
2204 Texture *const texture = getTargetTexture(target);
2205 SetTexParameterIuiv(this, texture, pname, params);
2206 onTextureChange(texture);
2207}
2208
Brandon Jones59770802018-04-02 13:18:42 -07002209void Context::texParameterivRobust(TextureType target,
2210 GLenum pname,
2211 GLsizei bufSize,
2212 const GLint *params)
2213{
2214 texParameteriv(target, pname, params);
2215}
2216
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002217void Context::texParameterIivRobust(TextureType target,
2218 GLenum pname,
2219 GLsizei bufSize,
2220 const GLint *params)
2221{
2222 UNIMPLEMENTED();
2223}
2224
2225void Context::texParameterIuivRobust(TextureType target,
2226 GLenum pname,
2227 GLsizei bufSize,
2228 const GLuint *params)
2229{
2230 UNIMPLEMENTED();
2231}
2232
Jamie Madill493f9572018-05-24 19:52:15 -04002233void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002234{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002235 // No-op if count draws no primitives for given mode
2236 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002237 {
2238 return;
2239 }
2240
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002241 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002242 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002243 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002244}
2245
Jamie Madill493f9572018-05-24 19:52:15 -04002246void Context::drawArraysInstanced(PrimitiveMode mode,
2247 GLint first,
2248 GLsizei count,
2249 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002250{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002251 // No-op if count draws no primitives for given mode
2252 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002253 {
2254 return;
2255 }
2256
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002257 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002258 ANGLE_CONTEXT_TRY(
2259 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002260 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2261 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002262}
2263
Jamie Madill493f9572018-05-24 19:52:15 -04002264void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002265{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002266 // No-op if count draws no primitives for given mode
2267 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002268 {
2269 return;
2270 }
2271
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002272 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002273 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002274}
2275
Jamie Madill493f9572018-05-24 19:52:15 -04002276void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002277 GLsizei count,
2278 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002279 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002280 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002281{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002282 // No-op if count draws no primitives for given mode
2283 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002284 {
2285 return;
2286 }
2287
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002288 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002289 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002290 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002291}
2292
Jamie Madill493f9572018-05-24 19:52:15 -04002293void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002294 GLuint start,
2295 GLuint end,
2296 GLsizei count,
2297 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002298 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002299{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002300 // No-op if count draws no primitives for given mode
2301 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002302 {
2303 return;
2304 }
2305
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002306 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002307 ANGLE_CONTEXT_TRY(
2308 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002309}
2310
Jamie Madill493f9572018-05-24 19:52:15 -04002311void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002312{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002313 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002314 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002315}
2316
Jamie Madill493f9572018-05-24 19:52:15 -04002317void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002318{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002319 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002320 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002321}
2322
Jamie Madill675fe712016-12-19 13:07:54 -05002323void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002324{
Jamie Madillafa02a22017-11-23 12:57:38 -05002325 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002326}
2327
Jamie Madill675fe712016-12-19 13:07:54 -05002328void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002329{
Jamie Madillafa02a22017-11-23 12:57:38 -05002330 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002331}
2332
Austin Kinross6ee1e782015-05-29 17:05:37 -07002333void Context::insertEventMarker(GLsizei length, const char *marker)
2334{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002335 ASSERT(mImplementation);
2336 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002337}
2338
2339void Context::pushGroupMarker(GLsizei length, const char *marker)
2340{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002341 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002342
2343 if (marker == nullptr)
2344 {
2345 // From the EXT_debug_marker spec,
2346 // "If <marker> is null then an empty string is pushed on the stack."
2347 mImplementation->pushGroupMarker(length, "");
2348 }
2349 else
2350 {
2351 mImplementation->pushGroupMarker(length, marker);
2352 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002353}
2354
2355void Context::popGroupMarker()
2356{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002357 ASSERT(mImplementation);
2358 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002359}
2360
Geoff Langd8605522016-04-13 10:19:12 -04002361void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2362{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002363 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002364 ASSERT(programObject);
2365
2366 programObject->bindUniformLocation(location, name);
2367}
2368
Brandon Jones59770802018-04-02 13:18:42 -07002369void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002370{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002371 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002372}
2373
Brandon Jones59770802018-04-02 13:18:42 -07002374void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002375{
2376 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2377}
2378
Brandon Jones59770802018-04-02 13:18:42 -07002379void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002380{
2381 GLfloat I[16];
2382 angle::Matrix<GLfloat>::setToIdentity(I);
2383
2384 mGLState.loadPathRenderingMatrix(matrixMode, I);
2385}
2386
2387void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2388{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002389 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002390 if (!pathObj)
2391 return;
2392
Geoff Lang9bf86f02018-07-26 11:46:34 -04002393 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002394
2395 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2396}
2397
2398void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2399{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002400 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002401 if (!pathObj)
2402 return;
2403
Geoff Lang9bf86f02018-07-26 11:46:34 -04002404 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002405
2406 mImplementation->stencilStrokePath(pathObj, reference, mask);
2407}
2408
2409void Context::coverFillPath(GLuint path, GLenum coverMode)
2410{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002411 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002412 if (!pathObj)
2413 return;
2414
Geoff Lang9bf86f02018-07-26 11:46:34 -04002415 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002416
2417 mImplementation->coverFillPath(pathObj, coverMode);
2418}
2419
2420void Context::coverStrokePath(GLuint path, GLenum coverMode)
2421{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002422 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002423 if (!pathObj)
2424 return;
2425
Geoff Lang9bf86f02018-07-26 11:46:34 -04002426 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002427
2428 mImplementation->coverStrokePath(pathObj, coverMode);
2429}
2430
2431void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2432{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002433 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002434 if (!pathObj)
2435 return;
2436
Geoff Lang9bf86f02018-07-26 11:46:34 -04002437 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002438
2439 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2440}
2441
2442void Context::stencilThenCoverStrokePath(GLuint path,
2443 GLint reference,
2444 GLuint mask,
2445 GLenum coverMode)
2446{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002447 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002448 if (!pathObj)
2449 return;
2450
Geoff Lang9bf86f02018-07-26 11:46:34 -04002451 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002452
2453 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2454}
2455
Sami Väisänend59ca052016-06-21 16:10:00 +03002456void Context::coverFillPathInstanced(GLsizei numPaths,
2457 GLenum pathNameType,
2458 const void *paths,
2459 GLuint pathBase,
2460 GLenum coverMode,
2461 GLenum transformType,
2462 const GLfloat *transformValues)
2463{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002464 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002465
Geoff Lang9bf86f02018-07-26 11:46:34 -04002466 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002467
2468 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2469}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002470
Sami Väisänend59ca052016-06-21 16:10:00 +03002471void Context::coverStrokePathInstanced(GLsizei numPaths,
2472 GLenum pathNameType,
2473 const void *paths,
2474 GLuint pathBase,
2475 GLenum coverMode,
2476 GLenum transformType,
2477 const GLfloat *transformValues)
2478{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002479 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002480
2481 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002482 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002483
2484 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2485 transformValues);
2486}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002487
Sami Väisänend59ca052016-06-21 16:10:00 +03002488void Context::stencilFillPathInstanced(GLsizei numPaths,
2489 GLenum pathNameType,
2490 const void *paths,
2491 GLuint pathBase,
2492 GLenum fillMode,
2493 GLuint mask,
2494 GLenum transformType,
2495 const GLfloat *transformValues)
2496{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002497 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002498
2499 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002500 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002501
2502 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2503 transformValues);
2504}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002505
Sami Väisänend59ca052016-06-21 16:10:00 +03002506void Context::stencilStrokePathInstanced(GLsizei numPaths,
2507 GLenum pathNameType,
2508 const void *paths,
2509 GLuint pathBase,
2510 GLint reference,
2511 GLuint mask,
2512 GLenum transformType,
2513 const GLfloat *transformValues)
2514{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002515 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002516
Geoff Lang9bf86f02018-07-26 11:46:34 -04002517 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002518
2519 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2520 transformValues);
2521}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002522
Sami Väisänend59ca052016-06-21 16:10:00 +03002523void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2524 GLenum pathNameType,
2525 const void *paths,
2526 GLuint pathBase,
2527 GLenum fillMode,
2528 GLuint mask,
2529 GLenum coverMode,
2530 GLenum transformType,
2531 const GLfloat *transformValues)
2532{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002533 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002534
Geoff Lang9bf86f02018-07-26 11:46:34 -04002535 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002536
2537 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2538 transformType, transformValues);
2539}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002540
Sami Väisänend59ca052016-06-21 16:10:00 +03002541void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2542 GLenum pathNameType,
2543 const void *paths,
2544 GLuint pathBase,
2545 GLint reference,
2546 GLuint mask,
2547 GLenum coverMode,
2548 GLenum transformType,
2549 const GLfloat *transformValues)
2550{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002551 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002552
Geoff Lang9bf86f02018-07-26 11:46:34 -04002553 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002554
2555 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2556 transformType, transformValues);
2557}
2558
Sami Väisänen46eaa942016-06-29 10:26:37 +03002559void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2560{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002561 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002562
2563 programObject->bindFragmentInputLocation(location, name);
2564}
2565
2566void Context::programPathFragmentInputGen(GLuint program,
2567 GLint location,
2568 GLenum genMode,
2569 GLint components,
2570 const GLfloat *coeffs)
2571{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002572 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002573
jchen103fd614d2018-08-13 12:21:58 +08002574 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002575}
2576
jchen1015015f72017-03-16 13:54:21 +08002577GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2578{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002579 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002580 return QueryProgramResourceIndex(programObject, programInterface, name);
2581}
2582
jchen10fd7c3b52017-03-21 15:36:03 +08002583void Context::getProgramResourceName(GLuint program,
2584 GLenum programInterface,
2585 GLuint index,
2586 GLsizei bufSize,
2587 GLsizei *length,
2588 GLchar *name)
2589{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002590 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002591 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2592}
2593
jchen10191381f2017-04-11 13:59:04 +08002594GLint Context::getProgramResourceLocation(GLuint program,
2595 GLenum programInterface,
2596 const GLchar *name)
2597{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002598 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002599 return QueryProgramResourceLocation(programObject, programInterface, name);
2600}
2601
jchen10880683b2017-04-12 16:21:55 +08002602void Context::getProgramResourceiv(GLuint program,
2603 GLenum programInterface,
2604 GLuint index,
2605 GLsizei propCount,
2606 const GLenum *props,
2607 GLsizei bufSize,
2608 GLsizei *length,
2609 GLint *params)
2610{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002611 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002612 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2613 length, params);
2614}
2615
jchen10d9cd7b72017-08-30 15:04:25 +08002616void Context::getProgramInterfaceiv(GLuint program,
2617 GLenum programInterface,
2618 GLenum pname,
2619 GLint *params)
2620{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002621 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002622 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2623}
2624
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002625void Context::getProgramInterfaceivRobust(GLuint program,
2626 GLenum programInterface,
2627 GLenum pname,
2628 GLsizei bufSize,
2629 GLsizei *length,
2630 GLint *params)
2631{
2632 UNIMPLEMENTED();
2633}
2634
Jamie Madill306b6c12018-07-27 08:12:49 -04002635void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002636{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002637 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002638}
2639
Jamie Madillabfbc0f2018-10-09 12:48:52 -04002640void Context::handleError(GLenum errorCode,
2641 const char *message,
2642 const char *file,
2643 const char *function,
2644 unsigned int line)
2645{
2646 mErrors.handleError(errorCode, message, file, function, line);
2647}
2648
Jamie Madilla139f012018-10-10 16:13:03 -04002649void Context::validationError(GLenum errorCode, const char *message)
2650{
2651 mErrors.validationError(errorCode, message);
2652}
2653
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002654// Get one of the recorded errors and clear its flag, if any.
2655// [OpenGL ES 2.0.24] section 2.5 page 13.
2656GLenum Context::getError()
2657{
Geoff Langda5777c2014-07-11 09:52:58 -04002658 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002659 {
Geoff Langda5777c2014-07-11 09:52:58 -04002660 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002661 }
Geoff Langda5777c2014-07-11 09:52:58 -04002662 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002663 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002664 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002665 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002666}
2667
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002668// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002669void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002670{
2671 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002672 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002673 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002674 mContextLostForced = true;
2675 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002676 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002677}
2678
Jamie Madillfa920eb2018-01-04 11:45:50 -05002679GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002680{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002681 // Even if the application doesn't want to know about resets, we want to know
2682 // as it will allow us to skip all the calls.
2683 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002684 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002685 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002686 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002687 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002688 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002689
2690 // EXT_robustness, section 2.6: If the reset notification behavior is
2691 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2692 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2693 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002694 }
2695
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002696 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2697 // status should be returned at least once, and GL_NO_ERROR should be returned
2698 // once the device has finished resetting.
2699 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002700 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002701 ASSERT(mResetStatus == GL_NO_ERROR);
2702 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002703
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002704 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002705 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002706 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002707 }
2708 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002709 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002710 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002711 // If markContextLost was used to mark the context lost then
2712 // assume that is not recoverable, and continue to report the
2713 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002714 mResetStatus = mImplementation->getResetStatus();
2715 }
Jamie Madill893ab082014-05-16 16:56:10 -04002716
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002717 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002718}
2719
2720bool Context::isResetNotificationEnabled()
2721{
2722 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2723}
2724
Corentin Walleze3b10e82015-05-20 11:06:25 -04002725const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002726{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002727 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002728}
2729
2730EGLenum Context::getClientType() const
2731{
2732 return mClientType;
2733}
2734
2735EGLenum Context::getRenderBuffer() const
2736{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002737 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2738 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002739 {
2740 return EGL_NONE;
2741 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002742
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002743 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002744 ASSERT(backAttachment != nullptr);
2745 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002746}
2747
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002748VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002749{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002750 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002751 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2752 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002753 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002754 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2755 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002756
Jamie Madill96a483b2017-06-27 16:49:21 -04002757 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002758 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002759
2760 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002761}
2762
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002763TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002764{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002765 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002766 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2767 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002768 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002769 transformFeedback =
2770 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002771 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002772 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002773 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002774
2775 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002776}
2777
2778bool Context::isVertexArrayGenerated(GLuint vertexArray)
2779{
Jamie Madill96a483b2017-06-27 16:49:21 -04002780 ASSERT(mVertexArrayMap.contains(0));
2781 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002782}
2783
2784bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2785{
Jamie Madill96a483b2017-06-27 16:49:21 -04002786 ASSERT(mTransformFeedbackMap.contains(0));
2787 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002788}
2789
Shannon Woods53a94a82014-06-24 15:20:36 -04002790void Context::detachTexture(GLuint texture)
2791{
2792 // Simple pass-through to State's detachTexture method, as textures do not require
2793 // allocation map management either here or in the resource manager at detach time.
2794 // Zero textures are held by the Context, and we don't attempt to request them from
2795 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002796 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002797}
2798
James Darpinian4d9d4832018-03-13 12:43:28 -07002799void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002800{
Yuly Novikov5807a532015-12-03 13:01:22 -05002801 // Simple pass-through to State's detachBuffer method, since
2802 // only buffer attachments to container objects that are bound to the current context
2803 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002804
Yuly Novikov5807a532015-12-03 13:01:22 -05002805 // [OpenGL ES 3.2] section 5.1.2 page 45:
2806 // Attachments to unbound container objects, such as
2807 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2808 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002809 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002810}
2811
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002812void Context::detachFramebuffer(GLuint framebuffer)
2813{
Shannon Woods53a94a82014-06-24 15:20:36 -04002814 // Framebuffer detachment is handled by Context, because 0 is a valid
2815 // Framebuffer object, and a pointer to it must be passed from Context
2816 // to State at binding time.
2817
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002818 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002819 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2820 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2821 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002822
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002823 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002824 {
2825 bindReadFramebuffer(0);
2826 }
2827
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002828 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002829 {
2830 bindDrawFramebuffer(0);
2831 }
2832}
2833
2834void Context::detachRenderbuffer(GLuint renderbuffer)
2835{
Jamie Madilla02315b2017-02-23 14:14:47 -05002836 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002837}
2838
Jamie Madill57a89722013-07-02 11:57:03 -04002839void Context::detachVertexArray(GLuint vertexArray)
2840{
Jamie Madill77a72f62015-04-14 11:18:32 -04002841 // Vertex array detachment is handled by Context, because 0 is a valid
2842 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002843 // binding time.
2844
Jamie Madill57a89722013-07-02 11:57:03 -04002845 // [OpenGL ES 3.0.2] section 2.10 page 43:
2846 // If a vertex array object that is currently bound is deleted, the binding
2847 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002848 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002849 {
2850 bindVertexArray(0);
2851 }
2852}
2853
Geoff Langc8058452014-02-03 12:04:11 -05002854void Context::detachTransformFeedback(GLuint transformFeedback)
2855{
Corentin Walleza2257da2016-04-19 16:43:12 -04002856 // Transform feedback detachment is handled by Context, because 0 is a valid
2857 // transform feedback, and a pointer to it must be passed from Context to State at
2858 // binding time.
2859
2860 // The OpenGL specification doesn't mention what should happen when the currently bound
2861 // transform feedback object is deleted. Since it is a container object, we treat it like
2862 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002863 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002864 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002865 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002866 }
Geoff Langc8058452014-02-03 12:04:11 -05002867}
2868
Jamie Madilldc356042013-07-19 16:36:57 -04002869void Context::detachSampler(GLuint sampler)
2870{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002871 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002872}
2873
Yunchao Hea336b902017-08-02 16:05:21 +08002874void Context::detachProgramPipeline(GLuint pipeline)
2875{
2876 mGLState.detachProgramPipeline(this, pipeline);
2877}
2878
Jamie Madill3ef140a2017-08-26 23:11:21 -04002879void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002880{
Shaodde78e82017-05-22 14:13:27 +08002881 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002882 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002883}
2884
Jamie Madille29d1672013-07-19 16:36:57 -04002885void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2886{
Till Rathmannb8543632018-10-02 19:46:14 +02002887 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002888 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002889 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002890}
Jamie Madille29d1672013-07-19 16:36:57 -04002891
Geoff Langc1984ed2016-10-07 12:41:00 -04002892void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2893{
Till Rathmannb8543632018-10-02 19:46:14 +02002894 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002895 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002896 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002897}
2898
Till Rathmannb8543632018-10-02 19:46:14 +02002899void Context::samplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
2900{
2901 Sampler *const samplerObject =
2902 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2903 SetSamplerParameterIiv(this, samplerObject, pname, param);
2904}
2905
2906void Context::samplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
2907{
2908 Sampler *const samplerObject =
2909 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2910 SetSamplerParameterIuiv(this, samplerObject, pname, param);
2911}
2912
Brandon Jones59770802018-04-02 13:18:42 -07002913void Context::samplerParameterivRobust(GLuint sampler,
2914 GLenum pname,
2915 GLsizei bufSize,
2916 const GLint *param)
2917{
2918 samplerParameteriv(sampler, pname, param);
2919}
2920
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002921void Context::samplerParameterIivRobust(GLuint sampler,
2922 GLenum pname,
2923 GLsizei bufSize,
2924 const GLint *param)
2925{
2926 UNIMPLEMENTED();
2927}
2928
2929void Context::samplerParameterIuivRobust(GLuint sampler,
2930 GLenum pname,
2931 GLsizei bufSize,
2932 const GLuint *param)
2933{
2934 UNIMPLEMENTED();
2935}
2936
Jamie Madille29d1672013-07-19 16:36:57 -04002937void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2938{
Till Rathmannb8543632018-10-02 19:46:14 +02002939 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002940 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002941 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002942}
2943
Geoff Langc1984ed2016-10-07 12:41:00 -04002944void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002945{
Till Rathmannb8543632018-10-02 19:46:14 +02002946 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002947 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002948 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002949}
2950
Brandon Jones59770802018-04-02 13:18:42 -07002951void Context::samplerParameterfvRobust(GLuint sampler,
2952 GLenum pname,
2953 GLsizei bufSize,
2954 const GLfloat *param)
2955{
2956 samplerParameterfv(sampler, pname, param);
2957}
2958
Geoff Langc1984ed2016-10-07 12:41:00 -04002959void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002960{
Till Rathmannb8543632018-10-02 19:46:14 +02002961 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002962 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002963 QuerySamplerParameteriv(samplerObject, pname, params);
2964}
Jamie Madill9675b802013-07-19 16:36:59 -04002965
Till Rathmannb8543632018-10-02 19:46:14 +02002966void Context::getSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
2967{
2968 const Sampler *const samplerObject =
2969 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2970 QuerySamplerParameterIiv(samplerObject, pname, params);
2971}
2972
2973void Context::getSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
2974{
2975 const Sampler *const samplerObject =
2976 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2977 QuerySamplerParameterIuiv(samplerObject, pname, params);
2978}
2979
Brandon Jones59770802018-04-02 13:18:42 -07002980void Context::getSamplerParameterivRobust(GLuint sampler,
2981 GLenum pname,
2982 GLsizei bufSize,
2983 GLsizei *length,
2984 GLint *params)
2985{
2986 getSamplerParameteriv(sampler, pname, params);
2987}
2988
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002989void Context::getSamplerParameterIivRobust(GLuint sampler,
2990 GLenum pname,
2991 GLsizei bufSize,
2992 GLsizei *length,
2993 GLint *params)
2994{
2995 UNIMPLEMENTED();
2996}
2997
2998void Context::getSamplerParameterIuivRobust(GLuint sampler,
2999 GLenum pname,
3000 GLsizei bufSize,
3001 GLsizei *length,
3002 GLuint *params)
3003{
3004 UNIMPLEMENTED();
3005}
3006
Geoff Langc1984ed2016-10-07 12:41:00 -04003007void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
3008{
Till Rathmannb8543632018-10-02 19:46:14 +02003009 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05003010 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04003011 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04003012}
3013
Brandon Jones59770802018-04-02 13:18:42 -07003014void Context::getSamplerParameterfvRobust(GLuint sampler,
3015 GLenum pname,
3016 GLsizei bufSize,
3017 GLsizei *length,
3018 GLfloat *params)
3019{
3020 getSamplerParameterfv(sampler, pname, params);
3021}
3022
Olli Etuahof0fee072016-03-30 15:11:58 +03003023void Context::programParameteri(GLuint program, GLenum pname, GLint value)
3024{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04003025 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08003026 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03003027}
3028
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003029void Context::initRendererString()
3030{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003031 std::ostringstream rendererString;
3032 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003033 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003034 rendererString << ")";
3035
Geoff Langcec35902014-04-16 10:52:36 -04003036 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003037}
3038
Geoff Langc339c4e2016-11-29 10:37:36 -05003039void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003040{
Geoff Langc339c4e2016-11-29 10:37:36 -05003041 const Version &clientVersion = getClientVersion();
3042
3043 std::ostringstream versionString;
3044 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
3045 << ANGLE_VERSION_STRING << ")";
3046 mVersionString = MakeStaticString(versionString.str());
3047
3048 std::ostringstream shadingLanguageVersionString;
3049 shadingLanguageVersionString << "OpenGL ES GLSL ES "
3050 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
3051 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
3052 << ")";
3053 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003054}
3055
Geoff Langcec35902014-04-16 10:52:36 -04003056void Context::initExtensionStrings()
3057{
Geoff Langc339c4e2016-11-29 10:37:36 -05003058 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
3059 std::ostringstream combinedStringStream;
3060 std::copy(strings.begin(), strings.end(),
3061 std::ostream_iterator<const char *>(combinedStringStream, " "));
3062 return MakeStaticString(combinedStringStream.str());
3063 };
3064
3065 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003066 for (const auto &extensionString : mExtensions.getStrings())
3067 {
3068 mExtensionStrings.push_back(MakeStaticString(extensionString));
3069 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003070 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003071
Geoff Langc339c4e2016-11-29 10:37:36 -05003072 mRequestableExtensionStrings.clear();
3073 for (const auto &extensionInfo : GetExtensionInfoMap())
3074 {
3075 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003076 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003077 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003078 {
3079 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3080 }
3081 }
3082 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003083}
3084
Geoff Langc339c4e2016-11-29 10:37:36 -05003085const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003086{
Geoff Langc339c4e2016-11-29 10:37:36 -05003087 switch (name)
3088 {
3089 case GL_VENDOR:
3090 return reinterpret_cast<const GLubyte *>("Google Inc.");
3091
3092 case GL_RENDERER:
3093 return reinterpret_cast<const GLubyte *>(mRendererString);
3094
3095 case GL_VERSION:
3096 return reinterpret_cast<const GLubyte *>(mVersionString);
3097
3098 case GL_SHADING_LANGUAGE_VERSION:
3099 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3100
3101 case GL_EXTENSIONS:
3102 return reinterpret_cast<const GLubyte *>(mExtensionString);
3103
3104 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3105 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3106
3107 default:
3108 UNREACHABLE();
3109 return nullptr;
3110 }
Geoff Langcec35902014-04-16 10:52:36 -04003111}
3112
Geoff Langc339c4e2016-11-29 10:37:36 -05003113const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003114{
Geoff Langc339c4e2016-11-29 10:37:36 -05003115 switch (name)
3116 {
3117 case GL_EXTENSIONS:
3118 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3119
3120 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3121 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3122
3123 default:
3124 UNREACHABLE();
3125 return nullptr;
3126 }
Geoff Langcec35902014-04-16 10:52:36 -04003127}
3128
3129size_t Context::getExtensionStringCount() const
3130{
3131 return mExtensionStrings.size();
3132}
3133
Geoff Lang111a99e2017-10-17 10:58:41 -04003134bool Context::isExtensionRequestable(const char *name)
3135{
3136 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3137 auto extension = extensionInfos.find(name);
3138
Geoff Lang111a99e2017-10-17 10:58:41 -04003139 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003140 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003141}
3142
Geoff Langc339c4e2016-11-29 10:37:36 -05003143void Context::requestExtension(const char *name)
3144{
3145 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3146 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3147 const auto &extension = extensionInfos.at(name);
3148 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003149 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003150
3151 if (mExtensions.*(extension.ExtensionsMember))
3152 {
3153 // Extension already enabled
3154 return;
3155 }
3156
3157 mExtensions.*(extension.ExtensionsMember) = true;
3158 updateCaps();
3159 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003160
Jamie Madill2f348d22017-06-05 10:50:59 -04003161 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3162 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003163
Jamie Madill81c2e252017-09-09 23:32:46 -04003164 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3165 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003166 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003167 for (auto &zeroTexture : mZeroTextures)
3168 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003169 if (zeroTexture.get() != nullptr)
3170 {
3171 zeroTexture->signalDirty(this, InitState::Initialized);
3172 }
Geoff Lang9aded172017-04-05 11:07:56 -04003173 }
3174
Jamie Madillb983a4b2018-08-01 11:34:51 -04003175 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003176}
3177
3178size_t Context::getRequestableExtensionStringCount() const
3179{
3180 return mRequestableExtensionStrings.size();
3181}
3182
Jamie Madill493f9572018-05-24 19:52:15 -04003183void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003184{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003185 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003186 ASSERT(transformFeedback != nullptr);
3187 ASSERT(!transformFeedback->isPaused());
3188
Jamie Madill6c1f6712017-02-14 19:08:04 -05003189 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003190 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003191}
3192
3193bool Context::hasActiveTransformFeedback(GLuint program) const
3194{
3195 for (auto pair : mTransformFeedbackMap)
3196 {
3197 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3198 {
3199 return true;
3200 }
3201 }
3202 return false;
3203}
3204
Geoff Lang33f11fb2018-05-07 13:42:47 -04003205Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003206{
3207 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3208
jchen1082af6202018-06-22 10:59:52 +08003209 // Explicitly enable GL_KHR_parallel_shader_compile
3210 supportedExtensions.parallelShaderCompile = true;
3211
Geoff Langb0f917f2017-12-05 13:41:54 -05003212 if (getClientVersion() < ES_2_0)
3213 {
3214 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003215 supportedExtensions.pointSizeArray = true;
3216 supportedExtensions.textureCubeMap = true;
3217 supportedExtensions.pointSprite = true;
3218 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003219 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003220 }
3221
3222 if (getClientVersion() < ES_3_0)
3223 {
3224 // Disable ES3+ extensions
3225 supportedExtensions.colorBufferFloat = false;
3226 supportedExtensions.eglImageExternalEssl3 = false;
3227 supportedExtensions.textureNorm16 = false;
3228 supportedExtensions.multiview = false;
3229 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003230 supportedExtensions.copyTexture3d = false;
Yizhou Jiang7818a852018-09-06 15:02:04 +08003231 supportedExtensions.textureMultisample = false;
Geoff Lang7198ebc2018-11-22 14:36:06 -05003232
3233 // Don't expose GL_EXT_texture_sRGB_decode without sRGB texture support
3234 if (!supportedExtensions.sRGB)
3235 {
3236 supportedExtensions.textureSRGBDecode = false;
3237 }
Geoff Langb0f917f2017-12-05 13:41:54 -05003238 }
3239
3240 if (getClientVersion() < ES_3_1)
3241 {
3242 // Disable ES3.1+ extensions
3243 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003244
3245 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3246 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003247 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003248 }
3249
3250 if (getClientVersion() > ES_2_0)
3251 {
3252 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3253 // supportedExtensions.sRGB = false;
3254 }
3255
3256 // Some extensions are always available because they are implemented in the GL layer.
3257 supportedExtensions.bindUniformLocation = true;
3258 supportedExtensions.vertexArrayObject = true;
3259 supportedExtensions.bindGeneratesResource = true;
3260 supportedExtensions.clientArrays = true;
3261 supportedExtensions.requestExtension = true;
Austin Eng7cf9cd22018-10-09 15:27:32 -07003262 supportedExtensions.multiDraw = true;
Geoff Langb0f917f2017-12-05 13:41:54 -05003263
3264 // Enable the no error extension if the context was created with the flag.
3265 supportedExtensions.noError = mSkipValidation;
3266
3267 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003268 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003269
3270 // Explicitly enable GL_KHR_debug
3271 supportedExtensions.debug = true;
3272 supportedExtensions.maxDebugMessageLength = 1024;
3273 supportedExtensions.maxDebugLoggedMessages = 1024;
3274 supportedExtensions.maxDebugGroupStackDepth = 1024;
3275 supportedExtensions.maxLabelLength = 1024;
3276
3277 // Explicitly enable GL_ANGLE_robust_client_memory
3278 supportedExtensions.robustClientMemory = true;
3279
3280 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003281 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003282
3283 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3284 // supports it.
3285 supportedExtensions.robustBufferAccessBehavior =
3286 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3287
3288 // Enable the cache control query unconditionally.
3289 supportedExtensions.programCacheControl = true;
3290
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003291 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003292 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003293 {
3294 // GL_ANGLE_explicit_context_gles1
3295 supportedExtensions.explicitContextGles1 = true;
3296 // GL_ANGLE_explicit_context
3297 supportedExtensions.explicitContext = true;
3298 }
3299
Geoff Lang79b91402018-10-04 15:11:30 -04003300 supportedExtensions.memorySize = true;
3301
Geoff Langb0f917f2017-12-05 13:41:54 -05003302 return supportedExtensions;
3303}
3304
Geoff Lang33f11fb2018-05-07 13:42:47 -04003305void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003306{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003307 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003308
Geoff Lang33f11fb2018-05-07 13:42:47 -04003309 mSupportedExtensions = generateSupportedExtensions();
3310 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003311
3312 mLimitations = mImplementation->getNativeLimitations();
3313
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003314 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3315 if (getClientVersion() < Version(2, 0))
3316 {
3317 mCaps.maxMultitextureUnits = 4;
3318 mCaps.maxClipPlanes = 6;
3319 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003320 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3321 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3322 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003323 mCaps.minSmoothPointSize = 1.0f;
3324 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003325 mCaps.minSmoothLineWidth = 1.0f;
3326 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003327 }
3328
Luc Ferronad2ae932018-06-11 15:31:17 -04003329 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003330 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003331
Luc Ferronad2ae932018-06-11 15:31:17 -04003332 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3333
Jamie Madill0f80ed82017-09-19 00:24:56 -04003334 if (getClientVersion() < ES_3_1)
3335 {
3336 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3337 }
3338 else
3339 {
3340 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3341 }
Geoff Lang301d1612014-07-09 10:34:37 -04003342
Jiawei Shao54aafe52018-04-27 14:54:57 +08003343 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3344 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003345 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3346
Jamie Madill0f80ed82017-09-19 00:24:56 -04003347 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3348 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3349
3350 // Limit textures as well, so we can use fast bitsets with texture bindings.
3351 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003352 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3353 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3354 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3355 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003356
Jiawei Shaodb342272017-09-27 10:21:45 +08003357 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3358
Geoff Langc287ea62016-09-16 14:46:51 -04003359 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003360 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003361 for (const auto &extensionInfo : GetExtensionInfoMap())
3362 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003363 // If the user has requested that extensions start disabled and they are requestable,
3364 // disable them.
3365 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003366 {
3367 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3368 }
3369 }
3370
3371 // Generate texture caps
3372 updateCaps();
3373}
3374
3375void Context::updateCaps()
3376{
Geoff Lang900013c2014-07-07 11:32:19 -04003377 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003378 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003379
Jamie Madill7b62cf92017-11-02 15:20:49 -04003380 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003381 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003382 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003383 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003384
Geoff Lang0d8b7242015-09-09 14:56:53 -04003385 // Update the format caps based on the client version and extensions.
3386 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3387 // ES3.
3388 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003389 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003390 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003391 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003392 formatCaps.textureAttachment =
3393 formatCaps.textureAttachment &&
3394 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3395 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3396 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003397
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003398 // OpenGL ES does not support multisampling with non-rendererable formats
3399 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003400 if (!formatCaps.renderbuffer ||
Yizhou Jiang2fa21472018-11-06 15:52:33 +08003401 (getClientVersion() < ES_3_1 && !mSupportedExtensions.textureMultisample &&
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003402 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003403 {
Geoff Langd87878e2014-09-19 15:42:59 -04003404 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003405 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003406 else
3407 {
3408 // We may have limited the max samples for some required renderbuffer formats due to
3409 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3410 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3411
3412 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3413 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3414 // exception of signed and unsigned integer formats."
3415 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3416 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3417 {
3418 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3419 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3420 }
3421
3422 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
Yizhou Jiang2fa21472018-11-06 15:52:33 +08003423 if (getClientVersion() >= ES_3_1 || mSupportedExtensions.textureMultisample)
Olli Etuaho50c562d2017-06-06 14:43:30 +03003424 {
3425 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3426 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3427 // the exception that the signed and unsigned integer formats are required only to
3428 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3429 // multisamples, which must be at least one."
3430 if (formatInfo.componentType == GL_INT ||
3431 formatInfo.componentType == GL_UNSIGNED_INT)
3432 {
3433 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3434 }
3435
3436 // GLES 3.1 section 19.3.1.
3437 if (formatCaps.texturable)
3438 {
3439 if (formatInfo.depthBits > 0)
3440 {
3441 mCaps.maxDepthTextureSamples =
3442 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3443 }
3444 else if (formatInfo.redBits > 0)
3445 {
3446 mCaps.maxColorTextureSamples =
3447 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3448 }
3449 }
3450 }
3451 }
Geoff Langd87878e2014-09-19 15:42:59 -04003452
3453 if (formatCaps.texturable && formatInfo.compressed)
3454 {
Geoff Langca271392017-04-05 12:30:00 -04003455 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003456 }
3457
Geoff Langca271392017-04-05 12:30:00 -04003458 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003459 }
Jamie Madill32447362017-06-28 14:53:52 -04003460
3461 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003462 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003463 {
3464 mMemoryProgramCache = nullptr;
3465 }
Corentin Walleze4477002017-12-01 14:39:58 -05003466
3467 // Compute which buffer types are allowed
3468 mValidBufferBindings.reset();
3469 mValidBufferBindings.set(BufferBinding::ElementArray);
3470 mValidBufferBindings.set(BufferBinding::Array);
3471
3472 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3473 {
3474 mValidBufferBindings.set(BufferBinding::PixelPack);
3475 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3476 }
3477
3478 if (getClientVersion() >= ES_3_0)
3479 {
3480 mValidBufferBindings.set(BufferBinding::CopyRead);
3481 mValidBufferBindings.set(BufferBinding::CopyWrite);
3482 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3483 mValidBufferBindings.set(BufferBinding::Uniform);
3484 }
3485
3486 if (getClientVersion() >= ES_3_1)
3487 {
3488 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3489 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3490 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3491 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3492 }
jchen107ae70d82018-07-06 13:47:01 +08003493
3494 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003495
3496 // Reinitialize state cache after extension changes.
3497 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003498}
3499
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003500void Context::initWorkarounds()
3501{
Jamie Madill761b02c2017-06-23 16:27:06 -04003502 // Apply back-end workarounds.
3503 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3504
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003505 // Lose the context upon out of memory error if the application is
3506 // expecting to watch for those events.
3507 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
Jamie Madilld4f07762018-10-19 19:24:07 -04003508
3509 if (mWorkarounds.syncFramebufferBindingsOnTexImage)
3510 {
3511 // Update the Framebuffer bindings on TexImage to work around an Intel bug.
3512 mTexImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
3513 mTexImageDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
3514 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003515}
3516
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003517// Return true if the draw is a no-op, else return false.
3518// A no-op draw occurs if the count of vertices is less than the minimum required to
3519// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3520bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3521{
3522 return count < kMinimumPrimitiveCounts[mode];
3523}
3524
3525bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3526{
3527 return (instanceCount == 0) || noopDraw(mode, count);
3528}
3529
Jamie Madill6f755b22018-10-09 12:48:54 -04003530angle::Result Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003531{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003532 if (mGLES1Renderer)
3533 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003534 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003535 }
3536
Geoff Lang9bf86f02018-07-26 11:46:34 -04003537 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003538
3539 if (isRobustResourceInitEnabled())
3540 {
3541 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3542 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3543 }
3544
Jamie Madill9e63a812018-11-16 12:30:04 +00003545 ANGLE_TRY(syncDirtyBits());
3546 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003547}
3548
Jamie Madill526392d2018-11-16 09:35:14 -05003549angle::Result Context::prepareForClear(GLbitfield mask)
Geoff Langd4fff502017-09-22 11:28:28 -04003550{
Geoff Langa8cb2872018-03-09 16:09:40 -05003551 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003552 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003553 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill526392d2018-11-16 09:35:14 -05003554 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003555}
3556
Jamie Madill526392d2018-11-16 09:35:14 -05003557angle::Result Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
Geoff Langd4fff502017-09-22 11:28:28 -04003558{
Geoff Langa8cb2872018-03-09 16:09:40 -05003559 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003560 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3561 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003562 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill526392d2018-11-16 09:35:14 -05003563 return angle::Result::Continue();
Jamie Madill05b35b22017-10-03 09:01:44 -04003564}
3565
Jamie Madill526392d2018-11-16 09:35:14 -05003566angle::Result Context::syncState(const State::DirtyBits &bitMask,
3567 const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003568{
Geoff Langa8cb2872018-03-09 16:09:40 -05003569 ANGLE_TRY(syncDirtyObjects(objectMask));
3570 ANGLE_TRY(syncDirtyBits(bitMask));
Jamie Madill526392d2018-11-16 09:35:14 -05003571 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003572}
3573
Jamie Madill9e63a812018-11-16 12:30:04 +00003574angle::Result Context::syncDirtyBits()
3575{
3576 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
3577 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
3578 mGLState.clearDirtyBits();
3579 return angle::Result::Continue();
3580}
3581
3582angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
3583{
3584 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
3585 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
3586 mGLState.clearDirtyBits(dirtyBits);
3587 return angle::Result::Continue();
3588}
3589
3590angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
3591{
3592 return mGLState.syncDirtyObjects(this, objectMask);
3593}
3594
Jamie Madillc29968b2016-01-20 11:17:23 -05003595void Context::blitFramebuffer(GLint srcX0,
3596 GLint srcY0,
3597 GLint srcX1,
3598 GLint srcY1,
3599 GLint dstX0,
3600 GLint dstY0,
3601 GLint dstX1,
3602 GLint dstY1,
3603 GLbitfield mask,
3604 GLenum filter)
3605{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003606 if (mask == 0)
3607 {
3608 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3609 // buffers are copied.
3610 return;
3611 }
3612
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003613 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003614 ASSERT(drawFramebuffer);
3615
3616 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3617 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3618
Jamie Madillbc918e72018-03-08 09:47:21 -05003619 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003620
Jamie Madillc564c072017-06-01 12:45:42 -04003621 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003622}
Jamie Madillc29968b2016-01-20 11:17:23 -05003623
3624void Context::clear(GLbitfield mask)
3625{
Geoff Langd4fff502017-09-22 11:28:28 -04003626 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3627 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003628}
3629
3630void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3631{
Olli Etuaho78df3362018-10-05 16:43:27 +03003632 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3633 const FramebufferAttachment *attachment = nullptr;
3634 if (buffer == GL_DEPTH)
3635 {
3636 attachment = framebufferObject->getDepthbuffer();
3637 }
3638 if (buffer == GL_COLOR &&
3639 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3640 {
3641 attachment = framebufferObject->getColorbuffer(drawbuffer);
3642 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003643 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3644 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003645 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003646 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003647 return;
3648 }
Geoff Langd4fff502017-09-22 11:28:28 -04003649 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003650 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003651}
3652
3653void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3654{
Olli Etuaho78df3362018-10-05 16:43:27 +03003655 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3656 const FramebufferAttachment *attachment = nullptr;
3657 if (buffer == GL_COLOR &&
3658 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3659 {
3660 attachment = framebufferObject->getColorbuffer(drawbuffer);
3661 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003662 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3663 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003664 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003665 {
3666 return;
3667 }
Geoff Langd4fff502017-09-22 11:28:28 -04003668 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003669 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003670}
3671
3672void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3673{
Olli Etuaho78df3362018-10-05 16:43:27 +03003674 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3675 const FramebufferAttachment *attachment = nullptr;
3676 if (buffer == GL_STENCIL)
3677 {
3678 attachment = framebufferObject->getStencilbuffer();
3679 }
3680 if (buffer == GL_COLOR &&
3681 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3682 {
3683 attachment = framebufferObject->getColorbuffer(drawbuffer);
3684 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003685 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3686 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003687 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003688 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003689 return;
3690 }
Geoff Langd4fff502017-09-22 11:28:28 -04003691 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003692 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003693}
3694
3695void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3696{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003697 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003698 ASSERT(framebufferObject);
3699
3700 // If a buffer is not present, the clear has no effect
3701 if (framebufferObject->getDepthbuffer() == nullptr &&
3702 framebufferObject->getStencilbuffer() == nullptr)
3703 {
3704 return;
3705 }
3706
Geoff Langd4fff502017-09-22 11:28:28 -04003707 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3708 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003709}
3710
3711void Context::readPixels(GLint x,
3712 GLint y,
3713 GLsizei width,
3714 GLsizei height,
3715 GLenum format,
3716 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003717 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003718{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003719 if (width == 0 || height == 0)
3720 {
3721 return;
3722 }
3723
Jamie Madillbc918e72018-03-08 09:47:21 -05003724 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003725
Jamie Madillb6664922017-07-25 12:55:04 -04003726 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3727 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003728
3729 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003730 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003731}
3732
Brandon Jones59770802018-04-02 13:18:42 -07003733void Context::readPixelsRobust(GLint x,
3734 GLint y,
3735 GLsizei width,
3736 GLsizei height,
3737 GLenum format,
3738 GLenum type,
3739 GLsizei bufSize,
3740 GLsizei *length,
3741 GLsizei *columns,
3742 GLsizei *rows,
3743 void *pixels)
3744{
3745 readPixels(x, y, width, height, format, type, pixels);
3746}
3747
3748void Context::readnPixelsRobust(GLint x,
3749 GLint y,
3750 GLsizei width,
3751 GLsizei height,
3752 GLenum format,
3753 GLenum type,
3754 GLsizei bufSize,
3755 GLsizei *length,
3756 GLsizei *columns,
3757 GLsizei *rows,
3758 void *data)
3759{
3760 readPixels(x, y, width, height, format, type, data);
3761}
3762
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003763void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003764 GLint level,
3765 GLenum internalformat,
3766 GLint x,
3767 GLint y,
3768 GLsizei width,
3769 GLsizei height,
3770 GLint border)
3771{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003772 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003773 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003774
Jamie Madillc29968b2016-01-20 11:17:23 -05003775 Rectangle sourceArea(x, y, width, height);
3776
Jamie Madill05b35b22017-10-03 09:01:44 -04003777 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003778 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003779 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003780}
3781
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003782void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003783 GLint level,
3784 GLint xoffset,
3785 GLint yoffset,
3786 GLint x,
3787 GLint y,
3788 GLsizei width,
3789 GLsizei height)
3790{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003791 if (width == 0 || height == 0)
3792 {
3793 return;
3794 }
3795
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003796 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003797 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003798
Jamie Madillc29968b2016-01-20 11:17:23 -05003799 Offset destOffset(xoffset, yoffset, 0);
3800 Rectangle sourceArea(x, y, width, height);
3801
Jamie Madill05b35b22017-10-03 09:01:44 -04003802 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003803 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003804 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003805}
3806
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003807void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003808 GLint level,
3809 GLint xoffset,
3810 GLint yoffset,
3811 GLint zoffset,
3812 GLint x,
3813 GLint y,
3814 GLsizei width,
3815 GLsizei height)
3816{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003817 if (width == 0 || height == 0)
3818 {
3819 return;
3820 }
3821
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003822 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003823 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003824
Jamie Madillc29968b2016-01-20 11:17:23 -05003825 Offset destOffset(xoffset, yoffset, zoffset);
3826 Rectangle sourceArea(x, y, width, height);
3827
Jamie Madill05b35b22017-10-03 09:01:44 -04003828 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3829 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003830 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3831 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003832}
3833
3834void Context::framebufferTexture2D(GLenum target,
3835 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003836 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003837 GLuint texture,
3838 GLint level)
3839{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003840 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003841 ASSERT(framebuffer);
3842
3843 if (texture != 0)
3844 {
3845 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003846 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003847 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003848 }
3849 else
3850 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003851 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003852 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003853
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003854 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003855}
3856
3857void Context::framebufferRenderbuffer(GLenum target,
3858 GLenum attachment,
3859 GLenum renderbuffertarget,
3860 GLuint renderbuffer)
3861{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003862 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003863 ASSERT(framebuffer);
3864
3865 if (renderbuffer != 0)
3866 {
3867 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003868
Jamie Madillcc129372018-04-12 09:13:18 -04003869 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003870 renderbufferObject);
3871 }
3872 else
3873 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003874 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003875 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003876
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003877 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003878}
3879
3880void Context::framebufferTextureLayer(GLenum target,
3881 GLenum attachment,
3882 GLuint texture,
3883 GLint level,
3884 GLint layer)
3885{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003886 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003887 ASSERT(framebuffer);
3888
3889 if (texture != 0)
3890 {
3891 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003892 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003893 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003894 }
3895 else
3896 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003897 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003898 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003899
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003900 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003901}
3902
Brandon Jones59770802018-04-02 13:18:42 -07003903void Context::framebufferTextureMultiviewLayered(GLenum target,
3904 GLenum attachment,
3905 GLuint texture,
3906 GLint level,
3907 GLint baseViewIndex,
3908 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003909{
Martin Radev82ef7742017-08-08 17:44:58 +03003910 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3911 ASSERT(framebuffer);
3912
3913 if (texture != 0)
3914 {
3915 Texture *textureObj = getTexture(texture);
3916
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003917 ImageIndex index;
3918 if (textureObj->getType() == TextureType::_2DArray)
3919 {
3920 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3921 }
3922 else
3923 {
3924 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3925 ASSERT(level == 0);
3926 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3927 }
Martin Radev82ef7742017-08-08 17:44:58 +03003928 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3929 numViews, baseViewIndex);
3930 }
3931 else
3932 {
3933 framebuffer->resetAttachment(this, attachment);
3934 }
3935
3936 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003937}
3938
Brandon Jones59770802018-04-02 13:18:42 -07003939void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3940 GLenum attachment,
3941 GLuint texture,
3942 GLint level,
3943 GLsizei numViews,
3944 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003945{
Martin Radev5dae57b2017-07-14 16:15:55 +03003946 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3947 ASSERT(framebuffer);
3948
3949 if (texture != 0)
3950 {
3951 Texture *textureObj = getTexture(texture);
3952
3953 ImageIndex index = ImageIndex::Make2D(level);
3954 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3955 textureObj, numViews, viewportOffsets);
3956 }
3957 else
3958 {
3959 framebuffer->resetAttachment(this, attachment);
3960 }
3961
3962 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003963}
3964
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003965void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3966{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003967 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3968 ASSERT(framebuffer);
3969
3970 if (texture != 0)
3971 {
3972 Texture *textureObj = getTexture(texture);
3973
3974 ImageIndex index = ImageIndex::MakeFromType(
3975 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3976 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3977 }
3978 else
3979 {
3980 framebuffer->resetAttachment(this, attachment);
3981 }
3982
3983 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003984}
3985
Jamie Madillc29968b2016-01-20 11:17:23 -05003986void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3987{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003988 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003989 ASSERT(framebuffer);
3990 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003991 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003992 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003993}
3994
3995void Context::readBuffer(GLenum mode)
3996{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003997 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003998 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003999 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05004000}
4001
4002void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
4003{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004004 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004005 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004006
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004007 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004008 ASSERT(framebuffer);
4009
4010 // The specification isn't clear what should be done when the framebuffer isn't complete.
4011 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04004012 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004013}
4014
4015void Context::invalidateFramebuffer(GLenum target,
4016 GLsizei numAttachments,
4017 const GLenum *attachments)
4018{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004019 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004020 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004021
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004022 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004023 ASSERT(framebuffer);
4024
Jamie Madill427064d2018-04-13 16:20:34 -04004025 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004026 {
Jamie Madill437fa652016-05-03 15:13:24 -04004027 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004028 }
Jamie Madill437fa652016-05-03 15:13:24 -04004029
Jamie Madill4928b7c2017-06-20 12:57:39 -04004030 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004031}
4032
4033void Context::invalidateSubFramebuffer(GLenum target,
4034 GLsizei numAttachments,
4035 const GLenum *attachments,
4036 GLint x,
4037 GLint y,
4038 GLsizei width,
4039 GLsizei height)
4040{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004041 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004042 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004043
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004044 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004045 ASSERT(framebuffer);
4046
Jamie Madill427064d2018-04-13 16:20:34 -04004047 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004048 {
Jamie Madill437fa652016-05-03 15:13:24 -04004049 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004050 }
Jamie Madill437fa652016-05-03 15:13:24 -04004051
4052 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004053 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05004054}
4055
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004056void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004057 GLint level,
4058 GLint internalformat,
4059 GLsizei width,
4060 GLsizei height,
4061 GLint border,
4062 GLenum format,
4063 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004064 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004065{
Jamie Madillbc918e72018-03-08 09:47:21 -05004066 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004067
4068 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004069 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004070 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004071 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004072}
4073
Brandon Jones59770802018-04-02 13:18:42 -07004074void Context::texImage2DRobust(TextureTarget target,
4075 GLint level,
4076 GLint internalformat,
4077 GLsizei width,
4078 GLsizei height,
4079 GLint border,
4080 GLenum format,
4081 GLenum type,
4082 GLsizei bufSize,
4083 const void *pixels)
4084{
4085 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4086}
4087
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004088void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004089 GLint level,
4090 GLint internalformat,
4091 GLsizei width,
4092 GLsizei height,
4093 GLsizei depth,
4094 GLint border,
4095 GLenum format,
4096 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004097 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004098{
Jamie Madillbc918e72018-03-08 09:47:21 -05004099 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004100
4101 Extents size(width, height, depth);
4102 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004103 handleError(texture->setImage(this, mGLState.getUnpackState(),
4104 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004105 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004106}
4107
Brandon Jones59770802018-04-02 13:18:42 -07004108void Context::texImage3DRobust(TextureType target,
4109 GLint level,
4110 GLint internalformat,
4111 GLsizei width,
4112 GLsizei height,
4113 GLsizei depth,
4114 GLint border,
4115 GLenum format,
4116 GLenum type,
4117 GLsizei bufSize,
4118 const void *pixels)
4119{
4120 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4121}
4122
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004123void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004124 GLint level,
4125 GLint xoffset,
4126 GLint yoffset,
4127 GLsizei width,
4128 GLsizei height,
4129 GLenum format,
4130 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004131 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004132{
4133 // Zero sized uploads are valid but no-ops
4134 if (width == 0 || height == 0)
4135 {
4136 return;
4137 }
4138
Jamie Madillbc918e72018-03-08 09:47:21 -05004139 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004140
4141 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004142 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004143
4144 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4145
4146 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4147 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004148}
4149
Brandon Jones59770802018-04-02 13:18:42 -07004150void Context::texSubImage2DRobust(TextureTarget target,
4151 GLint level,
4152 GLint xoffset,
4153 GLint yoffset,
4154 GLsizei width,
4155 GLsizei height,
4156 GLenum format,
4157 GLenum type,
4158 GLsizei bufSize,
4159 const void *pixels)
4160{
4161 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4162}
4163
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004164void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004165 GLint level,
4166 GLint xoffset,
4167 GLint yoffset,
4168 GLint zoffset,
4169 GLsizei width,
4170 GLsizei height,
4171 GLsizei depth,
4172 GLenum format,
4173 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004174 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004175{
4176 // Zero sized uploads are valid but no-ops
4177 if (width == 0 || height == 0 || depth == 0)
4178 {
4179 return;
4180 }
4181
Jamie Madillbc918e72018-03-08 09:47:21 -05004182 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004183
4184 Box area(xoffset, yoffset, zoffset, width, height, depth);
4185 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004186
4187 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4188
4189 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004190 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004191 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004192}
4193
Brandon Jones59770802018-04-02 13:18:42 -07004194void Context::texSubImage3DRobust(TextureType target,
4195 GLint level,
4196 GLint xoffset,
4197 GLint yoffset,
4198 GLint zoffset,
4199 GLsizei width,
4200 GLsizei height,
4201 GLsizei depth,
4202 GLenum format,
4203 GLenum type,
4204 GLsizei bufSize,
4205 const void *pixels)
4206{
4207 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4208 pixels);
4209}
4210
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004211void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004212 GLint level,
4213 GLenum internalformat,
4214 GLsizei width,
4215 GLsizei height,
4216 GLint border,
4217 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004218 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004219{
Jamie Madillbc918e72018-03-08 09:47:21 -05004220 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004221
4222 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004223 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004224 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4225 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004226 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004227}
4228
Brandon Jones59770802018-04-02 13:18:42 -07004229void Context::compressedTexImage2DRobust(TextureTarget target,
4230 GLint level,
4231 GLenum internalformat,
4232 GLsizei width,
4233 GLsizei height,
4234 GLint border,
4235 GLsizei imageSize,
4236 GLsizei dataSize,
4237 const GLvoid *data)
4238{
4239 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4240}
4241
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004242void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004243 GLint level,
4244 GLenum internalformat,
4245 GLsizei width,
4246 GLsizei height,
4247 GLsizei depth,
4248 GLint border,
4249 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004250 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004251{
Jamie Madillbc918e72018-03-08 09:47:21 -05004252 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004253
4254 Extents size(width, height, depth);
4255 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004256 handleError(texture->setCompressedImage(
4257 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004258 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004259}
4260
Brandon Jones59770802018-04-02 13:18:42 -07004261void Context::compressedTexImage3DRobust(TextureType target,
4262 GLint level,
4263 GLenum internalformat,
4264 GLsizei width,
4265 GLsizei height,
4266 GLsizei depth,
4267 GLint border,
4268 GLsizei imageSize,
4269 GLsizei dataSize,
4270 const GLvoid *data)
4271{
4272 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4273 data);
4274}
4275
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004276void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004277 GLint level,
4278 GLint xoffset,
4279 GLint yoffset,
4280 GLsizei width,
4281 GLsizei height,
4282 GLenum format,
4283 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004284 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004285{
Jamie Madillbc918e72018-03-08 09:47:21 -05004286 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004287
4288 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004289 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004290 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4291 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004292 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004293}
4294
Brandon Jones59770802018-04-02 13:18:42 -07004295void Context::compressedTexSubImage2DRobust(TextureTarget target,
4296 GLint level,
4297 GLint xoffset,
4298 GLint yoffset,
4299 GLsizei width,
4300 GLsizei height,
4301 GLenum format,
4302 GLsizei imageSize,
4303 GLsizei dataSize,
4304 const GLvoid *data)
4305{
4306 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4307 data);
4308}
4309
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004310void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004311 GLint level,
4312 GLint xoffset,
4313 GLint yoffset,
4314 GLint zoffset,
4315 GLsizei width,
4316 GLsizei height,
4317 GLsizei depth,
4318 GLenum format,
4319 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004320 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004321{
4322 // Zero sized uploads are valid but no-ops
4323 if (width == 0 || height == 0)
4324 {
4325 return;
4326 }
4327
Jamie Madillbc918e72018-03-08 09:47:21 -05004328 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004329
4330 Box area(xoffset, yoffset, zoffset, width, height, depth);
4331 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004332 handleError(texture->setCompressedSubImage(
4333 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004334 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004335}
4336
Brandon Jones59770802018-04-02 13:18:42 -07004337void Context::compressedTexSubImage3DRobust(TextureType target,
4338 GLint level,
4339 GLint xoffset,
4340 GLint yoffset,
4341 GLint zoffset,
4342 GLsizei width,
4343 GLsizei height,
4344 GLsizei depth,
4345 GLenum format,
4346 GLsizei imageSize,
4347 GLsizei dataSize,
4348 const GLvoid *data)
4349{
4350 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4351 imageSize, data);
4352}
4353
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004354void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004355{
4356 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004357 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004358}
4359
Jamie Madill007530e2017-12-28 14:27:04 -05004360void Context::copyTexture(GLuint sourceId,
4361 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004362 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004363 GLuint destId,
4364 GLint destLevel,
4365 GLint internalFormat,
4366 GLenum destType,
4367 GLboolean unpackFlipY,
4368 GLboolean unpackPremultiplyAlpha,
4369 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004370{
Jamie Madillbc918e72018-03-08 09:47:21 -05004371 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004372
4373 gl::Texture *sourceTexture = getTexture(sourceId);
4374 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004375 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4376 sourceLevel, ConvertToBool(unpackFlipY),
4377 ConvertToBool(unpackPremultiplyAlpha),
4378 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004379}
4380
Jamie Madill007530e2017-12-28 14:27:04 -05004381void Context::copySubTexture(GLuint sourceId,
4382 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004383 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004384 GLuint destId,
4385 GLint destLevel,
4386 GLint xoffset,
4387 GLint yoffset,
4388 GLint x,
4389 GLint y,
4390 GLsizei width,
4391 GLsizei height,
4392 GLboolean unpackFlipY,
4393 GLboolean unpackPremultiplyAlpha,
4394 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004395{
4396 // Zero sized copies are valid but no-ops
4397 if (width == 0 || height == 0)
4398 {
4399 return;
4400 }
4401
Jamie Madillbc918e72018-03-08 09:47:21 -05004402 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004403
4404 gl::Texture *sourceTexture = getTexture(sourceId);
4405 gl::Texture *destTexture = getTexture(destId);
4406 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004407 Box box(x, y, 0, width, height, 1);
4408 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4409 ConvertToBool(unpackFlipY),
4410 ConvertToBool(unpackPremultiplyAlpha),
4411 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4412}
4413
4414void Context::copyTexture3D(GLuint sourceId,
4415 GLint sourceLevel,
4416 TextureTarget destTarget,
4417 GLuint destId,
4418 GLint destLevel,
4419 GLint internalFormat,
4420 GLenum destType,
4421 GLboolean unpackFlipY,
4422 GLboolean unpackPremultiplyAlpha,
4423 GLboolean unpackUnmultiplyAlpha)
4424{
4425 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4426
4427 Texture *sourceTexture = getTexture(sourceId);
4428 Texture *destTexture = getTexture(destId);
4429 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4430 sourceLevel, ConvertToBool(unpackFlipY),
4431 ConvertToBool(unpackPremultiplyAlpha),
4432 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4433}
4434
4435void Context::copySubTexture3D(GLuint sourceId,
4436 GLint sourceLevel,
4437 TextureTarget destTarget,
4438 GLuint destId,
4439 GLint destLevel,
4440 GLint xoffset,
4441 GLint yoffset,
4442 GLint zoffset,
4443 GLint x,
4444 GLint y,
4445 GLint z,
4446 GLsizei width,
4447 GLsizei height,
4448 GLsizei depth,
4449 GLboolean unpackFlipY,
4450 GLboolean unpackPremultiplyAlpha,
4451 GLboolean unpackUnmultiplyAlpha)
4452{
4453 // Zero sized copies are valid but no-ops
4454 if (width == 0 || height == 0 || depth == 0)
4455 {
4456 return;
4457 }
4458
4459 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4460
4461 Texture *sourceTexture = getTexture(sourceId);
4462 Texture *destTexture = getTexture(destId);
4463 Offset offset(xoffset, yoffset, zoffset);
4464 Box box(x, y, z, width, height, depth);
4465 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004466 ConvertToBool(unpackFlipY),
4467 ConvertToBool(unpackPremultiplyAlpha),
4468 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004469}
4470
Jamie Madill007530e2017-12-28 14:27:04 -05004471void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004472{
Jamie Madillbc918e72018-03-08 09:47:21 -05004473 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004474
4475 gl::Texture *sourceTexture = getTexture(sourceId);
4476 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004477 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004478}
4479
Corentin Wallez336129f2017-10-17 15:55:40 -04004480void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004481{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004482 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004483 ASSERT(buffer);
4484
Geoff Lang496c02d2016-10-20 11:38:11 -07004485 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004486}
4487
Brandon Jones59770802018-04-02 13:18:42 -07004488void Context::getBufferPointervRobust(BufferBinding target,
4489 GLenum pname,
4490 GLsizei bufSize,
4491 GLsizei *length,
4492 void **params)
4493{
4494 getBufferPointerv(target, pname, params);
4495}
4496
Corentin Wallez336129f2017-10-17 15:55:40 -04004497void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004498{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004499 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004500 ASSERT(buffer);
4501
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004502 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004503 if (error.isError())
4504 {
Jamie Madill437fa652016-05-03 15:13:24 -04004505 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004506 return nullptr;
4507 }
4508
4509 return buffer->getMapPointer();
4510}
4511
Corentin Wallez336129f2017-10-17 15:55:40 -04004512GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004513{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004514 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004515 ASSERT(buffer);
4516
4517 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004518 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004519 if (error.isError())
4520 {
Jamie Madill437fa652016-05-03 15:13:24 -04004521 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004522 return GL_FALSE;
4523 }
4524
4525 return result;
4526}
4527
Corentin Wallez336129f2017-10-17 15:55:40 -04004528void *Context::mapBufferRange(BufferBinding target,
4529 GLintptr offset,
4530 GLsizeiptr length,
4531 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004532{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004533 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004534 ASSERT(buffer);
4535
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004536 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004537 if (error.isError())
4538 {
Jamie Madill437fa652016-05-03 15:13:24 -04004539 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004540 return nullptr;
4541 }
4542
4543 return buffer->getMapPointer();
4544}
4545
Corentin Wallez336129f2017-10-17 15:55:40 -04004546void Context::flushMappedBufferRange(BufferBinding /*target*/,
4547 GLintptr /*offset*/,
4548 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004549{
4550 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4551}
4552
Jamie Madill526392d2018-11-16 09:35:14 -05004553angle::Result Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004554{
Geoff Langa8cb2872018-03-09 16:09:40 -05004555 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004556}
4557
Jamie Madill526392d2018-11-16 09:35:14 -05004558angle::Result Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004559{
Geoff Langa8cb2872018-03-09 16:09:40 -05004560 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004561}
4562
Jamie Madill526392d2018-11-16 09:35:14 -05004563angle::Result Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004564{
Geoff Langa8cb2872018-03-09 16:09:40 -05004565 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004566}
4567
Jamie Madill526392d2018-11-16 09:35:14 -05004568angle::Result Context::syncStateForPathOperation()
Geoff Lang9bf86f02018-07-26 11:46:34 -04004569{
4570 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4571
4572 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4573 ANGLE_TRY(syncDirtyBits());
4574
Jamie Madill526392d2018-11-16 09:35:14 -05004575 return angle::Result::Continue();
Geoff Lang9bf86f02018-07-26 11:46:34 -04004576}
4577
Jiajia Qin5451d532017-11-16 17:16:34 +08004578void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4579{
4580 UNIMPLEMENTED();
4581}
4582
Jamie Madillc20ab272016-06-09 07:20:46 -07004583void Context::activeTexture(GLenum texture)
4584{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004585 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004586}
4587
Jamie Madill876429b2017-04-20 15:46:24 -04004588void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004589{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004590 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004591}
4592
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004593void Context::blendEquation(GLenum mode)
4594{
4595 mGLState.setBlendEquation(mode, mode);
4596}
4597
Jamie Madillc20ab272016-06-09 07:20:46 -07004598void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4599{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004600 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004601}
4602
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004603void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4604{
4605 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4606}
4607
Jamie Madillc20ab272016-06-09 07:20:46 -07004608void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4609{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004610 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004611}
4612
Jamie Madill876429b2017-04-20 15:46:24 -04004613void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004614{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004615 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004616}
4617
Jamie Madill876429b2017-04-20 15:46:24 -04004618void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004619{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004620 mGLState.setDepthClearValue(clamp01(depth));
Jamie Madillc20ab272016-06-09 07:20:46 -07004621}
4622
4623void Context::clearStencil(GLint s)
4624{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004625 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004626}
4627
4628void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4629{
Geoff Lang92019432017-11-20 13:09:34 -05004630 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4631 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004632}
4633
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004634void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004635{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004636 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004637}
4638
4639void Context::depthFunc(GLenum func)
4640{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004641 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004642}
4643
4644void Context::depthMask(GLboolean flag)
4645{
Geoff Lang92019432017-11-20 13:09:34 -05004646 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004647}
4648
Jamie Madill876429b2017-04-20 15:46:24 -04004649void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004650{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004651 mGLState.setDepthRange(clamp01(zNear), clamp01(zFar));
Jamie Madillc20ab272016-06-09 07:20:46 -07004652}
4653
4654void Context::disable(GLenum cap)
4655{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004656 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004657 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004658}
4659
4660void Context::disableVertexAttribArray(GLuint index)
4661{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004662 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004663 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004664}
4665
4666void Context::enable(GLenum cap)
4667{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004668 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004669 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004670}
4671
4672void Context::enableVertexAttribArray(GLuint index)
4673{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004674 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004675 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004676}
4677
4678void Context::frontFace(GLenum mode)
4679{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004680 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004681}
4682
4683void Context::hint(GLenum target, GLenum mode)
4684{
4685 switch (target)
4686 {
4687 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004688 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004689 break;
4690
4691 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004692 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004693 break;
4694
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004695 case GL_PERSPECTIVE_CORRECTION_HINT:
4696 case GL_POINT_SMOOTH_HINT:
4697 case GL_LINE_SMOOTH_HINT:
4698 case GL_FOG_HINT:
4699 mGLState.gles1().setHint(target, mode);
4700 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004701 default:
4702 UNREACHABLE();
4703 return;
4704 }
4705}
4706
4707void Context::lineWidth(GLfloat width)
4708{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004709 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004710}
4711
4712void Context::pixelStorei(GLenum pname, GLint param)
4713{
4714 switch (pname)
4715 {
4716 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004717 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004718 break;
4719
4720 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004721 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004722 break;
4723
4724 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004725 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004726 break;
4727
4728 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004729 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004730 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004731 break;
4732
4733 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004734 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004735 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004736 break;
4737
4738 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004739 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004740 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004741 break;
4742
4743 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004744 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004745 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004746 break;
4747
4748 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004749 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004750 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004751 break;
4752
4753 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004754 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004755 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004756 break;
4757
4758 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004759 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004760 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004761 break;
4762
4763 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004764 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004765 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004766 break;
4767
4768 default:
4769 UNREACHABLE();
4770 return;
4771 }
4772}
4773
4774void Context::polygonOffset(GLfloat factor, GLfloat units)
4775{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004776 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004777}
4778
Jamie Madill876429b2017-04-20 15:46:24 -04004779void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004780{
Geoff Lang92019432017-11-20 13:09:34 -05004781 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004782}
4783
Jiawei Shaodb342272017-09-27 10:21:45 +08004784void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4785{
4786 mGLState.setSampleMaskParams(maskNumber, mask);
4787}
4788
Jamie Madillc20ab272016-06-09 07:20:46 -07004789void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4790{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004791 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004792}
4793
4794void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4795{
4796 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4797 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004798 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004799 }
4800
4801 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4802 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004803 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004804 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004805
4806 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004807}
4808
4809void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4810{
4811 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4812 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004813 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004814 }
4815
4816 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4817 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004818 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004819 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004820
4821 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004822}
4823
4824void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4825{
4826 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4827 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004828 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004829 }
4830
4831 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4832 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004833 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004834 }
4835}
4836
4837void Context::vertexAttrib1f(GLuint index, GLfloat x)
4838{
4839 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004840 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004841 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004842}
4843
4844void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4845{
4846 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004847 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004848 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004849}
4850
4851void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4852{
4853 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004854 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004855 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004856}
4857
4858void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4859{
4860 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004861 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004862 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004863}
4864
4865void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4866{
4867 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004868 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004869 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004870}
4871
4872void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4873{
4874 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004875 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004876 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004877}
4878
4879void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4880{
4881 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004882 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004883 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004884}
4885
4886void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4887{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004888 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004889 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004890}
4891
4892void Context::vertexAttribPointer(GLuint index,
4893 GLint size,
4894 GLenum type,
4895 GLboolean normalized,
4896 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004897 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004898{
Corentin Wallez336129f2017-10-17 15:55:40 -04004899 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004900 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004901 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004902}
4903
Shao80957d92017-02-20 21:25:59 +08004904void Context::vertexAttribFormat(GLuint attribIndex,
4905 GLint size,
4906 GLenum type,
4907 GLboolean normalized,
4908 GLuint relativeOffset)
4909{
Geoff Lang92019432017-11-20 13:09:34 -05004910 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004911 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004912 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004913}
4914
4915void Context::vertexAttribIFormat(GLuint attribIndex,
4916 GLint size,
4917 GLenum type,
4918 GLuint relativeOffset)
4919{
4920 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004921 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004922}
4923
4924void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4925{
Shaodde78e82017-05-22 14:13:27 +08004926 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004927 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004928}
4929
Jiajia Qin5451d532017-11-16 17:16:34 +08004930void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004931{
4932 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004933 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004934}
4935
Jamie Madillc20ab272016-06-09 07:20:46 -07004936void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4937{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004938 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004939}
4940
4941void Context::vertexAttribIPointer(GLuint index,
4942 GLint size,
4943 GLenum type,
4944 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004945 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004946{
Corentin Wallez336129f2017-10-17 15:55:40 -04004947 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4948 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004949 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004950}
4951
4952void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4953{
4954 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004955 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004956 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004957}
4958
4959void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4960{
4961 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004962 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004963 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004964}
4965
4966void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4967{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004968 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004969 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004970}
4971
4972void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4973{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004974 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004975 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004976}
4977
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004978void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4979{
4980 const VertexAttribCurrentValueData &currentValues =
4981 getGLState().getVertexAttribCurrentValue(index);
4982 const VertexArray *vao = getGLState().getVertexArray();
4983 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4984 currentValues, pname, params);
4985}
4986
Brandon Jones59770802018-04-02 13:18:42 -07004987void Context::getVertexAttribivRobust(GLuint index,
4988 GLenum pname,
4989 GLsizei bufSize,
4990 GLsizei *length,
4991 GLint *params)
4992{
4993 getVertexAttribiv(index, pname, params);
4994}
4995
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004996void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4997{
4998 const VertexAttribCurrentValueData &currentValues =
4999 getGLState().getVertexAttribCurrentValue(index);
5000 const VertexArray *vao = getGLState().getVertexArray();
5001 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5002 currentValues, pname, params);
5003}
5004
Brandon Jones59770802018-04-02 13:18:42 -07005005void Context::getVertexAttribfvRobust(GLuint index,
5006 GLenum pname,
5007 GLsizei bufSize,
5008 GLsizei *length,
5009 GLfloat *params)
5010{
5011 getVertexAttribfv(index, pname, params);
5012}
5013
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005014void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
5015{
5016 const VertexAttribCurrentValueData &currentValues =
5017 getGLState().getVertexAttribCurrentValue(index);
5018 const VertexArray *vao = getGLState().getVertexArray();
5019 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5020 currentValues, pname, params);
5021}
5022
Brandon Jones59770802018-04-02 13:18:42 -07005023void Context::getVertexAttribIivRobust(GLuint index,
5024 GLenum pname,
5025 GLsizei bufSize,
5026 GLsizei *length,
5027 GLint *params)
5028{
5029 getVertexAttribIiv(index, pname, params);
5030}
5031
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005032void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
5033{
5034 const VertexAttribCurrentValueData &currentValues =
5035 getGLState().getVertexAttribCurrentValue(index);
5036 const VertexArray *vao = getGLState().getVertexArray();
5037 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5038 currentValues, pname, params);
5039}
5040
Brandon Jones59770802018-04-02 13:18:42 -07005041void Context::getVertexAttribIuivRobust(GLuint index,
5042 GLenum pname,
5043 GLsizei bufSize,
5044 GLsizei *length,
5045 GLuint *params)
5046{
5047 getVertexAttribIuiv(index, pname, params);
5048}
5049
Jamie Madill876429b2017-04-20 15:46:24 -04005050void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005051{
5052 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
5053 QueryVertexAttribPointerv(attrib, pname, pointer);
5054}
5055
Brandon Jones59770802018-04-02 13:18:42 -07005056void Context::getVertexAttribPointervRobust(GLuint index,
5057 GLenum pname,
5058 GLsizei bufSize,
5059 GLsizei *length,
5060 void **pointer)
5061{
5062 getVertexAttribPointerv(index, pname, pointer);
5063}
5064
Jamie Madillc20ab272016-06-09 07:20:46 -07005065void Context::debugMessageControl(GLenum source,
5066 GLenum type,
5067 GLenum severity,
5068 GLsizei count,
5069 const GLuint *ids,
5070 GLboolean enabled)
5071{
5072 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005073 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05005074 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07005075}
5076
5077void Context::debugMessageInsert(GLenum source,
5078 GLenum type,
5079 GLuint id,
5080 GLenum severity,
5081 GLsizei length,
5082 const GLchar *buf)
5083{
5084 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005085 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005086}
5087
5088void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5089{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005090 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005091}
5092
5093GLuint Context::getDebugMessageLog(GLuint count,
5094 GLsizei bufSize,
5095 GLenum *sources,
5096 GLenum *types,
5097 GLuint *ids,
5098 GLenum *severities,
5099 GLsizei *lengths,
5100 GLchar *messageLog)
5101{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005102 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5103 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005104}
5105
5106void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5107{
5108 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005109 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005110 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005111}
5112
5113void Context::popDebugGroup()
5114{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005115 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005116 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005117}
5118
Corentin Wallez336129f2017-10-17 15:55:40 -04005119void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005120{
5121 Buffer *buffer = mGLState.getTargetBuffer(target);
5122 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005123 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005124}
5125
Corentin Wallez336129f2017-10-17 15:55:40 -04005126void Context::bufferSubData(BufferBinding target,
5127 GLintptr offset,
5128 GLsizeiptr size,
5129 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005130{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005131 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005132 {
5133 return;
5134 }
5135
5136 Buffer *buffer = mGLState.getTargetBuffer(target);
5137 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005138 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005139}
5140
Jamie Madillef300b12016-10-07 15:12:09 -04005141void Context::attachShader(GLuint program, GLuint shader)
5142{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005143 Program *programObject = mState.mShaderPrograms->getProgram(program);
5144 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005145 ASSERT(programObject && shaderObject);
5146 programObject->attachShader(shaderObject);
5147}
5148
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005149const Workarounds &Context::getWorkarounds() const
5150{
5151 return mWorkarounds;
5152}
5153
Corentin Wallez336129f2017-10-17 15:55:40 -04005154void Context::copyBufferSubData(BufferBinding readTarget,
5155 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005156 GLintptr readOffset,
5157 GLintptr writeOffset,
5158 GLsizeiptr size)
5159{
5160 // if size is zero, the copy is a successful no-op
5161 if (size == 0)
5162 {
5163 return;
5164 }
5165
5166 // TODO(jmadill): cache these.
5167 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5168 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5169
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005170 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005171}
5172
Jamie Madill01a80ee2016-11-07 12:06:18 -05005173void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5174{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005175 // Ideally we could share the program query with the validation layer if possible.
5176 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005177 ASSERT(programObject);
5178 programObject->bindAttributeLocation(index, name);
5179}
5180
Corentin Wallez336129f2017-10-17 15:55:40 -04005181void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005182{
Corentin Wallez336129f2017-10-17 15:55:40 -04005183 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5184 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005185 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005186}
5187
Corentin Wallez336129f2017-10-17 15:55:40 -04005188void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005189{
5190 bindBufferRange(target, index, buffer, 0, 0);
5191}
5192
Corentin Wallez336129f2017-10-17 15:55:40 -04005193void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005194 GLuint index,
5195 GLuint buffer,
5196 GLintptr offset,
5197 GLsizeiptr size)
5198{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005199 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5200 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5201 if (target == BufferBinding::Uniform)
5202 {
Jamie Madill472ddc82018-10-18 18:41:56 -04005203 mUniformBufferObserverBindings[index].bind(object);
Jamie Madilld84b6732018-09-06 15:54:35 -04005204 mStateCache.onUniformBufferStateChange(this);
5205 }
5206 else
5207 {
5208 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005209 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005210}
5211
Jamie Madill01a80ee2016-11-07 12:06:18 -05005212void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5213{
5214 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5215 {
5216 bindReadFramebuffer(framebuffer);
5217 }
5218
5219 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5220 {
5221 bindDrawFramebuffer(framebuffer);
5222 }
5223}
5224
5225void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5226{
5227 ASSERT(target == GL_RENDERBUFFER);
5228 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005229 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005230 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005231}
5232
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005233void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005234 GLsizei samples,
5235 GLenum internalformat,
5236 GLsizei width,
5237 GLsizei height,
5238 GLboolean fixedsamplelocations)
5239{
5240 Extents size(width, height, 1);
5241 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005242 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5243 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005244}
5245
Olli Etuaho89664842018-08-24 14:45:36 +03005246void Context::texStorage3DMultisample(TextureType target,
5247 GLsizei samples,
5248 GLenum internalformat,
5249 GLsizei width,
5250 GLsizei height,
5251 GLsizei depth,
5252 GLboolean fixedsamplelocations)
5253{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005254 Extents size(width, height, depth);
5255 Texture *texture = getTargetTexture(target);
5256 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5257 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005258}
5259
JiangYizhoubddc46b2016-12-09 09:50:51 +08005260void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5261{
JiangYizhou5b03f472017-01-09 10:22:53 +08005262 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5263 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005264 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005265 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005266
5267 switch (pname)
5268 {
5269 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005270 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005271 break;
5272 default:
5273 UNREACHABLE();
5274 }
5275}
5276
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005277void Context::getMultisamplefvRobust(GLenum pname,
5278 GLuint index,
5279 GLsizei bufSize,
5280 GLsizei *length,
5281 GLfloat *val)
5282{
5283 UNIMPLEMENTED();
5284}
5285
Jamie Madille8fb6402017-02-14 17:56:40 -05005286void Context::renderbufferStorage(GLenum target,
5287 GLenum internalformat,
5288 GLsizei width,
5289 GLsizei height)
5290{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005291 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5292 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5293
Jamie Madille8fb6402017-02-14 17:56:40 -05005294 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005295 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005296}
5297
5298void Context::renderbufferStorageMultisample(GLenum target,
5299 GLsizei samples,
5300 GLenum internalformat,
5301 GLsizei width,
5302 GLsizei height)
5303{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005304 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5305 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005306
5307 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005308 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005309 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005310}
5311
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005312void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5313{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005314 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005315 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005316}
5317
JiangYizhoue18e6392017-02-20 10:32:23 +08005318void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5319{
5320 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5321 QueryFramebufferParameteriv(framebuffer, pname, params);
5322}
5323
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005324void Context::getFramebufferParameterivRobust(GLenum target,
5325 GLenum pname,
5326 GLsizei bufSize,
5327 GLsizei *length,
5328 GLint *params)
5329{
5330 UNIMPLEMENTED();
5331}
5332
Jiajia Qin5451d532017-11-16 17:16:34 +08005333void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005334{
5335 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005336 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005337}
5338
Jamie Madilldec86232018-07-11 09:01:18 -04005339bool Context::getScratchBuffer(size_t requstedSizeBytes,
5340 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005341{
Jamie Madilldec86232018-07-11 09:01:18 -04005342 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005343}
5344
Jamie Madilldec86232018-07-11 09:01:18 -04005345bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5346 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005347{
Jamie Madilldec86232018-07-11 09:01:18 -04005348 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005349}
5350
Jamie Madill526392d2018-11-16 09:35:14 -05005351angle::Result Context::prepareForDispatch()
Xinghua Cao10a4d432017-11-28 14:46:26 +08005352{
Jamie Madill0cc11c62018-10-12 18:07:18 -04005353 ANGLE_TRY(syncDirtyObjects(mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005354
5355 if (isRobustResourceInitEnabled())
5356 {
5357 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5358 }
5359
Jamie Madill0cc11c62018-10-12 18:07:18 -04005360 return syncDirtyBits(mComputeDirtyBits);
Xinghua Cao10a4d432017-11-28 14:46:26 +08005361}
5362
Xinghua Cao2b396592017-03-29 15:36:04 +08005363void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5364{
5365 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5366 {
5367 return;
5368 }
5369
Xinghua Cao10a4d432017-11-28 14:46:26 +08005370 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005371 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005372}
5373
Jiajia Qin5451d532017-11-16 17:16:34 +08005374void Context::dispatchComputeIndirect(GLintptr indirect)
5375{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005376 ANGLE_CONTEXT_TRY(prepareForDispatch());
5377 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005378}
5379
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005380void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005381 GLsizei levels,
5382 GLenum internalFormat,
5383 GLsizei width,
5384 GLsizei height)
5385{
5386 Extents size(width, height, 1);
5387 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005388 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005389}
5390
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005391void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005392 GLsizei levels,
5393 GLenum internalFormat,
5394 GLsizei width,
5395 GLsizei height,
5396 GLsizei depth)
5397{
5398 Extents size(width, height, depth);
5399 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005400 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005401}
5402
Jiajia Qin5451d532017-11-16 17:16:34 +08005403void Context::memoryBarrier(GLbitfield barriers)
5404{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005405 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005406}
5407
5408void Context::memoryBarrierByRegion(GLbitfield barriers)
5409{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005410 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005411}
5412
Austin Eng1bf18ce2018-10-19 15:34:02 -07005413void Context::multiDrawArrays(PrimitiveMode mode,
5414 const GLint *firsts,
5415 const GLsizei *counts,
5416 GLsizei drawcount)
5417{
5418 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5419 Program *programObject = mGLState.getLinkedProgram(this);
5420 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5421 if (hasDrawID)
5422 {
5423 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5424 {
5425 if (noopDraw(mode, counts[drawID]))
5426 {
5427 continue;
5428 }
5429 programObject->setDrawIDUniform(drawID);
5430 ANGLE_CONTEXT_TRY(
5431 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
5432 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5433 counts[drawID], 1);
5434 }
5435 }
5436 else
5437 {
5438 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5439 {
5440 if (noopDraw(mode, counts[drawID]))
5441 {
5442 continue;
5443 }
5444 ANGLE_CONTEXT_TRY(
5445 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
5446 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5447 counts[drawID], 1);
5448 }
5449 }
5450}
5451
5452void Context::multiDrawArraysInstanced(PrimitiveMode mode,
5453 const GLint *firsts,
5454 const GLsizei *counts,
5455 const GLsizei *instanceCounts,
5456 GLsizei drawcount)
5457{
5458 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5459 Program *programObject = mGLState.getLinkedProgram(this);
5460 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5461 if (hasDrawID)
5462 {
5463 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5464 {
5465 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5466 {
5467 continue;
5468 }
5469 programObject->setDrawIDUniform(drawID);
5470 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5471 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
5472 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5473 counts[drawID], instanceCounts[drawID]);
5474 }
5475 }
5476 else
5477 {
5478 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5479 {
5480 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5481 {
5482 continue;
5483 }
5484 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5485 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
5486 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5487 counts[drawID], instanceCounts[drawID]);
5488 }
5489 }
5490}
5491
5492void Context::multiDrawElements(PrimitiveMode mode,
5493 const GLsizei *counts,
5494 GLenum type,
5495 const GLsizei *offsets,
5496 GLsizei drawcount)
5497{
5498 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5499 Program *programObject = mGLState.getLinkedProgram(this);
5500 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5501 if (hasDrawID)
5502 {
5503 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5504 {
5505 if (noopDraw(mode, counts[drawID]))
5506 {
5507 continue;
5508 }
5509 programObject->setDrawIDUniform(drawID);
5510 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5511 ANGLE_CONTEXT_TRY(
5512 mImplementation->drawElements(this, mode, counts[drawID], type, indices));
5513 }
5514 }
5515 else
5516 {
5517 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5518 {
5519 if (noopDraw(mode, counts[drawID]))
5520 {
5521 continue;
5522 }
5523 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5524 ANGLE_CONTEXT_TRY(
5525 mImplementation->drawElements(this, mode, counts[drawID], type, indices));
5526 }
5527 }
5528}
5529
5530void Context::multiDrawElementsInstanced(PrimitiveMode mode,
5531 const GLsizei *counts,
5532 GLenum type,
5533 const GLsizei *offsets,
5534 const GLsizei *instanceCounts,
5535 GLsizei drawcount)
5536{
5537 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5538 Program *programObject = mGLState.getLinkedProgram(this);
5539 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5540 if (hasDrawID)
5541 {
5542 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5543 {
5544 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5545 {
5546 continue;
5547 }
5548 programObject->setDrawIDUniform(drawID);
5549 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5550 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
5551 this, mode, counts[drawID], type, indices, instanceCounts[drawID]));
5552 }
5553 }
5554 else
5555 {
5556 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5557 {
5558 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5559 {
5560 continue;
5561 }
5562 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5563 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
5564 this, mode, counts[drawID], type, indices, instanceCounts[drawID]));
5565 }
5566 }
5567}
5568
Jamie Madillc1d770e2017-04-13 17:31:24 -04005569GLenum Context::checkFramebufferStatus(GLenum target)
5570{
5571 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5572 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005573 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005574}
5575
5576void Context::compileShader(GLuint shader)
5577{
5578 Shader *shaderObject = GetValidShader(this, shader);
5579 if (!shaderObject)
5580 {
5581 return;
5582 }
5583 shaderObject->compile(this);
5584}
5585
5586void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5587{
5588 for (int i = 0; i < n; i++)
5589 {
5590 deleteBuffer(buffers[i]);
5591 }
5592}
5593
5594void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5595{
5596 for (int i = 0; i < n; i++)
5597 {
5598 if (framebuffers[i] != 0)
5599 {
5600 deleteFramebuffer(framebuffers[i]);
5601 }
5602 }
5603}
5604
5605void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5606{
5607 for (int i = 0; i < n; i++)
5608 {
5609 deleteRenderbuffer(renderbuffers[i]);
5610 }
5611}
5612
5613void Context::deleteTextures(GLsizei n, const GLuint *textures)
5614{
5615 for (int i = 0; i < n; i++)
5616 {
5617 if (textures[i] != 0)
5618 {
5619 deleteTexture(textures[i]);
5620 }
5621 }
5622}
5623
5624void Context::detachShader(GLuint program, GLuint shader)
5625{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005626 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005627 ASSERT(programObject);
5628
5629 Shader *shaderObject = getShader(shader);
5630 ASSERT(shaderObject);
5631
5632 programObject->detachShader(this, shaderObject);
5633}
5634
5635void Context::genBuffers(GLsizei n, GLuint *buffers)
5636{
5637 for (int i = 0; i < n; i++)
5638 {
5639 buffers[i] = createBuffer();
5640 }
5641}
5642
5643void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5644{
5645 for (int i = 0; i < n; i++)
5646 {
5647 framebuffers[i] = createFramebuffer();
5648 }
5649}
5650
5651void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5652{
5653 for (int i = 0; i < n; i++)
5654 {
5655 renderbuffers[i] = createRenderbuffer();
5656 }
5657}
5658
5659void Context::genTextures(GLsizei n, GLuint *textures)
5660{
5661 for (int i = 0; i < n; i++)
5662 {
5663 textures[i] = createTexture();
5664 }
5665}
5666
5667void Context::getActiveAttrib(GLuint program,
5668 GLuint index,
5669 GLsizei bufsize,
5670 GLsizei *length,
5671 GLint *size,
5672 GLenum *type,
5673 GLchar *name)
5674{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005675 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005676 ASSERT(programObject);
5677 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5678}
5679
5680void Context::getActiveUniform(GLuint program,
5681 GLuint index,
5682 GLsizei bufsize,
5683 GLsizei *length,
5684 GLint *size,
5685 GLenum *type,
5686 GLchar *name)
5687{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005688 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005689 ASSERT(programObject);
5690 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5691}
5692
5693void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5694{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005695 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005696 ASSERT(programObject);
5697 programObject->getAttachedShaders(maxcount, count, shaders);
5698}
5699
5700GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5701{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005702 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005703 ASSERT(programObject);
5704 return programObject->getAttributeLocation(name);
5705}
5706
5707void Context::getBooleanv(GLenum pname, GLboolean *params)
5708{
5709 GLenum nativeType;
5710 unsigned int numParams = 0;
5711 getQueryParameterInfo(pname, &nativeType, &numParams);
5712
5713 if (nativeType == GL_BOOL)
5714 {
5715 getBooleanvImpl(pname, params);
5716 }
5717 else
5718 {
5719 CastStateValues(this, nativeType, pname, numParams, params);
5720 }
5721}
5722
Brandon Jones59770802018-04-02 13:18:42 -07005723void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5724{
5725 getBooleanv(pname, params);
5726}
5727
Jamie Madillc1d770e2017-04-13 17:31:24 -04005728void Context::getFloatv(GLenum pname, GLfloat *params)
5729{
5730 GLenum nativeType;
5731 unsigned int numParams = 0;
5732 getQueryParameterInfo(pname, &nativeType, &numParams);
5733
5734 if (nativeType == GL_FLOAT)
5735 {
5736 getFloatvImpl(pname, params);
5737 }
5738 else
5739 {
5740 CastStateValues(this, nativeType, pname, numParams, params);
5741 }
5742}
5743
Brandon Jones59770802018-04-02 13:18:42 -07005744void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5745{
5746 getFloatv(pname, params);
5747}
5748
Jamie Madillc1d770e2017-04-13 17:31:24 -04005749void Context::getIntegerv(GLenum pname, GLint *params)
5750{
5751 GLenum nativeType;
5752 unsigned int numParams = 0;
5753 getQueryParameterInfo(pname, &nativeType, &numParams);
5754
5755 if (nativeType == GL_INT)
5756 {
5757 getIntegervImpl(pname, params);
5758 }
5759 else
5760 {
5761 CastStateValues(this, nativeType, pname, numParams, params);
5762 }
5763}
5764
Brandon Jones59770802018-04-02 13:18:42 -07005765void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5766{
5767 getIntegerv(pname, data);
5768}
5769
Jamie Madillc1d770e2017-04-13 17:31:24 -04005770void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5771{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005772 // Don't resolve link if checking the link completion status.
5773 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5774 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005775 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005776 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005777}
5778
Brandon Jones59770802018-04-02 13:18:42 -07005779void Context::getProgramivRobust(GLuint program,
5780 GLenum pname,
5781 GLsizei bufSize,
5782 GLsizei *length,
5783 GLint *params)
5784{
5785 getProgramiv(program, pname, params);
5786}
5787
Jiajia Qin5451d532017-11-16 17:16:34 +08005788void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5789{
5790 UNIMPLEMENTED();
5791}
5792
Jamie Madillbe849e42017-05-02 15:49:00 -04005793void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005794{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005795 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005796 ASSERT(programObject);
5797 programObject->getInfoLog(bufsize, length, infolog);
5798}
5799
Jiajia Qin5451d532017-11-16 17:16:34 +08005800void Context::getProgramPipelineInfoLog(GLuint pipeline,
5801 GLsizei bufSize,
5802 GLsizei *length,
5803 GLchar *infoLog)
5804{
5805 UNIMPLEMENTED();
5806}
5807
Jamie Madillc1d770e2017-04-13 17:31:24 -04005808void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5809{
5810 Shader *shaderObject = getShader(shader);
5811 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005812 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005813}
5814
Brandon Jones59770802018-04-02 13:18:42 -07005815void Context::getShaderivRobust(GLuint shader,
5816 GLenum pname,
5817 GLsizei bufSize,
5818 GLsizei *length,
5819 GLint *params)
5820{
5821 getShaderiv(shader, pname, params);
5822}
5823
Jamie Madillc1d770e2017-04-13 17:31:24 -04005824void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5825{
5826 Shader *shaderObject = getShader(shader);
5827 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005828 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005829}
5830
5831void Context::getShaderPrecisionFormat(GLenum shadertype,
5832 GLenum precisiontype,
5833 GLint *range,
5834 GLint *precision)
5835{
5836 // TODO(jmadill): Compute shaders.
5837
5838 switch (shadertype)
5839 {
5840 case GL_VERTEX_SHADER:
5841 switch (precisiontype)
5842 {
5843 case GL_LOW_FLOAT:
5844 mCaps.vertexLowpFloat.get(range, precision);
5845 break;
5846 case GL_MEDIUM_FLOAT:
5847 mCaps.vertexMediumpFloat.get(range, precision);
5848 break;
5849 case GL_HIGH_FLOAT:
5850 mCaps.vertexHighpFloat.get(range, precision);
5851 break;
5852
5853 case GL_LOW_INT:
5854 mCaps.vertexLowpInt.get(range, precision);
5855 break;
5856 case GL_MEDIUM_INT:
5857 mCaps.vertexMediumpInt.get(range, precision);
5858 break;
5859 case GL_HIGH_INT:
5860 mCaps.vertexHighpInt.get(range, precision);
5861 break;
5862
5863 default:
5864 UNREACHABLE();
5865 return;
5866 }
5867 break;
5868
5869 case GL_FRAGMENT_SHADER:
5870 switch (precisiontype)
5871 {
5872 case GL_LOW_FLOAT:
5873 mCaps.fragmentLowpFloat.get(range, precision);
5874 break;
5875 case GL_MEDIUM_FLOAT:
5876 mCaps.fragmentMediumpFloat.get(range, precision);
5877 break;
5878 case GL_HIGH_FLOAT:
5879 mCaps.fragmentHighpFloat.get(range, precision);
5880 break;
5881
5882 case GL_LOW_INT:
5883 mCaps.fragmentLowpInt.get(range, precision);
5884 break;
5885 case GL_MEDIUM_INT:
5886 mCaps.fragmentMediumpInt.get(range, precision);
5887 break;
5888 case GL_HIGH_INT:
5889 mCaps.fragmentHighpInt.get(range, precision);
5890 break;
5891
5892 default:
5893 UNREACHABLE();
5894 return;
5895 }
5896 break;
5897
5898 default:
5899 UNREACHABLE();
5900 return;
5901 }
5902}
5903
5904void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5905{
5906 Shader *shaderObject = getShader(shader);
5907 ASSERT(shaderObject);
5908 shaderObject->getSource(bufsize, length, source);
5909}
5910
5911void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5912{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005913 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005914 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005915 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005916}
5917
Brandon Jones59770802018-04-02 13:18:42 -07005918void Context::getUniformfvRobust(GLuint program,
5919 GLint location,
5920 GLsizei bufSize,
5921 GLsizei *length,
5922 GLfloat *params)
5923{
5924 getUniformfv(program, location, params);
5925}
5926
Jamie Madillc1d770e2017-04-13 17:31:24 -04005927void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5928{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005929 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005930 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005931 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005932}
5933
Brandon Jones59770802018-04-02 13:18:42 -07005934void Context::getUniformivRobust(GLuint program,
5935 GLint location,
5936 GLsizei bufSize,
5937 GLsizei *length,
5938 GLint *params)
5939{
5940 getUniformiv(program, location, params);
5941}
5942
Jamie Madillc1d770e2017-04-13 17:31:24 -04005943GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5944{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005945 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005946 ASSERT(programObject);
5947 return programObject->getUniformLocation(name);
5948}
5949
5950GLboolean Context::isBuffer(GLuint buffer)
5951{
5952 if (buffer == 0)
5953 {
5954 return GL_FALSE;
5955 }
5956
5957 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5958}
5959
5960GLboolean Context::isEnabled(GLenum cap)
5961{
5962 return mGLState.getEnableFeature(cap);
5963}
5964
5965GLboolean Context::isFramebuffer(GLuint framebuffer)
5966{
5967 if (framebuffer == 0)
5968 {
5969 return GL_FALSE;
5970 }
5971
5972 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5973}
5974
5975GLboolean Context::isProgram(GLuint program)
5976{
5977 if (program == 0)
5978 {
5979 return GL_FALSE;
5980 }
5981
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005982 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005983}
5984
5985GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5986{
5987 if (renderbuffer == 0)
5988 {
5989 return GL_FALSE;
5990 }
5991
5992 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5993}
5994
5995GLboolean Context::isShader(GLuint shader)
5996{
5997 if (shader == 0)
5998 {
5999 return GL_FALSE;
6000 }
6001
6002 return (getShader(shader) ? GL_TRUE : GL_FALSE);
6003}
6004
6005GLboolean Context::isTexture(GLuint texture)
6006{
6007 if (texture == 0)
6008 {
6009 return GL_FALSE;
6010 }
6011
6012 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
6013}
6014
6015void Context::linkProgram(GLuint program)
6016{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006017 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006018 ASSERT(programObject);
6019 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08006020
6021 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
6022 // don't need to worry that:
6023 // 1. Draw calls after link use the new executable code or the old one depending on the link
6024 // result.
6025 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
6026 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
6027 // ProgramD3D.
6028 if (programObject->isInUse())
6029 {
Jamie Madill785e8a02018-10-04 17:42:00 -04006030 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04006031 if (programObject->isLinked())
6032 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006033 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006034 }
jchen107ae70d82018-07-06 13:47:01 +08006035 mStateCache.onProgramExecutableChange(this);
6036 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04006037}
6038
6039void Context::releaseShaderCompiler()
6040{
Jamie Madill4928b7c2017-06-20 12:57:39 -04006041 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006042}
6043
6044void Context::shaderBinary(GLsizei n,
6045 const GLuint *shaders,
6046 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04006047 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04006048 GLsizei length)
6049{
6050 // No binary shader formats are supported.
6051 UNIMPLEMENTED();
6052}
6053
Olli Etuaho0ca09752018-09-24 11:00:50 +03006054void Context::bindFragDataLocationIndexed(GLuint program,
6055 GLuint colorNumber,
6056 GLuint index,
6057 const char *name)
6058{
6059 Program *programObject = getProgramNoResolveLink(program);
6060 programObject->bindFragmentOutputLocation(colorNumber, name);
6061 programObject->bindFragmentOutputIndex(index, name);
6062}
6063
6064void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
6065{
6066 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
6067}
6068
6069int Context::getFragDataIndex(GLuint program, const char *name)
6070{
6071 Program *programObject = getProgramResolveLink(program);
6072 return programObject->getFragDataIndex(name);
6073}
6074
6075int Context::getProgramResourceLocationIndex(GLuint program,
6076 GLenum programInterface,
6077 const char *name)
6078{
6079 Program *programObject = getProgramResolveLink(program);
6080 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
6081 return programObject->getFragDataIndex(name);
6082}
6083
Jamie Madillc1d770e2017-04-13 17:31:24 -04006084void Context::shaderSource(GLuint shader,
6085 GLsizei count,
6086 const GLchar *const *string,
6087 const GLint *length)
6088{
6089 Shader *shaderObject = getShader(shader);
6090 ASSERT(shaderObject);
6091 shaderObject->setSource(count, string, length);
6092}
6093
6094void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
6095{
6096 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
6097}
6098
6099void Context::stencilMask(GLuint mask)
6100{
6101 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
6102}
6103
6104void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
6105{
6106 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
6107}
6108
6109void Context::uniform1f(GLint location, GLfloat x)
6110{
6111 Program *program = mGLState.getProgram();
6112 program->setUniform1fv(location, 1, &x);
6113}
6114
6115void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
6116{
6117 Program *program = mGLState.getProgram();
6118 program->setUniform1fv(location, count, v);
6119}
6120
Jamie Madill7e4eff12018-08-08 15:49:26 -04006121void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006122{
Jamie Madill7e4eff12018-08-08 15:49:26 -04006123 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04006124 {
6125 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006126 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04006127 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04006128}
6129
Jamie Madill7e4eff12018-08-08 15:49:26 -04006130void Context::uniform1i(GLint location, GLint x)
6131{
6132 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
6133}
6134
Jamie Madillc1d770e2017-04-13 17:31:24 -04006135void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
6136{
Jamie Madill7e4eff12018-08-08 15:49:26 -04006137 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006138}
6139
6140void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
6141{
6142 GLfloat xy[2] = {x, y};
6143 Program *program = mGLState.getProgram();
6144 program->setUniform2fv(location, 1, xy);
6145}
6146
6147void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
6148{
6149 Program *program = mGLState.getProgram();
6150 program->setUniform2fv(location, count, v);
6151}
6152
6153void Context::uniform2i(GLint location, GLint x, GLint y)
6154{
6155 GLint xy[2] = {x, y};
6156 Program *program = mGLState.getProgram();
6157 program->setUniform2iv(location, 1, xy);
6158}
6159
6160void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
6161{
6162 Program *program = mGLState.getProgram();
6163 program->setUniform2iv(location, count, v);
6164}
6165
6166void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6167{
6168 GLfloat xyz[3] = {x, y, z};
6169 Program *program = mGLState.getProgram();
6170 program->setUniform3fv(location, 1, xyz);
6171}
6172
6173void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
6174{
6175 Program *program = mGLState.getProgram();
6176 program->setUniform3fv(location, count, v);
6177}
6178
6179void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
6180{
6181 GLint xyz[3] = {x, y, z};
6182 Program *program = mGLState.getProgram();
6183 program->setUniform3iv(location, 1, xyz);
6184}
6185
6186void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
6187{
6188 Program *program = mGLState.getProgram();
6189 program->setUniform3iv(location, count, v);
6190}
6191
6192void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6193{
6194 GLfloat xyzw[4] = {x, y, z, w};
6195 Program *program = mGLState.getProgram();
6196 program->setUniform4fv(location, 1, xyzw);
6197}
6198
6199void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
6200{
6201 Program *program = mGLState.getProgram();
6202 program->setUniform4fv(location, count, v);
6203}
6204
6205void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6206{
6207 GLint xyzw[4] = {x, y, z, w};
6208 Program *program = mGLState.getProgram();
6209 program->setUniform4iv(location, 1, xyzw);
6210}
6211
6212void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
6213{
6214 Program *program = mGLState.getProgram();
6215 program->setUniform4iv(location, count, v);
6216}
6217
6218void Context::uniformMatrix2fv(GLint location,
6219 GLsizei count,
6220 GLboolean transpose,
6221 const GLfloat *value)
6222{
6223 Program *program = mGLState.getProgram();
6224 program->setUniformMatrix2fv(location, count, transpose, value);
6225}
6226
6227void Context::uniformMatrix3fv(GLint location,
6228 GLsizei count,
6229 GLboolean transpose,
6230 const GLfloat *value)
6231{
6232 Program *program = mGLState.getProgram();
6233 program->setUniformMatrix3fv(location, count, transpose, value);
6234}
6235
6236void Context::uniformMatrix4fv(GLint location,
6237 GLsizei count,
6238 GLboolean transpose,
6239 const GLfloat *value)
6240{
6241 Program *program = mGLState.getProgram();
6242 program->setUniformMatrix4fv(location, count, transpose, value);
6243}
6244
6245void Context::validateProgram(GLuint program)
6246{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006247 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006248 ASSERT(programObject);
6249 programObject->validate(mCaps);
6250}
6251
Jiajia Qin5451d532017-11-16 17:16:34 +08006252void Context::validateProgramPipeline(GLuint pipeline)
6253{
6254 UNIMPLEMENTED();
6255}
6256
Jamie Madilld04908b2017-06-09 14:15:35 -04006257void Context::getProgramBinary(GLuint program,
6258 GLsizei bufSize,
6259 GLsizei *length,
6260 GLenum *binaryFormat,
6261 void *binary)
6262{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006263 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006264 ASSERT(programObject != nullptr);
6265
6266 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
6267}
6268
6269void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6270{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006271 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006272 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006273
Jamie Madilld04908b2017-06-09 14:15:35 -04006274 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006275 if (programObject->isInUse())
6276 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006277 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006278 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006279 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006280}
6281
Jamie Madillff325f12017-08-26 15:06:05 -04006282void Context::uniform1ui(GLint location, GLuint v0)
6283{
6284 Program *program = mGLState.getProgram();
6285 program->setUniform1uiv(location, 1, &v0);
6286}
6287
6288void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6289{
6290 Program *program = mGLState.getProgram();
6291 const GLuint xy[] = {v0, v1};
6292 program->setUniform2uiv(location, 1, xy);
6293}
6294
6295void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6296{
6297 Program *program = mGLState.getProgram();
6298 const GLuint xyz[] = {v0, v1, v2};
6299 program->setUniform3uiv(location, 1, xyz);
6300}
6301
6302void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6303{
6304 Program *program = mGLState.getProgram();
6305 const GLuint xyzw[] = {v0, v1, v2, v3};
6306 program->setUniform4uiv(location, 1, xyzw);
6307}
6308
6309void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6310{
6311 Program *program = mGLState.getProgram();
6312 program->setUniform1uiv(location, count, value);
6313}
6314void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6315{
6316 Program *program = mGLState.getProgram();
6317 program->setUniform2uiv(location, count, value);
6318}
6319
6320void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6321{
6322 Program *program = mGLState.getProgram();
6323 program->setUniform3uiv(location, count, value);
6324}
6325
6326void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6327{
6328 Program *program = mGLState.getProgram();
6329 program->setUniform4uiv(location, count, value);
6330}
6331
Jamie Madillf0e04492017-08-26 15:28:42 -04006332void Context::genQueries(GLsizei n, GLuint *ids)
6333{
6334 for (GLsizei i = 0; i < n; i++)
6335 {
6336 GLuint handle = mQueryHandleAllocator.allocate();
6337 mQueryMap.assign(handle, nullptr);
6338 ids[i] = handle;
6339 }
6340}
6341
6342void Context::deleteQueries(GLsizei n, const GLuint *ids)
6343{
6344 for (int i = 0; i < n; i++)
6345 {
6346 GLuint query = ids[i];
6347
6348 Query *queryObject = nullptr;
6349 if (mQueryMap.erase(query, &queryObject))
6350 {
6351 mQueryHandleAllocator.release(query);
6352 if (queryObject)
6353 {
6354 queryObject->release(this);
6355 }
6356 }
6357 }
6358}
6359
6360GLboolean Context::isQuery(GLuint id)
6361{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006362 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006363}
6364
Jamie Madillc8c95812017-08-26 18:40:09 -04006365void Context::uniformMatrix2x3fv(GLint location,
6366 GLsizei count,
6367 GLboolean transpose,
6368 const GLfloat *value)
6369{
6370 Program *program = mGLState.getProgram();
6371 program->setUniformMatrix2x3fv(location, count, transpose, value);
6372}
6373
6374void Context::uniformMatrix3x2fv(GLint location,
6375 GLsizei count,
6376 GLboolean transpose,
6377 const GLfloat *value)
6378{
6379 Program *program = mGLState.getProgram();
6380 program->setUniformMatrix3x2fv(location, count, transpose, value);
6381}
6382
6383void Context::uniformMatrix2x4fv(GLint location,
6384 GLsizei count,
6385 GLboolean transpose,
6386 const GLfloat *value)
6387{
6388 Program *program = mGLState.getProgram();
6389 program->setUniformMatrix2x4fv(location, count, transpose, value);
6390}
6391
6392void Context::uniformMatrix4x2fv(GLint location,
6393 GLsizei count,
6394 GLboolean transpose,
6395 const GLfloat *value)
6396{
6397 Program *program = mGLState.getProgram();
6398 program->setUniformMatrix4x2fv(location, count, transpose, value);
6399}
6400
6401void Context::uniformMatrix3x4fv(GLint location,
6402 GLsizei count,
6403 GLboolean transpose,
6404 const GLfloat *value)
6405{
6406 Program *program = mGLState.getProgram();
6407 program->setUniformMatrix3x4fv(location, count, transpose, value);
6408}
6409
6410void Context::uniformMatrix4x3fv(GLint location,
6411 GLsizei count,
6412 GLboolean transpose,
6413 const GLfloat *value)
6414{
6415 Program *program = mGLState.getProgram();
6416 program->setUniformMatrix4x3fv(location, count, transpose, value);
6417}
6418
Jamie Madilld7576732017-08-26 18:49:50 -04006419void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6420{
6421 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6422 {
6423 GLuint vertexArray = arrays[arrayIndex];
6424
6425 if (arrays[arrayIndex] != 0)
6426 {
6427 VertexArray *vertexArrayObject = nullptr;
6428 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6429 {
6430 if (vertexArrayObject != nullptr)
6431 {
6432 detachVertexArray(vertexArray);
6433 vertexArrayObject->onDestroy(this);
6434 }
6435
6436 mVertexArrayHandleAllocator.release(vertexArray);
6437 }
6438 }
6439 }
6440}
6441
6442void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6443{
6444 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6445 {
6446 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6447 mVertexArrayMap.assign(vertexArray, nullptr);
6448 arrays[arrayIndex] = vertexArray;
6449 }
6450}
6451
6452bool Context::isVertexArray(GLuint array)
6453{
6454 if (array == 0)
6455 {
6456 return GL_FALSE;
6457 }
6458
6459 VertexArray *vao = getVertexArray(array);
6460 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6461}
6462
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006463void Context::endTransformFeedback()
6464{
6465 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6466 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006467 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006468}
6469
6470void Context::transformFeedbackVaryings(GLuint program,
6471 GLsizei count,
6472 const GLchar *const *varyings,
6473 GLenum bufferMode)
6474{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006475 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006476 ASSERT(programObject);
6477 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6478}
6479
6480void Context::getTransformFeedbackVarying(GLuint program,
6481 GLuint index,
6482 GLsizei bufSize,
6483 GLsizei *length,
6484 GLsizei *size,
6485 GLenum *type,
6486 GLchar *name)
6487{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006488 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006489 ASSERT(programObject);
6490 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6491}
6492
6493void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6494{
6495 for (int i = 0; i < n; i++)
6496 {
6497 GLuint transformFeedback = ids[i];
6498 if (transformFeedback == 0)
6499 {
6500 continue;
6501 }
6502
6503 TransformFeedback *transformFeedbackObject = nullptr;
6504 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6505 {
6506 if (transformFeedbackObject != nullptr)
6507 {
6508 detachTransformFeedback(transformFeedback);
6509 transformFeedbackObject->release(this);
6510 }
6511
6512 mTransformFeedbackHandleAllocator.release(transformFeedback);
6513 }
6514 }
6515}
6516
6517void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6518{
6519 for (int i = 0; i < n; i++)
6520 {
6521 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6522 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6523 ids[i] = transformFeedback;
6524 }
6525}
6526
6527bool Context::isTransformFeedback(GLuint id)
6528{
6529 if (id == 0)
6530 {
6531 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6532 // returns FALSE
6533 return GL_FALSE;
6534 }
6535
6536 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6537 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6538}
6539
6540void Context::pauseTransformFeedback()
6541{
6542 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6543 transformFeedback->pause();
6544}
6545
6546void Context::resumeTransformFeedback()
6547{
6548 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6549 transformFeedback->resume();
6550}
6551
Jamie Madill12e957f2017-08-26 21:42:26 -04006552void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6553{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006554 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006555 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006556}
6557
Brandon Jones59770802018-04-02 13:18:42 -07006558void Context::getUniformuivRobust(GLuint program,
6559 GLint location,
6560 GLsizei bufSize,
6561 GLsizei *length,
6562 GLuint *params)
6563{
6564 getUniformuiv(program, location, params);
6565}
6566
Jamie Madill12e957f2017-08-26 21:42:26 -04006567GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6568{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006569 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006570 return programObject->getFragDataLocation(name);
6571}
6572
6573void Context::getUniformIndices(GLuint program,
6574 GLsizei uniformCount,
6575 const GLchar *const *uniformNames,
6576 GLuint *uniformIndices)
6577{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006578 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006579 if (!programObject->isLinked())
6580 {
6581 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6582 {
6583 uniformIndices[uniformId] = GL_INVALID_INDEX;
6584 }
6585 }
6586 else
6587 {
6588 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6589 {
6590 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6591 }
6592 }
6593}
6594
6595void Context::getActiveUniformsiv(GLuint program,
6596 GLsizei uniformCount,
6597 const GLuint *uniformIndices,
6598 GLenum pname,
6599 GLint *params)
6600{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006601 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006602 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6603 {
6604 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006605 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006606 }
6607}
6608
6609GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6610{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006611 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006612 return programObject->getUniformBlockIndex(uniformBlockName);
6613}
6614
6615void Context::getActiveUniformBlockiv(GLuint program,
6616 GLuint uniformBlockIndex,
6617 GLenum pname,
6618 GLint *params)
6619{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006620 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006621 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6622}
6623
Brandon Jones59770802018-04-02 13:18:42 -07006624void Context::getActiveUniformBlockivRobust(GLuint program,
6625 GLuint uniformBlockIndex,
6626 GLenum pname,
6627 GLsizei bufSize,
6628 GLsizei *length,
6629 GLint *params)
6630{
6631 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6632}
6633
Jamie Madill12e957f2017-08-26 21:42:26 -04006634void Context::getActiveUniformBlockName(GLuint program,
6635 GLuint uniformBlockIndex,
6636 GLsizei bufSize,
6637 GLsizei *length,
6638 GLchar *uniformBlockName)
6639{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006640 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006641 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6642}
6643
6644void Context::uniformBlockBinding(GLuint program,
6645 GLuint uniformBlockIndex,
6646 GLuint uniformBlockBinding)
6647{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006648 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006649 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006650
Jamie Madill956ab4d2018-10-10 16:13:03 -04006651 // Note: If the Program is shared between Contexts we would be better using Observer/Subject.
Jamie Madill70aeda42018-08-20 12:17:40 -04006652 if (programObject->isInUse())
6653 {
6654 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006655 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006656 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006657}
6658
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006659GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6660{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006661 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6662 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006663
Jamie Madill70b5bb02017-08-28 13:32:37 -04006664 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006665 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006666 if (error.isError())
6667 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006668 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006669 handleError(error);
6670 return nullptr;
6671 }
6672
Jamie Madill70b5bb02017-08-28 13:32:37 -04006673 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006674}
6675
6676GLboolean Context::isSync(GLsync sync)
6677{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006678 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006679}
6680
6681GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6682{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006683 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006684
6685 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006686 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006687 return result;
6688}
6689
6690void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6691{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006692 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006693 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006694}
6695
6696void Context::getInteger64v(GLenum pname, GLint64 *params)
6697{
6698 GLenum nativeType = GL_NONE;
6699 unsigned int numParams = 0;
6700 getQueryParameterInfo(pname, &nativeType, &numParams);
6701
6702 if (nativeType == GL_INT_64_ANGLEX)
6703 {
6704 getInteger64vImpl(pname, params);
6705 }
6706 else
6707 {
6708 CastStateValues(this, nativeType, pname, numParams, params);
6709 }
6710}
6711
Brandon Jones59770802018-04-02 13:18:42 -07006712void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6713{
6714 getInteger64v(pname, data);
6715}
6716
Corentin Wallez336129f2017-10-17 15:55:40 -04006717void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006718{
6719 Buffer *buffer = mGLState.getTargetBuffer(target);
6720 QueryBufferParameteri64v(buffer, pname, params);
6721}
6722
Brandon Jones59770802018-04-02 13:18:42 -07006723void Context::getBufferParameteri64vRobust(BufferBinding target,
6724 GLenum pname,
6725 GLsizei bufSize,
6726 GLsizei *length,
6727 GLint64 *params)
6728{
6729 getBufferParameteri64v(target, pname, params);
6730}
6731
Jamie Madill3ef140a2017-08-26 23:11:21 -04006732void Context::genSamplers(GLsizei count, GLuint *samplers)
6733{
6734 for (int i = 0; i < count; i++)
6735 {
6736 samplers[i] = mState.mSamplers->createSampler();
6737 }
6738}
6739
6740void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6741{
6742 for (int i = 0; i < count; i++)
6743 {
6744 GLuint sampler = samplers[i];
6745
6746 if (mState.mSamplers->getSampler(sampler))
6747 {
6748 detachSampler(sampler);
6749 }
6750
6751 mState.mSamplers->deleteObject(this, sampler);
6752 }
6753}
6754
6755void Context::getInternalformativ(GLenum target,
6756 GLenum internalformat,
6757 GLenum pname,
6758 GLsizei bufSize,
6759 GLint *params)
6760{
6761 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6762 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6763}
6764
Brandon Jones59770802018-04-02 13:18:42 -07006765void Context::getInternalformativRobust(GLenum target,
6766 GLenum internalformat,
6767 GLenum pname,
6768 GLsizei bufSize,
6769 GLsizei *length,
6770 GLint *params)
6771{
6772 getInternalformativ(target, internalformat, pname, bufSize, params);
6773}
6774
Jiajia Qin5451d532017-11-16 17:16:34 +08006775void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6776{
6777 programUniform1iv(program, location, 1, &v0);
6778}
6779
6780void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6781{
6782 GLint xy[2] = {v0, v1};
6783 programUniform2iv(program, location, 1, xy);
6784}
6785
6786void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6787{
6788 GLint xyz[3] = {v0, v1, v2};
6789 programUniform3iv(program, location, 1, xyz);
6790}
6791
6792void Context::programUniform4i(GLuint program,
6793 GLint location,
6794 GLint v0,
6795 GLint v1,
6796 GLint v2,
6797 GLint v3)
6798{
6799 GLint xyzw[4] = {v0, v1, v2, v3};
6800 programUniform4iv(program, location, 1, xyzw);
6801}
6802
6803void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6804{
6805 programUniform1uiv(program, location, 1, &v0);
6806}
6807
6808void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6809{
6810 GLuint xy[2] = {v0, v1};
6811 programUniform2uiv(program, location, 1, xy);
6812}
6813
6814void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6815{
6816 GLuint xyz[3] = {v0, v1, v2};
6817 programUniform3uiv(program, location, 1, xyz);
6818}
6819
6820void Context::programUniform4ui(GLuint program,
6821 GLint location,
6822 GLuint v0,
6823 GLuint v1,
6824 GLuint v2,
6825 GLuint v3)
6826{
6827 GLuint xyzw[4] = {v0, v1, v2, v3};
6828 programUniform4uiv(program, location, 1, xyzw);
6829}
6830
6831void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6832{
6833 programUniform1fv(program, location, 1, &v0);
6834}
6835
6836void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6837{
6838 GLfloat xy[2] = {v0, v1};
6839 programUniform2fv(program, location, 1, xy);
6840}
6841
6842void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6843{
6844 GLfloat xyz[3] = {v0, v1, v2};
6845 programUniform3fv(program, location, 1, xyz);
6846}
6847
6848void Context::programUniform4f(GLuint program,
6849 GLint location,
6850 GLfloat v0,
6851 GLfloat v1,
6852 GLfloat v2,
6853 GLfloat v3)
6854{
6855 GLfloat xyzw[4] = {v0, v1, v2, v3};
6856 programUniform4fv(program, location, 1, xyzw);
6857}
6858
Jamie Madill81c2e252017-09-09 23:32:46 -04006859void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6860{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006861 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006862 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006863 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006864}
6865
Jiajia Qin5451d532017-11-16 17:16:34 +08006866void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6867{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006868 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006869 ASSERT(programObject);
6870 programObject->setUniform2iv(location, count, value);
6871}
6872
6873void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6874{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006875 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006876 ASSERT(programObject);
6877 programObject->setUniform3iv(location, count, value);
6878}
6879
6880void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6881{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006882 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006883 ASSERT(programObject);
6884 programObject->setUniform4iv(location, count, value);
6885}
6886
6887void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6888{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006889 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006890 ASSERT(programObject);
6891 programObject->setUniform1uiv(location, count, value);
6892}
6893
6894void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6895{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006896 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006897 ASSERT(programObject);
6898 programObject->setUniform2uiv(location, count, value);
6899}
6900
6901void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6902{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006903 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006904 ASSERT(programObject);
6905 programObject->setUniform3uiv(location, count, value);
6906}
6907
6908void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6909{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006910 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006911 ASSERT(programObject);
6912 programObject->setUniform4uiv(location, count, value);
6913}
6914
6915void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6916{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006917 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006918 ASSERT(programObject);
6919 programObject->setUniform1fv(location, count, value);
6920}
6921
6922void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6923{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006924 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006925 ASSERT(programObject);
6926 programObject->setUniform2fv(location, count, value);
6927}
6928
6929void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6930{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006931 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006932 ASSERT(programObject);
6933 programObject->setUniform3fv(location, count, value);
6934}
6935
6936void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6937{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006938 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006939 ASSERT(programObject);
6940 programObject->setUniform4fv(location, count, value);
6941}
6942
6943void Context::programUniformMatrix2fv(GLuint program,
6944 GLint location,
6945 GLsizei count,
6946 GLboolean transpose,
6947 const GLfloat *value)
6948{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006949 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006950 ASSERT(programObject);
6951 programObject->setUniformMatrix2fv(location, count, transpose, value);
6952}
6953
6954void Context::programUniformMatrix3fv(GLuint program,
6955 GLint location,
6956 GLsizei count,
6957 GLboolean transpose,
6958 const GLfloat *value)
6959{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006960 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006961 ASSERT(programObject);
6962 programObject->setUniformMatrix3fv(location, count, transpose, value);
6963}
6964
6965void Context::programUniformMatrix4fv(GLuint program,
6966 GLint location,
6967 GLsizei count,
6968 GLboolean transpose,
6969 const GLfloat *value)
6970{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006971 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006972 ASSERT(programObject);
6973 programObject->setUniformMatrix4fv(location, count, transpose, value);
6974}
6975
6976void Context::programUniformMatrix2x3fv(GLuint program,
6977 GLint location,
6978 GLsizei count,
6979 GLboolean transpose,
6980 const GLfloat *value)
6981{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006982 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006983 ASSERT(programObject);
6984 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6985}
6986
6987void Context::programUniformMatrix3x2fv(GLuint program,
6988 GLint location,
6989 GLsizei count,
6990 GLboolean transpose,
6991 const GLfloat *value)
6992{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006993 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006994 ASSERT(programObject);
6995 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6996}
6997
6998void Context::programUniformMatrix2x4fv(GLuint program,
6999 GLint location,
7000 GLsizei count,
7001 GLboolean transpose,
7002 const GLfloat *value)
7003{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007004 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007005 ASSERT(programObject);
7006 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
7007}
7008
7009void Context::programUniformMatrix4x2fv(GLuint program,
7010 GLint location,
7011 GLsizei count,
7012 GLboolean transpose,
7013 const GLfloat *value)
7014{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007015 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007016 ASSERT(programObject);
7017 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
7018}
7019
7020void Context::programUniformMatrix3x4fv(GLuint program,
7021 GLint location,
7022 GLsizei count,
7023 GLboolean transpose,
7024 const GLfloat *value)
7025{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007026 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007027 ASSERT(programObject);
7028 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
7029}
7030
7031void Context::programUniformMatrix4x3fv(GLuint program,
7032 GLint location,
7033 GLsizei count,
7034 GLboolean transpose,
7035 const GLfloat *value)
7036{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007037 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007038 ASSERT(programObject);
7039 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
7040}
7041
Jamie Madill81c2e252017-09-09 23:32:46 -04007042void Context::onTextureChange(const Texture *texture)
7043{
7044 // Conservatively assume all textures are dirty.
7045 // TODO(jmadill): More fine-grained update.
7046 mGLState.setObjectDirty(GL_TEXTURE);
7047}
7048
James Darpiniane8a93c62018-01-04 18:02:24 -08007049bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
7050{
7051 return mGLState.isCurrentTransformFeedback(tf);
7052}
James Darpiniane8a93c62018-01-04 18:02:24 -08007053
Yunchao Hea336b902017-08-02 16:05:21 +08007054void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
7055{
7056 for (int i = 0; i < count; i++)
7057 {
7058 pipelines[i] = createProgramPipeline();
7059 }
7060}
7061
7062void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
7063{
7064 for (int i = 0; i < count; i++)
7065 {
7066 if (pipelines[i] != 0)
7067 {
7068 deleteProgramPipeline(pipelines[i]);
7069 }
7070 }
7071}
7072
7073GLboolean Context::isProgramPipeline(GLuint pipeline)
7074{
7075 if (pipeline == 0)
7076 {
7077 return GL_FALSE;
7078 }
7079
7080 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
7081}
7082
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007083void Context::finishFenceNV(GLuint fence)
7084{
7085 FenceNV *fenceObject = getFenceNV(fence);
7086
7087 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04007088 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007089}
7090
7091void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
7092{
7093 FenceNV *fenceObject = getFenceNV(fence);
7094
7095 ASSERT(fenceObject && fenceObject->isSet());
7096
7097 switch (pname)
7098 {
7099 case GL_FENCE_STATUS_NV:
7100 {
7101 // GL_NV_fence spec:
7102 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
7103 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
7104 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
7105 GLboolean status = GL_TRUE;
7106 if (fenceObject->getStatus() != GL_TRUE)
7107 {
Jamie Madilla0691b72018-07-25 10:41:22 -04007108 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007109 }
7110 *params = status;
7111 break;
7112 }
7113
7114 case GL_FENCE_CONDITION_NV:
7115 {
7116 *params = static_cast<GLint>(fenceObject->getCondition());
7117 break;
7118 }
7119
7120 default:
7121 UNREACHABLE();
7122 }
7123}
7124
7125void Context::getTranslatedShaderSource(GLuint shader,
7126 GLsizei bufsize,
7127 GLsizei *length,
7128 GLchar *source)
7129{
7130 Shader *shaderObject = getShader(shader);
7131 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08007132 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007133}
7134
7135void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
7136{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007137 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007138 ASSERT(programObject);
7139
7140 programObject->getUniformfv(this, location, params);
7141}
7142
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007143void Context::getnUniformfvRobust(GLuint program,
7144 GLint location,
7145 GLsizei bufSize,
7146 GLsizei *length,
7147 GLfloat *params)
7148{
7149 UNIMPLEMENTED();
7150}
7151
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007152void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
7153{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007154 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007155 ASSERT(programObject);
7156
7157 programObject->getUniformiv(this, location, params);
7158}
7159
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007160void Context::getnUniformivRobust(GLuint program,
7161 GLint location,
7162 GLsizei bufSize,
7163 GLsizei *length,
7164 GLint *params)
7165{
7166 UNIMPLEMENTED();
7167}
7168
7169void Context::getnUniformuivRobust(GLuint program,
7170 GLint location,
7171 GLsizei bufSize,
7172 GLsizei *length,
7173 GLuint *params)
7174{
7175 UNIMPLEMENTED();
7176}
7177
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007178GLboolean Context::isFenceNV(GLuint fence)
7179{
7180 FenceNV *fenceObject = getFenceNV(fence);
7181
7182 if (fenceObject == nullptr)
7183 {
7184 return GL_FALSE;
7185 }
7186
7187 // GL_NV_fence spec:
7188 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
7189 // existing fence.
7190 return fenceObject->isSet();
7191}
7192
7193void Context::readnPixels(GLint x,
7194 GLint y,
7195 GLsizei width,
7196 GLsizei height,
7197 GLenum format,
7198 GLenum type,
7199 GLsizei bufSize,
7200 void *data)
7201{
7202 return readPixels(x, y, width, height, format, type, data);
7203}
7204
Jamie Madill007530e2017-12-28 14:27:04 -05007205void Context::setFenceNV(GLuint fence, GLenum condition)
7206{
7207 ASSERT(condition == GL_ALL_COMPLETED_NV);
7208
7209 FenceNV *fenceObject = getFenceNV(fence);
7210 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04007211 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05007212}
7213
7214GLboolean Context::testFenceNV(GLuint fence)
7215{
7216 FenceNV *fenceObject = getFenceNV(fence);
7217
7218 ASSERT(fenceObject != nullptr);
7219 ASSERT(fenceObject->isSet() == GL_TRUE);
7220
7221 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04007222 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05007223 if (error.isError())
7224 {
7225 handleError(error);
7226 return GL_TRUE;
7227 }
7228
7229 return result;
7230}
7231
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007232void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007233{
7234 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007235 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05007236 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007237}
7238
Jamie Madillfa920eb2018-01-04 11:45:50 -05007239void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007240{
7241 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007242 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05007243 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
7244}
7245
Jamie Madillfa920eb2018-01-04 11:45:50 -05007246void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7247{
7248 UNIMPLEMENTED();
7249}
7250
Jamie Madill5b772312018-03-08 20:28:32 -05007251bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7252{
7253 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7254 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7255 // to the fact that it is stored internally as a float, and so would require conversion
7256 // if returned from Context::getIntegerv. Since this conversion is already implemented
7257 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7258 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7259 // application.
7260 switch (pname)
7261 {
7262 case GL_COMPRESSED_TEXTURE_FORMATS:
7263 {
7264 *type = GL_INT;
7265 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7266 return true;
7267 }
7268 case GL_SHADER_BINARY_FORMATS:
7269 {
7270 *type = GL_INT;
7271 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7272 return true;
7273 }
7274
7275 case GL_MAX_VERTEX_ATTRIBS:
7276 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7277 case GL_MAX_VARYING_VECTORS:
7278 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7279 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7280 case GL_MAX_TEXTURE_IMAGE_UNITS:
7281 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7282 case GL_MAX_RENDERBUFFER_SIZE:
7283 case GL_NUM_SHADER_BINARY_FORMATS:
7284 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7285 case GL_ARRAY_BUFFER_BINDING:
7286 case GL_FRAMEBUFFER_BINDING:
7287 case GL_RENDERBUFFER_BINDING:
7288 case GL_CURRENT_PROGRAM:
7289 case GL_PACK_ALIGNMENT:
7290 case GL_UNPACK_ALIGNMENT:
7291 case GL_GENERATE_MIPMAP_HINT:
7292 case GL_RED_BITS:
7293 case GL_GREEN_BITS:
7294 case GL_BLUE_BITS:
7295 case GL_ALPHA_BITS:
7296 case GL_DEPTH_BITS:
7297 case GL_STENCIL_BITS:
7298 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7299 case GL_CULL_FACE_MODE:
7300 case GL_FRONT_FACE:
7301 case GL_ACTIVE_TEXTURE:
7302 case GL_STENCIL_FUNC:
7303 case GL_STENCIL_VALUE_MASK:
7304 case GL_STENCIL_REF:
7305 case GL_STENCIL_FAIL:
7306 case GL_STENCIL_PASS_DEPTH_FAIL:
7307 case GL_STENCIL_PASS_DEPTH_PASS:
7308 case GL_STENCIL_BACK_FUNC:
7309 case GL_STENCIL_BACK_VALUE_MASK:
7310 case GL_STENCIL_BACK_REF:
7311 case GL_STENCIL_BACK_FAIL:
7312 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7313 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7314 case GL_DEPTH_FUNC:
7315 case GL_BLEND_SRC_RGB:
7316 case GL_BLEND_SRC_ALPHA:
7317 case GL_BLEND_DST_RGB:
7318 case GL_BLEND_DST_ALPHA:
7319 case GL_BLEND_EQUATION_RGB:
7320 case GL_BLEND_EQUATION_ALPHA:
7321 case GL_STENCIL_WRITEMASK:
7322 case GL_STENCIL_BACK_WRITEMASK:
7323 case GL_STENCIL_CLEAR_VALUE:
7324 case GL_SUBPIXEL_BITS:
7325 case GL_MAX_TEXTURE_SIZE:
7326 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7327 case GL_SAMPLE_BUFFERS:
7328 case GL_SAMPLES:
7329 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7330 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7331 case GL_TEXTURE_BINDING_2D:
7332 case GL_TEXTURE_BINDING_CUBE_MAP:
7333 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7334 {
7335 *type = GL_INT;
7336 *numParams = 1;
7337 return true;
7338 }
7339 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7340 {
7341 if (!getExtensions().packReverseRowOrder)
7342 {
7343 return false;
7344 }
7345 *type = GL_INT;
7346 *numParams = 1;
7347 return true;
7348 }
7349 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7350 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7351 {
7352 if (!getExtensions().textureRectangle)
7353 {
7354 return false;
7355 }
7356 *type = GL_INT;
7357 *numParams = 1;
7358 return true;
7359 }
7360 case GL_MAX_DRAW_BUFFERS_EXT:
7361 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7362 {
7363 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7364 {
7365 return false;
7366 }
7367 *type = GL_INT;
7368 *numParams = 1;
7369 return true;
7370 }
7371 case GL_MAX_VIEWPORT_DIMS:
7372 {
7373 *type = GL_INT;
7374 *numParams = 2;
7375 return true;
7376 }
7377 case GL_VIEWPORT:
7378 case GL_SCISSOR_BOX:
7379 {
7380 *type = GL_INT;
7381 *numParams = 4;
7382 return true;
7383 }
7384 case GL_SHADER_COMPILER:
7385 case GL_SAMPLE_COVERAGE_INVERT:
7386 case GL_DEPTH_WRITEMASK:
7387 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7388 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7389 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7390 // bool-natural
7391 case GL_SAMPLE_COVERAGE:
7392 case GL_SCISSOR_TEST:
7393 case GL_STENCIL_TEST:
7394 case GL_DEPTH_TEST:
7395 case GL_BLEND:
7396 case GL_DITHER:
7397 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7398 {
7399 *type = GL_BOOL;
7400 *numParams = 1;
7401 return true;
7402 }
7403 case GL_COLOR_WRITEMASK:
7404 {
7405 *type = GL_BOOL;
7406 *numParams = 4;
7407 return true;
7408 }
7409 case GL_POLYGON_OFFSET_FACTOR:
7410 case GL_POLYGON_OFFSET_UNITS:
7411 case GL_SAMPLE_COVERAGE_VALUE:
7412 case GL_DEPTH_CLEAR_VALUE:
7413 case GL_LINE_WIDTH:
7414 {
7415 *type = GL_FLOAT;
7416 *numParams = 1;
7417 return true;
7418 }
7419 case GL_ALIASED_LINE_WIDTH_RANGE:
7420 case GL_ALIASED_POINT_SIZE_RANGE:
7421 case GL_DEPTH_RANGE:
7422 {
7423 *type = GL_FLOAT;
7424 *numParams = 2;
7425 return true;
7426 }
7427 case GL_COLOR_CLEAR_VALUE:
7428 case GL_BLEND_COLOR:
7429 {
7430 *type = GL_FLOAT;
7431 *numParams = 4;
7432 return true;
7433 }
7434 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7435 if (!getExtensions().textureFilterAnisotropic)
7436 {
7437 return false;
7438 }
7439 *type = GL_FLOAT;
7440 *numParams = 1;
7441 return true;
7442 case GL_TIMESTAMP_EXT:
7443 if (!getExtensions().disjointTimerQuery)
7444 {
7445 return false;
7446 }
7447 *type = GL_INT_64_ANGLEX;
7448 *numParams = 1;
7449 return true;
7450 case GL_GPU_DISJOINT_EXT:
7451 if (!getExtensions().disjointTimerQuery)
7452 {
7453 return false;
7454 }
7455 *type = GL_INT;
7456 *numParams = 1;
7457 return true;
7458 case GL_COVERAGE_MODULATION_CHROMIUM:
7459 if (!getExtensions().framebufferMixedSamples)
7460 {
7461 return false;
7462 }
7463 *type = GL_INT;
7464 *numParams = 1;
7465 return true;
7466 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7467 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7468 {
7469 return false;
7470 }
7471 *type = GL_INT;
7472 *numParams = 1;
7473 return true;
7474 }
7475
7476 if (getExtensions().debug)
7477 {
7478 switch (pname)
7479 {
7480 case GL_DEBUG_LOGGED_MESSAGES:
7481 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7482 case GL_DEBUG_GROUP_STACK_DEPTH:
7483 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7484 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7485 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7486 case GL_MAX_LABEL_LENGTH:
7487 *type = GL_INT;
7488 *numParams = 1;
7489 return true;
7490
7491 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7492 case GL_DEBUG_OUTPUT:
7493 *type = GL_BOOL;
7494 *numParams = 1;
7495 return true;
7496 }
7497 }
7498
7499 if (getExtensions().multisampleCompatibility)
7500 {
7501 switch (pname)
7502 {
7503 case GL_MULTISAMPLE_EXT:
7504 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7505 *type = GL_BOOL;
7506 *numParams = 1;
7507 return true;
7508 }
7509 }
7510
7511 if (getExtensions().pathRendering)
7512 {
7513 switch (pname)
7514 {
7515 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7516 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7517 *type = GL_FLOAT;
7518 *numParams = 16;
7519 return true;
7520 }
7521 }
7522
7523 if (getExtensions().bindGeneratesResource)
7524 {
7525 switch (pname)
7526 {
7527 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7528 *type = GL_BOOL;
7529 *numParams = 1;
7530 return true;
7531 }
7532 }
7533
7534 if (getExtensions().clientArrays)
7535 {
7536 switch (pname)
7537 {
7538 case GL_CLIENT_ARRAYS_ANGLE:
7539 *type = GL_BOOL;
7540 *numParams = 1;
7541 return true;
7542 }
7543 }
7544
7545 if (getExtensions().sRGBWriteControl)
7546 {
7547 switch (pname)
7548 {
7549 case GL_FRAMEBUFFER_SRGB_EXT:
7550 *type = GL_BOOL;
7551 *numParams = 1;
7552 return true;
7553 }
7554 }
7555
7556 if (getExtensions().robustResourceInitialization &&
7557 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7558 {
7559 *type = GL_BOOL;
7560 *numParams = 1;
7561 return true;
7562 }
7563
7564 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7565 {
7566 *type = GL_BOOL;
7567 *numParams = 1;
7568 return true;
7569 }
7570
jchen1082af6202018-06-22 10:59:52 +08007571 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7572 {
7573 *type = GL_INT;
7574 *numParams = 1;
7575 return true;
7576 }
7577
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007578 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7579 {
7580 *type = GL_INT;
7581 *numParams = 1;
7582 return true;
7583 }
7584
Jamie Madill5b772312018-03-08 20:28:32 -05007585 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7586 switch (pname)
7587 {
7588 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7589 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7590 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7591 {
7592 return false;
7593 }
7594 *type = GL_INT;
7595 *numParams = 1;
7596 return true;
7597
7598 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7599 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7600 {
7601 return false;
7602 }
7603 *type = GL_INT;
7604 *numParams = 1;
7605 return true;
7606
7607 case GL_PROGRAM_BINARY_FORMATS_OES:
7608 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7609 {
7610 return false;
7611 }
7612 *type = GL_INT;
7613 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7614 return true;
7615
7616 case GL_PACK_ROW_LENGTH:
7617 case GL_PACK_SKIP_ROWS:
7618 case GL_PACK_SKIP_PIXELS:
7619 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7620 {
7621 return false;
7622 }
7623 *type = GL_INT;
7624 *numParams = 1;
7625 return true;
7626 case GL_UNPACK_ROW_LENGTH:
7627 case GL_UNPACK_SKIP_ROWS:
7628 case GL_UNPACK_SKIP_PIXELS:
7629 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7630 {
7631 return false;
7632 }
7633 *type = GL_INT;
7634 *numParams = 1;
7635 return true;
7636 case GL_VERTEX_ARRAY_BINDING:
7637 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7638 {
7639 return false;
7640 }
7641 *type = GL_INT;
7642 *numParams = 1;
7643 return true;
7644 case GL_PIXEL_PACK_BUFFER_BINDING:
7645 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7646 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7647 {
7648 return false;
7649 }
7650 *type = GL_INT;
7651 *numParams = 1;
7652 return true;
7653 case GL_MAX_SAMPLES:
7654 {
7655 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7656 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7657 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7658 {
7659 return false;
7660 }
7661 *type = GL_INT;
7662 *numParams = 1;
7663 return true;
7664
7665 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7666 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7667 {
7668 return false;
7669 }
7670 *type = GL_INT;
7671 *numParams = 1;
7672 return true;
7673 }
7674 }
7675
7676 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7677 {
7678 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7679 {
7680 return false;
7681 }
7682 *type = GL_INT;
7683 *numParams = 1;
7684 return true;
7685 }
7686
7687 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7688 {
7689 *type = GL_INT;
7690 *numParams = 1;
7691 return true;
7692 }
7693
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007694 if (getClientVersion() < Version(2, 0))
7695 {
7696 switch (pname)
7697 {
7698 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007699 case GL_CLIENT_ACTIVE_TEXTURE:
7700 case GL_MATRIX_MODE:
7701 case GL_MAX_TEXTURE_UNITS:
7702 case GL_MAX_MODELVIEW_STACK_DEPTH:
7703 case GL_MAX_PROJECTION_STACK_DEPTH:
7704 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007705 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007706 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007707 case GL_VERTEX_ARRAY_STRIDE:
7708 case GL_NORMAL_ARRAY_STRIDE:
7709 case GL_COLOR_ARRAY_STRIDE:
7710 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7711 case GL_VERTEX_ARRAY_SIZE:
7712 case GL_COLOR_ARRAY_SIZE:
7713 case GL_TEXTURE_COORD_ARRAY_SIZE:
7714 case GL_VERTEX_ARRAY_TYPE:
7715 case GL_NORMAL_ARRAY_TYPE:
7716 case GL_COLOR_ARRAY_TYPE:
7717 case GL_TEXTURE_COORD_ARRAY_TYPE:
7718 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7719 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7720 case GL_COLOR_ARRAY_BUFFER_BINDING:
7721 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7722 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7723 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7724 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007725 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007726 case GL_MODELVIEW_STACK_DEPTH:
7727 case GL_PROJECTION_STACK_DEPTH:
7728 case GL_TEXTURE_STACK_DEPTH:
7729 case GL_LOGIC_OP_MODE:
7730 case GL_BLEND_SRC:
7731 case GL_BLEND_DST:
7732 case GL_PERSPECTIVE_CORRECTION_HINT:
7733 case GL_POINT_SMOOTH_HINT:
7734 case GL_LINE_SMOOTH_HINT:
7735 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007736 *type = GL_INT;
7737 *numParams = 1;
7738 return true;
7739 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007740 case GL_FOG_DENSITY:
7741 case GL_FOG_START:
7742 case GL_FOG_END:
7743 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007744 case GL_POINT_SIZE:
7745 case GL_POINT_SIZE_MIN:
7746 case GL_POINT_SIZE_MAX:
7747 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007748 *type = GL_FLOAT;
7749 *numParams = 1;
7750 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007751 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007752 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007753 *type = GL_FLOAT;
7754 *numParams = 2;
7755 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007756 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007757 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007758 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007759 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007760 *type = GL_FLOAT;
7761 *numParams = 4;
7762 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007763 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007764 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007765 *type = GL_FLOAT;
7766 *numParams = 3;
7767 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007768 case GL_MODELVIEW_MATRIX:
7769 case GL_PROJECTION_MATRIX:
7770 case GL_TEXTURE_MATRIX:
7771 *type = GL_FLOAT;
7772 *numParams = 16;
7773 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007774 case GL_LIGHT_MODEL_TWO_SIDE:
7775 *type = GL_BOOL;
7776 *numParams = 1;
7777 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007778 }
7779 }
7780
Jamie Madill5b772312018-03-08 20:28:32 -05007781 if (getClientVersion() < Version(3, 0))
7782 {
7783 return false;
7784 }
7785
7786 // Check for ES3.0+ parameter names
7787 switch (pname)
7788 {
7789 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7790 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7791 case GL_UNIFORM_BUFFER_BINDING:
7792 case GL_TRANSFORM_FEEDBACK_BINDING:
7793 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7794 case GL_COPY_READ_BUFFER_BINDING:
7795 case GL_COPY_WRITE_BUFFER_BINDING:
7796 case GL_SAMPLER_BINDING:
7797 case GL_READ_BUFFER:
7798 case GL_TEXTURE_BINDING_3D:
7799 case GL_TEXTURE_BINDING_2D_ARRAY:
7800 case GL_MAX_3D_TEXTURE_SIZE:
7801 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7802 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7803 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7804 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7805 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7806 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7807 case GL_MAX_VARYING_COMPONENTS:
7808 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7809 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7810 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7811 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7812 case GL_NUM_EXTENSIONS:
7813 case GL_MAJOR_VERSION:
7814 case GL_MINOR_VERSION:
7815 case GL_MAX_ELEMENTS_INDICES:
7816 case GL_MAX_ELEMENTS_VERTICES:
7817 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7818 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7819 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7820 case GL_UNPACK_IMAGE_HEIGHT:
7821 case GL_UNPACK_SKIP_IMAGES:
7822 {
7823 *type = GL_INT;
7824 *numParams = 1;
7825 return true;
7826 }
7827
7828 case GL_MAX_ELEMENT_INDEX:
7829 case GL_MAX_UNIFORM_BLOCK_SIZE:
7830 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7831 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7832 case GL_MAX_SERVER_WAIT_TIMEOUT:
7833 {
7834 *type = GL_INT_64_ANGLEX;
7835 *numParams = 1;
7836 return true;
7837 }
7838
7839 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7840 case GL_TRANSFORM_FEEDBACK_PAUSED:
7841 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7842 case GL_RASTERIZER_DISCARD:
7843 {
7844 *type = GL_BOOL;
7845 *numParams = 1;
7846 return true;
7847 }
7848
7849 case GL_MAX_TEXTURE_LOD_BIAS:
7850 {
7851 *type = GL_FLOAT;
7852 *numParams = 1;
7853 return true;
7854 }
7855 }
7856
7857 if (getExtensions().requestExtension)
7858 {
7859 switch (pname)
7860 {
7861 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7862 *type = GL_INT;
7863 *numParams = 1;
7864 return true;
7865 }
7866 }
7867
Yizhou Jiang7818a852018-09-06 15:02:04 +08007868 if (getExtensions().textureMultisample)
7869 {
7870 switch (pname)
7871 {
7872 case GL_MAX_COLOR_TEXTURE_SAMPLES_ANGLE:
7873 case GL_MAX_INTEGER_SAMPLES_ANGLE:
7874 case GL_MAX_DEPTH_TEXTURE_SAMPLES_ANGLE:
7875 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE:
7876 *type = GL_INT;
7877 *numParams = 1;
7878 return true;
7879 }
7880 }
7881
Jamie Madill5b772312018-03-08 20:28:32 -05007882 if (getClientVersion() < Version(3, 1))
7883 {
7884 return false;
7885 }
7886
7887 switch (pname)
7888 {
7889 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7890 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7891 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7892 case GL_MAX_FRAMEBUFFER_WIDTH:
7893 case GL_MAX_FRAMEBUFFER_HEIGHT:
7894 case GL_MAX_FRAMEBUFFER_SAMPLES:
7895 case GL_MAX_SAMPLE_MASK_WORDS:
7896 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7897 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7898 case GL_MAX_INTEGER_SAMPLES:
7899 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7900 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7901 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7902 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7903 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7904 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7905 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7906 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7907 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7908 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7909 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7910 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7911 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7912 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7913 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7914 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7915 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7916 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7917 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7918 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7919 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7920 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7921 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7922 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7923 case GL_MAX_UNIFORM_LOCATIONS:
7924 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7925 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7926 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7927 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7928 case GL_MAX_IMAGE_UNITS:
7929 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7930 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7931 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7932 case GL_SHADER_STORAGE_BUFFER_BINDING:
7933 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7934 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007935 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007936 *type = GL_INT;
7937 *numParams = 1;
7938 return true;
7939 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7940 *type = GL_INT_64_ANGLEX;
7941 *numParams = 1;
7942 return true;
7943 case GL_SAMPLE_MASK:
7944 *type = GL_BOOL;
7945 *numParams = 1;
7946 return true;
7947 }
7948
7949 if (getExtensions().geometryShader)
7950 {
7951 switch (pname)
7952 {
7953 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7954 case GL_LAYER_PROVOKING_VERTEX_EXT:
7955 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7956 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7957 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7958 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7959 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7960 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7961 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7962 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7963 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7964 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7965 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7966 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7967 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7968 *type = GL_INT;
7969 *numParams = 1;
7970 return true;
7971 }
7972 }
7973
7974 return false;
7975}
7976
7977bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7978{
7979 if (getClientVersion() < Version(3, 0))
7980 {
7981 return false;
7982 }
7983
7984 switch (target)
7985 {
7986 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7987 case GL_UNIFORM_BUFFER_BINDING:
7988 {
7989 *type = GL_INT;
7990 *numParams = 1;
7991 return true;
7992 }
7993 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7994 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7995 case GL_UNIFORM_BUFFER_START:
7996 case GL_UNIFORM_BUFFER_SIZE:
7997 {
7998 *type = GL_INT_64_ANGLEX;
7999 *numParams = 1;
8000 return true;
8001 }
8002 }
8003
8004 if (getClientVersion() < Version(3, 1))
8005 {
8006 return false;
8007 }
8008
8009 switch (target)
8010 {
8011 case GL_IMAGE_BINDING_LAYERED:
8012 {
8013 *type = GL_BOOL;
8014 *numParams = 1;
8015 return true;
8016 }
8017 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
8018 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
8019 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
8020 case GL_SHADER_STORAGE_BUFFER_BINDING:
8021 case GL_VERTEX_BINDING_BUFFER:
8022 case GL_VERTEX_BINDING_DIVISOR:
8023 case GL_VERTEX_BINDING_OFFSET:
8024 case GL_VERTEX_BINDING_STRIDE:
8025 case GL_SAMPLE_MASK_VALUE:
8026 case GL_IMAGE_BINDING_NAME:
8027 case GL_IMAGE_BINDING_LEVEL:
8028 case GL_IMAGE_BINDING_LAYER:
8029 case GL_IMAGE_BINDING_ACCESS:
8030 case GL_IMAGE_BINDING_FORMAT:
8031 {
8032 *type = GL_INT;
8033 *numParams = 1;
8034 return true;
8035 }
8036 case GL_ATOMIC_COUNTER_BUFFER_START:
8037 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
8038 case GL_SHADER_STORAGE_BUFFER_START:
8039 case GL_SHADER_STORAGE_BUFFER_SIZE:
8040 {
8041 *type = GL_INT_64_ANGLEX;
8042 *numParams = 1;
8043 return true;
8044 }
8045 }
8046
8047 return false;
8048}
8049
Jamie Madill44a6fbf2018-10-02 13:38:56 -04008050Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05008051{
8052 return mState.mShaderPrograms->getProgram(handle);
8053}
8054
8055Shader *Context::getShader(GLuint handle) const
8056{
8057 return mState.mShaderPrograms->getShader(handle);
8058}
8059
Jamie Madill5b772312018-03-08 20:28:32 -05008060bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
8061{
8062 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
8063}
8064
8065bool Context::isFramebufferGenerated(GLuint framebuffer) const
8066{
8067 return mState.mFramebuffers->isHandleGenerated(framebuffer);
8068}
8069
8070bool Context::isProgramPipelineGenerated(GLuint pipeline) const
8071{
8072 return mState.mPipelines->isHandleGenerated(pipeline);
8073}
8074
8075bool Context::usingDisplayTextureShareGroup() const
8076{
8077 return mDisplayTextureShareGroup;
8078}
8079
8080GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
8081{
8082 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
8083 internalformat == GL_DEPTH_STENCIL
8084 ? GL_DEPTH24_STENCIL8
8085 : internalformat;
8086}
8087
jchen1082af6202018-06-22 10:59:52 +08008088void Context::maxShaderCompilerThreads(GLuint count)
8089{
jchen107ae70d82018-07-06 13:47:01 +08008090 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08008091 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08008092 // A count of zero specifies a request for no parallel compiling or linking.
8093 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
8094 {
8095 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
8096 }
8097 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08008098}
8099
Jamie Madill2eb65032018-07-30 10:25:57 -04008100bool Context::isGLES1() const
8101{
8102 return mState.getClientVersion() < Version(2, 0);
8103}
8104
Jamie Madilla11819d2018-07-30 10:26:01 -04008105void Context::onSubjectStateChange(const Context *context,
8106 angle::SubjectIndex index,
8107 angle::SubjectMessage message)
8108{
Jamie Madilla11819d2018-07-30 10:26:01 -04008109 switch (index)
8110 {
8111 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008112 switch (message)
8113 {
8114 case angle::SubjectMessage::CONTENTS_CHANGED:
8115 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
8116 mStateCache.onVertexArrayBufferContentsChange(this);
8117 break;
8118 case angle::SubjectMessage::RESOURCE_MAPPED:
8119 case angle::SubjectMessage::RESOURCE_UNMAPPED:
8120 case angle::SubjectMessage::BINDING_CHANGED:
8121 mStateCache.onVertexArrayBufferStateChange(this);
8122 break;
8123 default:
8124 break;
8125 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008126 break;
8127
8128 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008129 if (message == angle::SubjectMessage::STORAGE_CHANGED)
8130 {
8131 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
8132 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008133 break;
8134
8135 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008136 if (message == angle::SubjectMessage::STORAGE_CHANGED)
8137 {
8138 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
8139 }
8140 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04008141 break;
8142
8143 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04008144 if (index < kTextureMaxSubjectIndex)
8145 {
8146 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04008147 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008148 }
Jamie Madille25b8002018-09-20 13:39:49 -04008149 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04008150 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04008151 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04008152 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008153 }
Jamie Madille25b8002018-09-20 13:39:49 -04008154 else
8155 {
8156 ASSERT(index < kSamplerMaxSubjectIndex);
8157 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
8158 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008159 break;
8160 }
8161}
8162
Jamie Madill6b873dd2018-07-12 23:56:30 -04008163// ErrorSet implementation.
Jamie Madillb980c562018-11-27 11:34:27 -05008164ErrorSet::ErrorSet(Context *context) : mContext(context) {}
Jamie Madill6b873dd2018-07-12 23:56:30 -04008165
8166ErrorSet::~ErrorSet() = default;
8167
Jamie Madill306b6c12018-07-27 08:12:49 -04008168void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04008169{
8170 // This internal enum is used to filter internal errors that are already handled.
8171 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
8172 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
8173 {
8174 return;
8175 }
8176
8177 if (ANGLE_UNLIKELY(error.isError()))
8178 {
8179 GLenum code = error.getCode();
8180 mErrors.insert(code);
Jamie Madill785e8a02018-10-04 17:42:00 -04008181
Jamie Madill6b873dd2018-07-12 23:56:30 -04008182 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
8183 {
8184 mContext->markContextLost();
8185 }
8186
8187 ASSERT(!error.getMessage().empty());
8188 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
8189 error.getID(), GL_DEBUG_SEVERITY_HIGH,
8190 error.getMessage());
8191 }
8192}
8193
Jamie Madillabfbc0f2018-10-09 12:48:52 -04008194void ErrorSet::handleError(GLenum errorCode,
8195 const char *message,
8196 const char *file,
8197 const char *function,
8198 unsigned int line)
8199{
8200 // TODO(jmadill): Handle error directly instead of creating object. http://anglebug.com/2491
8201 std::stringstream errorStream;
8202 errorStream << "Front-end Error: " << gl::FmtHex(errorCode) << ", in " << file << ", "
8203 << function << ":" << line << ". " << message;
8204
8205 handleError(gl::Error(errorCode, errorCode, errorStream.str()));
8206}
8207
Jamie Madilla139f012018-10-10 16:13:03 -04008208void ErrorSet::validationError(GLenum errorCode, const char *message)
8209{
8210 handleError(gl::Error(errorCode, message));
8211}
8212
Jamie Madill6b873dd2018-07-12 23:56:30 -04008213bool ErrorSet::empty() const
8214{
8215 return mErrors.empty();
8216}
8217
8218GLenum ErrorSet::popError()
8219{
8220 ASSERT(!empty());
8221 GLenum error = *mErrors.begin();
8222 mErrors.erase(mErrors.begin());
8223 return error;
8224}
Jamie Madilldc358af2018-07-31 11:22:13 -04008225
8226// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04008227StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008228 : mCachedHasAnyEnabledClientAttrib(false),
8229 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04008230 mCachedInstancedVertexElementLimit(0),
8231 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madillb980c562018-11-27 11:34:27 -05008232{}
Jamie Madilldc358af2018-07-31 11:22:13 -04008233
8234StateCache::~StateCache() = default;
8235
Jamie Madillac66f982018-10-09 18:30:01 -04008236void StateCache::initialize(Context *context)
8237{
8238 updateValidDrawModes(context);
8239 updateValidBindTextureTypes(context);
8240}
8241
Jamie Madilldc358af2018-07-31 11:22:13 -04008242void StateCache::updateActiveAttribsMask(Context *context)
8243{
8244 bool isGLES1 = context->isGLES1();
8245 const State &glState = context->getGLState();
8246
8247 if (!isGLES1 && !glState.getProgram())
8248 {
8249 mCachedActiveBufferedAttribsMask = AttributesMask();
8250 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008251 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008252 return;
8253 }
8254
8255 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8256 : glState.getProgram()->getActiveAttribLocationsMask();
8257
8258 const VertexArray *vao = glState.getVertexArray();
8259 ASSERT(vao);
8260
8261 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8262 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008263 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008264
Jamie Madill0a17e482018-08-31 17:19:11 -04008265 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8266 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008267 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008268 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8269}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008270
8271void StateCache::updateVertexElementLimits(Context *context)
8272{
8273 const VertexArray *vao = context->getGLState().getVertexArray();
8274
8275 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8276 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8277
8278 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8279 // If there are no buffered attributes then we should not limit the draw call count.
8280 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8281 {
8282 return;
8283 }
8284
8285 const auto &vertexAttribs = vao->getVertexAttributes();
8286 const auto &vertexBindings = vao->getVertexBindings();
8287
8288 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8289 {
8290 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8291 ASSERT(attrib.enabled);
8292
8293 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8294 ASSERT(context->isGLES1() ||
8295 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8296
8297 GLint64 limit = attrib.getCachedElementLimit();
8298 if (binding.getDivisor() > 0)
8299 {
8300 mCachedInstancedVertexElementLimit =
8301 std::min(mCachedInstancedVertexElementLimit, limit);
8302 }
8303 else
8304 {
8305 mCachedNonInstancedVertexElementLimit =
8306 std::min(mCachedNonInstancedVertexElementLimit, limit);
8307 }
8308 }
8309}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008310
Jamie Madilld84b6732018-09-06 15:54:35 -04008311void StateCache::updateBasicDrawStatesError()
8312{
8313 mCachedBasicDrawStatesError = kInvalidPointer;
8314}
8315
8316intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8317{
8318 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8319 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8320 return mCachedBasicDrawStatesError;
8321}
8322
Jamie Madillc43cdad2018-08-08 15:49:25 -04008323void StateCache::onVertexArrayBindingChange(Context *context)
8324{
8325 updateActiveAttribsMask(context);
8326 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008327 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008328}
8329
8330void StateCache::onProgramExecutableChange(Context *context)
8331{
8332 updateActiveAttribsMask(context);
8333 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008334 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008335 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008336}
8337
Jamie Madilld84b6732018-09-06 15:54:35 -04008338void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008339{
8340 updateVertexElementLimits(context);
8341}
8342
Jamie Madilld84b6732018-09-06 15:54:35 -04008343void StateCache::onVertexArrayBufferContentsChange(Context *context)
8344{
8345 updateVertexElementLimits(context);
8346 updateBasicDrawStatesError();
8347}
8348
Jamie Madillc43cdad2018-08-08 15:49:25 -04008349void StateCache::onVertexArrayStateChange(Context *context)
8350{
8351 updateActiveAttribsMask(context);
8352 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008353 updateBasicDrawStatesError();
8354}
8355
8356void StateCache::onVertexArrayBufferStateChange(Context *context)
8357{
8358 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008359}
8360
8361void StateCache::onGLES1ClientStateChange(Context *context)
8362{
8363 updateActiveAttribsMask(context);
8364}
Jamie Madilld84b6732018-09-06 15:54:35 -04008365
8366void StateCache::onDrawFramebufferChange(Context *context)
8367{
8368 updateBasicDrawStatesError();
8369}
8370
8371void StateCache::onContextCapChange(Context *context)
8372{
8373 updateBasicDrawStatesError();
8374}
8375
8376void StateCache::onStencilStateChange(Context *context)
8377{
8378 updateBasicDrawStatesError();
8379}
8380
8381void StateCache::onDefaultVertexAttributeChange(Context *context)
8382{
8383 updateBasicDrawStatesError();
8384}
8385
8386void StateCache::onActiveTextureChange(Context *context)
8387{
8388 updateBasicDrawStatesError();
8389}
8390
8391void StateCache::onQueryChange(Context *context)
8392{
8393 updateBasicDrawStatesError();
8394}
8395
8396void StateCache::onTransformFeedbackChange(Context *context)
8397{
8398 updateBasicDrawStatesError();
8399}
8400
8401void StateCache::onUniformBufferStateChange(Context *context)
8402{
8403 updateBasicDrawStatesError();
8404}
8405
8406void StateCache::onBufferBindingChange(Context *context)
8407{
8408 updateBasicDrawStatesError();
8409}
Jamie Madill526a6f62018-09-12 11:03:05 -04008410
8411void StateCache::updateValidDrawModes(Context *context)
8412{
8413 Program *program = context->getGLState().getProgram();
8414 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8415 {
8416 mCachedValidDrawModes = {{
8417 true, /* Points */
8418 true, /* Lines */
8419 true, /* LineLoop */
8420 true, /* LineStrip */
8421 true, /* Triangles */
8422 true, /* TriangleStrip */
8423 true, /* TriangleFan */
8424 false, /* LinesAdjacency */
8425 false, /* LineStripAdjacency */
8426 false, /* TrianglesAdjacency */
8427 false, /* TriangleStripAdjacency */
8428 false, /* InvalidEnum */
8429 }};
8430 }
8431 else
8432 {
8433 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8434
8435 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8436
8437 mCachedValidDrawModes = {{
8438 gsMode == PrimitiveMode::Points, /* Points */
8439 gsMode == PrimitiveMode::Lines, /* Lines */
8440 gsMode == PrimitiveMode::Lines, /* LineLoop */
8441 gsMode == PrimitiveMode::Lines, /* LineStrip */
8442 gsMode == PrimitiveMode::Triangles, /* Triangles */
8443 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8444 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8445 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8446 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8447 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8448 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8449 false, /* InvalidEnum */
8450 }};
8451 }
8452}
Jamie Madillac66f982018-10-09 18:30:01 -04008453
8454void StateCache::updateValidBindTextureTypes(Context *context)
8455{
8456 const Extensions &exts = context->getExtensions();
8457 bool isGLES3 = context->getClientMajorVersion() >= 3;
8458 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8459
8460 mCachedValidBindTextureTypes = {{
8461 true, /* _2D */
8462 isGLES3, /* _2DArray */
Yizhou Jiang7818a852018-09-06 15:02:04 +08008463 isGLES31 || exts.textureMultisample, /* _2DMultisample */
Jamie Madillac66f982018-10-09 18:30:01 -04008464 exts.textureStorageMultisample2DArray, /* _2DMultisampleArray */
8465 isGLES3, /* _3D */
8466 exts.eglImageExternal || exts.eglStreamConsumerExternal, /* External */
8467 exts.textureRectangle, /* Rectangle */
8468 true, /* CubeMap */
8469 false, /* InvalidEnum */
8470
8471 }};
8472}
Jamie Madillc29968b2016-01-20 11:17:23 -05008473} // namespace gl