blob: 605a3bfc290f9c15dc1111acdb9105aa9915c75b [file] [log] [blame]
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001//
Geoff Langeeba6e12014-02-03 13:12:30 -05002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Context.cpp: Implements the gl::Context class, managing all GL state and performing
8// rendering operations. It is the GLES2 specific implementation of EGLContext.
9
Geoff Lang2b5420c2014-11-19 14:20:15 -050010#include "libANGLE/Context.h"
apatrick@chromium.org144f2802012-07-12 01:42:34 +000011
Jamie Madill231c7f52017-04-26 13:45:37 -040012#include <string.h>
Jamie Madillb9293972015-02-19 11:07:54 -050013#include <iterator>
14#include <sstream>
Sami Väisänend59ca052016-06-21 16:10:00 +030015#include <vector>
Jamie Madillb9293972015-02-19 11:07:54 -050016
Tobin Ehlisd7890bc2018-06-29 11:57:22 -060017#include "common/PackedEnums.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030018#include "common/matrix_utils.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040019#include "common/platform.h"
Jamie Madillb9293972015-02-19 11:07:54 -050020#include "common/utilities.h"
Geoff Langc339c4e2016-11-29 10:37:36 -050021#include "common/version.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050022#include "libANGLE/Buffer.h"
Jamie Madillb9293972015-02-19 11:07:54 -050023#include "libANGLE/Compiler.h"
Jamie Madill948bbe52017-06-01 13:10:42 -040024#include "libANGLE/Display.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050025#include "libANGLE/Fence.h"
26#include "libANGLE/Framebuffer.h"
27#include "libANGLE/FramebufferAttachment.h"
Lingfeng Yang461b09a2018-04-23 09:02:09 -070028#include "libANGLE/GLES1Renderer.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030029#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050030#include "libANGLE/Program.h"
Yunchao Hea336b902017-08-02 16:05:21 +080031#include "libANGLE/ProgramPipeline.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050032#include "libANGLE/Query.h"
Jamie Madillb9293972015-02-19 11:07:54 -050033#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050034#include "libANGLE/ResourceManager.h"
35#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050036#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050037#include "libANGLE/Texture.h"
38#include "libANGLE/TransformFeedback.h"
39#include "libANGLE/VertexArray.h"
Kenneth Russellf2f6f652016-10-05 19:53:23 -070040#include "libANGLE/Workarounds.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040041#include "libANGLE/formatutils.h"
Martin Radev66fb8202016-07-28 11:45:20 +030042#include "libANGLE/queryconversions.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040043#include "libANGLE/queryutils.h"
Jamie Madill6d32cef2018-08-14 02:34:28 -040044#include "libANGLE/renderer/BufferImpl.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040045#include "libANGLE/renderer/ContextImpl.h"
46#include "libANGLE/renderer/EGLImplFactory.h"
Jamie Madill7b62cf92017-11-02 15:20:49 -040047#include "libANGLE/renderer/Format.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040048#include "libANGLE/validationES.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000049
Geoff Langf6db0982015-08-25 13:04:00 -040050namespace
51{
52
Jamie Madillb6664922017-07-25 12:55:04 -040053#define ANGLE_HANDLE_ERR(X) \
54 handleError(X); \
55 return;
56#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
57
Ian Ewell3ffd78b2016-01-22 16:09:42 -050058template <typename T>
Geoff Lang4ddf5af2016-12-01 14:30:44 -050059std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030060 GLsizei numPaths,
61 const void *paths,
62 GLuint pathBase)
63{
64 std::vector<gl::Path *> ret;
65 ret.reserve(numPaths);
66
67 const auto *nameArray = static_cast<const T *>(paths);
68
69 for (GLsizei i = 0; i < numPaths; ++i)
70 {
71 const GLuint pathName = nameArray[i] + pathBase;
72
73 ret.push_back(resourceManager.getPath(pathName));
74 }
75
76 return ret;
77}
78
Geoff Lang4ddf5af2016-12-01 14:30:44 -050079std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030080 GLsizei numPaths,
81 GLenum pathNameType,
82 const void *paths,
83 GLuint pathBase)
84{
85 switch (pathNameType)
86 {
87 case GL_UNSIGNED_BYTE:
88 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
89
90 case GL_BYTE:
91 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
92
93 case GL_UNSIGNED_SHORT:
94 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
95
96 case GL_SHORT:
97 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
98
99 case GL_UNSIGNED_INT:
100 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
101
102 case GL_INT:
103 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
104 }
105
106 UNREACHABLE();
107 return std::vector<gl::Path *>();
108}
109
110template <typename T>
Jamie Madill5188a272018-07-25 10:53:56 -0400111gl::Error GetQueryObjectParameter(const gl::Context *context,
112 gl::Query *query,
113 GLenum pname,
114 T *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500115{
Geoff Lang2186c382016-10-14 10:54:54 -0400116 ASSERT(query != nullptr);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500117
118 switch (pname)
119 {
120 case GL_QUERY_RESULT_EXT:
Jamie Madill5188a272018-07-25 10:53:56 -0400121 return query->getResult(context, params);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500122 case GL_QUERY_RESULT_AVAILABLE_EXT:
123 {
124 bool available;
Jamie Madill5188a272018-07-25 10:53:56 -0400125 gl::Error error = query->isResultAvailable(context, &available);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500126 if (!error.isError())
127 {
jchen10a99ed552017-09-22 08:10:32 +0800128 *params = gl::CastFromStateValue<T>(pname, static_cast<GLuint>(available));
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500129 }
130 return error;
131 }
132 default:
133 UNREACHABLE();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500134 return gl::InternalError() << "Unreachable Error";
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500135 }
136}
137
Jamie Madill956ab4d2018-10-10 16:13:03 -0400138ANGLE_INLINE void MarkTransformFeedbackBufferUsage(const gl::Context *context,
139 gl::TransformFeedback *transformFeedback,
140 GLsizei count,
141 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -0400142{
Geoff Lang1a683462015-09-29 15:09:59 -0400143 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400144 {
Jamie Madill09463932018-04-04 05:26:59 -0400145 transformFeedback->onVerticesDrawn(context, count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -0400146 }
147}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500148
149// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300150EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500151{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400152 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500153}
154
Martin Radev1be913c2016-07-11 17:59:16 +0300155EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
156{
157 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
158}
159
Geoff Langeb66a6e2016-10-31 13:06:12 -0400160gl::Version GetClientVersion(const egl::AttributeMap &attribs)
161{
162 return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
163}
164
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500165GLenum GetResetStrategy(const egl::AttributeMap &attribs)
166{
Lingfeng Yangb27b03a2018-02-19 13:38:48 -0800167 EGLAttrib attrib =
168 attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500169 switch (attrib)
170 {
171 case EGL_NO_RESET_NOTIFICATION:
172 return GL_NO_RESET_NOTIFICATION_EXT;
173 case EGL_LOSE_CONTEXT_ON_RESET:
174 return GL_LOSE_CONTEXT_ON_RESET_EXT;
175 default:
176 UNREACHABLE();
177 return GL_NONE;
178 }
179}
180
181bool GetRobustAccess(const egl::AttributeMap &attribs)
182{
Geoff Lang077f20a2016-11-01 10:08:02 -0400183 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
184 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
185 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500186}
187
188bool GetDebug(const egl::AttributeMap &attribs)
189{
Geoff Lang077f20a2016-11-01 10:08:02 -0400190 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
191 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500192}
193
194bool GetNoError(const egl::AttributeMap &attribs)
195{
196 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
197}
198
Geoff Langc287ea62016-09-16 14:46:51 -0400199bool GetWebGLContext(const egl::AttributeMap &attribs)
200{
Jamie Madill4230d482018-09-14 10:14:45 -0400201 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
Geoff Langc287ea62016-09-16 14:46:51 -0400202}
203
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400204bool GetExtensionsEnabled(const egl::AttributeMap &attribs, bool webGLContext)
205{
206 // If the context is WebGL, extensions are disabled by default
207 EGLAttrib defaultValue = webGLContext ? EGL_FALSE : EGL_TRUE;
208 return (attribs.get(EGL_EXTENSIONS_ENABLED_ANGLE, defaultValue) == EGL_TRUE);
209}
210
Geoff Langf41a7152016-09-19 15:11:17 -0400211bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
212{
Jamie Madill4230d482018-09-14 10:14:45 -0400213 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
Geoff Langf41a7152016-09-19 15:11:17 -0400214}
215
Geoff Langfeb8c682017-02-13 16:07:35 -0500216bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
217{
218 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
219}
220
Geoff Langb433e872017-10-05 14:01:47 -0400221bool GetRobustResourceInit(const egl::AttributeMap &attribs)
222{
223 return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
224}
225
Martin Radev9d901792016-07-15 15:58:58 +0300226std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
227{
228 std::string labelName;
229 if (label != nullptr)
230 {
231 size_t labelLength = length < 0 ? strlen(label) : length;
232 labelName = std::string(label, labelLength);
233 }
234 return labelName;
235}
236
237void GetObjectLabelBase(const std::string &objectLabel,
238 GLsizei bufSize,
239 GLsizei *length,
240 GLchar *label)
241{
242 size_t writeLength = objectLabel.length();
243 if (label != nullptr && bufSize > 0)
244 {
245 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
246 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
247 label[writeLength] = '\0';
248 }
249
250 if (length != nullptr)
251 {
252 *length = static_cast<GLsizei>(writeLength);
253 }
254}
255
Jamie Madill0f80ed82017-09-19 00:24:56 -0400256template <typename CapT, typename MaxT>
257void LimitCap(CapT *cap, MaxT maximum)
258{
259 *cap = std::min(*cap, static_cast<CapT>(maximum));
260}
261
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600262constexpr angle::PackedEnumMap<gl::PrimitiveMode, GLsizei> kMinimumPrimitiveCounts = {{
Jamie Madill526a6f62018-09-12 11:03:05 -0400263 1, /* Points */
264 2, /* Lines */
265 2, /* LineLoop */
266 2, /* LineStrip */
267 3, /* Triangles */
268 3, /* TriangleStrip */
269 3, /* TriangleFan */
270 2, /* LinesAdjacency */
271 2, /* LineStripAdjacency */
272 3, /* TrianglesAdjacency */
273 3, /* TriangleStripAdjacency */
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600274}};
275// Indices above are code-gen'd so make sure they don't change
276// if any of these static asserts are hit, must update kMinimumPrimitiveCounts abouve
277static_assert(static_cast<gl::PrimitiveMode>(0) == gl::PrimitiveMode::Points,
278 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
279static_assert(static_cast<gl::PrimitiveMode>(1) == gl::PrimitiveMode::Lines,
280 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
281static_assert(static_cast<gl::PrimitiveMode>(2) == gl::PrimitiveMode::LineLoop,
282 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
283static_assert(static_cast<gl::PrimitiveMode>(3) == gl::PrimitiveMode::LineStrip,
284 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
285static_assert(static_cast<gl::PrimitiveMode>(4) == gl::PrimitiveMode::Triangles,
286 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
287static_assert(static_cast<gl::PrimitiveMode>(5) == gl::PrimitiveMode::TriangleStrip,
288 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
289static_assert(static_cast<gl::PrimitiveMode>(6) == gl::PrimitiveMode::TriangleFan,
290 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
291static_assert(static_cast<gl::PrimitiveMode>(7) == gl::PrimitiveMode::LinesAdjacency,
292 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
293static_assert(static_cast<gl::PrimitiveMode>(8) == gl::PrimitiveMode::LineStripAdjacency,
294 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
295static_assert(static_cast<gl::PrimitiveMode>(9) == gl::PrimitiveMode::TrianglesAdjacency,
296 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
297static_assert(static_cast<gl::PrimitiveMode>(10) == gl::PrimitiveMode::TriangleStripAdjacency,
298 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
299static_assert(static_cast<gl::PrimitiveMode>(11) == gl::PrimitiveMode::EnumCount,
300 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
301
Jamie Madill6d32cef2018-08-14 02:34:28 -0400302enum SubjectIndexes : angle::SubjectIndex
303{
304 kTexture0SubjectIndex = 0,
305 kTextureMaxSubjectIndex = kTexture0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
306 kUniformBuffer0SubjectIndex = kTextureMaxSubjectIndex,
307 kUniformBufferMaxSubjectIndex =
308 kUniformBuffer0SubjectIndex + gl::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS,
Jamie Madille25b8002018-09-20 13:39:49 -0400309 kSampler0SubjectIndex = kUniformBufferMaxSubjectIndex,
310 kSamplerMaxSubjectIndex = kSampler0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
311 kVertexArraySubjectIndex = kSamplerMaxSubjectIndex,
Jamie Madill6d32cef2018-08-14 02:34:28 -0400312 kReadFramebufferSubjectIndex,
313 kDrawFramebufferSubjectIndex
314};
Geoff Langf6db0982015-08-25 13:04:00 -0400315} // anonymous namespace
316
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000317namespace gl
318{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000319
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400320Context::Context(rx::EGLImplFactory *implFactory,
321 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400322 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500323 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400324 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500325 const egl::AttributeMap &attribs,
Brandon Jones2b0cdcc2018-05-02 08:02:50 -0700326 const egl::DisplayExtensions &displayExtensions,
327 const egl::ClientExtensions &clientExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500328 : mState(reinterpret_cast<ContextID>(this),
329 shareContext ? &shareContext->mState : nullptr,
330 shareTextures,
331 GetClientVersion(attribs),
332 &mGLState,
333 mCaps,
334 mTextureCaps,
335 mExtensions,
336 mLimitations),
337 mSkipValidation(GetNoError(attribs)),
338 mDisplayTextureShareGroup(shareTextures != nullptr),
339 mSavedArgsType(nullptr),
Geoff Lang3cacf692018-06-20 16:49:57 -0400340 mImplementation(implFactory->createContext(mState, config, shareContext, attribs)),
Geoff Lang75359662018-04-11 01:42:27 -0400341 mLabel(nullptr),
Jamie Madill2f348d22017-06-05 10:50:59 -0400342 mCompiler(),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400343 mGLState(GetDebug(attribs),
344 GetBindGeneratesResource(attribs),
345 GetClientArraysEnabled(attribs),
346 GetRobustResourceInit(attribs),
347 memoryProgramCache != nullptr),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400348 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500349 mClientType(EGL_OPENGL_ES_API),
Jamie Madill6b873dd2018-07-12 23:56:30 -0400350 mErrors(this),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500351 mHasBeenCurrent(false),
352 mContextLost(false),
353 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700354 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500355 mResetStrategy(GetResetStrategy(attribs)),
356 mRobustAccess(GetRobustAccess(attribs)),
Geoff Lang33f11fb2018-05-07 13:42:47 -0400357 mSurfacelessSupported(displayExtensions.surfacelessContext),
358 mExplicitContextAvailable(clientExtensions.explicitContext),
Jamie Madill61e16b42017-06-19 11:13:23 -0400359 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
360 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madille14951e2017-03-09 18:55:16 -0500361 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400362 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400363 mMemoryProgramCache(memoryProgramCache),
Jamie Madilla11819d2018-07-30 10:26:01 -0400364 mVertexArrayObserverBinding(this, kVertexArraySubjectIndex),
365 mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex),
366 mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400367 mScratchBuffer(1000u),
jchen107ae70d82018-07-06 13:47:01 +0800368 mZeroFilledBuffer(1000u),
369 mThreadPool(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000370{
Jamie Madill5b772312018-03-08 20:28:32 -0500371 // Needed to solve a Clang warning of unused variables.
Jamie Madillc6dbc252018-04-30 19:07:56 -0400372 ANGLE_UNUSED_VARIABLE(mSavedArgsType);
373 ANGLE_UNUSED_VARIABLE(mParamsBuffer);
Jamie Madill6d32cef2018-08-14 02:34:28 -0400374
375 for (angle::SubjectIndex uboIndex = kUniformBuffer0SubjectIndex;
376 uboIndex < kUniformBufferMaxSubjectIndex; ++uboIndex)
377 {
378 mUniformBufferObserverBindings.emplace_back(this, uboIndex);
379 }
Jamie Madille25b8002018-09-20 13:39:49 -0400380
381 for (angle::SubjectIndex samplerIndex = kSampler0SubjectIndex;
382 samplerIndex < kSamplerMaxSubjectIndex; ++samplerIndex)
383 {
384 mSamplerObserverBindings.emplace_back(this, samplerIndex);
385 }
Geoff Lang33f11fb2018-05-07 13:42:47 -0400386}
Jamie Madill5b772312018-03-08 20:28:32 -0500387
Geoff Lang33f11fb2018-05-07 13:42:47 -0400388void Context::initialize()
389{
390 mImplementation->setMemoryProgramCache(mMemoryProgramCache);
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400391
Geoff Lang33f11fb2018-05-07 13:42:47 -0400392 initCaps();
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700393 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400394
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400395 mGLState.initialize(this);
Régis Fénéon83107972015-02-05 12:57:44 +0100396
Shannon Woods53a94a82014-06-24 15:20:36 -0400397 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400398
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000399 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400400 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000401 // and cube map texture state vectors respectively associated with them.
402 // In order that access to these initial textures not be lost, they are treated as texture
403 // objects all of whose names are 0.
404
Corentin Wallez99d492c2018-02-27 15:17:10 -0500405 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800406 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500407
Corentin Wallez99d492c2018-02-27 15:17:10 -0500408 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800409 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400410
Geoff Langeb66a6e2016-10-31 13:06:12 -0400411 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400412 {
413 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500414 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800415 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400416
Corentin Wallez99d492c2018-02-27 15:17:10 -0500417 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800418 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400419 }
Yizhou Jiang7818a852018-09-06 15:02:04 +0800420 if (getClientVersion() >= Version(3, 1) || mSupportedExtensions.textureMultisample)
Geoff Lang3b573612016-10-31 14:08:10 -0400421 {
422 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500423 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800424 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Yizhou Jiang7818a852018-09-06 15:02:04 +0800425 }
426 if (getClientVersion() >= Version(3, 1))
427 {
Olli Etuahod310a432018-08-24 15:40:23 +0300428 Texture *zeroTexture2DMultisampleArray =
429 new Texture(mImplementation.get(), 0, TextureType::_2DMultisampleArray);
430 mZeroTextures[TextureType::_2DMultisampleArray].set(this, zeroTexture2DMultisampleArray);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800431
Jiajia Qin6eafb042016-12-27 17:04:07 +0800432 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
433 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800434 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800435 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800436
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800437 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
438 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400439 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800440 }
Geoff Lang3b573612016-10-31 14:08:10 -0400441 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000442
Geoff Langb0f917f2017-12-05 13:41:54 -0500443 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400444 {
445 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500446 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800447 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400448 }
449
Geoff Langb0f917f2017-12-05 13:41:54 -0500450 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400451 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500452 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800453 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400454 }
455
Jamie Madill4928b7c2017-06-20 12:57:39 -0400456 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500457
Jamie Madill57a89722013-07-02 11:57:03 -0400458 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000459
Geoff Langeb66a6e2016-10-31 13:06:12 -0400460 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400461 {
462 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
463 // In the initial state, a default transform feedback object is bound and treated as
464 // a transform feedback object with a name of zero. That object is bound any time
465 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400466 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400467 }
Geoff Langc8058452014-02-03 12:04:11 -0500468
Corentin Wallez336129f2017-10-17 15:55:40 -0400469 for (auto type : angle::AllEnums<BufferBinding>())
470 {
471 bindBuffer(type, 0);
472 }
473
474 bindRenderbuffer(GL_RENDERBUFFER, 0);
475
476 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
477 {
478 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
479 }
480
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700481 // Initialize GLES1 renderer if appropriate.
482 if (getClientVersion() < Version(2, 0))
483 {
484 mGLES1Renderer.reset(new GLES1Renderer());
485 }
486
Jamie Madillad9f24e2016-02-12 09:27:24 -0500487 // Initialize dirty bit masks
Jamie Madill9d0bb3d2018-10-09 20:29:13 -0400488 mAllDirtyBits.set();
489
Geoff Lang9bf86f02018-07-26 11:46:34 -0400490 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
491 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
492 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400493 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400494 mDrawDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400495
496 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
497 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
498 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madille25b8002018-09-20 13:39:49 -0400499 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400500
Jamie Madillc67323a2017-11-02 23:11:41 -0400501 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500502 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500503 // No dirty objects.
504
505 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400506 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500507 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400508 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500509 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
510
511 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
512 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
513 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
514 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
515 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
516 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
517 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
518 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
519 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
520 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
521 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400522 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500523 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
524
525 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
526 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700527 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400528 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
529 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500530 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
531 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400532
Xinghua Cao10a4d432017-11-28 14:46:26 +0800533 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
jchen1099118c12018-09-10 16:28:51 +0800534 mComputeDirtyBits.set(State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
535 mComputeDirtyBits.set(State::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800536 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
537 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
538 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
539 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
jchen1099118c12018-09-10 16:28:51 +0800540 mComputeDirtyBits.set(State::DIRTY_BIT_IMAGE_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800541 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800542 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400543 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400544 mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800545
Jamie Madillb4927eb2018-07-16 11:39:46 -0400546 mImplementation->setErrorSet(&mErrors);
547
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400548 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000549}
550
Jamie Madill4928b7c2017-06-20 12:57:39 -0400551egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000552{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700553 if (mGLES1Renderer)
554 {
555 mGLES1Renderer->onDestroy(this, &mGLState);
556 }
557
Jamie Madille7b3fe22018-04-05 09:42:46 -0400558 // Delete the Surface first to trigger a finish() in Vulkan.
Jamie Madille7b3fe22018-04-05 09:42:46 -0400559 ANGLE_TRY(releaseSurface(display));
560
Corentin Wallez80b24112015-08-25 16:41:57 -0400561 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000562 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400563 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000564 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400565 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000566
Corentin Wallez80b24112015-08-25 16:41:57 -0400567 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000568 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400569 if (query.second != nullptr)
570 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400571 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400572 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000573 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400574 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000575
Corentin Wallez80b24112015-08-25 16:41:57 -0400576 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400577 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400578 if (vertexArray.second)
579 {
580 vertexArray.second->onDestroy(this);
581 }
Jamie Madill57a89722013-07-02 11:57:03 -0400582 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400583 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400584
Corentin Wallez80b24112015-08-25 16:41:57 -0400585 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500586 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500587 if (transformFeedback.second != nullptr)
588 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500589 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500590 }
Geoff Langc8058452014-02-03 12:04:11 -0500591 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400592 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500593
Jamie Madill5b772312018-03-08 20:28:32 -0500594 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400595 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800596 if (zeroTexture.get() != nullptr)
597 {
Jamie Madill1c7f08c2018-10-10 16:13:02 -0400598 zeroTexture->onDestroy(this);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800599 zeroTexture.set(this, nullptr);
600 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400601 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000602
Jamie Madill2f348d22017-06-05 10:50:59 -0400603 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500604
Jamie Madill4928b7c2017-06-20 12:57:39 -0400605 mGLState.reset(this);
606
Jamie Madill6c1f6712017-02-14 19:08:04 -0500607 mState.mBuffers->release(this);
608 mState.mShaderPrograms->release(this);
609 mState.mTextures->release(this);
610 mState.mRenderbuffers->release(this);
611 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400612 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500613 mState.mPaths->release(this);
614 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800615 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400616
jchen107ae70d82018-07-06 13:47:01 +0800617 mThreadPool.reset();
618
Jamie Madill76e471e2017-10-21 09:56:01 -0400619 mImplementation->onDestroy(this);
620
Jamie Madill4928b7c2017-06-20 12:57:39 -0400621 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000622}
623
Jamie Madill70ee0f62017-02-06 16:04:20 -0500624Context::~Context()
625{
626}
627
Geoff Lang75359662018-04-11 01:42:27 -0400628void Context::setLabel(EGLLabelKHR label)
629{
630 mLabel = label;
631}
632
633EGLLabelKHR Context::getLabel() const
634{
635 return mLabel;
636}
637
Jamie Madill4928b7c2017-06-20 12:57:39 -0400638egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000639{
Jamie Madill61e16b42017-06-19 11:13:23 -0400640 mCurrentDisplay = display;
641
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000642 if (!mHasBeenCurrent)
643 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400644 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000645 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500646 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400647 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000648
Corentin Wallezc295e512017-01-27 17:47:50 -0500649 int width = 0;
650 int height = 0;
651 if (surface != nullptr)
652 {
653 width = surface->getWidth();
654 height = surface->getHeight();
655 }
656
657 mGLState.setViewportParams(0, 0, width, height);
658 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000659
660 mHasBeenCurrent = true;
661 }
662
Jamie Madill1b94d432015-08-07 13:23:23 -0400663 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700664 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400665 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400666
Jamie Madill4928b7c2017-06-20 12:57:39 -0400667 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500668
669 Framebuffer *newDefault = nullptr;
670 if (surface != nullptr)
671 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400672 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500673 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400674 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500675 }
676 else
677 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400678 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500679 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000680
Corentin Wallez37c39792015-08-20 14:19:46 -0400681 // Update default framebuffer, the binding of the previous default
682 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400683 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400684 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700685 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400686 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400687 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400688 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700689 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400690 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400691 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400692 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400693 }
Ian Ewell292f0052016-02-04 10:37:32 -0500694
Jamie Madill32643ce2018-10-19 11:38:03 -0400695 // Notify the renderer of a context switch.
696 // TODO(jmadill): Fix this error handling. http://anglebug.com/2491
697 (void)(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400698 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000699}
700
Jamie Madill4928b7c2017-06-20 12:57:39 -0400701egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400702{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400703 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400704
Geoff Langbf7b95d2018-05-01 16:48:21 -0400705 // Remove the default framebuffer
706 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500707 {
708 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400709 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500710 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400711
712 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500713 {
714 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400715 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500716 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400717
718 if (defaultFramebuffer)
719 {
720 defaultFramebuffer->onDestroy(this);
721 delete defaultFramebuffer;
722 }
723
Corentin Wallezc295e512017-01-27 17:47:50 -0500724 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
725
726 if (mCurrentSurface)
727 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400728 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500729 mCurrentSurface = nullptr;
730 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400731
732 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400733}
734
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000735GLuint Context::createBuffer()
736{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500737 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000738}
739
740GLuint Context::createProgram()
741{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500742 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000743}
744
Jiawei Shao385b3e02018-03-21 09:43:28 +0800745GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000746{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500747 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000748}
749
750GLuint Context::createTexture()
751{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500752 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000753}
754
755GLuint Context::createRenderbuffer()
756{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500757 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000758}
759
Jamie Madill13951342018-09-30 15:24:28 -0400760void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
761{
762 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(mImplementation.get(), range, createdOut));
763}
764
Brandon Jones59770802018-04-02 13:18:42 -0700765GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300766{
Jamie Madill13951342018-09-30 15:24:28 -0400767 GLuint created = 0;
768 tryGenPaths(range, &created);
769 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300770}
771
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000772// Returns an unused framebuffer name
773GLuint Context::createFramebuffer()
774{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500775 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000776}
777
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500778void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000779{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500780 for (int i = 0; i < n; i++)
781 {
782 GLuint handle = mFenceNVHandleAllocator.allocate();
783 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
784 fences[i] = handle;
785 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000786}
787
Yunchao Hea336b902017-08-02 16:05:21 +0800788GLuint Context::createProgramPipeline()
789{
790 return mState.mPipelines->createProgramPipeline();
791}
792
Jiawei Shao385b3e02018-03-21 09:43:28 +0800793GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800794{
795 UNIMPLEMENTED();
796 return 0u;
797}
798
James Darpinian4d9d4832018-03-13 12:43:28 -0700799void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000800{
James Darpinian4d9d4832018-03-13 12:43:28 -0700801 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
802 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000803 {
804 detachBuffer(buffer);
805 }
Jamie Madill893ab082014-05-16 16:56:10 -0400806
James Darpinian4d9d4832018-03-13 12:43:28 -0700807 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000808}
809
810void Context::deleteShader(GLuint shader)
811{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500812 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000813}
814
815void Context::deleteProgram(GLuint program)
816{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500817 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000818}
819
820void Context::deleteTexture(GLuint texture)
821{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500822 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000823 {
824 detachTexture(texture);
825 }
826
Jamie Madill6c1f6712017-02-14 19:08:04 -0500827 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000828}
829
830void Context::deleteRenderbuffer(GLuint renderbuffer)
831{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500832 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000833 {
834 detachRenderbuffer(renderbuffer);
835 }
Jamie Madill893ab082014-05-16 16:56:10 -0400836
Jamie Madill6c1f6712017-02-14 19:08:04 -0500837 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000838}
839
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400840void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400841{
842 // The spec specifies the underlying Fence object is not deleted until all current
843 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
844 // and since our API is currently designed for being called from a single thread, we can delete
845 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400846 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400847}
848
Yunchao Hea336b902017-08-02 16:05:21 +0800849void Context::deleteProgramPipeline(GLuint pipeline)
850{
851 if (mState.mPipelines->getProgramPipeline(pipeline))
852 {
853 detachProgramPipeline(pipeline);
854 }
855
856 mState.mPipelines->deleteObject(this, pipeline);
857}
858
Sami Väisänene45e53b2016-05-25 10:36:04 +0300859void Context::deletePaths(GLuint first, GLsizei range)
860{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500861 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300862}
863
Brandon Jones59770802018-04-02 13:18:42 -0700864bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300865{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500866 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300867 if (pathObj == nullptr)
868 return false;
869
870 return pathObj->hasPathData();
871}
872
Brandon Jones59770802018-04-02 13:18:42 -0700873bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300874{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500875 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300876}
877
Brandon Jones59770802018-04-02 13:18:42 -0700878void Context::pathCommands(GLuint path,
879 GLsizei numCommands,
880 const GLubyte *commands,
881 GLsizei numCoords,
882 GLenum coordType,
883 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300884{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500885 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300886
887 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
888}
889
Jamie Madill007530e2017-12-28 14:27:04 -0500890void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300891{
Jamie Madill007530e2017-12-28 14:27:04 -0500892 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300893
894 switch (pname)
895 {
896 case GL_PATH_STROKE_WIDTH_CHROMIUM:
897 pathObj->setStrokeWidth(value);
898 break;
899 case GL_PATH_END_CAPS_CHROMIUM:
900 pathObj->setEndCaps(static_cast<GLenum>(value));
901 break;
902 case GL_PATH_JOIN_STYLE_CHROMIUM:
903 pathObj->setJoinStyle(static_cast<GLenum>(value));
904 break;
905 case GL_PATH_MITER_LIMIT_CHROMIUM:
906 pathObj->setMiterLimit(value);
907 break;
908 case GL_PATH_STROKE_BOUND_CHROMIUM:
909 pathObj->setStrokeBound(value);
910 break;
911 default:
912 UNREACHABLE();
913 break;
914 }
915}
916
Jamie Madill007530e2017-12-28 14:27:04 -0500917void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300918{
Jamie Madill007530e2017-12-28 14:27:04 -0500919 // TODO(jmadill): Should use proper clamping/casting.
920 pathParameterf(path, pname, static_cast<GLfloat>(value));
921}
922
923void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
924{
925 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300926
927 switch (pname)
928 {
929 case GL_PATH_STROKE_WIDTH_CHROMIUM:
930 *value = pathObj->getStrokeWidth();
931 break;
932 case GL_PATH_END_CAPS_CHROMIUM:
933 *value = static_cast<GLfloat>(pathObj->getEndCaps());
934 break;
935 case GL_PATH_JOIN_STYLE_CHROMIUM:
936 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
937 break;
938 case GL_PATH_MITER_LIMIT_CHROMIUM:
939 *value = pathObj->getMiterLimit();
940 break;
941 case GL_PATH_STROKE_BOUND_CHROMIUM:
942 *value = pathObj->getStrokeBound();
943 break;
944 default:
945 UNREACHABLE();
946 break;
947 }
948}
949
Jamie Madill007530e2017-12-28 14:27:04 -0500950void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
951{
952 GLfloat val = 0.0f;
953 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
954 if (value)
955 *value = static_cast<GLint>(val);
956}
957
Brandon Jones59770802018-04-02 13:18:42 -0700958void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300959{
960 mGLState.setPathStencilFunc(func, ref, mask);
961}
962
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000963void Context::deleteFramebuffer(GLuint framebuffer)
964{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500965 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000966 {
967 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000968 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500969
Jamie Madill6c1f6712017-02-14 19:08:04 -0500970 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000971}
972
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500973void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000974{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500975 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000976 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500977 GLuint fence = fences[i];
978
979 FenceNV *fenceObject = nullptr;
980 if (mFenceNVMap.erase(fence, &fenceObject))
981 {
982 mFenceNVHandleAllocator.release(fence);
983 delete fenceObject;
984 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000985 }
986}
987
Geoff Lang70d0f492015-12-10 17:45:46 -0500988Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000989{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500990 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000991}
992
Geoff Lang70d0f492015-12-10 17:45:46 -0500993Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000994{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500995 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000996}
997
Jamie Madill70b5bb02017-08-28 13:32:37 -0400998Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400999{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001000 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -04001001}
1002
Jamie Madill57a89722013-07-02 11:57:03 -04001003VertexArray *Context::getVertexArray(GLuint handle) const
1004{
Jamie Madill96a483b2017-06-27 16:49:21 -04001005 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -04001006}
1007
Jamie Madilldc356042013-07-19 16:36:57 -04001008Sampler *Context::getSampler(GLuint handle) const
1009{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001010 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -04001011}
1012
Geoff Langc8058452014-02-03 12:04:11 -05001013TransformFeedback *Context::getTransformFeedback(GLuint handle) const
1014{
Jamie Madill96a483b2017-06-27 16:49:21 -04001015 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -05001016}
1017
Yunchao Hea336b902017-08-02 16:05:21 +08001018ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
1019{
1020 return mState.mPipelines->getProgramPipeline(handle);
1021}
1022
Geoff Lang75359662018-04-11 01:42:27 -04001023gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001024{
1025 switch (identifier)
1026 {
1027 case GL_BUFFER:
1028 return getBuffer(name);
1029 case GL_SHADER:
1030 return getShader(name);
1031 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04001032 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -05001033 case GL_VERTEX_ARRAY:
1034 return getVertexArray(name);
1035 case GL_QUERY:
1036 return getQuery(name);
1037 case GL_TRANSFORM_FEEDBACK:
1038 return getTransformFeedback(name);
1039 case GL_SAMPLER:
1040 return getSampler(name);
1041 case GL_TEXTURE:
1042 return getTexture(name);
1043 case GL_RENDERBUFFER:
1044 return getRenderbuffer(name);
1045 case GL_FRAMEBUFFER:
1046 return getFramebuffer(name);
1047 default:
1048 UNREACHABLE();
1049 return nullptr;
1050 }
1051}
1052
Geoff Lang75359662018-04-11 01:42:27 -04001053gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001054{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001055 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001056}
1057
Martin Radev9d901792016-07-15 15:58:58 +03001058void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1059{
Geoff Lang75359662018-04-11 01:42:27 -04001060 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001061 ASSERT(object != nullptr);
1062
1063 std::string labelName = GetObjectLabelFromPointer(length, label);
1064 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001065
1066 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1067 // specified object is active until we do this.
1068 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001069}
1070
1071void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1072{
Geoff Lang75359662018-04-11 01:42:27 -04001073 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001074 ASSERT(object != nullptr);
1075
1076 std::string labelName = GetObjectLabelFromPointer(length, label);
1077 object->setLabel(labelName);
1078}
1079
1080void Context::getObjectLabel(GLenum identifier,
1081 GLuint name,
1082 GLsizei bufSize,
1083 GLsizei *length,
1084 GLchar *label) const
1085{
Geoff Lang75359662018-04-11 01:42:27 -04001086 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001087 ASSERT(object != nullptr);
1088
1089 const std::string &objectLabel = object->getLabel();
1090 GetObjectLabelBase(objectLabel, bufSize, length, label);
1091}
1092
1093void Context::getObjectPtrLabel(const void *ptr,
1094 GLsizei bufSize,
1095 GLsizei *length,
1096 GLchar *label) const
1097{
Geoff Lang75359662018-04-11 01:42:27 -04001098 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001099 ASSERT(object != nullptr);
1100
1101 const std::string &objectLabel = object->getLabel();
1102 GetObjectLabelBase(objectLabel, bufSize, length, label);
1103}
1104
Jamie Madilldc356042013-07-19 16:36:57 -04001105bool Context::isSampler(GLuint samplerName) const
1106{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001107 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001108}
1109
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001110void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001111{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001112 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001113
Jamie Madilldedd7b92014-11-05 16:30:36 -05001114 if (handle == 0)
1115 {
1116 texture = mZeroTextures[target].get();
1117 }
1118 else
1119 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001120 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001121 }
1122
1123 ASSERT(texture);
Jamie Madill14246812018-10-03 17:51:16 -04001124 ANGLE_CONTEXT_TRY(mGLState.setSamplerTexture(this, target, texture));
Jamie Madilld84b6732018-09-06 15:54:35 -04001125 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001126}
1127
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001128void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001129{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001130 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1131 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001132 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001133 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001134}
1135
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001136void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001137{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001138 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1139 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001140 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001141 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001142 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001143}
1144
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001145void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001146{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001147 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001148 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001149 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001150 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001151}
1152
Shao80957d92017-02-20 21:25:59 +08001153void Context::bindVertexBuffer(GLuint bindingIndex,
1154 GLuint bufferHandle,
1155 GLintptr offset,
1156 GLsizei stride)
1157{
1158 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001159 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001160 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001161}
1162
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001163void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001164{
Geoff Lang76b10c92014-09-05 16:28:14 -04001165 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001166 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001167 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001168 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001169 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001170}
1171
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001172void Context::bindImageTexture(GLuint unit,
1173 GLuint texture,
1174 GLint level,
1175 GLboolean layered,
1176 GLint layer,
1177 GLenum access,
1178 GLenum format)
1179{
1180 Texture *tex = mState.mTextures->getTexture(texture);
1181 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1182}
1183
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001184void Context::useProgram(GLuint program)
1185{
Jamie Madille3bb6b72018-10-03 17:51:15 -04001186 ANGLE_CONTEXT_TRY(mGLState.setProgram(this, getProgramResolveLink(program)));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001187 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001188}
1189
Jiajia Qin5451d532017-11-16 17:16:34 +08001190void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1191{
1192 UNIMPLEMENTED();
1193}
1194
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001195void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001196{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001197 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001198 TransformFeedback *transformFeedback =
1199 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001200 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Jamie Madilld84b6732018-09-06 15:54:35 -04001201 mStateCache.onTransformFeedbackChange(this);
Geoff Langc8058452014-02-03 12:04:11 -05001202}
1203
Yunchao Hea336b902017-08-02 16:05:21 +08001204void Context::bindProgramPipeline(GLuint pipelineHandle)
1205{
1206 ProgramPipeline *pipeline =
1207 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1208 mGLState.setProgramPipelineBinding(this, pipeline);
1209}
1210
Corentin Wallezad3ae902018-03-09 13:40:42 -05001211void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001212{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001213 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001214 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001215
Geoff Lang5aad9672014-09-08 11:10:42 -04001216 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001217 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001218
1219 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001220 mGLState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001221 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001222}
1223
Corentin Wallezad3ae902018-03-09 13:40:42 -05001224void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001225{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001226 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001227 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001228
Jamie Madill5188a272018-07-25 10:53:56 -04001229 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001230
Geoff Lang5aad9672014-09-08 11:10:42 -04001231 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001232 mGLState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001233 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001234}
1235
Corentin Wallezad3ae902018-03-09 13:40:42 -05001236void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001237{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001238 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001239
1240 Query *queryObject = getQuery(id, true, target);
1241 ASSERT(queryObject);
1242
Jamie Madill5188a272018-07-25 10:53:56 -04001243 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001244}
1245
Corentin Wallezad3ae902018-03-09 13:40:42 -05001246void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001247{
1248 switch (pname)
1249 {
1250 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001251 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001252 break;
1253 case GL_QUERY_COUNTER_BITS_EXT:
1254 switch (target)
1255 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001256 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001257 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1258 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001259 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001260 params[0] = getExtensions().queryCounterBitsTimestamp;
1261 break;
1262 default:
1263 UNREACHABLE();
1264 params[0] = 0;
1265 break;
1266 }
1267 break;
1268 default:
1269 UNREACHABLE();
1270 return;
1271 }
1272}
1273
Corentin Wallezad3ae902018-03-09 13:40:42 -05001274void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001275 GLenum pname,
1276 GLsizei bufSize,
1277 GLsizei *length,
1278 GLint *params)
1279{
1280 getQueryiv(target, pname, params);
1281}
1282
Geoff Lang2186c382016-10-14 10:54:54 -04001283void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001284{
Jamie Madill5188a272018-07-25 10:53:56 -04001285 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001286}
1287
Brandon Jones59770802018-04-02 13:18:42 -07001288void Context::getQueryObjectivRobust(GLuint id,
1289 GLenum pname,
1290 GLsizei bufSize,
1291 GLsizei *length,
1292 GLint *params)
1293{
1294 getQueryObjectiv(id, pname, params);
1295}
1296
Geoff Lang2186c382016-10-14 10:54:54 -04001297void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001298{
Jamie Madill5188a272018-07-25 10:53:56 -04001299 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001300}
1301
Brandon Jones59770802018-04-02 13:18:42 -07001302void Context::getQueryObjectuivRobust(GLuint id,
1303 GLenum pname,
1304 GLsizei bufSize,
1305 GLsizei *length,
1306 GLuint *params)
1307{
1308 getQueryObjectuiv(id, pname, params);
1309}
1310
Geoff Lang2186c382016-10-14 10:54:54 -04001311void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001312{
Jamie Madill5188a272018-07-25 10:53:56 -04001313 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001314}
1315
Brandon Jones59770802018-04-02 13:18:42 -07001316void Context::getQueryObjecti64vRobust(GLuint id,
1317 GLenum pname,
1318 GLsizei bufSize,
1319 GLsizei *length,
1320 GLint64 *params)
1321{
1322 getQueryObjecti64v(id, pname, params);
1323}
1324
Geoff Lang2186c382016-10-14 10:54:54 -04001325void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001326{
Jamie Madill5188a272018-07-25 10:53:56 -04001327 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001328}
1329
Brandon Jones59770802018-04-02 13:18:42 -07001330void Context::getQueryObjectui64vRobust(GLuint id,
1331 GLenum pname,
1332 GLsizei bufSize,
1333 GLsizei *length,
1334 GLuint64 *params)
1335{
1336 getQueryObjectui64v(id, pname, params);
1337}
1338
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001339Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001340{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001341 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001342}
1343
Jamie Madill2f348d22017-06-05 10:50:59 -04001344FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001345{
Jamie Madill96a483b2017-06-27 16:49:21 -04001346 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001347}
1348
Corentin Wallezad3ae902018-03-09 13:40:42 -05001349Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001350{
Jamie Madill96a483b2017-06-27 16:49:21 -04001351 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001352 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001353 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001354 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001355
1356 Query *query = mQueryMap.query(handle);
1357 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001358 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001359 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001360 query = new Query(mImplementation->createQuery(type), handle);
1361 query->addRef();
1362 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001363 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001364 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001365}
1366
Geoff Lang70d0f492015-12-10 17:45:46 -05001367Query *Context::getQuery(GLuint handle) const
1368{
Jamie Madill96a483b2017-06-27 16:49:21 -04001369 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001370}
1371
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001372Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001373{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001374 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1375 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001376}
1377
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001378Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001379{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001380 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001381}
1382
Geoff Lang492a7e42014-11-05 13:27:06 -05001383Compiler *Context::getCompiler() const
1384{
Jamie Madill2f348d22017-06-05 10:50:59 -04001385 if (mCompiler.get() == nullptr)
1386 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001387 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001388 }
1389 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001390}
1391
Jamie Madillc1d770e2017-04-13 17:31:24 -04001392void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001393{
1394 switch (pname)
1395 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001396 case GL_SHADER_COMPILER:
1397 *params = GL_TRUE;
1398 break;
1399 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1400 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1401 break;
1402 default:
1403 mGLState.getBooleanv(pname, params);
1404 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001405 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001406}
1407
Jamie Madillc1d770e2017-04-13 17:31:24 -04001408void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001409{
Shannon Woods53a94a82014-06-24 15:20:36 -04001410 // Queries about context capabilities and maximums are answered by Context.
1411 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001412 switch (pname)
1413 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001414 case GL_ALIASED_LINE_WIDTH_RANGE:
1415 params[0] = mCaps.minAliasedLineWidth;
1416 params[1] = mCaps.maxAliasedLineWidth;
1417 break;
1418 case GL_ALIASED_POINT_SIZE_RANGE:
1419 params[0] = mCaps.minAliasedPointSize;
1420 params[1] = mCaps.maxAliasedPointSize;
1421 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001422 case GL_SMOOTH_POINT_SIZE_RANGE:
1423 params[0] = mCaps.minSmoothPointSize;
1424 params[1] = mCaps.maxSmoothPointSize;
1425 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001426 case GL_SMOOTH_LINE_WIDTH_RANGE:
1427 params[0] = mCaps.minSmoothLineWidth;
1428 params[1] = mCaps.maxSmoothLineWidth;
1429 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001430 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1431 ASSERT(mExtensions.textureFilterAnisotropic);
1432 *params = mExtensions.maxTextureAnisotropy;
1433 break;
1434 case GL_MAX_TEXTURE_LOD_BIAS:
1435 *params = mCaps.maxLODBias;
1436 break;
1437
1438 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1439 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1440 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001441 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1442 // GLES1 constants for modelview/projection matrix.
1443 if (getClientVersion() < Version(2, 0))
1444 {
1445 mGLState.getFloatv(pname, params);
1446 }
1447 else
1448 {
1449 ASSERT(mExtensions.pathRendering);
1450 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1451 memcpy(params, m, 16 * sizeof(GLfloat));
1452 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001453 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001454 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001455
Jamie Madill231c7f52017-04-26 13:45:37 -04001456 default:
1457 mGLState.getFloatv(pname, params);
1458 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001459 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001460}
1461
Jamie Madillc1d770e2017-04-13 17:31:24 -04001462void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001463{
Shannon Woods53a94a82014-06-24 15:20:36 -04001464 // Queries about context capabilities and maximums are answered by Context.
1465 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001466
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001467 switch (pname)
1468 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001469 case GL_MAX_VERTEX_ATTRIBS:
1470 *params = mCaps.maxVertexAttributes;
1471 break;
1472 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1473 *params = mCaps.maxVertexUniformVectors;
1474 break;
1475 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001476 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001477 break;
1478 case GL_MAX_VARYING_VECTORS:
1479 *params = mCaps.maxVaryingVectors;
1480 break;
1481 case GL_MAX_VARYING_COMPONENTS:
1482 *params = mCaps.maxVertexOutputComponents;
1483 break;
1484 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1485 *params = mCaps.maxCombinedTextureImageUnits;
1486 break;
1487 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001488 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001489 break;
1490 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001491 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001492 break;
1493 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1494 *params = mCaps.maxFragmentUniformVectors;
1495 break;
1496 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001497 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001498 break;
1499 case GL_MAX_RENDERBUFFER_SIZE:
1500 *params = mCaps.maxRenderbufferSize;
1501 break;
1502 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1503 *params = mCaps.maxColorAttachments;
1504 break;
1505 case GL_MAX_DRAW_BUFFERS_EXT:
1506 *params = mCaps.maxDrawBuffers;
1507 break;
1508 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1509 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1510 case GL_SUBPIXEL_BITS:
1511 *params = 4;
1512 break;
1513 case GL_MAX_TEXTURE_SIZE:
1514 *params = mCaps.max2DTextureSize;
1515 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001516 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1517 *params = mCaps.maxRectangleTextureSize;
1518 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001519 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1520 *params = mCaps.maxCubeMapTextureSize;
1521 break;
1522 case GL_MAX_3D_TEXTURE_SIZE:
1523 *params = mCaps.max3DTextureSize;
1524 break;
1525 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1526 *params = mCaps.maxArrayTextureLayers;
1527 break;
1528 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1529 *params = mCaps.uniformBufferOffsetAlignment;
1530 break;
1531 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1532 *params = mCaps.maxUniformBufferBindings;
1533 break;
1534 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001535 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001536 break;
1537 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001538 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001539 break;
1540 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1541 *params = mCaps.maxCombinedTextureImageUnits;
1542 break;
1543 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1544 *params = mCaps.maxVertexOutputComponents;
1545 break;
1546 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1547 *params = mCaps.maxFragmentInputComponents;
1548 break;
1549 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1550 *params = mCaps.minProgramTexelOffset;
1551 break;
1552 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1553 *params = mCaps.maxProgramTexelOffset;
1554 break;
1555 case GL_MAJOR_VERSION:
1556 *params = getClientVersion().major;
1557 break;
1558 case GL_MINOR_VERSION:
1559 *params = getClientVersion().minor;
1560 break;
1561 case GL_MAX_ELEMENTS_INDICES:
1562 *params = mCaps.maxElementsIndices;
1563 break;
1564 case GL_MAX_ELEMENTS_VERTICES:
1565 *params = mCaps.maxElementsVertices;
1566 break;
1567 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1568 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1569 break;
1570 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1571 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1572 break;
1573 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1574 *params = mCaps.maxTransformFeedbackSeparateComponents;
1575 break;
1576 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1577 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1578 break;
1579 case GL_MAX_SAMPLES_ANGLE:
1580 *params = mCaps.maxSamples;
1581 break;
1582 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001583 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001584 params[0] = mCaps.maxViewportWidth;
1585 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001586 }
1587 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001588 case GL_COMPRESSED_TEXTURE_FORMATS:
1589 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1590 params);
1591 break;
1592 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1593 *params = mResetStrategy;
1594 break;
1595 case GL_NUM_SHADER_BINARY_FORMATS:
1596 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1597 break;
1598 case GL_SHADER_BINARY_FORMATS:
1599 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1600 break;
1601 case GL_NUM_PROGRAM_BINARY_FORMATS:
1602 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1603 break;
1604 case GL_PROGRAM_BINARY_FORMATS:
1605 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1606 break;
1607 case GL_NUM_EXTENSIONS:
1608 *params = static_cast<GLint>(mExtensionStrings.size());
1609 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001610
Geoff Lang38f24ee2018-10-01 13:04:59 -04001611 // GL_ANGLE_request_extension
1612 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1613 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1614 break;
1615
Jamie Madill231c7f52017-04-26 13:45:37 -04001616 // GL_KHR_debug
1617 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1618 *params = mExtensions.maxDebugMessageLength;
1619 break;
1620 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1621 *params = mExtensions.maxDebugLoggedMessages;
1622 break;
1623 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1624 *params = mExtensions.maxDebugGroupStackDepth;
1625 break;
1626 case GL_MAX_LABEL_LENGTH:
1627 *params = mExtensions.maxLabelLength;
1628 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001629
Martin Radeve5285d22017-07-14 16:23:53 +03001630 // GL_ANGLE_multiview
1631 case GL_MAX_VIEWS_ANGLE:
1632 *params = mExtensions.maxViews;
1633 break;
1634
Jamie Madill231c7f52017-04-26 13:45:37 -04001635 // GL_EXT_disjoint_timer_query
1636 case GL_GPU_DISJOINT_EXT:
1637 *params = mImplementation->getGPUDisjoint();
1638 break;
1639 case GL_MAX_FRAMEBUFFER_WIDTH:
1640 *params = mCaps.maxFramebufferWidth;
1641 break;
1642 case GL_MAX_FRAMEBUFFER_HEIGHT:
1643 *params = mCaps.maxFramebufferHeight;
1644 break;
1645 case GL_MAX_FRAMEBUFFER_SAMPLES:
1646 *params = mCaps.maxFramebufferSamples;
1647 break;
1648 case GL_MAX_SAMPLE_MASK_WORDS:
1649 *params = mCaps.maxSampleMaskWords;
1650 break;
1651 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1652 *params = mCaps.maxColorTextureSamples;
1653 break;
1654 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1655 *params = mCaps.maxDepthTextureSamples;
1656 break;
1657 case GL_MAX_INTEGER_SAMPLES:
1658 *params = mCaps.maxIntegerSamples;
1659 break;
1660 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1661 *params = mCaps.maxVertexAttribRelativeOffset;
1662 break;
1663 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1664 *params = mCaps.maxVertexAttribBindings;
1665 break;
1666 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1667 *params = mCaps.maxVertexAttribStride;
1668 break;
1669 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001670 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001671 break;
1672 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001673 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001674 break;
1675 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001676 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001677 break;
1678 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001679 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001680 break;
1681 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001682 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001683 break;
1684 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001685 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001686 break;
1687 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001688 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001689 break;
1690 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001691 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001692 break;
1693 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1694 *params = mCaps.minProgramTextureGatherOffset;
1695 break;
1696 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1697 *params = mCaps.maxProgramTextureGatherOffset;
1698 break;
1699 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1700 *params = mCaps.maxComputeWorkGroupInvocations;
1701 break;
1702 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001703 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001704 break;
1705 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001706 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001707 break;
1708 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1709 *params = mCaps.maxComputeSharedMemorySize;
1710 break;
1711 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001712 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001713 break;
1714 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001715 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001716 break;
1717 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001718 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001719 break;
1720 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001721 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001722 break;
1723 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001724 *params =
1725 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001726 break;
1727 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001728 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001729 break;
1730 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1731 *params = mCaps.maxCombinedShaderOutputResources;
1732 break;
1733 case GL_MAX_UNIFORM_LOCATIONS:
1734 *params = mCaps.maxUniformLocations;
1735 break;
1736 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1737 *params = mCaps.maxAtomicCounterBufferBindings;
1738 break;
1739 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1740 *params = mCaps.maxAtomicCounterBufferSize;
1741 break;
1742 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1743 *params = mCaps.maxCombinedAtomicCounterBuffers;
1744 break;
1745 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1746 *params = mCaps.maxCombinedAtomicCounters;
1747 break;
1748 case GL_MAX_IMAGE_UNITS:
1749 *params = mCaps.maxImageUnits;
1750 break;
1751 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1752 *params = mCaps.maxCombinedImageUniforms;
1753 break;
1754 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1755 *params = mCaps.maxShaderStorageBufferBindings;
1756 break;
1757 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1758 *params = mCaps.maxCombinedShaderStorageBlocks;
1759 break;
1760 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1761 *params = mCaps.shaderStorageBufferOffsetAlignment;
1762 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001763
1764 // GL_EXT_geometry_shader
1765 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1766 *params = mCaps.maxFramebufferLayers;
1767 break;
1768 case GL_LAYER_PROVOKING_VERTEX_EXT:
1769 *params = mCaps.layerProvokingVertex;
1770 break;
1771 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001772 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001773 break;
1774 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001775 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001776 break;
1777 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001778 *params =
1779 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001780 break;
1781 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1782 *params = mCaps.maxGeometryInputComponents;
1783 break;
1784 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1785 *params = mCaps.maxGeometryOutputComponents;
1786 break;
1787 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1788 *params = mCaps.maxGeometryOutputVertices;
1789 break;
1790 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1791 *params = mCaps.maxGeometryTotalOutputComponents;
1792 break;
1793 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1794 *params = mCaps.maxGeometryShaderInvocations;
1795 break;
1796 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001797 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001798 break;
1799 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001800 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001801 break;
1802 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001803 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001804 break;
1805 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001806 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001807 break;
1808 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001809 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001810 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001811 // GLES1 emulation: Caps queries
1812 case GL_MAX_TEXTURE_UNITS:
1813 *params = mCaps.maxMultitextureUnits;
1814 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001815 case GL_MAX_MODELVIEW_STACK_DEPTH:
1816 *params = mCaps.maxModelviewMatrixStackDepth;
1817 break;
1818 case GL_MAX_PROJECTION_STACK_DEPTH:
1819 *params = mCaps.maxProjectionMatrixStackDepth;
1820 break;
1821 case GL_MAX_TEXTURE_STACK_DEPTH:
1822 *params = mCaps.maxTextureMatrixStackDepth;
1823 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001824 case GL_MAX_LIGHTS:
1825 *params = mCaps.maxLights;
1826 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001827 case GL_MAX_CLIP_PLANES:
1828 *params = mCaps.maxClipPlanes;
1829 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001830 // GLES1 emulation: Vertex attribute queries
1831 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1832 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1833 case GL_COLOR_ARRAY_BUFFER_BINDING:
1834 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1835 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1836 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1837 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1838 break;
1839 case GL_VERTEX_ARRAY_STRIDE:
1840 case GL_NORMAL_ARRAY_STRIDE:
1841 case GL_COLOR_ARRAY_STRIDE:
1842 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1843 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1844 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1845 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1846 break;
1847 case GL_VERTEX_ARRAY_SIZE:
1848 case GL_COLOR_ARRAY_SIZE:
1849 case GL_TEXTURE_COORD_ARRAY_SIZE:
1850 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1851 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1852 break;
1853 case GL_VERTEX_ARRAY_TYPE:
1854 case GL_COLOR_ARRAY_TYPE:
1855 case GL_NORMAL_ARRAY_TYPE:
1856 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1857 case GL_TEXTURE_COORD_ARRAY_TYPE:
1858 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1859 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1860 break;
1861
jchen1082af6202018-06-22 10:59:52 +08001862 // GL_KHR_parallel_shader_compile
1863 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1864 *params = mGLState.getMaxShaderCompilerThreads();
1865 break;
1866
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001867 // GL_EXT_blend_func_extended
1868 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
1869 *params = mExtensions.maxDualSourceDrawBuffers;
1870 break;
1871
Jamie Madill231c7f52017-04-26 13:45:37 -04001872 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001873 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001874 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001875 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001876}
1877
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001878void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001879{
Shannon Woods53a94a82014-06-24 15:20:36 -04001880 // Queries about context capabilities and maximums are answered by Context.
1881 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001882 switch (pname)
1883 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001884 case GL_MAX_ELEMENT_INDEX:
1885 *params = mCaps.maxElementIndex;
1886 break;
1887 case GL_MAX_UNIFORM_BLOCK_SIZE:
1888 *params = mCaps.maxUniformBlockSize;
1889 break;
1890 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001891 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001892 break;
1893 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001894 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001895 break;
1896 case GL_MAX_SERVER_WAIT_TIMEOUT:
1897 *params = mCaps.maxServerWaitTimeout;
1898 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001899
Jamie Madill231c7f52017-04-26 13:45:37 -04001900 // GL_EXT_disjoint_timer_query
1901 case GL_TIMESTAMP_EXT:
1902 *params = mImplementation->getTimestamp();
1903 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001904
Jamie Madill231c7f52017-04-26 13:45:37 -04001905 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1906 *params = mCaps.maxShaderStorageBlockSize;
1907 break;
1908 default:
1909 UNREACHABLE();
1910 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001911 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001912}
1913
Geoff Lang70d0f492015-12-10 17:45:46 -05001914void Context::getPointerv(GLenum pname, void **params) const
1915{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001916 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001917}
1918
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001919void Context::getPointervRobustANGLERobust(GLenum pname,
1920 GLsizei bufSize,
1921 GLsizei *length,
1922 void **params)
1923{
1924 UNIMPLEMENTED();
1925}
1926
Martin Radev66fb8202016-07-28 11:45:20 +03001927void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001928{
Shannon Woods53a94a82014-06-24 15:20:36 -04001929 // Queries about context capabilities and maximums are answered by Context.
1930 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001931
1932 GLenum nativeType;
1933 unsigned int numParams;
1934 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1935 ASSERT(queryStatus);
1936
1937 if (nativeType == GL_INT)
1938 {
1939 switch (target)
1940 {
1941 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1942 ASSERT(index < 3u);
1943 *data = mCaps.maxComputeWorkGroupCount[index];
1944 break;
1945 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1946 ASSERT(index < 3u);
1947 *data = mCaps.maxComputeWorkGroupSize[index];
1948 break;
1949 default:
1950 mGLState.getIntegeri_v(target, index, data);
1951 }
1952 }
1953 else
1954 {
1955 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1956 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001957}
1958
Brandon Jones59770802018-04-02 13:18:42 -07001959void Context::getIntegeri_vRobust(GLenum target,
1960 GLuint index,
1961 GLsizei bufSize,
1962 GLsizei *length,
1963 GLint *data)
1964{
1965 getIntegeri_v(target, index, data);
1966}
1967
Martin Radev66fb8202016-07-28 11:45:20 +03001968void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001969{
Shannon Woods53a94a82014-06-24 15:20:36 -04001970 // Queries about context capabilities and maximums are answered by Context.
1971 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001972
1973 GLenum nativeType;
1974 unsigned int numParams;
1975 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1976 ASSERT(queryStatus);
1977
1978 if (nativeType == GL_INT_64_ANGLEX)
1979 {
1980 mGLState.getInteger64i_v(target, index, data);
1981 }
1982 else
1983 {
1984 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1985 }
1986}
1987
Brandon Jones59770802018-04-02 13:18:42 -07001988void Context::getInteger64i_vRobust(GLenum target,
1989 GLuint index,
1990 GLsizei bufSize,
1991 GLsizei *length,
1992 GLint64 *data)
1993{
1994 getInteger64i_v(target, index, data);
1995}
1996
Martin Radev66fb8202016-07-28 11:45:20 +03001997void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1998{
1999 // Queries about context capabilities and maximums are answered by Context.
2000 // Queries about current GL state values are answered by State.
2001
2002 GLenum nativeType;
2003 unsigned int numParams;
2004 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
2005 ASSERT(queryStatus);
2006
2007 if (nativeType == GL_BOOL)
2008 {
2009 mGLState.getBooleani_v(target, index, data);
2010 }
2011 else
2012 {
2013 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
2014 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04002015}
2016
Brandon Jones59770802018-04-02 13:18:42 -07002017void Context::getBooleani_vRobust(GLenum target,
2018 GLuint index,
2019 GLsizei bufSize,
2020 GLsizei *length,
2021 GLboolean *data)
2022{
2023 getBooleani_v(target, index, data);
2024}
2025
Corentin Wallez336129f2017-10-17 15:55:40 -04002026void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002027{
2028 Buffer *buffer = mGLState.getTargetBuffer(target);
2029 QueryBufferParameteriv(buffer, pname, params);
2030}
2031
Brandon Jones59770802018-04-02 13:18:42 -07002032void Context::getBufferParameterivRobust(BufferBinding target,
2033 GLenum pname,
2034 GLsizei bufSize,
2035 GLsizei *length,
2036 GLint *params)
2037{
2038 getBufferParameteriv(target, pname, params);
2039}
2040
He Yunchao010e4db2017-03-03 14:22:06 +08002041void Context::getFramebufferAttachmentParameteriv(GLenum target,
2042 GLenum attachment,
2043 GLenum pname,
2044 GLint *params)
2045{
2046 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002047 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002048}
2049
Brandon Jones59770802018-04-02 13:18:42 -07002050void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2051 GLenum attachment,
2052 GLenum pname,
2053 GLsizei bufSize,
2054 GLsizei *length,
2055 GLint *params)
2056{
2057 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2058}
2059
He Yunchao010e4db2017-03-03 14:22:06 +08002060void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2061{
2062 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2063 QueryRenderbufferiv(this, renderbuffer, pname, params);
2064}
2065
Brandon Jones59770802018-04-02 13:18:42 -07002066void Context::getRenderbufferParameterivRobust(GLenum target,
2067 GLenum pname,
2068 GLsizei bufSize,
2069 GLsizei *length,
2070 GLint *params)
2071{
2072 getRenderbufferParameteriv(target, pname, params);
2073}
2074
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002075void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002076{
Till Rathmannb8543632018-10-02 19:46:14 +02002077 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002078 QueryTexParameterfv(texture, pname, params);
2079}
2080
Brandon Jones59770802018-04-02 13:18:42 -07002081void Context::getTexParameterfvRobust(TextureType target,
2082 GLenum pname,
2083 GLsizei bufSize,
2084 GLsizei *length,
2085 GLfloat *params)
2086{
2087 getTexParameterfv(target, pname, params);
2088}
2089
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002090void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002091{
Till Rathmannb8543632018-10-02 19:46:14 +02002092 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002093 QueryTexParameteriv(texture, pname, params);
2094}
Jiajia Qin5451d532017-11-16 17:16:34 +08002095
Till Rathmannb8543632018-10-02 19:46:14 +02002096void Context::getTexParameterIiv(TextureType target, GLenum pname, GLint *params)
2097{
2098 const Texture *const texture = getTargetTexture(target);
2099 QueryTexParameterIiv(texture, pname, params);
2100}
2101
2102void Context::getTexParameterIuiv(TextureType target, GLenum pname, GLuint *params)
2103{
2104 const Texture *const texture = getTargetTexture(target);
2105 QueryTexParameterIuiv(texture, pname, params);
2106}
2107
Brandon Jones59770802018-04-02 13:18:42 -07002108void Context::getTexParameterivRobust(TextureType target,
2109 GLenum pname,
2110 GLsizei bufSize,
2111 GLsizei *length,
2112 GLint *params)
2113{
2114 getTexParameteriv(target, pname, params);
2115}
2116
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002117void Context::getTexParameterIivRobust(TextureType target,
2118 GLenum pname,
2119 GLsizei bufSize,
2120 GLsizei *length,
2121 GLint *params)
2122{
2123 UNIMPLEMENTED();
2124}
2125
2126void Context::getTexParameterIuivRobust(TextureType target,
2127 GLenum pname,
2128 GLsizei bufSize,
2129 GLsizei *length,
2130 GLuint *params)
2131{
2132 UNIMPLEMENTED();
2133}
2134
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002135void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002136{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002137 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002138 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002139}
2140
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002141void Context::getTexLevelParameterivRobust(TextureTarget target,
2142 GLint level,
2143 GLenum pname,
2144 GLsizei bufSize,
2145 GLsizei *length,
2146 GLint *params)
2147{
2148 UNIMPLEMENTED();
2149}
2150
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002151void Context::getTexLevelParameterfv(TextureTarget target,
2152 GLint level,
2153 GLenum pname,
2154 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002155{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002156 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002157 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002158}
2159
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002160void Context::getTexLevelParameterfvRobust(TextureTarget target,
2161 GLint level,
2162 GLenum pname,
2163 GLsizei bufSize,
2164 GLsizei *length,
2165 GLfloat *params)
2166{
2167 UNIMPLEMENTED();
2168}
2169
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002170void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002171{
Till Rathmannb8543632018-10-02 19:46:14 +02002172 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002173 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002174 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002175}
2176
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002177void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002178{
Till Rathmannb8543632018-10-02 19:46:14 +02002179 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002180 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002181 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002182}
2183
Brandon Jones59770802018-04-02 13:18:42 -07002184void Context::texParameterfvRobust(TextureType target,
2185 GLenum pname,
2186 GLsizei bufSize,
2187 const GLfloat *params)
2188{
2189 texParameterfv(target, pname, params);
2190}
2191
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002192void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002193{
Till Rathmannb8543632018-10-02 19:46:14 +02002194 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002195 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002196 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002197}
2198
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002199void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002200{
Till Rathmannb8543632018-10-02 19:46:14 +02002201 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002202 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002203 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002204}
2205
Till Rathmannb8543632018-10-02 19:46:14 +02002206void Context::texParameterIiv(TextureType target, GLenum pname, const GLint *params)
2207{
2208 Texture *const texture = getTargetTexture(target);
2209 SetTexParameterIiv(this, texture, pname, params);
2210 onTextureChange(texture);
2211}
2212
2213void Context::texParameterIuiv(TextureType target, GLenum pname, const GLuint *params)
2214{
2215 Texture *const texture = getTargetTexture(target);
2216 SetTexParameterIuiv(this, texture, pname, params);
2217 onTextureChange(texture);
2218}
2219
Brandon Jones59770802018-04-02 13:18:42 -07002220void Context::texParameterivRobust(TextureType target,
2221 GLenum pname,
2222 GLsizei bufSize,
2223 const GLint *params)
2224{
2225 texParameteriv(target, pname, params);
2226}
2227
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002228void Context::texParameterIivRobust(TextureType target,
2229 GLenum pname,
2230 GLsizei bufSize,
2231 const GLint *params)
2232{
2233 UNIMPLEMENTED();
2234}
2235
2236void Context::texParameterIuivRobust(TextureType target,
2237 GLenum pname,
2238 GLsizei bufSize,
2239 const GLuint *params)
2240{
2241 UNIMPLEMENTED();
2242}
2243
Jamie Madill493f9572018-05-24 19:52:15 -04002244void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002245{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002246 // No-op if count draws no primitives for given mode
2247 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002248 {
2249 return;
2250 }
2251
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002252 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002253 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002254 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002255}
2256
Jamie Madill493f9572018-05-24 19:52:15 -04002257void Context::drawArraysInstanced(PrimitiveMode mode,
2258 GLint first,
2259 GLsizei count,
2260 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002261{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002262 // No-op if count draws no primitives for given mode
2263 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002264 {
2265 return;
2266 }
2267
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002268 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002269 ANGLE_CONTEXT_TRY(
2270 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002271 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2272 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002273}
2274
Jamie Madill493f9572018-05-24 19:52:15 -04002275void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002276{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002277 // No-op if count draws no primitives for given mode
2278 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002279 {
2280 return;
2281 }
2282
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002283 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002284 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002285}
2286
Jamie Madill493f9572018-05-24 19:52:15 -04002287void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002288 GLsizei count,
2289 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002290 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002291 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002292{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002293 // No-op if count draws no primitives for given mode
2294 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002295 {
2296 return;
2297 }
2298
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002299 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002300 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002301 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002302}
2303
Jamie Madill493f9572018-05-24 19:52:15 -04002304void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002305 GLuint start,
2306 GLuint end,
2307 GLsizei count,
2308 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002309 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002310{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002311 // No-op if count draws no primitives for given mode
2312 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002313 {
2314 return;
2315 }
2316
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002317 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002318 ANGLE_CONTEXT_TRY(
2319 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002320}
2321
Jamie Madill493f9572018-05-24 19:52:15 -04002322void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002323{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002324 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002325 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002326}
2327
Jamie Madill493f9572018-05-24 19:52:15 -04002328void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002329{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002330 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002331 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002332}
2333
Jamie Madill675fe712016-12-19 13:07:54 -05002334void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002335{
Jamie Madillafa02a22017-11-23 12:57:38 -05002336 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002337}
2338
Jamie Madill675fe712016-12-19 13:07:54 -05002339void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002340{
Jamie Madillafa02a22017-11-23 12:57:38 -05002341 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002342}
2343
Austin Kinross6ee1e782015-05-29 17:05:37 -07002344void Context::insertEventMarker(GLsizei length, const char *marker)
2345{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002346 ASSERT(mImplementation);
2347 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002348}
2349
2350void Context::pushGroupMarker(GLsizei length, const char *marker)
2351{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002352 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002353
2354 if (marker == nullptr)
2355 {
2356 // From the EXT_debug_marker spec,
2357 // "If <marker> is null then an empty string is pushed on the stack."
2358 mImplementation->pushGroupMarker(length, "");
2359 }
2360 else
2361 {
2362 mImplementation->pushGroupMarker(length, marker);
2363 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002364}
2365
2366void Context::popGroupMarker()
2367{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002368 ASSERT(mImplementation);
2369 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002370}
2371
Geoff Langd8605522016-04-13 10:19:12 -04002372void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2373{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002374 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002375 ASSERT(programObject);
2376
2377 programObject->bindUniformLocation(location, name);
2378}
2379
Brandon Jones59770802018-04-02 13:18:42 -07002380void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002381{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002382 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002383}
2384
Brandon Jones59770802018-04-02 13:18:42 -07002385void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002386{
2387 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2388}
2389
Brandon Jones59770802018-04-02 13:18:42 -07002390void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002391{
2392 GLfloat I[16];
2393 angle::Matrix<GLfloat>::setToIdentity(I);
2394
2395 mGLState.loadPathRenderingMatrix(matrixMode, I);
2396}
2397
2398void Context::stencilFillPath(GLuint path, GLenum fillMode, 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->stencilFillPath(pathObj, fillMode, mask);
2407}
2408
2409void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
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->stencilStrokePath(pathObj, reference, mask);
2418}
2419
2420void Context::coverFillPath(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->coverFillPath(pathObj, coverMode);
2429}
2430
2431void Context::coverStrokePath(GLuint path, 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->coverStrokePath(pathObj, coverMode);
2440}
2441
2442void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2443{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002444 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002445 if (!pathObj)
2446 return;
2447
Geoff Lang9bf86f02018-07-26 11:46:34 -04002448 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002449
2450 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2451}
2452
2453void Context::stencilThenCoverStrokePath(GLuint path,
2454 GLint reference,
2455 GLuint mask,
2456 GLenum coverMode)
2457{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002458 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002459 if (!pathObj)
2460 return;
2461
Geoff Lang9bf86f02018-07-26 11:46:34 -04002462 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002463
2464 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2465}
2466
Sami Väisänend59ca052016-06-21 16:10:00 +03002467void Context::coverFillPathInstanced(GLsizei numPaths,
2468 GLenum pathNameType,
2469 const void *paths,
2470 GLuint pathBase,
2471 GLenum coverMode,
2472 GLenum transformType,
2473 const GLfloat *transformValues)
2474{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002475 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002476
Geoff Lang9bf86f02018-07-26 11:46:34 -04002477 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002478
2479 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2480}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002481
Sami Väisänend59ca052016-06-21 16:10:00 +03002482void Context::coverStrokePathInstanced(GLsizei numPaths,
2483 GLenum pathNameType,
2484 const void *paths,
2485 GLuint pathBase,
2486 GLenum coverMode,
2487 GLenum transformType,
2488 const GLfloat *transformValues)
2489{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002490 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002491
2492 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002493 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002494
2495 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2496 transformValues);
2497}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002498
Sami Väisänend59ca052016-06-21 16:10:00 +03002499void Context::stencilFillPathInstanced(GLsizei numPaths,
2500 GLenum pathNameType,
2501 const void *paths,
2502 GLuint pathBase,
2503 GLenum fillMode,
2504 GLuint mask,
2505 GLenum transformType,
2506 const GLfloat *transformValues)
2507{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002508 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002509
2510 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002511 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002512
2513 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2514 transformValues);
2515}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002516
Sami Väisänend59ca052016-06-21 16:10:00 +03002517void Context::stencilStrokePathInstanced(GLsizei numPaths,
2518 GLenum pathNameType,
2519 const void *paths,
2520 GLuint pathBase,
2521 GLint reference,
2522 GLuint mask,
2523 GLenum transformType,
2524 const GLfloat *transformValues)
2525{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002526 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002527
Geoff Lang9bf86f02018-07-26 11:46:34 -04002528 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002529
2530 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2531 transformValues);
2532}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002533
Sami Väisänend59ca052016-06-21 16:10:00 +03002534void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2535 GLenum pathNameType,
2536 const void *paths,
2537 GLuint pathBase,
2538 GLenum fillMode,
2539 GLuint mask,
2540 GLenum coverMode,
2541 GLenum transformType,
2542 const GLfloat *transformValues)
2543{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002544 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002545
Geoff Lang9bf86f02018-07-26 11:46:34 -04002546 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002547
2548 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2549 transformType, transformValues);
2550}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002551
Sami Väisänend59ca052016-06-21 16:10:00 +03002552void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2553 GLenum pathNameType,
2554 const void *paths,
2555 GLuint pathBase,
2556 GLint reference,
2557 GLuint mask,
2558 GLenum coverMode,
2559 GLenum transformType,
2560 const GLfloat *transformValues)
2561{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002562 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002563
Geoff Lang9bf86f02018-07-26 11:46:34 -04002564 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002565
2566 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2567 transformType, transformValues);
2568}
2569
Sami Väisänen46eaa942016-06-29 10:26:37 +03002570void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2571{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002572 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002573
2574 programObject->bindFragmentInputLocation(location, name);
2575}
2576
2577void Context::programPathFragmentInputGen(GLuint program,
2578 GLint location,
2579 GLenum genMode,
2580 GLint components,
2581 const GLfloat *coeffs)
2582{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002583 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002584
jchen103fd614d2018-08-13 12:21:58 +08002585 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002586}
2587
jchen1015015f72017-03-16 13:54:21 +08002588GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2589{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002590 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002591 return QueryProgramResourceIndex(programObject, programInterface, name);
2592}
2593
jchen10fd7c3b52017-03-21 15:36:03 +08002594void Context::getProgramResourceName(GLuint program,
2595 GLenum programInterface,
2596 GLuint index,
2597 GLsizei bufSize,
2598 GLsizei *length,
2599 GLchar *name)
2600{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002601 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002602 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2603}
2604
jchen10191381f2017-04-11 13:59:04 +08002605GLint Context::getProgramResourceLocation(GLuint program,
2606 GLenum programInterface,
2607 const GLchar *name)
2608{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002609 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002610 return QueryProgramResourceLocation(programObject, programInterface, name);
2611}
2612
jchen10880683b2017-04-12 16:21:55 +08002613void Context::getProgramResourceiv(GLuint program,
2614 GLenum programInterface,
2615 GLuint index,
2616 GLsizei propCount,
2617 const GLenum *props,
2618 GLsizei bufSize,
2619 GLsizei *length,
2620 GLint *params)
2621{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002622 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002623 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2624 length, params);
2625}
2626
jchen10d9cd7b72017-08-30 15:04:25 +08002627void Context::getProgramInterfaceiv(GLuint program,
2628 GLenum programInterface,
2629 GLenum pname,
2630 GLint *params)
2631{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002632 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002633 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2634}
2635
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002636void Context::getProgramInterfaceivRobust(GLuint program,
2637 GLenum programInterface,
2638 GLenum pname,
2639 GLsizei bufSize,
2640 GLsizei *length,
2641 GLint *params)
2642{
2643 UNIMPLEMENTED();
2644}
2645
Jamie Madill306b6c12018-07-27 08:12:49 -04002646void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002647{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002648 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002649}
2650
Jamie Madillabfbc0f2018-10-09 12:48:52 -04002651void Context::handleError(GLenum errorCode,
2652 const char *message,
2653 const char *file,
2654 const char *function,
2655 unsigned int line)
2656{
2657 mErrors.handleError(errorCode, message, file, function, line);
2658}
2659
Jamie Madilla139f012018-10-10 16:13:03 -04002660void Context::validationError(GLenum errorCode, const char *message)
2661{
2662 mErrors.validationError(errorCode, message);
2663}
2664
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002665// Get one of the recorded errors and clear its flag, if any.
2666// [OpenGL ES 2.0.24] section 2.5 page 13.
2667GLenum Context::getError()
2668{
Geoff Langda5777c2014-07-11 09:52:58 -04002669 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002670 {
Geoff Langda5777c2014-07-11 09:52:58 -04002671 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002672 }
Geoff Langda5777c2014-07-11 09:52:58 -04002673 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002674 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002675 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002676 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002677}
2678
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002679// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002680void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002681{
2682 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002683 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002684 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002685 mContextLostForced = true;
2686 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002687 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002688}
2689
Jamie Madillfa920eb2018-01-04 11:45:50 -05002690GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002691{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002692 // Even if the application doesn't want to know about resets, we want to know
2693 // as it will allow us to skip all the calls.
2694 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002695 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002696 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002697 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002698 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002699 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002700
2701 // EXT_robustness, section 2.6: If the reset notification behavior is
2702 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2703 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2704 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002705 }
2706
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002707 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2708 // status should be returned at least once, and GL_NO_ERROR should be returned
2709 // once the device has finished resetting.
2710 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002711 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002712 ASSERT(mResetStatus == GL_NO_ERROR);
2713 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002714
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002715 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002716 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002717 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002718 }
2719 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002720 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002721 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002722 // If markContextLost was used to mark the context lost then
2723 // assume that is not recoverable, and continue to report the
2724 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002725 mResetStatus = mImplementation->getResetStatus();
2726 }
Jamie Madill893ab082014-05-16 16:56:10 -04002727
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002728 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002729}
2730
2731bool Context::isResetNotificationEnabled()
2732{
2733 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2734}
2735
Corentin Walleze3b10e82015-05-20 11:06:25 -04002736const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002737{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002738 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002739}
2740
2741EGLenum Context::getClientType() const
2742{
2743 return mClientType;
2744}
2745
2746EGLenum Context::getRenderBuffer() const
2747{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002748 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2749 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002750 {
2751 return EGL_NONE;
2752 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002753
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002754 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002755 ASSERT(backAttachment != nullptr);
2756 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002757}
2758
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002759VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002760{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002761 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002762 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2763 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002764 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002765 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2766 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002767
Jamie Madill96a483b2017-06-27 16:49:21 -04002768 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002769 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002770
2771 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002772}
2773
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002774TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002775{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002776 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002777 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2778 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002779 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002780 transformFeedback =
2781 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002782 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002783 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002784 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002785
2786 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002787}
2788
2789bool Context::isVertexArrayGenerated(GLuint vertexArray)
2790{
Jamie Madill96a483b2017-06-27 16:49:21 -04002791 ASSERT(mVertexArrayMap.contains(0));
2792 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002793}
2794
2795bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2796{
Jamie Madill96a483b2017-06-27 16:49:21 -04002797 ASSERT(mTransformFeedbackMap.contains(0));
2798 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002799}
2800
Shannon Woods53a94a82014-06-24 15:20:36 -04002801void Context::detachTexture(GLuint texture)
2802{
2803 // Simple pass-through to State's detachTexture method, as textures do not require
2804 // allocation map management either here or in the resource manager at detach time.
2805 // Zero textures are held by the Context, and we don't attempt to request them from
2806 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002807 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002808}
2809
James Darpinian4d9d4832018-03-13 12:43:28 -07002810void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002811{
Yuly Novikov5807a532015-12-03 13:01:22 -05002812 // Simple pass-through to State's detachBuffer method, since
2813 // only buffer attachments to container objects that are bound to the current context
2814 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002815
Yuly Novikov5807a532015-12-03 13:01:22 -05002816 // [OpenGL ES 3.2] section 5.1.2 page 45:
2817 // Attachments to unbound container objects, such as
2818 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2819 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002820 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002821}
2822
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002823void Context::detachFramebuffer(GLuint framebuffer)
2824{
Shannon Woods53a94a82014-06-24 15:20:36 -04002825 // Framebuffer detachment is handled by Context, because 0 is a valid
2826 // Framebuffer object, and a pointer to it must be passed from Context
2827 // to State at binding time.
2828
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002829 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002830 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2831 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2832 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002833
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002834 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002835 {
2836 bindReadFramebuffer(0);
2837 }
2838
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002839 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002840 {
2841 bindDrawFramebuffer(0);
2842 }
2843}
2844
2845void Context::detachRenderbuffer(GLuint renderbuffer)
2846{
Jamie Madilla02315b2017-02-23 14:14:47 -05002847 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002848}
2849
Jamie Madill57a89722013-07-02 11:57:03 -04002850void Context::detachVertexArray(GLuint vertexArray)
2851{
Jamie Madill77a72f62015-04-14 11:18:32 -04002852 // Vertex array detachment is handled by Context, because 0 is a valid
2853 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002854 // binding time.
2855
Jamie Madill57a89722013-07-02 11:57:03 -04002856 // [OpenGL ES 3.0.2] section 2.10 page 43:
2857 // If a vertex array object that is currently bound is deleted, the binding
2858 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002859 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002860 {
2861 bindVertexArray(0);
2862 }
2863}
2864
Geoff Langc8058452014-02-03 12:04:11 -05002865void Context::detachTransformFeedback(GLuint transformFeedback)
2866{
Corentin Walleza2257da2016-04-19 16:43:12 -04002867 // Transform feedback detachment is handled by Context, because 0 is a valid
2868 // transform feedback, and a pointer to it must be passed from Context to State at
2869 // binding time.
2870
2871 // The OpenGL specification doesn't mention what should happen when the currently bound
2872 // transform feedback object is deleted. Since it is a container object, we treat it like
2873 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002874 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002875 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002876 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002877 }
Geoff Langc8058452014-02-03 12:04:11 -05002878}
2879
Jamie Madilldc356042013-07-19 16:36:57 -04002880void Context::detachSampler(GLuint sampler)
2881{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002882 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002883}
2884
Yunchao Hea336b902017-08-02 16:05:21 +08002885void Context::detachProgramPipeline(GLuint pipeline)
2886{
2887 mGLState.detachProgramPipeline(this, pipeline);
2888}
2889
Jamie Madill3ef140a2017-08-26 23:11:21 -04002890void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002891{
Shaodde78e82017-05-22 14:13:27 +08002892 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002893 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002894}
2895
Jamie Madille29d1672013-07-19 16:36:57 -04002896void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2897{
Till Rathmannb8543632018-10-02 19:46:14 +02002898 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002899 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002900 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002901}
Jamie Madille29d1672013-07-19 16:36:57 -04002902
Geoff Langc1984ed2016-10-07 12:41:00 -04002903void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2904{
Till Rathmannb8543632018-10-02 19:46:14 +02002905 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002906 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002907 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002908}
2909
Till Rathmannb8543632018-10-02 19:46:14 +02002910void Context::samplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
2911{
2912 Sampler *const samplerObject =
2913 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2914 SetSamplerParameterIiv(this, samplerObject, pname, param);
2915}
2916
2917void Context::samplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
2918{
2919 Sampler *const samplerObject =
2920 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2921 SetSamplerParameterIuiv(this, samplerObject, pname, param);
2922}
2923
Brandon Jones59770802018-04-02 13:18:42 -07002924void Context::samplerParameterivRobust(GLuint sampler,
2925 GLenum pname,
2926 GLsizei bufSize,
2927 const GLint *param)
2928{
2929 samplerParameteriv(sampler, pname, param);
2930}
2931
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002932void Context::samplerParameterIivRobust(GLuint sampler,
2933 GLenum pname,
2934 GLsizei bufSize,
2935 const GLint *param)
2936{
2937 UNIMPLEMENTED();
2938}
2939
2940void Context::samplerParameterIuivRobust(GLuint sampler,
2941 GLenum pname,
2942 GLsizei bufSize,
2943 const GLuint *param)
2944{
2945 UNIMPLEMENTED();
2946}
2947
Jamie Madille29d1672013-07-19 16:36:57 -04002948void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2949{
Till Rathmannb8543632018-10-02 19:46:14 +02002950 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002951 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002952 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002953}
2954
Geoff Langc1984ed2016-10-07 12:41:00 -04002955void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002956{
Till Rathmannb8543632018-10-02 19:46:14 +02002957 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002958 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002959 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002960}
2961
Brandon Jones59770802018-04-02 13:18:42 -07002962void Context::samplerParameterfvRobust(GLuint sampler,
2963 GLenum pname,
2964 GLsizei bufSize,
2965 const GLfloat *param)
2966{
2967 samplerParameterfv(sampler, pname, param);
2968}
2969
Geoff Langc1984ed2016-10-07 12:41:00 -04002970void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002971{
Till Rathmannb8543632018-10-02 19:46:14 +02002972 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002973 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002974 QuerySamplerParameteriv(samplerObject, pname, params);
2975}
Jamie Madill9675b802013-07-19 16:36:59 -04002976
Till Rathmannb8543632018-10-02 19:46:14 +02002977void Context::getSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
2978{
2979 const Sampler *const samplerObject =
2980 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2981 QuerySamplerParameterIiv(samplerObject, pname, params);
2982}
2983
2984void Context::getSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
2985{
2986 const Sampler *const samplerObject =
2987 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2988 QuerySamplerParameterIuiv(samplerObject, pname, params);
2989}
2990
Brandon Jones59770802018-04-02 13:18:42 -07002991void Context::getSamplerParameterivRobust(GLuint sampler,
2992 GLenum pname,
2993 GLsizei bufSize,
2994 GLsizei *length,
2995 GLint *params)
2996{
2997 getSamplerParameteriv(sampler, pname, params);
2998}
2999
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07003000void Context::getSamplerParameterIivRobust(GLuint sampler,
3001 GLenum pname,
3002 GLsizei bufSize,
3003 GLsizei *length,
3004 GLint *params)
3005{
3006 UNIMPLEMENTED();
3007}
3008
3009void Context::getSamplerParameterIuivRobust(GLuint sampler,
3010 GLenum pname,
3011 GLsizei bufSize,
3012 GLsizei *length,
3013 GLuint *params)
3014{
3015 UNIMPLEMENTED();
3016}
3017
Geoff Langc1984ed2016-10-07 12:41:00 -04003018void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
3019{
Till Rathmannb8543632018-10-02 19:46:14 +02003020 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05003021 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04003022 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04003023}
3024
Brandon Jones59770802018-04-02 13:18:42 -07003025void Context::getSamplerParameterfvRobust(GLuint sampler,
3026 GLenum pname,
3027 GLsizei bufSize,
3028 GLsizei *length,
3029 GLfloat *params)
3030{
3031 getSamplerParameterfv(sampler, pname, params);
3032}
3033
Olli Etuahof0fee072016-03-30 15:11:58 +03003034void Context::programParameteri(GLuint program, GLenum pname, GLint value)
3035{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04003036 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08003037 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03003038}
3039
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003040void Context::initRendererString()
3041{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003042 std::ostringstream rendererString;
3043 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003044 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003045 rendererString << ")";
3046
Geoff Langcec35902014-04-16 10:52:36 -04003047 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003048}
3049
Geoff Langc339c4e2016-11-29 10:37:36 -05003050void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003051{
Geoff Langc339c4e2016-11-29 10:37:36 -05003052 const Version &clientVersion = getClientVersion();
3053
3054 std::ostringstream versionString;
3055 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
3056 << ANGLE_VERSION_STRING << ")";
3057 mVersionString = MakeStaticString(versionString.str());
3058
3059 std::ostringstream shadingLanguageVersionString;
3060 shadingLanguageVersionString << "OpenGL ES GLSL ES "
3061 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
3062 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
3063 << ")";
3064 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003065}
3066
Geoff Langcec35902014-04-16 10:52:36 -04003067void Context::initExtensionStrings()
3068{
Geoff Langc339c4e2016-11-29 10:37:36 -05003069 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
3070 std::ostringstream combinedStringStream;
3071 std::copy(strings.begin(), strings.end(),
3072 std::ostream_iterator<const char *>(combinedStringStream, " "));
3073 return MakeStaticString(combinedStringStream.str());
3074 };
3075
3076 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003077 for (const auto &extensionString : mExtensions.getStrings())
3078 {
3079 mExtensionStrings.push_back(MakeStaticString(extensionString));
3080 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003081 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003082
Geoff Langc339c4e2016-11-29 10:37:36 -05003083 mRequestableExtensionStrings.clear();
3084 for (const auto &extensionInfo : GetExtensionInfoMap())
3085 {
3086 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003087 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003088 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003089 {
3090 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3091 }
3092 }
3093 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003094}
3095
Geoff Langc339c4e2016-11-29 10:37:36 -05003096const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003097{
Geoff Langc339c4e2016-11-29 10:37:36 -05003098 switch (name)
3099 {
3100 case GL_VENDOR:
3101 return reinterpret_cast<const GLubyte *>("Google Inc.");
3102
3103 case GL_RENDERER:
3104 return reinterpret_cast<const GLubyte *>(mRendererString);
3105
3106 case GL_VERSION:
3107 return reinterpret_cast<const GLubyte *>(mVersionString);
3108
3109 case GL_SHADING_LANGUAGE_VERSION:
3110 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3111
3112 case GL_EXTENSIONS:
3113 return reinterpret_cast<const GLubyte *>(mExtensionString);
3114
3115 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3116 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3117
3118 default:
3119 UNREACHABLE();
3120 return nullptr;
3121 }
Geoff Langcec35902014-04-16 10:52:36 -04003122}
3123
Geoff Langc339c4e2016-11-29 10:37:36 -05003124const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003125{
Geoff Langc339c4e2016-11-29 10:37:36 -05003126 switch (name)
3127 {
3128 case GL_EXTENSIONS:
3129 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3130
3131 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3132 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3133
3134 default:
3135 UNREACHABLE();
3136 return nullptr;
3137 }
Geoff Langcec35902014-04-16 10:52:36 -04003138}
3139
3140size_t Context::getExtensionStringCount() const
3141{
3142 return mExtensionStrings.size();
3143}
3144
Geoff Lang111a99e2017-10-17 10:58:41 -04003145bool Context::isExtensionRequestable(const char *name)
3146{
3147 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3148 auto extension = extensionInfos.find(name);
3149
Geoff Lang111a99e2017-10-17 10:58:41 -04003150 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003151 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003152}
3153
Geoff Langc339c4e2016-11-29 10:37:36 -05003154void Context::requestExtension(const char *name)
3155{
3156 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3157 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3158 const auto &extension = extensionInfos.at(name);
3159 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003160 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003161
3162 if (mExtensions.*(extension.ExtensionsMember))
3163 {
3164 // Extension already enabled
3165 return;
3166 }
3167
3168 mExtensions.*(extension.ExtensionsMember) = true;
3169 updateCaps();
3170 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003171
Jamie Madill2f348d22017-06-05 10:50:59 -04003172 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3173 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003174
Jamie Madill81c2e252017-09-09 23:32:46 -04003175 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3176 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003177 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003178 for (auto &zeroTexture : mZeroTextures)
3179 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003180 if (zeroTexture.get() != nullptr)
3181 {
3182 zeroTexture->signalDirty(this, InitState::Initialized);
3183 }
Geoff Lang9aded172017-04-05 11:07:56 -04003184 }
3185
Jamie Madillb983a4b2018-08-01 11:34:51 -04003186 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003187}
3188
3189size_t Context::getRequestableExtensionStringCount() const
3190{
3191 return mRequestableExtensionStrings.size();
3192}
3193
Jamie Madill493f9572018-05-24 19:52:15 -04003194void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003195{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003196 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003197 ASSERT(transformFeedback != nullptr);
3198 ASSERT(!transformFeedback->isPaused());
3199
Jamie Madill6c1f6712017-02-14 19:08:04 -05003200 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003201 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003202}
3203
3204bool Context::hasActiveTransformFeedback(GLuint program) const
3205{
3206 for (auto pair : mTransformFeedbackMap)
3207 {
3208 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3209 {
3210 return true;
3211 }
3212 }
3213 return false;
3214}
3215
Geoff Lang33f11fb2018-05-07 13:42:47 -04003216Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003217{
3218 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3219
jchen1082af6202018-06-22 10:59:52 +08003220 // Explicitly enable GL_KHR_parallel_shader_compile
3221 supportedExtensions.parallelShaderCompile = true;
3222
Geoff Langb0f917f2017-12-05 13:41:54 -05003223 if (getClientVersion() < ES_2_0)
3224 {
3225 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003226 supportedExtensions.pointSizeArray = true;
3227 supportedExtensions.textureCubeMap = true;
3228 supportedExtensions.pointSprite = true;
3229 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003230 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003231 }
3232
3233 if (getClientVersion() < ES_3_0)
3234 {
3235 // Disable ES3+ extensions
3236 supportedExtensions.colorBufferFloat = false;
3237 supportedExtensions.eglImageExternalEssl3 = false;
3238 supportedExtensions.textureNorm16 = false;
3239 supportedExtensions.multiview = false;
3240 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003241 supportedExtensions.copyTexture3d = false;
Yizhou Jiang7818a852018-09-06 15:02:04 +08003242 supportedExtensions.textureMultisample = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003243 }
3244
3245 if (getClientVersion() < ES_3_1)
3246 {
3247 // Disable ES3.1+ extensions
3248 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003249
3250 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3251 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003252 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003253 }
3254
3255 if (getClientVersion() > ES_2_0)
3256 {
3257 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3258 // supportedExtensions.sRGB = false;
3259 }
3260
3261 // Some extensions are always available because they are implemented in the GL layer.
3262 supportedExtensions.bindUniformLocation = true;
3263 supportedExtensions.vertexArrayObject = true;
3264 supportedExtensions.bindGeneratesResource = true;
3265 supportedExtensions.clientArrays = true;
3266 supportedExtensions.requestExtension = true;
3267
3268 // Enable the no error extension if the context was created with the flag.
3269 supportedExtensions.noError = mSkipValidation;
3270
3271 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003272 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003273
3274 // Explicitly enable GL_KHR_debug
3275 supportedExtensions.debug = true;
3276 supportedExtensions.maxDebugMessageLength = 1024;
3277 supportedExtensions.maxDebugLoggedMessages = 1024;
3278 supportedExtensions.maxDebugGroupStackDepth = 1024;
3279 supportedExtensions.maxLabelLength = 1024;
3280
3281 // Explicitly enable GL_ANGLE_robust_client_memory
3282 supportedExtensions.robustClientMemory = true;
3283
3284 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003285 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003286
3287 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3288 // supports it.
3289 supportedExtensions.robustBufferAccessBehavior =
3290 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3291
3292 // Enable the cache control query unconditionally.
3293 supportedExtensions.programCacheControl = true;
3294
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003295 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003296 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003297 {
3298 // GL_ANGLE_explicit_context_gles1
3299 supportedExtensions.explicitContextGles1 = true;
3300 // GL_ANGLE_explicit_context
3301 supportedExtensions.explicitContext = true;
3302 }
3303
Geoff Lang79b91402018-10-04 15:11:30 -04003304 supportedExtensions.memorySize = true;
3305
Geoff Langb0f917f2017-12-05 13:41:54 -05003306 return supportedExtensions;
3307}
3308
Geoff Lang33f11fb2018-05-07 13:42:47 -04003309void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003310{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003311 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003312
Geoff Lang33f11fb2018-05-07 13:42:47 -04003313 mSupportedExtensions = generateSupportedExtensions();
3314 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003315
3316 mLimitations = mImplementation->getNativeLimitations();
3317
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003318 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3319 if (getClientVersion() < Version(2, 0))
3320 {
3321 mCaps.maxMultitextureUnits = 4;
3322 mCaps.maxClipPlanes = 6;
3323 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003324 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3325 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3326 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003327 mCaps.minSmoothPointSize = 1.0f;
3328 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003329 mCaps.minSmoothLineWidth = 1.0f;
3330 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003331 }
3332
Luc Ferronad2ae932018-06-11 15:31:17 -04003333 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003334 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003335
Luc Ferronad2ae932018-06-11 15:31:17 -04003336 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3337
Jamie Madill0f80ed82017-09-19 00:24:56 -04003338 if (getClientVersion() < ES_3_1)
3339 {
3340 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3341 }
3342 else
3343 {
3344 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3345 }
Geoff Lang301d1612014-07-09 10:34:37 -04003346
Jiawei Shao54aafe52018-04-27 14:54:57 +08003347 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3348 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003349 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3350
Jamie Madill0f80ed82017-09-19 00:24:56 -04003351 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3352 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3353
3354 // Limit textures as well, so we can use fast bitsets with texture bindings.
3355 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003356 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3357 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3358 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3359 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003360
Jiawei Shaodb342272017-09-27 10:21:45 +08003361 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3362
Geoff Langc287ea62016-09-16 14:46:51 -04003363 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003364 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003365 for (const auto &extensionInfo : GetExtensionInfoMap())
3366 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003367 // If the user has requested that extensions start disabled and they are requestable,
3368 // disable them.
3369 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003370 {
3371 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3372 }
3373 }
3374
3375 // Generate texture caps
3376 updateCaps();
3377}
3378
3379void Context::updateCaps()
3380{
Geoff Lang900013c2014-07-07 11:32:19 -04003381 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003382 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003383
Jamie Madill7b62cf92017-11-02 15:20:49 -04003384 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003385 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003386 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003387 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003388
Geoff Lang0d8b7242015-09-09 14:56:53 -04003389 // Update the format caps based on the client version and extensions.
3390 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3391 // ES3.
3392 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003393 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003394 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003395 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003396 formatCaps.textureAttachment =
3397 formatCaps.textureAttachment &&
3398 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3399 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3400 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003401
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003402 // OpenGL ES does not support multisampling with non-rendererable formats
3403 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003404 if (!formatCaps.renderbuffer ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003405 (getClientVersion() < ES_3_1 &&
3406 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003407 {
Geoff Langd87878e2014-09-19 15:42:59 -04003408 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003409 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003410 else
3411 {
3412 // We may have limited the max samples for some required renderbuffer formats due to
3413 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3414 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3415
3416 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3417 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3418 // exception of signed and unsigned integer formats."
3419 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3420 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3421 {
3422 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3423 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3424 }
3425
3426 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3427 if (getClientVersion() >= ES_3_1)
3428 {
3429 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3430 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3431 // the exception that the signed and unsigned integer formats are required only to
3432 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3433 // multisamples, which must be at least one."
3434 if (formatInfo.componentType == GL_INT ||
3435 formatInfo.componentType == GL_UNSIGNED_INT)
3436 {
3437 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3438 }
3439
3440 // GLES 3.1 section 19.3.1.
3441 if (formatCaps.texturable)
3442 {
3443 if (formatInfo.depthBits > 0)
3444 {
3445 mCaps.maxDepthTextureSamples =
3446 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3447 }
3448 else if (formatInfo.redBits > 0)
3449 {
3450 mCaps.maxColorTextureSamples =
3451 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3452 }
3453 }
3454 }
3455 }
Geoff Langd87878e2014-09-19 15:42:59 -04003456
3457 if (formatCaps.texturable && formatInfo.compressed)
3458 {
Geoff Langca271392017-04-05 12:30:00 -04003459 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003460 }
3461
Geoff Langca271392017-04-05 12:30:00 -04003462 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003463 }
Jamie Madill32447362017-06-28 14:53:52 -04003464
3465 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003466 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003467 {
3468 mMemoryProgramCache = nullptr;
3469 }
Corentin Walleze4477002017-12-01 14:39:58 -05003470
3471 // Compute which buffer types are allowed
3472 mValidBufferBindings.reset();
3473 mValidBufferBindings.set(BufferBinding::ElementArray);
3474 mValidBufferBindings.set(BufferBinding::Array);
3475
3476 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3477 {
3478 mValidBufferBindings.set(BufferBinding::PixelPack);
3479 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3480 }
3481
3482 if (getClientVersion() >= ES_3_0)
3483 {
3484 mValidBufferBindings.set(BufferBinding::CopyRead);
3485 mValidBufferBindings.set(BufferBinding::CopyWrite);
3486 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3487 mValidBufferBindings.set(BufferBinding::Uniform);
3488 }
3489
3490 if (getClientVersion() >= ES_3_1)
3491 {
3492 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3493 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3494 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3495 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3496 }
jchen107ae70d82018-07-06 13:47:01 +08003497
3498 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003499
3500 // Reinitialize state cache after extension changes.
3501 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003502}
3503
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003504void Context::initWorkarounds()
3505{
Jamie Madill761b02c2017-06-23 16:27:06 -04003506 // Apply back-end workarounds.
3507 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3508
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003509 // Lose the context upon out of memory error if the application is
3510 // expecting to watch for those events.
3511 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
Jamie Madilld4f07762018-10-19 19:24:07 -04003512
3513 if (mWorkarounds.syncFramebufferBindingsOnTexImage)
3514 {
3515 // Update the Framebuffer bindings on TexImage to work around an Intel bug.
3516 mTexImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
3517 mTexImageDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
3518 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003519}
3520
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003521// Return true if the draw is a no-op, else return false.
3522// A no-op draw occurs if the count of vertices is less than the minimum required to
3523// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3524bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3525{
3526 return count < kMinimumPrimitiveCounts[mode];
3527}
3528
3529bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3530{
3531 return (instanceCount == 0) || noopDraw(mode, count);
3532}
3533
Jamie Madill6f755b22018-10-09 12:48:54 -04003534angle::Result Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003535{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003536 if (mGLES1Renderer)
3537 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003538 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003539 }
3540
Geoff Lang9bf86f02018-07-26 11:46:34 -04003541 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003542
3543 if (isRobustResourceInitEnabled())
3544 {
3545 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3546 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3547 }
3548
Geoff Langa8cb2872018-03-09 16:09:40 -05003549 ANGLE_TRY(syncDirtyBits());
Jamie Madill6f755b22018-10-09 12:48:54 -04003550 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003551}
3552
3553Error Context::prepareForClear(GLbitfield mask)
3554{
Geoff Langa8cb2872018-03-09 16:09:40 -05003555 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003556 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003557 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003558 return NoError();
3559}
3560
3561Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3562{
Geoff Langa8cb2872018-03-09 16:09:40 -05003563 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003564 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3565 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003566 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003567 return NoError();
3568}
3569
Geoff Langa8cb2872018-03-09 16:09:40 -05003570Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003571{
Geoff Langa8cb2872018-03-09 16:09:40 -05003572 ANGLE_TRY(syncDirtyObjects(objectMask));
3573 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003574 return NoError();
3575}
3576
Jamie Madill6f755b22018-10-09 12:48:54 -04003577angle::Result Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003578{
3579 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003580 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003581 mGLState.clearDirtyBits();
Jamie Madill6f755b22018-10-09 12:48:54 -04003582 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003583}
3584
Jamie Madill6f755b22018-10-09 12:48:54 -04003585angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003586{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003587 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003588 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003589 mGLState.clearDirtyBits(dirtyBits);
Jamie Madill6f755b22018-10-09 12:48:54 -04003590 return angle::Result::Continue();
Jamie Madill1b94d432015-08-07 13:23:23 -04003591}
Jamie Madillc29968b2016-01-20 11:17:23 -05003592
Jamie Madill6f755b22018-10-09 12:48:54 -04003593angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003594{
3595 return mGLState.syncDirtyObjects(this, objectMask);
3596}
3597
Jamie Madillc29968b2016-01-20 11:17:23 -05003598void Context::blitFramebuffer(GLint srcX0,
3599 GLint srcY0,
3600 GLint srcX1,
3601 GLint srcY1,
3602 GLint dstX0,
3603 GLint dstY0,
3604 GLint dstX1,
3605 GLint dstY1,
3606 GLbitfield mask,
3607 GLenum filter)
3608{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003609 if (mask == 0)
3610 {
3611 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3612 // buffers are copied.
3613 return;
3614 }
3615
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003616 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003617 ASSERT(drawFramebuffer);
3618
3619 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3620 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3621
Jamie Madillbc918e72018-03-08 09:47:21 -05003622 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003623
Jamie Madillc564c072017-06-01 12:45:42 -04003624 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003625}
Jamie Madillc29968b2016-01-20 11:17:23 -05003626
3627void Context::clear(GLbitfield mask)
3628{
Geoff Langd4fff502017-09-22 11:28:28 -04003629 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3630 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003631}
3632
3633void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3634{
Olli Etuaho78df3362018-10-05 16:43:27 +03003635 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3636 const FramebufferAttachment *attachment = nullptr;
3637 if (buffer == GL_DEPTH)
3638 {
3639 attachment = framebufferObject->getDepthbuffer();
3640 }
3641 if (buffer == GL_COLOR &&
3642 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3643 {
3644 attachment = framebufferObject->getColorbuffer(drawbuffer);
3645 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003646 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3647 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003648 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003649 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003650 return;
3651 }
Geoff Langd4fff502017-09-22 11:28:28 -04003652 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003653 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003654}
3655
3656void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3657{
Olli Etuaho78df3362018-10-05 16:43:27 +03003658 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3659 const FramebufferAttachment *attachment = nullptr;
3660 if (buffer == GL_COLOR &&
3661 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3662 {
3663 attachment = framebufferObject->getColorbuffer(drawbuffer);
3664 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003665 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3666 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003667 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003668 {
3669 return;
3670 }
Geoff Langd4fff502017-09-22 11:28:28 -04003671 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003672 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003673}
3674
3675void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3676{
Olli Etuaho78df3362018-10-05 16:43:27 +03003677 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3678 const FramebufferAttachment *attachment = nullptr;
3679 if (buffer == GL_STENCIL)
3680 {
3681 attachment = framebufferObject->getStencilbuffer();
3682 }
3683 if (buffer == GL_COLOR &&
3684 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3685 {
3686 attachment = framebufferObject->getColorbuffer(drawbuffer);
3687 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003688 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3689 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003690 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003691 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003692 return;
3693 }
Geoff Langd4fff502017-09-22 11:28:28 -04003694 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003695 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003696}
3697
3698void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3699{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003700 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003701 ASSERT(framebufferObject);
3702
3703 // If a buffer is not present, the clear has no effect
3704 if (framebufferObject->getDepthbuffer() == nullptr &&
3705 framebufferObject->getStencilbuffer() == nullptr)
3706 {
3707 return;
3708 }
3709
Geoff Langd4fff502017-09-22 11:28:28 -04003710 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3711 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003712}
3713
3714void Context::readPixels(GLint x,
3715 GLint y,
3716 GLsizei width,
3717 GLsizei height,
3718 GLenum format,
3719 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003720 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003721{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003722 if (width == 0 || height == 0)
3723 {
3724 return;
3725 }
3726
Jamie Madillbc918e72018-03-08 09:47:21 -05003727 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003728
Jamie Madillb6664922017-07-25 12:55:04 -04003729 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3730 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003731
3732 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003733 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003734}
3735
Brandon Jones59770802018-04-02 13:18:42 -07003736void Context::readPixelsRobust(GLint x,
3737 GLint y,
3738 GLsizei width,
3739 GLsizei height,
3740 GLenum format,
3741 GLenum type,
3742 GLsizei bufSize,
3743 GLsizei *length,
3744 GLsizei *columns,
3745 GLsizei *rows,
3746 void *pixels)
3747{
3748 readPixels(x, y, width, height, format, type, pixels);
3749}
3750
3751void Context::readnPixelsRobust(GLint x,
3752 GLint y,
3753 GLsizei width,
3754 GLsizei height,
3755 GLenum format,
3756 GLenum type,
3757 GLsizei bufSize,
3758 GLsizei *length,
3759 GLsizei *columns,
3760 GLsizei *rows,
3761 void *data)
3762{
3763 readPixels(x, y, width, height, format, type, data);
3764}
3765
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003766void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003767 GLint level,
3768 GLenum internalformat,
3769 GLint x,
3770 GLint y,
3771 GLsizei width,
3772 GLsizei height,
3773 GLint border)
3774{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003775 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003776 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003777
Jamie Madillc29968b2016-01-20 11:17:23 -05003778 Rectangle sourceArea(x, y, width, height);
3779
Jamie Madill05b35b22017-10-03 09:01:44 -04003780 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003781 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003782 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003783}
3784
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003785void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003786 GLint level,
3787 GLint xoffset,
3788 GLint yoffset,
3789 GLint x,
3790 GLint y,
3791 GLsizei width,
3792 GLsizei height)
3793{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003794 if (width == 0 || height == 0)
3795 {
3796 return;
3797 }
3798
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003799 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003800 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003801
Jamie Madillc29968b2016-01-20 11:17:23 -05003802 Offset destOffset(xoffset, yoffset, 0);
3803 Rectangle sourceArea(x, y, width, height);
3804
Jamie Madill05b35b22017-10-03 09:01:44 -04003805 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003806 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003807 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003808}
3809
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003810void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003811 GLint level,
3812 GLint xoffset,
3813 GLint yoffset,
3814 GLint zoffset,
3815 GLint x,
3816 GLint y,
3817 GLsizei width,
3818 GLsizei height)
3819{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003820 if (width == 0 || height == 0)
3821 {
3822 return;
3823 }
3824
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003825 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003826 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003827
Jamie Madillc29968b2016-01-20 11:17:23 -05003828 Offset destOffset(xoffset, yoffset, zoffset);
3829 Rectangle sourceArea(x, y, width, height);
3830
Jamie Madill05b35b22017-10-03 09:01:44 -04003831 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3832 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003833 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3834 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003835}
3836
3837void Context::framebufferTexture2D(GLenum target,
3838 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003839 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003840 GLuint texture,
3841 GLint level)
3842{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003843 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003844 ASSERT(framebuffer);
3845
3846 if (texture != 0)
3847 {
3848 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003849 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003850 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003851 }
3852 else
3853 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003854 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003855 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003856
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003857 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003858}
3859
3860void Context::framebufferRenderbuffer(GLenum target,
3861 GLenum attachment,
3862 GLenum renderbuffertarget,
3863 GLuint renderbuffer)
3864{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003865 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003866 ASSERT(framebuffer);
3867
3868 if (renderbuffer != 0)
3869 {
3870 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003871
Jamie Madillcc129372018-04-12 09:13:18 -04003872 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003873 renderbufferObject);
3874 }
3875 else
3876 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003877 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003878 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003879
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003880 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003881}
3882
3883void Context::framebufferTextureLayer(GLenum target,
3884 GLenum attachment,
3885 GLuint texture,
3886 GLint level,
3887 GLint layer)
3888{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003889 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003890 ASSERT(framebuffer);
3891
3892 if (texture != 0)
3893 {
3894 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003895 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003896 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003897 }
3898 else
3899 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003900 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003901 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003902
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003903 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003904}
3905
Brandon Jones59770802018-04-02 13:18:42 -07003906void Context::framebufferTextureMultiviewLayered(GLenum target,
3907 GLenum attachment,
3908 GLuint texture,
3909 GLint level,
3910 GLint baseViewIndex,
3911 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003912{
Martin Radev82ef7742017-08-08 17:44:58 +03003913 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3914 ASSERT(framebuffer);
3915
3916 if (texture != 0)
3917 {
3918 Texture *textureObj = getTexture(texture);
3919
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003920 ImageIndex index;
3921 if (textureObj->getType() == TextureType::_2DArray)
3922 {
3923 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3924 }
3925 else
3926 {
3927 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3928 ASSERT(level == 0);
3929 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3930 }
Martin Radev82ef7742017-08-08 17:44:58 +03003931 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3932 numViews, baseViewIndex);
3933 }
3934 else
3935 {
3936 framebuffer->resetAttachment(this, attachment);
3937 }
3938
3939 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003940}
3941
Brandon Jones59770802018-04-02 13:18:42 -07003942void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3943 GLenum attachment,
3944 GLuint texture,
3945 GLint level,
3946 GLsizei numViews,
3947 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003948{
Martin Radev5dae57b2017-07-14 16:15:55 +03003949 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3950 ASSERT(framebuffer);
3951
3952 if (texture != 0)
3953 {
3954 Texture *textureObj = getTexture(texture);
3955
3956 ImageIndex index = ImageIndex::Make2D(level);
3957 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3958 textureObj, numViews, viewportOffsets);
3959 }
3960 else
3961 {
3962 framebuffer->resetAttachment(this, attachment);
3963 }
3964
3965 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003966}
3967
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003968void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3969{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003970 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3971 ASSERT(framebuffer);
3972
3973 if (texture != 0)
3974 {
3975 Texture *textureObj = getTexture(texture);
3976
3977 ImageIndex index = ImageIndex::MakeFromType(
3978 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3979 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3980 }
3981 else
3982 {
3983 framebuffer->resetAttachment(this, attachment);
3984 }
3985
3986 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003987}
3988
Jamie Madillc29968b2016-01-20 11:17:23 -05003989void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3990{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003991 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003992 ASSERT(framebuffer);
3993 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003994 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003995 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003996}
3997
3998void Context::readBuffer(GLenum mode)
3999{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004000 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05004001 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004002 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05004003}
4004
4005void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
4006{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004007 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004008 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004009
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004010 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004011 ASSERT(framebuffer);
4012
4013 // The specification isn't clear what should be done when the framebuffer isn't complete.
4014 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04004015 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004016}
4017
4018void Context::invalidateFramebuffer(GLenum target,
4019 GLsizei numAttachments,
4020 const GLenum *attachments)
4021{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004022 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004023 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004024
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004025 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004026 ASSERT(framebuffer);
4027
Jamie Madill427064d2018-04-13 16:20:34 -04004028 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004029 {
Jamie Madill437fa652016-05-03 15:13:24 -04004030 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004031 }
Jamie Madill437fa652016-05-03 15:13:24 -04004032
Jamie Madill4928b7c2017-06-20 12:57:39 -04004033 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004034}
4035
4036void Context::invalidateSubFramebuffer(GLenum target,
4037 GLsizei numAttachments,
4038 const GLenum *attachments,
4039 GLint x,
4040 GLint y,
4041 GLsizei width,
4042 GLsizei height)
4043{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004044 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004045 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004046
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004047 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004048 ASSERT(framebuffer);
4049
Jamie Madill427064d2018-04-13 16:20:34 -04004050 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004051 {
Jamie Madill437fa652016-05-03 15:13:24 -04004052 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004053 }
Jamie Madill437fa652016-05-03 15:13:24 -04004054
4055 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004056 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05004057}
4058
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004059void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004060 GLint level,
4061 GLint internalformat,
4062 GLsizei width,
4063 GLsizei height,
4064 GLint border,
4065 GLenum format,
4066 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004067 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004068{
Jamie Madillbc918e72018-03-08 09:47:21 -05004069 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004070
4071 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004072 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004073 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004074 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004075}
4076
Brandon Jones59770802018-04-02 13:18:42 -07004077void Context::texImage2DRobust(TextureTarget target,
4078 GLint level,
4079 GLint internalformat,
4080 GLsizei width,
4081 GLsizei height,
4082 GLint border,
4083 GLenum format,
4084 GLenum type,
4085 GLsizei bufSize,
4086 const void *pixels)
4087{
4088 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4089}
4090
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004091void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004092 GLint level,
4093 GLint internalformat,
4094 GLsizei width,
4095 GLsizei height,
4096 GLsizei depth,
4097 GLint border,
4098 GLenum format,
4099 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004100 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004101{
Jamie Madillbc918e72018-03-08 09:47:21 -05004102 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004103
4104 Extents size(width, height, depth);
4105 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004106 handleError(texture->setImage(this, mGLState.getUnpackState(),
4107 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004108 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004109}
4110
Brandon Jones59770802018-04-02 13:18:42 -07004111void Context::texImage3DRobust(TextureType target,
4112 GLint level,
4113 GLint internalformat,
4114 GLsizei width,
4115 GLsizei height,
4116 GLsizei depth,
4117 GLint border,
4118 GLenum format,
4119 GLenum type,
4120 GLsizei bufSize,
4121 const void *pixels)
4122{
4123 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4124}
4125
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004126void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004127 GLint level,
4128 GLint xoffset,
4129 GLint yoffset,
4130 GLsizei width,
4131 GLsizei height,
4132 GLenum format,
4133 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004134 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004135{
4136 // Zero sized uploads are valid but no-ops
4137 if (width == 0 || height == 0)
4138 {
4139 return;
4140 }
4141
Jamie Madillbc918e72018-03-08 09:47:21 -05004142 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004143
4144 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004145 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004146
4147 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4148
4149 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4150 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004151}
4152
Brandon Jones59770802018-04-02 13:18:42 -07004153void Context::texSubImage2DRobust(TextureTarget target,
4154 GLint level,
4155 GLint xoffset,
4156 GLint yoffset,
4157 GLsizei width,
4158 GLsizei height,
4159 GLenum format,
4160 GLenum type,
4161 GLsizei bufSize,
4162 const void *pixels)
4163{
4164 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4165}
4166
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004167void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004168 GLint level,
4169 GLint xoffset,
4170 GLint yoffset,
4171 GLint zoffset,
4172 GLsizei width,
4173 GLsizei height,
4174 GLsizei depth,
4175 GLenum format,
4176 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004177 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004178{
4179 // Zero sized uploads are valid but no-ops
4180 if (width == 0 || height == 0 || depth == 0)
4181 {
4182 return;
4183 }
4184
Jamie Madillbc918e72018-03-08 09:47:21 -05004185 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004186
4187 Box area(xoffset, yoffset, zoffset, width, height, depth);
4188 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004189
4190 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4191
4192 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004193 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004194 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004195}
4196
Brandon Jones59770802018-04-02 13:18:42 -07004197void Context::texSubImage3DRobust(TextureType target,
4198 GLint level,
4199 GLint xoffset,
4200 GLint yoffset,
4201 GLint zoffset,
4202 GLsizei width,
4203 GLsizei height,
4204 GLsizei depth,
4205 GLenum format,
4206 GLenum type,
4207 GLsizei bufSize,
4208 const void *pixels)
4209{
4210 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4211 pixels);
4212}
4213
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004214void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004215 GLint level,
4216 GLenum internalformat,
4217 GLsizei width,
4218 GLsizei height,
4219 GLint border,
4220 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004221 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004222{
Jamie Madillbc918e72018-03-08 09:47:21 -05004223 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004224
4225 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004226 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004227 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4228 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004229 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004230}
4231
Brandon Jones59770802018-04-02 13:18:42 -07004232void Context::compressedTexImage2DRobust(TextureTarget target,
4233 GLint level,
4234 GLenum internalformat,
4235 GLsizei width,
4236 GLsizei height,
4237 GLint border,
4238 GLsizei imageSize,
4239 GLsizei dataSize,
4240 const GLvoid *data)
4241{
4242 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4243}
4244
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004245void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004246 GLint level,
4247 GLenum internalformat,
4248 GLsizei width,
4249 GLsizei height,
4250 GLsizei depth,
4251 GLint border,
4252 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004253 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004254{
Jamie Madillbc918e72018-03-08 09:47:21 -05004255 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004256
4257 Extents size(width, height, depth);
4258 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004259 handleError(texture->setCompressedImage(
4260 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004261 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004262}
4263
Brandon Jones59770802018-04-02 13:18:42 -07004264void Context::compressedTexImage3DRobust(TextureType target,
4265 GLint level,
4266 GLenum internalformat,
4267 GLsizei width,
4268 GLsizei height,
4269 GLsizei depth,
4270 GLint border,
4271 GLsizei imageSize,
4272 GLsizei dataSize,
4273 const GLvoid *data)
4274{
4275 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4276 data);
4277}
4278
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004279void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004280 GLint level,
4281 GLint xoffset,
4282 GLint yoffset,
4283 GLsizei width,
4284 GLsizei height,
4285 GLenum format,
4286 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004287 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004288{
Jamie Madillbc918e72018-03-08 09:47:21 -05004289 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004290
4291 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004292 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004293 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4294 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004295 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004296}
4297
Brandon Jones59770802018-04-02 13:18:42 -07004298void Context::compressedTexSubImage2DRobust(TextureTarget target,
4299 GLint level,
4300 GLint xoffset,
4301 GLint yoffset,
4302 GLsizei width,
4303 GLsizei height,
4304 GLenum format,
4305 GLsizei imageSize,
4306 GLsizei dataSize,
4307 const GLvoid *data)
4308{
4309 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4310 data);
4311}
4312
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004313void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004314 GLint level,
4315 GLint xoffset,
4316 GLint yoffset,
4317 GLint zoffset,
4318 GLsizei width,
4319 GLsizei height,
4320 GLsizei depth,
4321 GLenum format,
4322 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004323 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004324{
4325 // Zero sized uploads are valid but no-ops
4326 if (width == 0 || height == 0)
4327 {
4328 return;
4329 }
4330
Jamie Madillbc918e72018-03-08 09:47:21 -05004331 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004332
4333 Box area(xoffset, yoffset, zoffset, width, height, depth);
4334 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004335 handleError(texture->setCompressedSubImage(
4336 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004337 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004338}
4339
Brandon Jones59770802018-04-02 13:18:42 -07004340void Context::compressedTexSubImage3DRobust(TextureType target,
4341 GLint level,
4342 GLint xoffset,
4343 GLint yoffset,
4344 GLint zoffset,
4345 GLsizei width,
4346 GLsizei height,
4347 GLsizei depth,
4348 GLenum format,
4349 GLsizei imageSize,
4350 GLsizei dataSize,
4351 const GLvoid *data)
4352{
4353 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4354 imageSize, data);
4355}
4356
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004357void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004358{
4359 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004360 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004361}
4362
Jamie Madill007530e2017-12-28 14:27:04 -05004363void Context::copyTexture(GLuint sourceId,
4364 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004365 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004366 GLuint destId,
4367 GLint destLevel,
4368 GLint internalFormat,
4369 GLenum destType,
4370 GLboolean unpackFlipY,
4371 GLboolean unpackPremultiplyAlpha,
4372 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004373{
Jamie Madillbc918e72018-03-08 09:47:21 -05004374 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004375
4376 gl::Texture *sourceTexture = getTexture(sourceId);
4377 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004378 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4379 sourceLevel, ConvertToBool(unpackFlipY),
4380 ConvertToBool(unpackPremultiplyAlpha),
4381 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004382}
4383
Jamie Madill007530e2017-12-28 14:27:04 -05004384void Context::copySubTexture(GLuint sourceId,
4385 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004386 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004387 GLuint destId,
4388 GLint destLevel,
4389 GLint xoffset,
4390 GLint yoffset,
4391 GLint x,
4392 GLint y,
4393 GLsizei width,
4394 GLsizei height,
4395 GLboolean unpackFlipY,
4396 GLboolean unpackPremultiplyAlpha,
4397 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004398{
4399 // Zero sized copies are valid but no-ops
4400 if (width == 0 || height == 0)
4401 {
4402 return;
4403 }
4404
Jamie Madillbc918e72018-03-08 09:47:21 -05004405 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004406
4407 gl::Texture *sourceTexture = getTexture(sourceId);
4408 gl::Texture *destTexture = getTexture(destId);
4409 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004410 Box box(x, y, 0, width, height, 1);
4411 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4412 ConvertToBool(unpackFlipY),
4413 ConvertToBool(unpackPremultiplyAlpha),
4414 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4415}
4416
4417void Context::copyTexture3D(GLuint sourceId,
4418 GLint sourceLevel,
4419 TextureTarget destTarget,
4420 GLuint destId,
4421 GLint destLevel,
4422 GLint internalFormat,
4423 GLenum destType,
4424 GLboolean unpackFlipY,
4425 GLboolean unpackPremultiplyAlpha,
4426 GLboolean unpackUnmultiplyAlpha)
4427{
4428 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4429
4430 Texture *sourceTexture = getTexture(sourceId);
4431 Texture *destTexture = getTexture(destId);
4432 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4433 sourceLevel, ConvertToBool(unpackFlipY),
4434 ConvertToBool(unpackPremultiplyAlpha),
4435 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4436}
4437
4438void Context::copySubTexture3D(GLuint sourceId,
4439 GLint sourceLevel,
4440 TextureTarget destTarget,
4441 GLuint destId,
4442 GLint destLevel,
4443 GLint xoffset,
4444 GLint yoffset,
4445 GLint zoffset,
4446 GLint x,
4447 GLint y,
4448 GLint z,
4449 GLsizei width,
4450 GLsizei height,
4451 GLsizei depth,
4452 GLboolean unpackFlipY,
4453 GLboolean unpackPremultiplyAlpha,
4454 GLboolean unpackUnmultiplyAlpha)
4455{
4456 // Zero sized copies are valid but no-ops
4457 if (width == 0 || height == 0 || depth == 0)
4458 {
4459 return;
4460 }
4461
4462 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4463
4464 Texture *sourceTexture = getTexture(sourceId);
4465 Texture *destTexture = getTexture(destId);
4466 Offset offset(xoffset, yoffset, zoffset);
4467 Box box(x, y, z, width, height, depth);
4468 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004469 ConvertToBool(unpackFlipY),
4470 ConvertToBool(unpackPremultiplyAlpha),
4471 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004472}
4473
Jamie Madill007530e2017-12-28 14:27:04 -05004474void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004475{
Jamie Madillbc918e72018-03-08 09:47:21 -05004476 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004477
4478 gl::Texture *sourceTexture = getTexture(sourceId);
4479 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004480 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004481}
4482
Corentin Wallez336129f2017-10-17 15:55:40 -04004483void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004484{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004485 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004486 ASSERT(buffer);
4487
Geoff Lang496c02d2016-10-20 11:38:11 -07004488 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004489}
4490
Brandon Jones59770802018-04-02 13:18:42 -07004491void Context::getBufferPointervRobust(BufferBinding target,
4492 GLenum pname,
4493 GLsizei bufSize,
4494 GLsizei *length,
4495 void **params)
4496{
4497 getBufferPointerv(target, pname, params);
4498}
4499
Corentin Wallez336129f2017-10-17 15:55:40 -04004500void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004501{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004502 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004503 ASSERT(buffer);
4504
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004505 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004506 if (error.isError())
4507 {
Jamie Madill437fa652016-05-03 15:13:24 -04004508 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004509 return nullptr;
4510 }
4511
4512 return buffer->getMapPointer();
4513}
4514
Corentin Wallez336129f2017-10-17 15:55:40 -04004515GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004516{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004517 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004518 ASSERT(buffer);
4519
4520 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004521 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004522 if (error.isError())
4523 {
Jamie Madill437fa652016-05-03 15:13:24 -04004524 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004525 return GL_FALSE;
4526 }
4527
4528 return result;
4529}
4530
Corentin Wallez336129f2017-10-17 15:55:40 -04004531void *Context::mapBufferRange(BufferBinding target,
4532 GLintptr offset,
4533 GLsizeiptr length,
4534 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004535{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004536 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004537 ASSERT(buffer);
4538
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004539 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004540 if (error.isError())
4541 {
Jamie Madill437fa652016-05-03 15:13:24 -04004542 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004543 return nullptr;
4544 }
4545
4546 return buffer->getMapPointer();
4547}
4548
Corentin Wallez336129f2017-10-17 15:55:40 -04004549void Context::flushMappedBufferRange(BufferBinding /*target*/,
4550 GLintptr /*offset*/,
4551 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004552{
4553 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4554}
4555
Jamie Madillbc918e72018-03-08 09:47:21 -05004556Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004557{
Geoff Langa8cb2872018-03-09 16:09:40 -05004558 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004559}
4560
Jamie Madillbc918e72018-03-08 09:47:21 -05004561Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004562{
Geoff Langa8cb2872018-03-09 16:09:40 -05004563 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004564}
4565
Jamie Madillbc918e72018-03-08 09:47:21 -05004566Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004567{
Geoff Langa8cb2872018-03-09 16:09:40 -05004568 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004569}
4570
Geoff Lang9bf86f02018-07-26 11:46:34 -04004571Error Context::syncStateForPathOperation()
4572{
4573 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4574
4575 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4576 ANGLE_TRY(syncDirtyBits());
4577
4578 return NoError();
4579}
4580
Jiajia Qin5451d532017-11-16 17:16:34 +08004581void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4582{
4583 UNIMPLEMENTED();
4584}
4585
Jamie Madillc20ab272016-06-09 07:20:46 -07004586void Context::activeTexture(GLenum texture)
4587{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004588 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004589}
4590
Jamie Madill876429b2017-04-20 15:46:24 -04004591void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004592{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004593 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004594}
4595
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004596void Context::blendEquation(GLenum mode)
4597{
4598 mGLState.setBlendEquation(mode, mode);
4599}
4600
Jamie Madillc20ab272016-06-09 07:20:46 -07004601void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4602{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004603 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004604}
4605
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004606void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4607{
4608 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4609}
4610
Jamie Madillc20ab272016-06-09 07:20:46 -07004611void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4612{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004613 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004614}
4615
Jamie Madill876429b2017-04-20 15:46:24 -04004616void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004617{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004618 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004619}
4620
Jamie Madill876429b2017-04-20 15:46:24 -04004621void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004622{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004623 mGLState.setDepthClearValue(clamp01(depth));
Jamie Madillc20ab272016-06-09 07:20:46 -07004624}
4625
4626void Context::clearStencil(GLint s)
4627{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004628 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004629}
4630
4631void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4632{
Geoff Lang92019432017-11-20 13:09:34 -05004633 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4634 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004635}
4636
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004637void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004638{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004639 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004640}
4641
4642void Context::depthFunc(GLenum func)
4643{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004644 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004645}
4646
4647void Context::depthMask(GLboolean flag)
4648{
Geoff Lang92019432017-11-20 13:09:34 -05004649 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004650}
4651
Jamie Madill876429b2017-04-20 15:46:24 -04004652void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004653{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004654 mGLState.setDepthRange(clamp01(zNear), clamp01(zFar));
Jamie Madillc20ab272016-06-09 07:20:46 -07004655}
4656
4657void Context::disable(GLenum cap)
4658{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004659 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004660 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004661}
4662
4663void Context::disableVertexAttribArray(GLuint index)
4664{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004665 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004666 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004667}
4668
4669void Context::enable(GLenum cap)
4670{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004671 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004672 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004673}
4674
4675void Context::enableVertexAttribArray(GLuint index)
4676{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004677 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004678 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004679}
4680
4681void Context::frontFace(GLenum mode)
4682{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004683 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004684}
4685
4686void Context::hint(GLenum target, GLenum mode)
4687{
4688 switch (target)
4689 {
4690 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004691 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004692 break;
4693
4694 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004695 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004696 break;
4697
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004698 case GL_PERSPECTIVE_CORRECTION_HINT:
4699 case GL_POINT_SMOOTH_HINT:
4700 case GL_LINE_SMOOTH_HINT:
4701 case GL_FOG_HINT:
4702 mGLState.gles1().setHint(target, mode);
4703 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004704 default:
4705 UNREACHABLE();
4706 return;
4707 }
4708}
4709
4710void Context::lineWidth(GLfloat width)
4711{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004712 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004713}
4714
4715void Context::pixelStorei(GLenum pname, GLint param)
4716{
4717 switch (pname)
4718 {
4719 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004720 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004721 break;
4722
4723 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004724 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004725 break;
4726
4727 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004728 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004729 break;
4730
4731 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004732 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004733 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004734 break;
4735
4736 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004737 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004738 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004739 break;
4740
4741 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004742 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004743 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004744 break;
4745
4746 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004747 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004748 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004749 break;
4750
4751 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004752 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004753 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004754 break;
4755
4756 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004757 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004758 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004759 break;
4760
4761 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004762 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004763 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004764 break;
4765
4766 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004767 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004768 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004769 break;
4770
4771 default:
4772 UNREACHABLE();
4773 return;
4774 }
4775}
4776
4777void Context::polygonOffset(GLfloat factor, GLfloat units)
4778{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004779 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004780}
4781
Jamie Madill876429b2017-04-20 15:46:24 -04004782void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004783{
Geoff Lang92019432017-11-20 13:09:34 -05004784 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004785}
4786
Jiawei Shaodb342272017-09-27 10:21:45 +08004787void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4788{
4789 mGLState.setSampleMaskParams(maskNumber, mask);
4790}
4791
Jamie Madillc20ab272016-06-09 07:20:46 -07004792void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4793{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004794 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004795}
4796
4797void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4798{
4799 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4800 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004801 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004802 }
4803
4804 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4805 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004806 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004807 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004808
4809 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004810}
4811
4812void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4813{
4814 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4815 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004816 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004817 }
4818
4819 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4820 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004821 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004822 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004823
4824 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004825}
4826
4827void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4828{
4829 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4830 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004831 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004832 }
4833
4834 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4835 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004836 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004837 }
4838}
4839
4840void Context::vertexAttrib1f(GLuint index, GLfloat x)
4841{
4842 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004843 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004844 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004845}
4846
4847void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4848{
4849 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004850 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004851 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004852}
4853
4854void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4855{
4856 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004857 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004858 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004859}
4860
4861void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4862{
4863 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004864 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004865 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004866}
4867
4868void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4869{
4870 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004871 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004872 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004873}
4874
4875void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4876{
4877 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004878 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004879 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004880}
4881
4882void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4883{
4884 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004885 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004886 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004887}
4888
4889void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4890{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004891 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004892 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004893}
4894
4895void Context::vertexAttribPointer(GLuint index,
4896 GLint size,
4897 GLenum type,
4898 GLboolean normalized,
4899 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004900 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004901{
Corentin Wallez336129f2017-10-17 15:55:40 -04004902 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004903 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004904 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004905}
4906
Shao80957d92017-02-20 21:25:59 +08004907void Context::vertexAttribFormat(GLuint attribIndex,
4908 GLint size,
4909 GLenum type,
4910 GLboolean normalized,
4911 GLuint relativeOffset)
4912{
Geoff Lang92019432017-11-20 13:09:34 -05004913 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004914 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004915 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004916}
4917
4918void Context::vertexAttribIFormat(GLuint attribIndex,
4919 GLint size,
4920 GLenum type,
4921 GLuint relativeOffset)
4922{
4923 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004924 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004925}
4926
4927void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4928{
Shaodde78e82017-05-22 14:13:27 +08004929 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004930 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004931}
4932
Jiajia Qin5451d532017-11-16 17:16:34 +08004933void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004934{
4935 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004936 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004937}
4938
Jamie Madillc20ab272016-06-09 07:20:46 -07004939void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4940{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004941 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004942}
4943
4944void Context::vertexAttribIPointer(GLuint index,
4945 GLint size,
4946 GLenum type,
4947 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004948 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004949{
Corentin Wallez336129f2017-10-17 15:55:40 -04004950 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4951 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004952 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004953}
4954
4955void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4956{
4957 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004958 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004959 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004960}
4961
4962void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4963{
4964 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004965 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004966 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004967}
4968
4969void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4970{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004971 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004972 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004973}
4974
4975void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4976{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004977 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004978 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004979}
4980
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004981void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4982{
4983 const VertexAttribCurrentValueData &currentValues =
4984 getGLState().getVertexAttribCurrentValue(index);
4985 const VertexArray *vao = getGLState().getVertexArray();
4986 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4987 currentValues, pname, params);
4988}
4989
Brandon Jones59770802018-04-02 13:18:42 -07004990void Context::getVertexAttribivRobust(GLuint index,
4991 GLenum pname,
4992 GLsizei bufSize,
4993 GLsizei *length,
4994 GLint *params)
4995{
4996 getVertexAttribiv(index, pname, params);
4997}
4998
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004999void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
5000{
5001 const VertexAttribCurrentValueData &currentValues =
5002 getGLState().getVertexAttribCurrentValue(index);
5003 const VertexArray *vao = getGLState().getVertexArray();
5004 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5005 currentValues, pname, params);
5006}
5007
Brandon Jones59770802018-04-02 13:18:42 -07005008void Context::getVertexAttribfvRobust(GLuint index,
5009 GLenum pname,
5010 GLsizei bufSize,
5011 GLsizei *length,
5012 GLfloat *params)
5013{
5014 getVertexAttribfv(index, pname, params);
5015}
5016
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005017void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
5018{
5019 const VertexAttribCurrentValueData &currentValues =
5020 getGLState().getVertexAttribCurrentValue(index);
5021 const VertexArray *vao = getGLState().getVertexArray();
5022 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5023 currentValues, pname, params);
5024}
5025
Brandon Jones59770802018-04-02 13:18:42 -07005026void Context::getVertexAttribIivRobust(GLuint index,
5027 GLenum pname,
5028 GLsizei bufSize,
5029 GLsizei *length,
5030 GLint *params)
5031{
5032 getVertexAttribIiv(index, pname, params);
5033}
5034
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005035void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
5036{
5037 const VertexAttribCurrentValueData &currentValues =
5038 getGLState().getVertexAttribCurrentValue(index);
5039 const VertexArray *vao = getGLState().getVertexArray();
5040 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5041 currentValues, pname, params);
5042}
5043
Brandon Jones59770802018-04-02 13:18:42 -07005044void Context::getVertexAttribIuivRobust(GLuint index,
5045 GLenum pname,
5046 GLsizei bufSize,
5047 GLsizei *length,
5048 GLuint *params)
5049{
5050 getVertexAttribIuiv(index, pname, params);
5051}
5052
Jamie Madill876429b2017-04-20 15:46:24 -04005053void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005054{
5055 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
5056 QueryVertexAttribPointerv(attrib, pname, pointer);
5057}
5058
Brandon Jones59770802018-04-02 13:18:42 -07005059void Context::getVertexAttribPointervRobust(GLuint index,
5060 GLenum pname,
5061 GLsizei bufSize,
5062 GLsizei *length,
5063 void **pointer)
5064{
5065 getVertexAttribPointerv(index, pname, pointer);
5066}
5067
Jamie Madillc20ab272016-06-09 07:20:46 -07005068void Context::debugMessageControl(GLenum source,
5069 GLenum type,
5070 GLenum severity,
5071 GLsizei count,
5072 const GLuint *ids,
5073 GLboolean enabled)
5074{
5075 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005076 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05005077 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07005078}
5079
5080void Context::debugMessageInsert(GLenum source,
5081 GLenum type,
5082 GLuint id,
5083 GLenum severity,
5084 GLsizei length,
5085 const GLchar *buf)
5086{
5087 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005088 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005089}
5090
5091void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5092{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005093 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005094}
5095
5096GLuint Context::getDebugMessageLog(GLuint count,
5097 GLsizei bufSize,
5098 GLenum *sources,
5099 GLenum *types,
5100 GLuint *ids,
5101 GLenum *severities,
5102 GLsizei *lengths,
5103 GLchar *messageLog)
5104{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005105 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5106 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005107}
5108
5109void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5110{
5111 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005112 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005113 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005114}
5115
5116void Context::popDebugGroup()
5117{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005118 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005119 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005120}
5121
Corentin Wallez336129f2017-10-17 15:55:40 -04005122void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005123{
5124 Buffer *buffer = mGLState.getTargetBuffer(target);
5125 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005126 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005127}
5128
Corentin Wallez336129f2017-10-17 15:55:40 -04005129void Context::bufferSubData(BufferBinding target,
5130 GLintptr offset,
5131 GLsizeiptr size,
5132 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005133{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005134 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005135 {
5136 return;
5137 }
5138
5139 Buffer *buffer = mGLState.getTargetBuffer(target);
5140 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005141 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005142}
5143
Jamie Madillef300b12016-10-07 15:12:09 -04005144void Context::attachShader(GLuint program, GLuint shader)
5145{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005146 Program *programObject = mState.mShaderPrograms->getProgram(program);
5147 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005148 ASSERT(programObject && shaderObject);
5149 programObject->attachShader(shaderObject);
5150}
5151
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005152const Workarounds &Context::getWorkarounds() const
5153{
5154 return mWorkarounds;
5155}
5156
Corentin Wallez336129f2017-10-17 15:55:40 -04005157void Context::copyBufferSubData(BufferBinding readTarget,
5158 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005159 GLintptr readOffset,
5160 GLintptr writeOffset,
5161 GLsizeiptr size)
5162{
5163 // if size is zero, the copy is a successful no-op
5164 if (size == 0)
5165 {
5166 return;
5167 }
5168
5169 // TODO(jmadill): cache these.
5170 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5171 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5172
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005173 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005174}
5175
Jamie Madill01a80ee2016-11-07 12:06:18 -05005176void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5177{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005178 // Ideally we could share the program query with the validation layer if possible.
5179 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005180 ASSERT(programObject);
5181 programObject->bindAttributeLocation(index, name);
5182}
5183
Corentin Wallez336129f2017-10-17 15:55:40 -04005184void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005185{
Corentin Wallez336129f2017-10-17 15:55:40 -04005186 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5187 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005188 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005189}
5190
Corentin Wallez336129f2017-10-17 15:55:40 -04005191void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005192{
5193 bindBufferRange(target, index, buffer, 0, 0);
5194}
5195
Corentin Wallez336129f2017-10-17 15:55:40 -04005196void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005197 GLuint index,
5198 GLuint buffer,
5199 GLintptr offset,
5200 GLsizeiptr size)
5201{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005202 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5203 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5204 if (target == BufferBinding::Uniform)
5205 {
Jamie Madill472ddc82018-10-18 18:41:56 -04005206 mUniformBufferObserverBindings[index].bind(object);
Jamie Madilld84b6732018-09-06 15:54:35 -04005207 mStateCache.onUniformBufferStateChange(this);
5208 }
5209 else
5210 {
5211 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005212 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005213}
5214
Jamie Madill01a80ee2016-11-07 12:06:18 -05005215void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5216{
5217 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5218 {
5219 bindReadFramebuffer(framebuffer);
5220 }
5221
5222 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5223 {
5224 bindDrawFramebuffer(framebuffer);
5225 }
5226}
5227
5228void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5229{
5230 ASSERT(target == GL_RENDERBUFFER);
5231 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005232 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005233 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005234}
5235
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005236void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005237 GLsizei samples,
5238 GLenum internalformat,
5239 GLsizei width,
5240 GLsizei height,
5241 GLboolean fixedsamplelocations)
5242{
5243 Extents size(width, height, 1);
5244 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005245 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5246 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005247}
5248
Olli Etuaho89664842018-08-24 14:45:36 +03005249void Context::texStorage3DMultisample(TextureType target,
5250 GLsizei samples,
5251 GLenum internalformat,
5252 GLsizei width,
5253 GLsizei height,
5254 GLsizei depth,
5255 GLboolean fixedsamplelocations)
5256{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005257 Extents size(width, height, depth);
5258 Texture *texture = getTargetTexture(target);
5259 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5260 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005261}
5262
JiangYizhoubddc46b2016-12-09 09:50:51 +08005263void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5264{
JiangYizhou5b03f472017-01-09 10:22:53 +08005265 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5266 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005267 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005268 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005269
5270 switch (pname)
5271 {
5272 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005273 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005274 break;
5275 default:
5276 UNREACHABLE();
5277 }
5278}
5279
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005280void Context::getMultisamplefvRobust(GLenum pname,
5281 GLuint index,
5282 GLsizei bufSize,
5283 GLsizei *length,
5284 GLfloat *val)
5285{
5286 UNIMPLEMENTED();
5287}
5288
Jamie Madille8fb6402017-02-14 17:56:40 -05005289void Context::renderbufferStorage(GLenum target,
5290 GLenum internalformat,
5291 GLsizei width,
5292 GLsizei height)
5293{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005294 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5295 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5296
Jamie Madille8fb6402017-02-14 17:56:40 -05005297 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005298 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005299}
5300
5301void Context::renderbufferStorageMultisample(GLenum target,
5302 GLsizei samples,
5303 GLenum internalformat,
5304 GLsizei width,
5305 GLsizei height)
5306{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005307 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5308 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005309
5310 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005311 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005312 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005313}
5314
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005315void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5316{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005317 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005318 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005319}
5320
JiangYizhoue18e6392017-02-20 10:32:23 +08005321void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5322{
5323 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5324 QueryFramebufferParameteriv(framebuffer, pname, params);
5325}
5326
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005327void Context::getFramebufferParameterivRobust(GLenum target,
5328 GLenum pname,
5329 GLsizei bufSize,
5330 GLsizei *length,
5331 GLint *params)
5332{
5333 UNIMPLEMENTED();
5334}
5335
Jiajia Qin5451d532017-11-16 17:16:34 +08005336void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005337{
5338 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005339 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005340}
5341
Jamie Madilldec86232018-07-11 09:01:18 -04005342bool Context::getScratchBuffer(size_t requstedSizeBytes,
5343 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005344{
Jamie Madilldec86232018-07-11 09:01:18 -04005345 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005346}
5347
Jamie Madilldec86232018-07-11 09:01:18 -04005348bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5349 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005350{
Jamie Madilldec86232018-07-11 09:01:18 -04005351 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005352}
5353
Xinghua Cao10a4d432017-11-28 14:46:26 +08005354Error Context::prepareForDispatch()
5355{
Jamie Madill0cc11c62018-10-12 18:07:18 -04005356 ANGLE_TRY(syncDirtyObjects(mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005357
5358 if (isRobustResourceInitEnabled())
5359 {
5360 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5361 }
5362
Jamie Madill0cc11c62018-10-12 18:07:18 -04005363 return syncDirtyBits(mComputeDirtyBits);
Xinghua Cao10a4d432017-11-28 14:46:26 +08005364}
5365
Xinghua Cao2b396592017-03-29 15:36:04 +08005366void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5367{
5368 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5369 {
5370 return;
5371 }
5372
Xinghua Cao10a4d432017-11-28 14:46:26 +08005373 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005374 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005375}
5376
Jiajia Qin5451d532017-11-16 17:16:34 +08005377void Context::dispatchComputeIndirect(GLintptr indirect)
5378{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005379 ANGLE_CONTEXT_TRY(prepareForDispatch());
5380 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005381}
5382
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005383void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005384 GLsizei levels,
5385 GLenum internalFormat,
5386 GLsizei width,
5387 GLsizei height)
5388{
5389 Extents size(width, height, 1);
5390 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005391 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005392}
5393
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005394void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005395 GLsizei levels,
5396 GLenum internalFormat,
5397 GLsizei width,
5398 GLsizei height,
5399 GLsizei depth)
5400{
5401 Extents size(width, height, depth);
5402 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005403 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005404}
5405
Jiajia Qin5451d532017-11-16 17:16:34 +08005406void Context::memoryBarrier(GLbitfield barriers)
5407{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005408 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005409}
5410
5411void Context::memoryBarrierByRegion(GLbitfield barriers)
5412{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005413 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005414}
5415
Jamie Madillc1d770e2017-04-13 17:31:24 -04005416GLenum Context::checkFramebufferStatus(GLenum target)
5417{
5418 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5419 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005420 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005421}
5422
5423void Context::compileShader(GLuint shader)
5424{
5425 Shader *shaderObject = GetValidShader(this, shader);
5426 if (!shaderObject)
5427 {
5428 return;
5429 }
5430 shaderObject->compile(this);
5431}
5432
5433void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5434{
5435 for (int i = 0; i < n; i++)
5436 {
5437 deleteBuffer(buffers[i]);
5438 }
5439}
5440
5441void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5442{
5443 for (int i = 0; i < n; i++)
5444 {
5445 if (framebuffers[i] != 0)
5446 {
5447 deleteFramebuffer(framebuffers[i]);
5448 }
5449 }
5450}
5451
5452void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5453{
5454 for (int i = 0; i < n; i++)
5455 {
5456 deleteRenderbuffer(renderbuffers[i]);
5457 }
5458}
5459
5460void Context::deleteTextures(GLsizei n, const GLuint *textures)
5461{
5462 for (int i = 0; i < n; i++)
5463 {
5464 if (textures[i] != 0)
5465 {
5466 deleteTexture(textures[i]);
5467 }
5468 }
5469}
5470
5471void Context::detachShader(GLuint program, GLuint shader)
5472{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005473 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005474 ASSERT(programObject);
5475
5476 Shader *shaderObject = getShader(shader);
5477 ASSERT(shaderObject);
5478
5479 programObject->detachShader(this, shaderObject);
5480}
5481
5482void Context::genBuffers(GLsizei n, GLuint *buffers)
5483{
5484 for (int i = 0; i < n; i++)
5485 {
5486 buffers[i] = createBuffer();
5487 }
5488}
5489
5490void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5491{
5492 for (int i = 0; i < n; i++)
5493 {
5494 framebuffers[i] = createFramebuffer();
5495 }
5496}
5497
5498void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5499{
5500 for (int i = 0; i < n; i++)
5501 {
5502 renderbuffers[i] = createRenderbuffer();
5503 }
5504}
5505
5506void Context::genTextures(GLsizei n, GLuint *textures)
5507{
5508 for (int i = 0; i < n; i++)
5509 {
5510 textures[i] = createTexture();
5511 }
5512}
5513
5514void Context::getActiveAttrib(GLuint program,
5515 GLuint index,
5516 GLsizei bufsize,
5517 GLsizei *length,
5518 GLint *size,
5519 GLenum *type,
5520 GLchar *name)
5521{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005522 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005523 ASSERT(programObject);
5524 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5525}
5526
5527void Context::getActiveUniform(GLuint program,
5528 GLuint index,
5529 GLsizei bufsize,
5530 GLsizei *length,
5531 GLint *size,
5532 GLenum *type,
5533 GLchar *name)
5534{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005535 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005536 ASSERT(programObject);
5537 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5538}
5539
5540void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5541{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005542 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005543 ASSERT(programObject);
5544 programObject->getAttachedShaders(maxcount, count, shaders);
5545}
5546
5547GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5548{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005549 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005550 ASSERT(programObject);
5551 return programObject->getAttributeLocation(name);
5552}
5553
5554void Context::getBooleanv(GLenum pname, GLboolean *params)
5555{
5556 GLenum nativeType;
5557 unsigned int numParams = 0;
5558 getQueryParameterInfo(pname, &nativeType, &numParams);
5559
5560 if (nativeType == GL_BOOL)
5561 {
5562 getBooleanvImpl(pname, params);
5563 }
5564 else
5565 {
5566 CastStateValues(this, nativeType, pname, numParams, params);
5567 }
5568}
5569
Brandon Jones59770802018-04-02 13:18:42 -07005570void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5571{
5572 getBooleanv(pname, params);
5573}
5574
Jamie Madillc1d770e2017-04-13 17:31:24 -04005575void Context::getFloatv(GLenum pname, GLfloat *params)
5576{
5577 GLenum nativeType;
5578 unsigned int numParams = 0;
5579 getQueryParameterInfo(pname, &nativeType, &numParams);
5580
5581 if (nativeType == GL_FLOAT)
5582 {
5583 getFloatvImpl(pname, params);
5584 }
5585 else
5586 {
5587 CastStateValues(this, nativeType, pname, numParams, params);
5588 }
5589}
5590
Brandon Jones59770802018-04-02 13:18:42 -07005591void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5592{
5593 getFloatv(pname, params);
5594}
5595
Jamie Madillc1d770e2017-04-13 17:31:24 -04005596void Context::getIntegerv(GLenum pname, GLint *params)
5597{
5598 GLenum nativeType;
5599 unsigned int numParams = 0;
5600 getQueryParameterInfo(pname, &nativeType, &numParams);
5601
5602 if (nativeType == GL_INT)
5603 {
5604 getIntegervImpl(pname, params);
5605 }
5606 else
5607 {
5608 CastStateValues(this, nativeType, pname, numParams, params);
5609 }
5610}
5611
Brandon Jones59770802018-04-02 13:18:42 -07005612void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5613{
5614 getIntegerv(pname, data);
5615}
5616
Jamie Madillc1d770e2017-04-13 17:31:24 -04005617void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5618{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005619 // Don't resolve link if checking the link completion status.
5620 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5621 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005622 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005623 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005624}
5625
Brandon Jones59770802018-04-02 13:18:42 -07005626void Context::getProgramivRobust(GLuint program,
5627 GLenum pname,
5628 GLsizei bufSize,
5629 GLsizei *length,
5630 GLint *params)
5631{
5632 getProgramiv(program, pname, params);
5633}
5634
Jiajia Qin5451d532017-11-16 17:16:34 +08005635void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5636{
5637 UNIMPLEMENTED();
5638}
5639
Jamie Madillbe849e42017-05-02 15:49:00 -04005640void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005641{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005642 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005643 ASSERT(programObject);
5644 programObject->getInfoLog(bufsize, length, infolog);
5645}
5646
Jiajia Qin5451d532017-11-16 17:16:34 +08005647void Context::getProgramPipelineInfoLog(GLuint pipeline,
5648 GLsizei bufSize,
5649 GLsizei *length,
5650 GLchar *infoLog)
5651{
5652 UNIMPLEMENTED();
5653}
5654
Jamie Madillc1d770e2017-04-13 17:31:24 -04005655void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5656{
5657 Shader *shaderObject = getShader(shader);
5658 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005659 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005660}
5661
Brandon Jones59770802018-04-02 13:18:42 -07005662void Context::getShaderivRobust(GLuint shader,
5663 GLenum pname,
5664 GLsizei bufSize,
5665 GLsizei *length,
5666 GLint *params)
5667{
5668 getShaderiv(shader, pname, params);
5669}
5670
Jamie Madillc1d770e2017-04-13 17:31:24 -04005671void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5672{
5673 Shader *shaderObject = getShader(shader);
5674 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005675 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005676}
5677
5678void Context::getShaderPrecisionFormat(GLenum shadertype,
5679 GLenum precisiontype,
5680 GLint *range,
5681 GLint *precision)
5682{
5683 // TODO(jmadill): Compute shaders.
5684
5685 switch (shadertype)
5686 {
5687 case GL_VERTEX_SHADER:
5688 switch (precisiontype)
5689 {
5690 case GL_LOW_FLOAT:
5691 mCaps.vertexLowpFloat.get(range, precision);
5692 break;
5693 case GL_MEDIUM_FLOAT:
5694 mCaps.vertexMediumpFloat.get(range, precision);
5695 break;
5696 case GL_HIGH_FLOAT:
5697 mCaps.vertexHighpFloat.get(range, precision);
5698 break;
5699
5700 case GL_LOW_INT:
5701 mCaps.vertexLowpInt.get(range, precision);
5702 break;
5703 case GL_MEDIUM_INT:
5704 mCaps.vertexMediumpInt.get(range, precision);
5705 break;
5706 case GL_HIGH_INT:
5707 mCaps.vertexHighpInt.get(range, precision);
5708 break;
5709
5710 default:
5711 UNREACHABLE();
5712 return;
5713 }
5714 break;
5715
5716 case GL_FRAGMENT_SHADER:
5717 switch (precisiontype)
5718 {
5719 case GL_LOW_FLOAT:
5720 mCaps.fragmentLowpFloat.get(range, precision);
5721 break;
5722 case GL_MEDIUM_FLOAT:
5723 mCaps.fragmentMediumpFloat.get(range, precision);
5724 break;
5725 case GL_HIGH_FLOAT:
5726 mCaps.fragmentHighpFloat.get(range, precision);
5727 break;
5728
5729 case GL_LOW_INT:
5730 mCaps.fragmentLowpInt.get(range, precision);
5731 break;
5732 case GL_MEDIUM_INT:
5733 mCaps.fragmentMediumpInt.get(range, precision);
5734 break;
5735 case GL_HIGH_INT:
5736 mCaps.fragmentHighpInt.get(range, precision);
5737 break;
5738
5739 default:
5740 UNREACHABLE();
5741 return;
5742 }
5743 break;
5744
5745 default:
5746 UNREACHABLE();
5747 return;
5748 }
5749}
5750
5751void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5752{
5753 Shader *shaderObject = getShader(shader);
5754 ASSERT(shaderObject);
5755 shaderObject->getSource(bufsize, length, source);
5756}
5757
5758void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5759{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005760 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005761 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005762 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005763}
5764
Brandon Jones59770802018-04-02 13:18:42 -07005765void Context::getUniformfvRobust(GLuint program,
5766 GLint location,
5767 GLsizei bufSize,
5768 GLsizei *length,
5769 GLfloat *params)
5770{
5771 getUniformfv(program, location, params);
5772}
5773
Jamie Madillc1d770e2017-04-13 17:31:24 -04005774void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5775{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005776 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005777 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005778 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005779}
5780
Brandon Jones59770802018-04-02 13:18:42 -07005781void Context::getUniformivRobust(GLuint program,
5782 GLint location,
5783 GLsizei bufSize,
5784 GLsizei *length,
5785 GLint *params)
5786{
5787 getUniformiv(program, location, params);
5788}
5789
Jamie Madillc1d770e2017-04-13 17:31:24 -04005790GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5791{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005792 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005793 ASSERT(programObject);
5794 return programObject->getUniformLocation(name);
5795}
5796
5797GLboolean Context::isBuffer(GLuint buffer)
5798{
5799 if (buffer == 0)
5800 {
5801 return GL_FALSE;
5802 }
5803
5804 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5805}
5806
5807GLboolean Context::isEnabled(GLenum cap)
5808{
5809 return mGLState.getEnableFeature(cap);
5810}
5811
5812GLboolean Context::isFramebuffer(GLuint framebuffer)
5813{
5814 if (framebuffer == 0)
5815 {
5816 return GL_FALSE;
5817 }
5818
5819 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5820}
5821
5822GLboolean Context::isProgram(GLuint program)
5823{
5824 if (program == 0)
5825 {
5826 return GL_FALSE;
5827 }
5828
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005829 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005830}
5831
5832GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5833{
5834 if (renderbuffer == 0)
5835 {
5836 return GL_FALSE;
5837 }
5838
5839 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5840}
5841
5842GLboolean Context::isShader(GLuint shader)
5843{
5844 if (shader == 0)
5845 {
5846 return GL_FALSE;
5847 }
5848
5849 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5850}
5851
5852GLboolean Context::isTexture(GLuint texture)
5853{
5854 if (texture == 0)
5855 {
5856 return GL_FALSE;
5857 }
5858
5859 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5860}
5861
5862void Context::linkProgram(GLuint program)
5863{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005864 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005865 ASSERT(programObject);
5866 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08005867
5868 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
5869 // don't need to worry that:
5870 // 1. Draw calls after link use the new executable code or the old one depending on the link
5871 // result.
5872 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
5873 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
5874 // ProgramD3D.
5875 if (programObject->isInUse())
5876 {
Jamie Madill785e8a02018-10-04 17:42:00 -04005877 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04005878 if (programObject->isLinked())
5879 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04005880 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04005881 }
jchen107ae70d82018-07-06 13:47:01 +08005882 mStateCache.onProgramExecutableChange(this);
5883 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005884}
5885
5886void Context::releaseShaderCompiler()
5887{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005888 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005889}
5890
5891void Context::shaderBinary(GLsizei n,
5892 const GLuint *shaders,
5893 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005894 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005895 GLsizei length)
5896{
5897 // No binary shader formats are supported.
5898 UNIMPLEMENTED();
5899}
5900
Olli Etuaho0ca09752018-09-24 11:00:50 +03005901void Context::bindFragDataLocationIndexed(GLuint program,
5902 GLuint colorNumber,
5903 GLuint index,
5904 const char *name)
5905{
5906 Program *programObject = getProgramNoResolveLink(program);
5907 programObject->bindFragmentOutputLocation(colorNumber, name);
5908 programObject->bindFragmentOutputIndex(index, name);
5909}
5910
5911void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
5912{
5913 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
5914}
5915
5916int Context::getFragDataIndex(GLuint program, const char *name)
5917{
5918 Program *programObject = getProgramResolveLink(program);
5919 return programObject->getFragDataIndex(name);
5920}
5921
5922int Context::getProgramResourceLocationIndex(GLuint program,
5923 GLenum programInterface,
5924 const char *name)
5925{
5926 Program *programObject = getProgramResolveLink(program);
5927 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
5928 return programObject->getFragDataIndex(name);
5929}
5930
Jamie Madillc1d770e2017-04-13 17:31:24 -04005931void Context::shaderSource(GLuint shader,
5932 GLsizei count,
5933 const GLchar *const *string,
5934 const GLint *length)
5935{
5936 Shader *shaderObject = getShader(shader);
5937 ASSERT(shaderObject);
5938 shaderObject->setSource(count, string, length);
5939}
5940
5941void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5942{
5943 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5944}
5945
5946void Context::stencilMask(GLuint mask)
5947{
5948 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5949}
5950
5951void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5952{
5953 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5954}
5955
5956void Context::uniform1f(GLint location, GLfloat x)
5957{
5958 Program *program = mGLState.getProgram();
5959 program->setUniform1fv(location, 1, &x);
5960}
5961
5962void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5963{
5964 Program *program = mGLState.getProgram();
5965 program->setUniform1fv(location, count, v);
5966}
5967
Jamie Madill7e4eff12018-08-08 15:49:26 -04005968void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005969{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005970 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04005971 {
5972 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04005973 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04005974 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005975}
5976
Jamie Madill7e4eff12018-08-08 15:49:26 -04005977void Context::uniform1i(GLint location, GLint x)
5978{
5979 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
5980}
5981
Jamie Madillc1d770e2017-04-13 17:31:24 -04005982void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5983{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005984 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005985}
5986
5987void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5988{
5989 GLfloat xy[2] = {x, y};
5990 Program *program = mGLState.getProgram();
5991 program->setUniform2fv(location, 1, xy);
5992}
5993
5994void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5995{
5996 Program *program = mGLState.getProgram();
5997 program->setUniform2fv(location, count, v);
5998}
5999
6000void Context::uniform2i(GLint location, GLint x, GLint y)
6001{
6002 GLint xy[2] = {x, y};
6003 Program *program = mGLState.getProgram();
6004 program->setUniform2iv(location, 1, xy);
6005}
6006
6007void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
6008{
6009 Program *program = mGLState.getProgram();
6010 program->setUniform2iv(location, count, v);
6011}
6012
6013void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6014{
6015 GLfloat xyz[3] = {x, y, z};
6016 Program *program = mGLState.getProgram();
6017 program->setUniform3fv(location, 1, xyz);
6018}
6019
6020void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
6021{
6022 Program *program = mGLState.getProgram();
6023 program->setUniform3fv(location, count, v);
6024}
6025
6026void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
6027{
6028 GLint xyz[3] = {x, y, z};
6029 Program *program = mGLState.getProgram();
6030 program->setUniform3iv(location, 1, xyz);
6031}
6032
6033void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
6034{
6035 Program *program = mGLState.getProgram();
6036 program->setUniform3iv(location, count, v);
6037}
6038
6039void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6040{
6041 GLfloat xyzw[4] = {x, y, z, w};
6042 Program *program = mGLState.getProgram();
6043 program->setUniform4fv(location, 1, xyzw);
6044}
6045
6046void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
6047{
6048 Program *program = mGLState.getProgram();
6049 program->setUniform4fv(location, count, v);
6050}
6051
6052void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6053{
6054 GLint xyzw[4] = {x, y, z, w};
6055 Program *program = mGLState.getProgram();
6056 program->setUniform4iv(location, 1, xyzw);
6057}
6058
6059void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
6060{
6061 Program *program = mGLState.getProgram();
6062 program->setUniform4iv(location, count, v);
6063}
6064
6065void Context::uniformMatrix2fv(GLint location,
6066 GLsizei count,
6067 GLboolean transpose,
6068 const GLfloat *value)
6069{
6070 Program *program = mGLState.getProgram();
6071 program->setUniformMatrix2fv(location, count, transpose, value);
6072}
6073
6074void Context::uniformMatrix3fv(GLint location,
6075 GLsizei count,
6076 GLboolean transpose,
6077 const GLfloat *value)
6078{
6079 Program *program = mGLState.getProgram();
6080 program->setUniformMatrix3fv(location, count, transpose, value);
6081}
6082
6083void Context::uniformMatrix4fv(GLint location,
6084 GLsizei count,
6085 GLboolean transpose,
6086 const GLfloat *value)
6087{
6088 Program *program = mGLState.getProgram();
6089 program->setUniformMatrix4fv(location, count, transpose, value);
6090}
6091
6092void Context::validateProgram(GLuint program)
6093{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006094 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006095 ASSERT(programObject);
6096 programObject->validate(mCaps);
6097}
6098
Jiajia Qin5451d532017-11-16 17:16:34 +08006099void Context::validateProgramPipeline(GLuint pipeline)
6100{
6101 UNIMPLEMENTED();
6102}
6103
Jamie Madilld04908b2017-06-09 14:15:35 -04006104void Context::getProgramBinary(GLuint program,
6105 GLsizei bufSize,
6106 GLsizei *length,
6107 GLenum *binaryFormat,
6108 void *binary)
6109{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006110 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006111 ASSERT(programObject != nullptr);
6112
6113 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
6114}
6115
6116void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6117{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006118 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006119 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006120
Jamie Madilld04908b2017-06-09 14:15:35 -04006121 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006122 if (programObject->isInUse())
6123 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006124 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006125 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006126 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006127}
6128
Jamie Madillff325f12017-08-26 15:06:05 -04006129void Context::uniform1ui(GLint location, GLuint v0)
6130{
6131 Program *program = mGLState.getProgram();
6132 program->setUniform1uiv(location, 1, &v0);
6133}
6134
6135void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6136{
6137 Program *program = mGLState.getProgram();
6138 const GLuint xy[] = {v0, v1};
6139 program->setUniform2uiv(location, 1, xy);
6140}
6141
6142void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6143{
6144 Program *program = mGLState.getProgram();
6145 const GLuint xyz[] = {v0, v1, v2};
6146 program->setUniform3uiv(location, 1, xyz);
6147}
6148
6149void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6150{
6151 Program *program = mGLState.getProgram();
6152 const GLuint xyzw[] = {v0, v1, v2, v3};
6153 program->setUniform4uiv(location, 1, xyzw);
6154}
6155
6156void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6157{
6158 Program *program = mGLState.getProgram();
6159 program->setUniform1uiv(location, count, value);
6160}
6161void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6162{
6163 Program *program = mGLState.getProgram();
6164 program->setUniform2uiv(location, count, value);
6165}
6166
6167void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6168{
6169 Program *program = mGLState.getProgram();
6170 program->setUniform3uiv(location, count, value);
6171}
6172
6173void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6174{
6175 Program *program = mGLState.getProgram();
6176 program->setUniform4uiv(location, count, value);
6177}
6178
Jamie Madillf0e04492017-08-26 15:28:42 -04006179void Context::genQueries(GLsizei n, GLuint *ids)
6180{
6181 for (GLsizei i = 0; i < n; i++)
6182 {
6183 GLuint handle = mQueryHandleAllocator.allocate();
6184 mQueryMap.assign(handle, nullptr);
6185 ids[i] = handle;
6186 }
6187}
6188
6189void Context::deleteQueries(GLsizei n, const GLuint *ids)
6190{
6191 for (int i = 0; i < n; i++)
6192 {
6193 GLuint query = ids[i];
6194
6195 Query *queryObject = nullptr;
6196 if (mQueryMap.erase(query, &queryObject))
6197 {
6198 mQueryHandleAllocator.release(query);
6199 if (queryObject)
6200 {
6201 queryObject->release(this);
6202 }
6203 }
6204 }
6205}
6206
6207GLboolean Context::isQuery(GLuint id)
6208{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006209 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006210}
6211
Jamie Madillc8c95812017-08-26 18:40:09 -04006212void Context::uniformMatrix2x3fv(GLint location,
6213 GLsizei count,
6214 GLboolean transpose,
6215 const GLfloat *value)
6216{
6217 Program *program = mGLState.getProgram();
6218 program->setUniformMatrix2x3fv(location, count, transpose, value);
6219}
6220
6221void Context::uniformMatrix3x2fv(GLint location,
6222 GLsizei count,
6223 GLboolean transpose,
6224 const GLfloat *value)
6225{
6226 Program *program = mGLState.getProgram();
6227 program->setUniformMatrix3x2fv(location, count, transpose, value);
6228}
6229
6230void Context::uniformMatrix2x4fv(GLint location,
6231 GLsizei count,
6232 GLboolean transpose,
6233 const GLfloat *value)
6234{
6235 Program *program = mGLState.getProgram();
6236 program->setUniformMatrix2x4fv(location, count, transpose, value);
6237}
6238
6239void Context::uniformMatrix4x2fv(GLint location,
6240 GLsizei count,
6241 GLboolean transpose,
6242 const GLfloat *value)
6243{
6244 Program *program = mGLState.getProgram();
6245 program->setUniformMatrix4x2fv(location, count, transpose, value);
6246}
6247
6248void Context::uniformMatrix3x4fv(GLint location,
6249 GLsizei count,
6250 GLboolean transpose,
6251 const GLfloat *value)
6252{
6253 Program *program = mGLState.getProgram();
6254 program->setUniformMatrix3x4fv(location, count, transpose, value);
6255}
6256
6257void Context::uniformMatrix4x3fv(GLint location,
6258 GLsizei count,
6259 GLboolean transpose,
6260 const GLfloat *value)
6261{
6262 Program *program = mGLState.getProgram();
6263 program->setUniformMatrix4x3fv(location, count, transpose, value);
6264}
6265
Jamie Madilld7576732017-08-26 18:49:50 -04006266void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6267{
6268 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6269 {
6270 GLuint vertexArray = arrays[arrayIndex];
6271
6272 if (arrays[arrayIndex] != 0)
6273 {
6274 VertexArray *vertexArrayObject = nullptr;
6275 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6276 {
6277 if (vertexArrayObject != nullptr)
6278 {
6279 detachVertexArray(vertexArray);
6280 vertexArrayObject->onDestroy(this);
6281 }
6282
6283 mVertexArrayHandleAllocator.release(vertexArray);
6284 }
6285 }
6286 }
6287}
6288
6289void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6290{
6291 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6292 {
6293 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6294 mVertexArrayMap.assign(vertexArray, nullptr);
6295 arrays[arrayIndex] = vertexArray;
6296 }
6297}
6298
6299bool Context::isVertexArray(GLuint array)
6300{
6301 if (array == 0)
6302 {
6303 return GL_FALSE;
6304 }
6305
6306 VertexArray *vao = getVertexArray(array);
6307 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6308}
6309
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006310void Context::endTransformFeedback()
6311{
6312 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6313 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006314 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006315}
6316
6317void Context::transformFeedbackVaryings(GLuint program,
6318 GLsizei count,
6319 const GLchar *const *varyings,
6320 GLenum bufferMode)
6321{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006322 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006323 ASSERT(programObject);
6324 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6325}
6326
6327void Context::getTransformFeedbackVarying(GLuint program,
6328 GLuint index,
6329 GLsizei bufSize,
6330 GLsizei *length,
6331 GLsizei *size,
6332 GLenum *type,
6333 GLchar *name)
6334{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006335 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006336 ASSERT(programObject);
6337 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6338}
6339
6340void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6341{
6342 for (int i = 0; i < n; i++)
6343 {
6344 GLuint transformFeedback = ids[i];
6345 if (transformFeedback == 0)
6346 {
6347 continue;
6348 }
6349
6350 TransformFeedback *transformFeedbackObject = nullptr;
6351 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6352 {
6353 if (transformFeedbackObject != nullptr)
6354 {
6355 detachTransformFeedback(transformFeedback);
6356 transformFeedbackObject->release(this);
6357 }
6358
6359 mTransformFeedbackHandleAllocator.release(transformFeedback);
6360 }
6361 }
6362}
6363
6364void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6365{
6366 for (int i = 0; i < n; i++)
6367 {
6368 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6369 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6370 ids[i] = transformFeedback;
6371 }
6372}
6373
6374bool Context::isTransformFeedback(GLuint id)
6375{
6376 if (id == 0)
6377 {
6378 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6379 // returns FALSE
6380 return GL_FALSE;
6381 }
6382
6383 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6384 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6385}
6386
6387void Context::pauseTransformFeedback()
6388{
6389 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6390 transformFeedback->pause();
6391}
6392
6393void Context::resumeTransformFeedback()
6394{
6395 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6396 transformFeedback->resume();
6397}
6398
Jamie Madill12e957f2017-08-26 21:42:26 -04006399void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6400{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006401 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006402 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006403}
6404
Brandon Jones59770802018-04-02 13:18:42 -07006405void Context::getUniformuivRobust(GLuint program,
6406 GLint location,
6407 GLsizei bufSize,
6408 GLsizei *length,
6409 GLuint *params)
6410{
6411 getUniformuiv(program, location, params);
6412}
6413
Jamie Madill12e957f2017-08-26 21:42:26 -04006414GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6415{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006416 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006417 return programObject->getFragDataLocation(name);
6418}
6419
6420void Context::getUniformIndices(GLuint program,
6421 GLsizei uniformCount,
6422 const GLchar *const *uniformNames,
6423 GLuint *uniformIndices)
6424{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006425 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006426 if (!programObject->isLinked())
6427 {
6428 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6429 {
6430 uniformIndices[uniformId] = GL_INVALID_INDEX;
6431 }
6432 }
6433 else
6434 {
6435 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6436 {
6437 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6438 }
6439 }
6440}
6441
6442void Context::getActiveUniformsiv(GLuint program,
6443 GLsizei uniformCount,
6444 const GLuint *uniformIndices,
6445 GLenum pname,
6446 GLint *params)
6447{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006448 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006449 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6450 {
6451 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006452 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006453 }
6454}
6455
6456GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6457{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006458 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006459 return programObject->getUniformBlockIndex(uniformBlockName);
6460}
6461
6462void Context::getActiveUniformBlockiv(GLuint program,
6463 GLuint uniformBlockIndex,
6464 GLenum pname,
6465 GLint *params)
6466{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006467 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006468 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6469}
6470
Brandon Jones59770802018-04-02 13:18:42 -07006471void Context::getActiveUniformBlockivRobust(GLuint program,
6472 GLuint uniformBlockIndex,
6473 GLenum pname,
6474 GLsizei bufSize,
6475 GLsizei *length,
6476 GLint *params)
6477{
6478 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6479}
6480
Jamie Madill12e957f2017-08-26 21:42:26 -04006481void Context::getActiveUniformBlockName(GLuint program,
6482 GLuint uniformBlockIndex,
6483 GLsizei bufSize,
6484 GLsizei *length,
6485 GLchar *uniformBlockName)
6486{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006487 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006488 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6489}
6490
6491void Context::uniformBlockBinding(GLuint program,
6492 GLuint uniformBlockIndex,
6493 GLuint uniformBlockBinding)
6494{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006495 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006496 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006497
Jamie Madill956ab4d2018-10-10 16:13:03 -04006498 // Note: If the Program is shared between Contexts we would be better using Observer/Subject.
Jamie Madill70aeda42018-08-20 12:17:40 -04006499 if (programObject->isInUse())
6500 {
6501 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006502 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006503 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006504}
6505
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006506GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6507{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006508 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6509 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006510
Jamie Madill70b5bb02017-08-28 13:32:37 -04006511 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006512 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006513 if (error.isError())
6514 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006515 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006516 handleError(error);
6517 return nullptr;
6518 }
6519
Jamie Madill70b5bb02017-08-28 13:32:37 -04006520 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006521}
6522
6523GLboolean Context::isSync(GLsync sync)
6524{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006525 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006526}
6527
6528GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6529{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006530 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006531
6532 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006533 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006534 return result;
6535}
6536
6537void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6538{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006539 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006540 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006541}
6542
6543void Context::getInteger64v(GLenum pname, GLint64 *params)
6544{
6545 GLenum nativeType = GL_NONE;
6546 unsigned int numParams = 0;
6547 getQueryParameterInfo(pname, &nativeType, &numParams);
6548
6549 if (nativeType == GL_INT_64_ANGLEX)
6550 {
6551 getInteger64vImpl(pname, params);
6552 }
6553 else
6554 {
6555 CastStateValues(this, nativeType, pname, numParams, params);
6556 }
6557}
6558
Brandon Jones59770802018-04-02 13:18:42 -07006559void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6560{
6561 getInteger64v(pname, data);
6562}
6563
Corentin Wallez336129f2017-10-17 15:55:40 -04006564void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006565{
6566 Buffer *buffer = mGLState.getTargetBuffer(target);
6567 QueryBufferParameteri64v(buffer, pname, params);
6568}
6569
Brandon Jones59770802018-04-02 13:18:42 -07006570void Context::getBufferParameteri64vRobust(BufferBinding target,
6571 GLenum pname,
6572 GLsizei bufSize,
6573 GLsizei *length,
6574 GLint64 *params)
6575{
6576 getBufferParameteri64v(target, pname, params);
6577}
6578
Jamie Madill3ef140a2017-08-26 23:11:21 -04006579void Context::genSamplers(GLsizei count, GLuint *samplers)
6580{
6581 for (int i = 0; i < count; i++)
6582 {
6583 samplers[i] = mState.mSamplers->createSampler();
6584 }
6585}
6586
6587void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6588{
6589 for (int i = 0; i < count; i++)
6590 {
6591 GLuint sampler = samplers[i];
6592
6593 if (mState.mSamplers->getSampler(sampler))
6594 {
6595 detachSampler(sampler);
6596 }
6597
6598 mState.mSamplers->deleteObject(this, sampler);
6599 }
6600}
6601
6602void Context::getInternalformativ(GLenum target,
6603 GLenum internalformat,
6604 GLenum pname,
6605 GLsizei bufSize,
6606 GLint *params)
6607{
6608 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6609 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6610}
6611
Brandon Jones59770802018-04-02 13:18:42 -07006612void Context::getInternalformativRobust(GLenum target,
6613 GLenum internalformat,
6614 GLenum pname,
6615 GLsizei bufSize,
6616 GLsizei *length,
6617 GLint *params)
6618{
6619 getInternalformativ(target, internalformat, pname, bufSize, params);
6620}
6621
Jiajia Qin5451d532017-11-16 17:16:34 +08006622void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6623{
6624 programUniform1iv(program, location, 1, &v0);
6625}
6626
6627void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6628{
6629 GLint xy[2] = {v0, v1};
6630 programUniform2iv(program, location, 1, xy);
6631}
6632
6633void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6634{
6635 GLint xyz[3] = {v0, v1, v2};
6636 programUniform3iv(program, location, 1, xyz);
6637}
6638
6639void Context::programUniform4i(GLuint program,
6640 GLint location,
6641 GLint v0,
6642 GLint v1,
6643 GLint v2,
6644 GLint v3)
6645{
6646 GLint xyzw[4] = {v0, v1, v2, v3};
6647 programUniform4iv(program, location, 1, xyzw);
6648}
6649
6650void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6651{
6652 programUniform1uiv(program, location, 1, &v0);
6653}
6654
6655void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6656{
6657 GLuint xy[2] = {v0, v1};
6658 programUniform2uiv(program, location, 1, xy);
6659}
6660
6661void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6662{
6663 GLuint xyz[3] = {v0, v1, v2};
6664 programUniform3uiv(program, location, 1, xyz);
6665}
6666
6667void Context::programUniform4ui(GLuint program,
6668 GLint location,
6669 GLuint v0,
6670 GLuint v1,
6671 GLuint v2,
6672 GLuint v3)
6673{
6674 GLuint xyzw[4] = {v0, v1, v2, v3};
6675 programUniform4uiv(program, location, 1, xyzw);
6676}
6677
6678void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6679{
6680 programUniform1fv(program, location, 1, &v0);
6681}
6682
6683void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6684{
6685 GLfloat xy[2] = {v0, v1};
6686 programUniform2fv(program, location, 1, xy);
6687}
6688
6689void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6690{
6691 GLfloat xyz[3] = {v0, v1, v2};
6692 programUniform3fv(program, location, 1, xyz);
6693}
6694
6695void Context::programUniform4f(GLuint program,
6696 GLint location,
6697 GLfloat v0,
6698 GLfloat v1,
6699 GLfloat v2,
6700 GLfloat v3)
6701{
6702 GLfloat xyzw[4] = {v0, v1, v2, v3};
6703 programUniform4fv(program, location, 1, xyzw);
6704}
6705
Jamie Madill81c2e252017-09-09 23:32:46 -04006706void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6707{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006708 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006709 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006710 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006711}
6712
Jiajia Qin5451d532017-11-16 17:16:34 +08006713void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6714{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006715 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006716 ASSERT(programObject);
6717 programObject->setUniform2iv(location, count, value);
6718}
6719
6720void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6721{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006722 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006723 ASSERT(programObject);
6724 programObject->setUniform3iv(location, count, value);
6725}
6726
6727void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6728{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006729 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006730 ASSERT(programObject);
6731 programObject->setUniform4iv(location, count, value);
6732}
6733
6734void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6735{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006736 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006737 ASSERT(programObject);
6738 programObject->setUniform1uiv(location, count, value);
6739}
6740
6741void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6742{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006743 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006744 ASSERT(programObject);
6745 programObject->setUniform2uiv(location, count, value);
6746}
6747
6748void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6749{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006750 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006751 ASSERT(programObject);
6752 programObject->setUniform3uiv(location, count, value);
6753}
6754
6755void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6756{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006757 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006758 ASSERT(programObject);
6759 programObject->setUniform4uiv(location, count, value);
6760}
6761
6762void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6763{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006764 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006765 ASSERT(programObject);
6766 programObject->setUniform1fv(location, count, value);
6767}
6768
6769void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6770{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006771 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006772 ASSERT(programObject);
6773 programObject->setUniform2fv(location, count, value);
6774}
6775
6776void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6777{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006778 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006779 ASSERT(programObject);
6780 programObject->setUniform3fv(location, count, value);
6781}
6782
6783void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6784{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006785 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006786 ASSERT(programObject);
6787 programObject->setUniform4fv(location, count, value);
6788}
6789
6790void Context::programUniformMatrix2fv(GLuint program,
6791 GLint location,
6792 GLsizei count,
6793 GLboolean transpose,
6794 const GLfloat *value)
6795{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006796 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006797 ASSERT(programObject);
6798 programObject->setUniformMatrix2fv(location, count, transpose, value);
6799}
6800
6801void Context::programUniformMatrix3fv(GLuint program,
6802 GLint location,
6803 GLsizei count,
6804 GLboolean transpose,
6805 const GLfloat *value)
6806{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006807 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006808 ASSERT(programObject);
6809 programObject->setUniformMatrix3fv(location, count, transpose, value);
6810}
6811
6812void Context::programUniformMatrix4fv(GLuint program,
6813 GLint location,
6814 GLsizei count,
6815 GLboolean transpose,
6816 const GLfloat *value)
6817{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006818 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006819 ASSERT(programObject);
6820 programObject->setUniformMatrix4fv(location, count, transpose, value);
6821}
6822
6823void Context::programUniformMatrix2x3fv(GLuint program,
6824 GLint location,
6825 GLsizei count,
6826 GLboolean transpose,
6827 const GLfloat *value)
6828{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006829 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006830 ASSERT(programObject);
6831 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6832}
6833
6834void Context::programUniformMatrix3x2fv(GLuint program,
6835 GLint location,
6836 GLsizei count,
6837 GLboolean transpose,
6838 const GLfloat *value)
6839{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006840 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006841 ASSERT(programObject);
6842 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6843}
6844
6845void Context::programUniformMatrix2x4fv(GLuint program,
6846 GLint location,
6847 GLsizei count,
6848 GLboolean transpose,
6849 const GLfloat *value)
6850{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006851 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006852 ASSERT(programObject);
6853 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6854}
6855
6856void Context::programUniformMatrix4x2fv(GLuint program,
6857 GLint location,
6858 GLsizei count,
6859 GLboolean transpose,
6860 const GLfloat *value)
6861{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006862 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006863 ASSERT(programObject);
6864 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6865}
6866
6867void Context::programUniformMatrix3x4fv(GLuint program,
6868 GLint location,
6869 GLsizei count,
6870 GLboolean transpose,
6871 const GLfloat *value)
6872{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006873 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006874 ASSERT(programObject);
6875 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6876}
6877
6878void Context::programUniformMatrix4x3fv(GLuint program,
6879 GLint location,
6880 GLsizei count,
6881 GLboolean transpose,
6882 const GLfloat *value)
6883{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006884 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006885 ASSERT(programObject);
6886 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6887}
6888
Jamie Madill81c2e252017-09-09 23:32:46 -04006889void Context::onTextureChange(const Texture *texture)
6890{
6891 // Conservatively assume all textures are dirty.
6892 // TODO(jmadill): More fine-grained update.
6893 mGLState.setObjectDirty(GL_TEXTURE);
6894}
6895
James Darpiniane8a93c62018-01-04 18:02:24 -08006896bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6897{
6898 return mGLState.isCurrentTransformFeedback(tf);
6899}
James Darpiniane8a93c62018-01-04 18:02:24 -08006900
Yunchao Hea336b902017-08-02 16:05:21 +08006901void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6902{
6903 for (int i = 0; i < count; i++)
6904 {
6905 pipelines[i] = createProgramPipeline();
6906 }
6907}
6908
6909void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6910{
6911 for (int i = 0; i < count; i++)
6912 {
6913 if (pipelines[i] != 0)
6914 {
6915 deleteProgramPipeline(pipelines[i]);
6916 }
6917 }
6918}
6919
6920GLboolean Context::isProgramPipeline(GLuint pipeline)
6921{
6922 if (pipeline == 0)
6923 {
6924 return GL_FALSE;
6925 }
6926
6927 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6928}
6929
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006930void Context::finishFenceNV(GLuint fence)
6931{
6932 FenceNV *fenceObject = getFenceNV(fence);
6933
6934 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04006935 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006936}
6937
6938void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6939{
6940 FenceNV *fenceObject = getFenceNV(fence);
6941
6942 ASSERT(fenceObject && fenceObject->isSet());
6943
6944 switch (pname)
6945 {
6946 case GL_FENCE_STATUS_NV:
6947 {
6948 // GL_NV_fence spec:
6949 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6950 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6951 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6952 GLboolean status = GL_TRUE;
6953 if (fenceObject->getStatus() != GL_TRUE)
6954 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006955 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006956 }
6957 *params = status;
6958 break;
6959 }
6960
6961 case GL_FENCE_CONDITION_NV:
6962 {
6963 *params = static_cast<GLint>(fenceObject->getCondition());
6964 break;
6965 }
6966
6967 default:
6968 UNREACHABLE();
6969 }
6970}
6971
6972void Context::getTranslatedShaderSource(GLuint shader,
6973 GLsizei bufsize,
6974 GLsizei *length,
6975 GLchar *source)
6976{
6977 Shader *shaderObject = getShader(shader);
6978 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08006979 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006980}
6981
6982void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6983{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006984 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006985 ASSERT(programObject);
6986
6987 programObject->getUniformfv(this, location, params);
6988}
6989
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006990void Context::getnUniformfvRobust(GLuint program,
6991 GLint location,
6992 GLsizei bufSize,
6993 GLsizei *length,
6994 GLfloat *params)
6995{
6996 UNIMPLEMENTED();
6997}
6998
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006999void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
7000{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007001 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007002 ASSERT(programObject);
7003
7004 programObject->getUniformiv(this, location, params);
7005}
7006
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007007void Context::getnUniformivRobust(GLuint program,
7008 GLint location,
7009 GLsizei bufSize,
7010 GLsizei *length,
7011 GLint *params)
7012{
7013 UNIMPLEMENTED();
7014}
7015
7016void Context::getnUniformuivRobust(GLuint program,
7017 GLint location,
7018 GLsizei bufSize,
7019 GLsizei *length,
7020 GLuint *params)
7021{
7022 UNIMPLEMENTED();
7023}
7024
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007025GLboolean Context::isFenceNV(GLuint fence)
7026{
7027 FenceNV *fenceObject = getFenceNV(fence);
7028
7029 if (fenceObject == nullptr)
7030 {
7031 return GL_FALSE;
7032 }
7033
7034 // GL_NV_fence spec:
7035 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
7036 // existing fence.
7037 return fenceObject->isSet();
7038}
7039
7040void Context::readnPixels(GLint x,
7041 GLint y,
7042 GLsizei width,
7043 GLsizei height,
7044 GLenum format,
7045 GLenum type,
7046 GLsizei bufSize,
7047 void *data)
7048{
7049 return readPixels(x, y, width, height, format, type, data);
7050}
7051
Jamie Madill007530e2017-12-28 14:27:04 -05007052void Context::setFenceNV(GLuint fence, GLenum condition)
7053{
7054 ASSERT(condition == GL_ALL_COMPLETED_NV);
7055
7056 FenceNV *fenceObject = getFenceNV(fence);
7057 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04007058 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05007059}
7060
7061GLboolean Context::testFenceNV(GLuint fence)
7062{
7063 FenceNV *fenceObject = getFenceNV(fence);
7064
7065 ASSERT(fenceObject != nullptr);
7066 ASSERT(fenceObject->isSet() == GL_TRUE);
7067
7068 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04007069 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05007070 if (error.isError())
7071 {
7072 handleError(error);
7073 return GL_TRUE;
7074 }
7075
7076 return result;
7077}
7078
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007079void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007080{
7081 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007082 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05007083 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007084}
7085
Jamie Madillfa920eb2018-01-04 11:45:50 -05007086void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007087{
7088 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007089 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05007090 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
7091}
7092
Jamie Madillfa920eb2018-01-04 11:45:50 -05007093void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7094{
7095 UNIMPLEMENTED();
7096}
7097
Jamie Madill5b772312018-03-08 20:28:32 -05007098bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7099{
7100 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7101 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7102 // to the fact that it is stored internally as a float, and so would require conversion
7103 // if returned from Context::getIntegerv. Since this conversion is already implemented
7104 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7105 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7106 // application.
7107 switch (pname)
7108 {
7109 case GL_COMPRESSED_TEXTURE_FORMATS:
7110 {
7111 *type = GL_INT;
7112 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7113 return true;
7114 }
7115 case GL_SHADER_BINARY_FORMATS:
7116 {
7117 *type = GL_INT;
7118 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7119 return true;
7120 }
7121
7122 case GL_MAX_VERTEX_ATTRIBS:
7123 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7124 case GL_MAX_VARYING_VECTORS:
7125 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7126 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7127 case GL_MAX_TEXTURE_IMAGE_UNITS:
7128 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7129 case GL_MAX_RENDERBUFFER_SIZE:
7130 case GL_NUM_SHADER_BINARY_FORMATS:
7131 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7132 case GL_ARRAY_BUFFER_BINDING:
7133 case GL_FRAMEBUFFER_BINDING:
7134 case GL_RENDERBUFFER_BINDING:
7135 case GL_CURRENT_PROGRAM:
7136 case GL_PACK_ALIGNMENT:
7137 case GL_UNPACK_ALIGNMENT:
7138 case GL_GENERATE_MIPMAP_HINT:
7139 case GL_RED_BITS:
7140 case GL_GREEN_BITS:
7141 case GL_BLUE_BITS:
7142 case GL_ALPHA_BITS:
7143 case GL_DEPTH_BITS:
7144 case GL_STENCIL_BITS:
7145 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7146 case GL_CULL_FACE_MODE:
7147 case GL_FRONT_FACE:
7148 case GL_ACTIVE_TEXTURE:
7149 case GL_STENCIL_FUNC:
7150 case GL_STENCIL_VALUE_MASK:
7151 case GL_STENCIL_REF:
7152 case GL_STENCIL_FAIL:
7153 case GL_STENCIL_PASS_DEPTH_FAIL:
7154 case GL_STENCIL_PASS_DEPTH_PASS:
7155 case GL_STENCIL_BACK_FUNC:
7156 case GL_STENCIL_BACK_VALUE_MASK:
7157 case GL_STENCIL_BACK_REF:
7158 case GL_STENCIL_BACK_FAIL:
7159 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7160 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7161 case GL_DEPTH_FUNC:
7162 case GL_BLEND_SRC_RGB:
7163 case GL_BLEND_SRC_ALPHA:
7164 case GL_BLEND_DST_RGB:
7165 case GL_BLEND_DST_ALPHA:
7166 case GL_BLEND_EQUATION_RGB:
7167 case GL_BLEND_EQUATION_ALPHA:
7168 case GL_STENCIL_WRITEMASK:
7169 case GL_STENCIL_BACK_WRITEMASK:
7170 case GL_STENCIL_CLEAR_VALUE:
7171 case GL_SUBPIXEL_BITS:
7172 case GL_MAX_TEXTURE_SIZE:
7173 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7174 case GL_SAMPLE_BUFFERS:
7175 case GL_SAMPLES:
7176 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7177 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7178 case GL_TEXTURE_BINDING_2D:
7179 case GL_TEXTURE_BINDING_CUBE_MAP:
7180 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7181 {
7182 *type = GL_INT;
7183 *numParams = 1;
7184 return true;
7185 }
7186 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7187 {
7188 if (!getExtensions().packReverseRowOrder)
7189 {
7190 return false;
7191 }
7192 *type = GL_INT;
7193 *numParams = 1;
7194 return true;
7195 }
7196 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7197 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7198 {
7199 if (!getExtensions().textureRectangle)
7200 {
7201 return false;
7202 }
7203 *type = GL_INT;
7204 *numParams = 1;
7205 return true;
7206 }
7207 case GL_MAX_DRAW_BUFFERS_EXT:
7208 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7209 {
7210 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7211 {
7212 return false;
7213 }
7214 *type = GL_INT;
7215 *numParams = 1;
7216 return true;
7217 }
7218 case GL_MAX_VIEWPORT_DIMS:
7219 {
7220 *type = GL_INT;
7221 *numParams = 2;
7222 return true;
7223 }
7224 case GL_VIEWPORT:
7225 case GL_SCISSOR_BOX:
7226 {
7227 *type = GL_INT;
7228 *numParams = 4;
7229 return true;
7230 }
7231 case GL_SHADER_COMPILER:
7232 case GL_SAMPLE_COVERAGE_INVERT:
7233 case GL_DEPTH_WRITEMASK:
7234 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7235 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7236 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7237 // bool-natural
7238 case GL_SAMPLE_COVERAGE:
7239 case GL_SCISSOR_TEST:
7240 case GL_STENCIL_TEST:
7241 case GL_DEPTH_TEST:
7242 case GL_BLEND:
7243 case GL_DITHER:
7244 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7245 {
7246 *type = GL_BOOL;
7247 *numParams = 1;
7248 return true;
7249 }
7250 case GL_COLOR_WRITEMASK:
7251 {
7252 *type = GL_BOOL;
7253 *numParams = 4;
7254 return true;
7255 }
7256 case GL_POLYGON_OFFSET_FACTOR:
7257 case GL_POLYGON_OFFSET_UNITS:
7258 case GL_SAMPLE_COVERAGE_VALUE:
7259 case GL_DEPTH_CLEAR_VALUE:
7260 case GL_LINE_WIDTH:
7261 {
7262 *type = GL_FLOAT;
7263 *numParams = 1;
7264 return true;
7265 }
7266 case GL_ALIASED_LINE_WIDTH_RANGE:
7267 case GL_ALIASED_POINT_SIZE_RANGE:
7268 case GL_DEPTH_RANGE:
7269 {
7270 *type = GL_FLOAT;
7271 *numParams = 2;
7272 return true;
7273 }
7274 case GL_COLOR_CLEAR_VALUE:
7275 case GL_BLEND_COLOR:
7276 {
7277 *type = GL_FLOAT;
7278 *numParams = 4;
7279 return true;
7280 }
7281 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7282 if (!getExtensions().textureFilterAnisotropic)
7283 {
7284 return false;
7285 }
7286 *type = GL_FLOAT;
7287 *numParams = 1;
7288 return true;
7289 case GL_TIMESTAMP_EXT:
7290 if (!getExtensions().disjointTimerQuery)
7291 {
7292 return false;
7293 }
7294 *type = GL_INT_64_ANGLEX;
7295 *numParams = 1;
7296 return true;
7297 case GL_GPU_DISJOINT_EXT:
7298 if (!getExtensions().disjointTimerQuery)
7299 {
7300 return false;
7301 }
7302 *type = GL_INT;
7303 *numParams = 1;
7304 return true;
7305 case GL_COVERAGE_MODULATION_CHROMIUM:
7306 if (!getExtensions().framebufferMixedSamples)
7307 {
7308 return false;
7309 }
7310 *type = GL_INT;
7311 *numParams = 1;
7312 return true;
7313 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7314 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7315 {
7316 return false;
7317 }
7318 *type = GL_INT;
7319 *numParams = 1;
7320 return true;
7321 }
7322
7323 if (getExtensions().debug)
7324 {
7325 switch (pname)
7326 {
7327 case GL_DEBUG_LOGGED_MESSAGES:
7328 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7329 case GL_DEBUG_GROUP_STACK_DEPTH:
7330 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7331 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7332 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7333 case GL_MAX_LABEL_LENGTH:
7334 *type = GL_INT;
7335 *numParams = 1;
7336 return true;
7337
7338 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7339 case GL_DEBUG_OUTPUT:
7340 *type = GL_BOOL;
7341 *numParams = 1;
7342 return true;
7343 }
7344 }
7345
7346 if (getExtensions().multisampleCompatibility)
7347 {
7348 switch (pname)
7349 {
7350 case GL_MULTISAMPLE_EXT:
7351 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7352 *type = GL_BOOL;
7353 *numParams = 1;
7354 return true;
7355 }
7356 }
7357
7358 if (getExtensions().pathRendering)
7359 {
7360 switch (pname)
7361 {
7362 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7363 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7364 *type = GL_FLOAT;
7365 *numParams = 16;
7366 return true;
7367 }
7368 }
7369
7370 if (getExtensions().bindGeneratesResource)
7371 {
7372 switch (pname)
7373 {
7374 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7375 *type = GL_BOOL;
7376 *numParams = 1;
7377 return true;
7378 }
7379 }
7380
7381 if (getExtensions().clientArrays)
7382 {
7383 switch (pname)
7384 {
7385 case GL_CLIENT_ARRAYS_ANGLE:
7386 *type = GL_BOOL;
7387 *numParams = 1;
7388 return true;
7389 }
7390 }
7391
7392 if (getExtensions().sRGBWriteControl)
7393 {
7394 switch (pname)
7395 {
7396 case GL_FRAMEBUFFER_SRGB_EXT:
7397 *type = GL_BOOL;
7398 *numParams = 1;
7399 return true;
7400 }
7401 }
7402
7403 if (getExtensions().robustResourceInitialization &&
7404 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7405 {
7406 *type = GL_BOOL;
7407 *numParams = 1;
7408 return true;
7409 }
7410
7411 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7412 {
7413 *type = GL_BOOL;
7414 *numParams = 1;
7415 return true;
7416 }
7417
jchen1082af6202018-06-22 10:59:52 +08007418 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7419 {
7420 *type = GL_INT;
7421 *numParams = 1;
7422 return true;
7423 }
7424
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007425 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7426 {
7427 *type = GL_INT;
7428 *numParams = 1;
7429 return true;
7430 }
7431
Jamie Madill5b772312018-03-08 20:28:32 -05007432 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7433 switch (pname)
7434 {
7435 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7436 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7437 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7438 {
7439 return false;
7440 }
7441 *type = GL_INT;
7442 *numParams = 1;
7443 return true;
7444
7445 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7446 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7447 {
7448 return false;
7449 }
7450 *type = GL_INT;
7451 *numParams = 1;
7452 return true;
7453
7454 case GL_PROGRAM_BINARY_FORMATS_OES:
7455 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7456 {
7457 return false;
7458 }
7459 *type = GL_INT;
7460 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7461 return true;
7462
7463 case GL_PACK_ROW_LENGTH:
7464 case GL_PACK_SKIP_ROWS:
7465 case GL_PACK_SKIP_PIXELS:
7466 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7467 {
7468 return false;
7469 }
7470 *type = GL_INT;
7471 *numParams = 1;
7472 return true;
7473 case GL_UNPACK_ROW_LENGTH:
7474 case GL_UNPACK_SKIP_ROWS:
7475 case GL_UNPACK_SKIP_PIXELS:
7476 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7477 {
7478 return false;
7479 }
7480 *type = GL_INT;
7481 *numParams = 1;
7482 return true;
7483 case GL_VERTEX_ARRAY_BINDING:
7484 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7485 {
7486 return false;
7487 }
7488 *type = GL_INT;
7489 *numParams = 1;
7490 return true;
7491 case GL_PIXEL_PACK_BUFFER_BINDING:
7492 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7493 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7494 {
7495 return false;
7496 }
7497 *type = GL_INT;
7498 *numParams = 1;
7499 return true;
7500 case GL_MAX_SAMPLES:
7501 {
7502 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7503 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7504 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7505 {
7506 return false;
7507 }
7508 *type = GL_INT;
7509 *numParams = 1;
7510 return true;
7511
7512 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7513 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7514 {
7515 return false;
7516 }
7517 *type = GL_INT;
7518 *numParams = 1;
7519 return true;
7520 }
7521 }
7522
7523 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7524 {
7525 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7526 {
7527 return false;
7528 }
7529 *type = GL_INT;
7530 *numParams = 1;
7531 return true;
7532 }
7533
7534 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7535 {
7536 *type = GL_INT;
7537 *numParams = 1;
7538 return true;
7539 }
7540
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007541 if (getClientVersion() < Version(2, 0))
7542 {
7543 switch (pname)
7544 {
7545 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007546 case GL_CLIENT_ACTIVE_TEXTURE:
7547 case GL_MATRIX_MODE:
7548 case GL_MAX_TEXTURE_UNITS:
7549 case GL_MAX_MODELVIEW_STACK_DEPTH:
7550 case GL_MAX_PROJECTION_STACK_DEPTH:
7551 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007552 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007553 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007554 case GL_VERTEX_ARRAY_STRIDE:
7555 case GL_NORMAL_ARRAY_STRIDE:
7556 case GL_COLOR_ARRAY_STRIDE:
7557 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7558 case GL_VERTEX_ARRAY_SIZE:
7559 case GL_COLOR_ARRAY_SIZE:
7560 case GL_TEXTURE_COORD_ARRAY_SIZE:
7561 case GL_VERTEX_ARRAY_TYPE:
7562 case GL_NORMAL_ARRAY_TYPE:
7563 case GL_COLOR_ARRAY_TYPE:
7564 case GL_TEXTURE_COORD_ARRAY_TYPE:
7565 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7566 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7567 case GL_COLOR_ARRAY_BUFFER_BINDING:
7568 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7569 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7570 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7571 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007572 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007573 case GL_MODELVIEW_STACK_DEPTH:
7574 case GL_PROJECTION_STACK_DEPTH:
7575 case GL_TEXTURE_STACK_DEPTH:
7576 case GL_LOGIC_OP_MODE:
7577 case GL_BLEND_SRC:
7578 case GL_BLEND_DST:
7579 case GL_PERSPECTIVE_CORRECTION_HINT:
7580 case GL_POINT_SMOOTH_HINT:
7581 case GL_LINE_SMOOTH_HINT:
7582 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007583 *type = GL_INT;
7584 *numParams = 1;
7585 return true;
7586 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007587 case GL_FOG_DENSITY:
7588 case GL_FOG_START:
7589 case GL_FOG_END:
7590 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007591 case GL_POINT_SIZE:
7592 case GL_POINT_SIZE_MIN:
7593 case GL_POINT_SIZE_MAX:
7594 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007595 *type = GL_FLOAT;
7596 *numParams = 1;
7597 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007598 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007599 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007600 *type = GL_FLOAT;
7601 *numParams = 2;
7602 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007603 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007604 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007605 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007606 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007607 *type = GL_FLOAT;
7608 *numParams = 4;
7609 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007610 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007611 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007612 *type = GL_FLOAT;
7613 *numParams = 3;
7614 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007615 case GL_MODELVIEW_MATRIX:
7616 case GL_PROJECTION_MATRIX:
7617 case GL_TEXTURE_MATRIX:
7618 *type = GL_FLOAT;
7619 *numParams = 16;
7620 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007621 case GL_LIGHT_MODEL_TWO_SIDE:
7622 *type = GL_BOOL;
7623 *numParams = 1;
7624 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007625 }
7626 }
7627
Jamie Madill5b772312018-03-08 20:28:32 -05007628 if (getClientVersion() < Version(3, 0))
7629 {
7630 return false;
7631 }
7632
7633 // Check for ES3.0+ parameter names
7634 switch (pname)
7635 {
7636 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7637 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7638 case GL_UNIFORM_BUFFER_BINDING:
7639 case GL_TRANSFORM_FEEDBACK_BINDING:
7640 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7641 case GL_COPY_READ_BUFFER_BINDING:
7642 case GL_COPY_WRITE_BUFFER_BINDING:
7643 case GL_SAMPLER_BINDING:
7644 case GL_READ_BUFFER:
7645 case GL_TEXTURE_BINDING_3D:
7646 case GL_TEXTURE_BINDING_2D_ARRAY:
7647 case GL_MAX_3D_TEXTURE_SIZE:
7648 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7649 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7650 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7651 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7652 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7653 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7654 case GL_MAX_VARYING_COMPONENTS:
7655 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7656 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7657 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7658 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7659 case GL_NUM_EXTENSIONS:
7660 case GL_MAJOR_VERSION:
7661 case GL_MINOR_VERSION:
7662 case GL_MAX_ELEMENTS_INDICES:
7663 case GL_MAX_ELEMENTS_VERTICES:
7664 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7665 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7666 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7667 case GL_UNPACK_IMAGE_HEIGHT:
7668 case GL_UNPACK_SKIP_IMAGES:
7669 {
7670 *type = GL_INT;
7671 *numParams = 1;
7672 return true;
7673 }
7674
7675 case GL_MAX_ELEMENT_INDEX:
7676 case GL_MAX_UNIFORM_BLOCK_SIZE:
7677 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7678 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7679 case GL_MAX_SERVER_WAIT_TIMEOUT:
7680 {
7681 *type = GL_INT_64_ANGLEX;
7682 *numParams = 1;
7683 return true;
7684 }
7685
7686 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7687 case GL_TRANSFORM_FEEDBACK_PAUSED:
7688 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7689 case GL_RASTERIZER_DISCARD:
7690 {
7691 *type = GL_BOOL;
7692 *numParams = 1;
7693 return true;
7694 }
7695
7696 case GL_MAX_TEXTURE_LOD_BIAS:
7697 {
7698 *type = GL_FLOAT;
7699 *numParams = 1;
7700 return true;
7701 }
7702 }
7703
7704 if (getExtensions().requestExtension)
7705 {
7706 switch (pname)
7707 {
7708 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7709 *type = GL_INT;
7710 *numParams = 1;
7711 return true;
7712 }
7713 }
7714
Yizhou Jiang7818a852018-09-06 15:02:04 +08007715 if (getExtensions().textureMultisample)
7716 {
7717 switch (pname)
7718 {
7719 case GL_MAX_COLOR_TEXTURE_SAMPLES_ANGLE:
7720 case GL_MAX_INTEGER_SAMPLES_ANGLE:
7721 case GL_MAX_DEPTH_TEXTURE_SAMPLES_ANGLE:
7722 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE:
7723 *type = GL_INT;
7724 *numParams = 1;
7725 return true;
7726 }
7727 }
7728
Jamie Madill5b772312018-03-08 20:28:32 -05007729 if (getClientVersion() < Version(3, 1))
7730 {
7731 return false;
7732 }
7733
7734 switch (pname)
7735 {
7736 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7737 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7738 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7739 case GL_MAX_FRAMEBUFFER_WIDTH:
7740 case GL_MAX_FRAMEBUFFER_HEIGHT:
7741 case GL_MAX_FRAMEBUFFER_SAMPLES:
7742 case GL_MAX_SAMPLE_MASK_WORDS:
7743 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7744 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7745 case GL_MAX_INTEGER_SAMPLES:
7746 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7747 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7748 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7749 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7750 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7751 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7752 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7753 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7754 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7755 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7756 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7757 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7758 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7759 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7760 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7761 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7762 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7763 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7764 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7765 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7766 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7767 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7768 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7769 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7770 case GL_MAX_UNIFORM_LOCATIONS:
7771 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7772 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7773 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7774 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7775 case GL_MAX_IMAGE_UNITS:
7776 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7777 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7778 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7779 case GL_SHADER_STORAGE_BUFFER_BINDING:
7780 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7781 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007782 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007783 *type = GL_INT;
7784 *numParams = 1;
7785 return true;
7786 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7787 *type = GL_INT_64_ANGLEX;
7788 *numParams = 1;
7789 return true;
7790 case GL_SAMPLE_MASK:
7791 *type = GL_BOOL;
7792 *numParams = 1;
7793 return true;
7794 }
7795
7796 if (getExtensions().geometryShader)
7797 {
7798 switch (pname)
7799 {
7800 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7801 case GL_LAYER_PROVOKING_VERTEX_EXT:
7802 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7803 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7804 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7805 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7806 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7807 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7808 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7809 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7810 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7811 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7812 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7813 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7814 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7815 *type = GL_INT;
7816 *numParams = 1;
7817 return true;
7818 }
7819 }
7820
7821 return false;
7822}
7823
7824bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7825{
7826 if (getClientVersion() < Version(3, 0))
7827 {
7828 return false;
7829 }
7830
7831 switch (target)
7832 {
7833 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7834 case GL_UNIFORM_BUFFER_BINDING:
7835 {
7836 *type = GL_INT;
7837 *numParams = 1;
7838 return true;
7839 }
7840 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7841 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7842 case GL_UNIFORM_BUFFER_START:
7843 case GL_UNIFORM_BUFFER_SIZE:
7844 {
7845 *type = GL_INT_64_ANGLEX;
7846 *numParams = 1;
7847 return true;
7848 }
7849 }
7850
7851 if (getClientVersion() < Version(3, 1))
7852 {
7853 return false;
7854 }
7855
7856 switch (target)
7857 {
7858 case GL_IMAGE_BINDING_LAYERED:
7859 {
7860 *type = GL_BOOL;
7861 *numParams = 1;
7862 return true;
7863 }
7864 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7865 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7866 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7867 case GL_SHADER_STORAGE_BUFFER_BINDING:
7868 case GL_VERTEX_BINDING_BUFFER:
7869 case GL_VERTEX_BINDING_DIVISOR:
7870 case GL_VERTEX_BINDING_OFFSET:
7871 case GL_VERTEX_BINDING_STRIDE:
7872 case GL_SAMPLE_MASK_VALUE:
7873 case GL_IMAGE_BINDING_NAME:
7874 case GL_IMAGE_BINDING_LEVEL:
7875 case GL_IMAGE_BINDING_LAYER:
7876 case GL_IMAGE_BINDING_ACCESS:
7877 case GL_IMAGE_BINDING_FORMAT:
7878 {
7879 *type = GL_INT;
7880 *numParams = 1;
7881 return true;
7882 }
7883 case GL_ATOMIC_COUNTER_BUFFER_START:
7884 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7885 case GL_SHADER_STORAGE_BUFFER_START:
7886 case GL_SHADER_STORAGE_BUFFER_SIZE:
7887 {
7888 *type = GL_INT_64_ANGLEX;
7889 *numParams = 1;
7890 return true;
7891 }
7892 }
7893
7894 return false;
7895}
7896
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007897Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05007898{
7899 return mState.mShaderPrograms->getProgram(handle);
7900}
7901
7902Shader *Context::getShader(GLuint handle) const
7903{
7904 return mState.mShaderPrograms->getShader(handle);
7905}
7906
Jamie Madill5b772312018-03-08 20:28:32 -05007907bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7908{
7909 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7910}
7911
7912bool Context::isFramebufferGenerated(GLuint framebuffer) const
7913{
7914 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7915}
7916
7917bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7918{
7919 return mState.mPipelines->isHandleGenerated(pipeline);
7920}
7921
7922bool Context::usingDisplayTextureShareGroup() const
7923{
7924 return mDisplayTextureShareGroup;
7925}
7926
7927GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7928{
7929 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7930 internalformat == GL_DEPTH_STENCIL
7931 ? GL_DEPTH24_STENCIL8
7932 : internalformat;
7933}
7934
jchen1082af6202018-06-22 10:59:52 +08007935void Context::maxShaderCompilerThreads(GLuint count)
7936{
jchen107ae70d82018-07-06 13:47:01 +08007937 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08007938 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08007939 // A count of zero specifies a request for no parallel compiling or linking.
7940 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
7941 {
7942 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
7943 }
7944 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08007945}
7946
Jamie Madill2eb65032018-07-30 10:25:57 -04007947bool Context::isGLES1() const
7948{
7949 return mState.getClientVersion() < Version(2, 0);
7950}
7951
Jamie Madilla11819d2018-07-30 10:26:01 -04007952void Context::onSubjectStateChange(const Context *context,
7953 angle::SubjectIndex index,
7954 angle::SubjectMessage message)
7955{
Jamie Madilla11819d2018-07-30 10:26:01 -04007956 switch (index)
7957 {
7958 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007959 switch (message)
7960 {
7961 case angle::SubjectMessage::CONTENTS_CHANGED:
7962 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
7963 mStateCache.onVertexArrayBufferContentsChange(this);
7964 break;
7965 case angle::SubjectMessage::RESOURCE_MAPPED:
7966 case angle::SubjectMessage::RESOURCE_UNMAPPED:
7967 case angle::SubjectMessage::BINDING_CHANGED:
7968 mStateCache.onVertexArrayBufferStateChange(this);
7969 break;
7970 default:
7971 break;
7972 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007973 break;
7974
7975 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007976 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7977 {
7978 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
7979 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007980 break;
7981
7982 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007983 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7984 {
7985 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
7986 }
7987 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04007988 break;
7989
7990 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04007991 if (index < kTextureMaxSubjectIndex)
7992 {
7993 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04007994 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007995 }
Jamie Madille25b8002018-09-20 13:39:49 -04007996 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04007997 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04007998 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04007999 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008000 }
Jamie Madille25b8002018-09-20 13:39:49 -04008001 else
8002 {
8003 ASSERT(index < kSamplerMaxSubjectIndex);
8004 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
8005 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008006 break;
8007 }
8008}
8009
Jamie Madill6b873dd2018-07-12 23:56:30 -04008010// ErrorSet implementation.
8011ErrorSet::ErrorSet(Context *context) : mContext(context)
8012{
8013}
8014
8015ErrorSet::~ErrorSet() = default;
8016
Jamie Madill306b6c12018-07-27 08:12:49 -04008017void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04008018{
8019 // This internal enum is used to filter internal errors that are already handled.
8020 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
8021 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
8022 {
8023 return;
8024 }
8025
8026 if (ANGLE_UNLIKELY(error.isError()))
8027 {
8028 GLenum code = error.getCode();
8029 mErrors.insert(code);
Jamie Madill785e8a02018-10-04 17:42:00 -04008030
Jamie Madill6b873dd2018-07-12 23:56:30 -04008031 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
8032 {
8033 mContext->markContextLost();
8034 }
8035
8036 ASSERT(!error.getMessage().empty());
8037 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
8038 error.getID(), GL_DEBUG_SEVERITY_HIGH,
8039 error.getMessage());
8040 }
8041}
8042
Jamie Madillabfbc0f2018-10-09 12:48:52 -04008043void ErrorSet::handleError(GLenum errorCode,
8044 const char *message,
8045 const char *file,
8046 const char *function,
8047 unsigned int line)
8048{
8049 // TODO(jmadill): Handle error directly instead of creating object. http://anglebug.com/2491
8050 std::stringstream errorStream;
8051 errorStream << "Front-end Error: " << gl::FmtHex(errorCode) << ", in " << file << ", "
8052 << function << ":" << line << ". " << message;
8053
8054 handleError(gl::Error(errorCode, errorCode, errorStream.str()));
8055}
8056
Jamie Madilla139f012018-10-10 16:13:03 -04008057void ErrorSet::validationError(GLenum errorCode, const char *message)
8058{
8059 handleError(gl::Error(errorCode, message));
8060}
8061
Jamie Madill6b873dd2018-07-12 23:56:30 -04008062bool ErrorSet::empty() const
8063{
8064 return mErrors.empty();
8065}
8066
8067GLenum ErrorSet::popError()
8068{
8069 ASSERT(!empty());
8070 GLenum error = *mErrors.begin();
8071 mErrors.erase(mErrors.begin());
8072 return error;
8073}
Jamie Madilldc358af2018-07-31 11:22:13 -04008074
8075// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04008076StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008077 : mCachedHasAnyEnabledClientAttrib(false),
8078 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04008079 mCachedInstancedVertexElementLimit(0),
8080 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madilldc358af2018-07-31 11:22:13 -04008081{
8082}
8083
8084StateCache::~StateCache() = default;
8085
Jamie Madillac66f982018-10-09 18:30:01 -04008086void StateCache::initialize(Context *context)
8087{
8088 updateValidDrawModes(context);
8089 updateValidBindTextureTypes(context);
8090}
8091
Jamie Madilldc358af2018-07-31 11:22:13 -04008092void StateCache::updateActiveAttribsMask(Context *context)
8093{
8094 bool isGLES1 = context->isGLES1();
8095 const State &glState = context->getGLState();
8096
8097 if (!isGLES1 && !glState.getProgram())
8098 {
8099 mCachedActiveBufferedAttribsMask = AttributesMask();
8100 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008101 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008102 return;
8103 }
8104
8105 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8106 : glState.getProgram()->getActiveAttribLocationsMask();
8107
8108 const VertexArray *vao = glState.getVertexArray();
8109 ASSERT(vao);
8110
8111 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8112 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008113 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008114
Jamie Madill0a17e482018-08-31 17:19:11 -04008115 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8116 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008117 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008118 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8119}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008120
8121void StateCache::updateVertexElementLimits(Context *context)
8122{
8123 const VertexArray *vao = context->getGLState().getVertexArray();
8124
8125 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8126 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8127
8128 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8129 // If there are no buffered attributes then we should not limit the draw call count.
8130 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8131 {
8132 return;
8133 }
8134
8135 const auto &vertexAttribs = vao->getVertexAttributes();
8136 const auto &vertexBindings = vao->getVertexBindings();
8137
8138 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8139 {
8140 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8141 ASSERT(attrib.enabled);
8142
8143 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8144 ASSERT(context->isGLES1() ||
8145 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8146
8147 GLint64 limit = attrib.getCachedElementLimit();
8148 if (binding.getDivisor() > 0)
8149 {
8150 mCachedInstancedVertexElementLimit =
8151 std::min(mCachedInstancedVertexElementLimit, limit);
8152 }
8153 else
8154 {
8155 mCachedNonInstancedVertexElementLimit =
8156 std::min(mCachedNonInstancedVertexElementLimit, limit);
8157 }
8158 }
8159}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008160
Jamie Madilld84b6732018-09-06 15:54:35 -04008161void StateCache::updateBasicDrawStatesError()
8162{
8163 mCachedBasicDrawStatesError = kInvalidPointer;
8164}
8165
8166intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8167{
8168 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8169 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8170 return mCachedBasicDrawStatesError;
8171}
8172
Jamie Madillc43cdad2018-08-08 15:49:25 -04008173void StateCache::onVertexArrayBindingChange(Context *context)
8174{
8175 updateActiveAttribsMask(context);
8176 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008177 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008178}
8179
8180void StateCache::onProgramExecutableChange(Context *context)
8181{
8182 updateActiveAttribsMask(context);
8183 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008184 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008185 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008186}
8187
Jamie Madilld84b6732018-09-06 15:54:35 -04008188void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008189{
8190 updateVertexElementLimits(context);
8191}
8192
Jamie Madilld84b6732018-09-06 15:54:35 -04008193void StateCache::onVertexArrayBufferContentsChange(Context *context)
8194{
8195 updateVertexElementLimits(context);
8196 updateBasicDrawStatesError();
8197}
8198
Jamie Madillc43cdad2018-08-08 15:49:25 -04008199void StateCache::onVertexArrayStateChange(Context *context)
8200{
8201 updateActiveAttribsMask(context);
8202 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008203 updateBasicDrawStatesError();
8204}
8205
8206void StateCache::onVertexArrayBufferStateChange(Context *context)
8207{
8208 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008209}
8210
8211void StateCache::onGLES1ClientStateChange(Context *context)
8212{
8213 updateActiveAttribsMask(context);
8214}
Jamie Madilld84b6732018-09-06 15:54:35 -04008215
8216void StateCache::onDrawFramebufferChange(Context *context)
8217{
8218 updateBasicDrawStatesError();
8219}
8220
8221void StateCache::onContextCapChange(Context *context)
8222{
8223 updateBasicDrawStatesError();
8224}
8225
8226void StateCache::onStencilStateChange(Context *context)
8227{
8228 updateBasicDrawStatesError();
8229}
8230
8231void StateCache::onDefaultVertexAttributeChange(Context *context)
8232{
8233 updateBasicDrawStatesError();
8234}
8235
8236void StateCache::onActiveTextureChange(Context *context)
8237{
8238 updateBasicDrawStatesError();
8239}
8240
8241void StateCache::onQueryChange(Context *context)
8242{
8243 updateBasicDrawStatesError();
8244}
8245
8246void StateCache::onTransformFeedbackChange(Context *context)
8247{
8248 updateBasicDrawStatesError();
8249}
8250
8251void StateCache::onUniformBufferStateChange(Context *context)
8252{
8253 updateBasicDrawStatesError();
8254}
8255
8256void StateCache::onBufferBindingChange(Context *context)
8257{
8258 updateBasicDrawStatesError();
8259}
Jamie Madill526a6f62018-09-12 11:03:05 -04008260
8261void StateCache::updateValidDrawModes(Context *context)
8262{
8263 Program *program = context->getGLState().getProgram();
8264 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8265 {
8266 mCachedValidDrawModes = {{
8267 true, /* Points */
8268 true, /* Lines */
8269 true, /* LineLoop */
8270 true, /* LineStrip */
8271 true, /* Triangles */
8272 true, /* TriangleStrip */
8273 true, /* TriangleFan */
8274 false, /* LinesAdjacency */
8275 false, /* LineStripAdjacency */
8276 false, /* TrianglesAdjacency */
8277 false, /* TriangleStripAdjacency */
8278 false, /* InvalidEnum */
8279 }};
8280 }
8281 else
8282 {
8283 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8284
8285 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8286
8287 mCachedValidDrawModes = {{
8288 gsMode == PrimitiveMode::Points, /* Points */
8289 gsMode == PrimitiveMode::Lines, /* Lines */
8290 gsMode == PrimitiveMode::Lines, /* LineLoop */
8291 gsMode == PrimitiveMode::Lines, /* LineStrip */
8292 gsMode == PrimitiveMode::Triangles, /* Triangles */
8293 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8294 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8295 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8296 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8297 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8298 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8299 false, /* InvalidEnum */
8300 }};
8301 }
8302}
Jamie Madillac66f982018-10-09 18:30:01 -04008303
8304void StateCache::updateValidBindTextureTypes(Context *context)
8305{
8306 const Extensions &exts = context->getExtensions();
8307 bool isGLES3 = context->getClientMajorVersion() >= 3;
8308 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8309
8310 mCachedValidBindTextureTypes = {{
8311 true, /* _2D */
8312 isGLES3, /* _2DArray */
Yizhou Jiang7818a852018-09-06 15:02:04 +08008313 isGLES31 || exts.textureMultisample, /* _2DMultisample */
Jamie Madillac66f982018-10-09 18:30:01 -04008314 exts.textureStorageMultisample2DArray, /* _2DMultisampleArray */
8315 isGLES3, /* _3D */
8316 exts.eglImageExternal || exts.eglStreamConsumerExternal, /* External */
8317 exts.textureRectangle, /* Rectangle */
8318 true, /* CubeMap */
8319 false, /* InvalidEnum */
8320
8321 }};
8322}
Jamie Madillc29968b2016-01-20 11:17:23 -05008323} // namespace gl