blob: 3567e29a1b036941a07b4641bf6c48f2e5ecd434 [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 Madill09463932018-04-04 05:26:59 -0400138void MarkTransformFeedbackBufferUsage(const gl::Context *context,
139 gl::TransformFeedback *transformFeedback,
James Darpinian30b604d2018-03-12 17:26:57 -0700140 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 Madill16e28fd2018-09-12 11:03:05 -0400364 mStateCache(this),
Jamie Madilla11819d2018-07-30 10:26:01 -0400365 mVertexArrayObserverBinding(this, kVertexArraySubjectIndex),
366 mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex),
367 mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400368 mScratchBuffer(1000u),
jchen107ae70d82018-07-06 13:47:01 +0800369 mZeroFilledBuffer(1000u),
370 mThreadPool(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000371{
Jamie Madill5b772312018-03-08 20:28:32 -0500372 // Needed to solve a Clang warning of unused variables.
Jamie Madillc6dbc252018-04-30 19:07:56 -0400373 ANGLE_UNUSED_VARIABLE(mSavedArgsType);
374 ANGLE_UNUSED_VARIABLE(mParamsBuffer);
Jamie Madill6d32cef2018-08-14 02:34:28 -0400375
376 for (angle::SubjectIndex uboIndex = kUniformBuffer0SubjectIndex;
377 uboIndex < kUniformBufferMaxSubjectIndex; ++uboIndex)
378 {
379 mUniformBufferObserverBindings.emplace_back(this, uboIndex);
380 }
Jamie Madille25b8002018-09-20 13:39:49 -0400381
382 for (angle::SubjectIndex samplerIndex = kSampler0SubjectIndex;
383 samplerIndex < kSamplerMaxSubjectIndex; ++samplerIndex)
384 {
385 mSamplerObserverBindings.emplace_back(this, samplerIndex);
386 }
Geoff Lang33f11fb2018-05-07 13:42:47 -0400387}
Jamie Madill5b772312018-03-08 20:28:32 -0500388
Geoff Lang33f11fb2018-05-07 13:42:47 -0400389void Context::initialize()
390{
391 mImplementation->setMemoryProgramCache(mMemoryProgramCache);
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400392
Geoff Lang33f11fb2018-05-07 13:42:47 -0400393 initCaps();
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700394 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400395
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400396 mGLState.initialize(this);
Régis Fénéon83107972015-02-05 12:57:44 +0100397
Shannon Woods53a94a82014-06-24 15:20:36 -0400398 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400399
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000400 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400401 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000402 // and cube map texture state vectors respectively associated with them.
403 // In order that access to these initial textures not be lost, they are treated as texture
404 // objects all of whose names are 0.
405
Corentin Wallez99d492c2018-02-27 15:17:10 -0500406 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800407 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500408
Corentin Wallez99d492c2018-02-27 15:17:10 -0500409 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800410 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400411
Geoff Langeb66a6e2016-10-31 13:06:12 -0400412 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400413 {
414 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500415 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800416 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400417
Corentin Wallez99d492c2018-02-27 15:17:10 -0500418 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800419 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400420 }
Geoff Lang3b573612016-10-31 14:08:10 -0400421 if (getClientVersion() >= Version(3, 1))
422 {
Olli Etuahod310a432018-08-24 15:40:23 +0300423 // TODO(http://anglebug.com/2775): These could also be enabled via extension
Geoff Lang3b573612016-10-31 14:08:10 -0400424 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500425 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800426 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Olli Etuahod310a432018-08-24 15:40:23 +0300427 Texture *zeroTexture2DMultisampleArray =
428 new Texture(mImplementation.get(), 0, TextureType::_2DMultisampleArray);
429 mZeroTextures[TextureType::_2DMultisampleArray].set(this, zeroTexture2DMultisampleArray);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800430
Jiajia Qin6eafb042016-12-27 17:04:07 +0800431 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
432 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800433 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800434 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800435
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800436 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
437 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400438 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800439 }
Geoff Lang3b573612016-10-31 14:08:10 -0400440 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000441
Geoff Langb0f917f2017-12-05 13:41:54 -0500442 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400443 {
444 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500445 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800446 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400447 }
448
Geoff Langb0f917f2017-12-05 13:41:54 -0500449 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400450 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500451 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800452 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400453 }
454
Jamie Madill4928b7c2017-06-20 12:57:39 -0400455 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500456
Jamie Madill57a89722013-07-02 11:57:03 -0400457 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000458
Geoff Langeb66a6e2016-10-31 13:06:12 -0400459 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400460 {
461 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
462 // In the initial state, a default transform feedback object is bound and treated as
463 // a transform feedback object with a name of zero. That object is bound any time
464 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400465 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400466 }
Geoff Langc8058452014-02-03 12:04:11 -0500467
Corentin Wallez336129f2017-10-17 15:55:40 -0400468 for (auto type : angle::AllEnums<BufferBinding>())
469 {
470 bindBuffer(type, 0);
471 }
472
473 bindRenderbuffer(GL_RENDERBUFFER, 0);
474
475 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
476 {
477 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
478 }
479
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700480 // Initialize GLES1 renderer if appropriate.
481 if (getClientVersion() < Version(2, 0))
482 {
483 mGLES1Renderer.reset(new GLES1Renderer());
484 }
485
Jamie Madillad9f24e2016-02-12 09:27:24 -0500486 // Initialize dirty bit masks
Geoff Lang9bf86f02018-07-26 11:46:34 -0400487 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
488 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
489 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400490 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400491 mDrawDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400492
493 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
494 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
495 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madille25b8002018-09-20 13:39:49 -0400496 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400497
Jamie Madillc67323a2017-11-02 23:11:41 -0400498 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500499 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500500 // No dirty objects.
501
502 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400503 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500504 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400505 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500506 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
507
508 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
509 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
510 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
511 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
512 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
513 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
514 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
515 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
516 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
517 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
518 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400519 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500520 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
521
522 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
523 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700524 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400525 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
526 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500527 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
528 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400529
Xinghua Cao10a4d432017-11-28 14:46:26 +0800530 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
jchen1099118c12018-09-10 16:28:51 +0800531 mComputeDirtyBits.set(State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
532 mComputeDirtyBits.set(State::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800533 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
534 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
535 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
536 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
jchen1099118c12018-09-10 16:28:51 +0800537 mComputeDirtyBits.set(State::DIRTY_BIT_IMAGE_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800538 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800539 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400540 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400541 mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800542
Jamie Madillb4927eb2018-07-16 11:39:46 -0400543 mImplementation->setErrorSet(&mErrors);
544
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400545 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000546}
547
Jamie Madill4928b7c2017-06-20 12:57:39 -0400548egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000549{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700550 if (mGLES1Renderer)
551 {
552 mGLES1Renderer->onDestroy(this, &mGLState);
553 }
554
Jamie Madille7b3fe22018-04-05 09:42:46 -0400555 // Delete the Surface first to trigger a finish() in Vulkan.
Jamie Madille7b3fe22018-04-05 09:42:46 -0400556 ANGLE_TRY(releaseSurface(display));
557
Corentin Wallez80b24112015-08-25 16:41:57 -0400558 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000559 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400560 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000561 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400562 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000563
Corentin Wallez80b24112015-08-25 16:41:57 -0400564 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000565 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400566 if (query.second != nullptr)
567 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400568 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400569 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000570 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400571 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000572
Corentin Wallez80b24112015-08-25 16:41:57 -0400573 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400574 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400575 if (vertexArray.second)
576 {
577 vertexArray.second->onDestroy(this);
578 }
Jamie Madill57a89722013-07-02 11:57:03 -0400579 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400580 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400581
Corentin Wallez80b24112015-08-25 16:41:57 -0400582 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500583 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500584 if (transformFeedback.second != nullptr)
585 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500586 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500587 }
Geoff Langc8058452014-02-03 12:04:11 -0500588 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400589 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500590
Jamie Madill5b772312018-03-08 20:28:32 -0500591 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400592 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800593 if (zeroTexture.get() != nullptr)
594 {
595 ANGLE_TRY(zeroTexture->onDestroy(this));
596 zeroTexture.set(this, nullptr);
597 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400598 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000599
Jamie Madill2f348d22017-06-05 10:50:59 -0400600 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500601
Jamie Madill4928b7c2017-06-20 12:57:39 -0400602 mGLState.reset(this);
603
Jamie Madill6c1f6712017-02-14 19:08:04 -0500604 mState.mBuffers->release(this);
605 mState.mShaderPrograms->release(this);
606 mState.mTextures->release(this);
607 mState.mRenderbuffers->release(this);
608 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400609 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500610 mState.mPaths->release(this);
611 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800612 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400613
jchen107ae70d82018-07-06 13:47:01 +0800614 mThreadPool.reset();
615
Jamie Madill76e471e2017-10-21 09:56:01 -0400616 mImplementation->onDestroy(this);
617
Jamie Madill4928b7c2017-06-20 12:57:39 -0400618 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000619}
620
Jamie Madill70ee0f62017-02-06 16:04:20 -0500621Context::~Context()
622{
623}
624
Geoff Lang75359662018-04-11 01:42:27 -0400625void Context::setLabel(EGLLabelKHR label)
626{
627 mLabel = label;
628}
629
630EGLLabelKHR Context::getLabel() const
631{
632 return mLabel;
633}
634
Jamie Madill4928b7c2017-06-20 12:57:39 -0400635egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000636{
Jamie Madill61e16b42017-06-19 11:13:23 -0400637 mCurrentDisplay = display;
638
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000639 if (!mHasBeenCurrent)
640 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400641 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000642 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500643 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400644 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000645
Corentin Wallezc295e512017-01-27 17:47:50 -0500646 int width = 0;
647 int height = 0;
648 if (surface != nullptr)
649 {
650 width = surface->getWidth();
651 height = surface->getHeight();
652 }
653
654 mGLState.setViewportParams(0, 0, width, height);
655 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000656
657 mHasBeenCurrent = true;
658 }
659
Jamie Madill1b94d432015-08-07 13:23:23 -0400660 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700661 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400662 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400663
Jamie Madill4928b7c2017-06-20 12:57:39 -0400664 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500665
666 Framebuffer *newDefault = nullptr;
667 if (surface != nullptr)
668 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400669 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500670 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400671 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500672 }
673 else
674 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400675 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500676 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000677
Corentin Wallez37c39792015-08-20 14:19:46 -0400678 // Update default framebuffer, the binding of the previous default
679 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400680 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400681 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700682 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400683 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400684 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400685 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700686 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400687 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400688 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400689 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400690 }
Ian Ewell292f0052016-02-04 10:37:32 -0500691
692 // Notify the renderer of a context switch
Luc Ferron5396f2a2018-07-12 08:24:23 -0400693 ANGLE_TRY(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400694 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000695}
696
Jamie Madill4928b7c2017-06-20 12:57:39 -0400697egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400698{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400699 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400700
Geoff Langbf7b95d2018-05-01 16:48:21 -0400701 // Remove the default framebuffer
702 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500703 {
704 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400705 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500706 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400707
708 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500709 {
710 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400711 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500712 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400713
714 if (defaultFramebuffer)
715 {
716 defaultFramebuffer->onDestroy(this);
717 delete defaultFramebuffer;
718 }
719
Corentin Wallezc295e512017-01-27 17:47:50 -0500720 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
721
722 if (mCurrentSurface)
723 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400724 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500725 mCurrentSurface = nullptr;
726 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400727
728 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400729}
730
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000731GLuint Context::createBuffer()
732{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500733 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000734}
735
736GLuint Context::createProgram()
737{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500738 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000739}
740
Jiawei Shao385b3e02018-03-21 09:43:28 +0800741GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000742{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500743 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000744}
745
746GLuint Context::createTexture()
747{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500748 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000749}
750
751GLuint Context::createRenderbuffer()
752{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500753 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000754}
755
Jamie Madill13951342018-09-30 15:24:28 -0400756void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
757{
758 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(mImplementation.get(), range, createdOut));
759}
760
Brandon Jones59770802018-04-02 13:18:42 -0700761GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300762{
Jamie Madill13951342018-09-30 15:24:28 -0400763 GLuint created = 0;
764 tryGenPaths(range, &created);
765 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300766}
767
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000768// Returns an unused framebuffer name
769GLuint Context::createFramebuffer()
770{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500771 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000772}
773
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500774void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000775{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500776 for (int i = 0; i < n; i++)
777 {
778 GLuint handle = mFenceNVHandleAllocator.allocate();
779 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
780 fences[i] = handle;
781 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000782}
783
Yunchao Hea336b902017-08-02 16:05:21 +0800784GLuint Context::createProgramPipeline()
785{
786 return mState.mPipelines->createProgramPipeline();
787}
788
Jiawei Shao385b3e02018-03-21 09:43:28 +0800789GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800790{
791 UNIMPLEMENTED();
792 return 0u;
793}
794
James Darpinian4d9d4832018-03-13 12:43:28 -0700795void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000796{
James Darpinian4d9d4832018-03-13 12:43:28 -0700797 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
798 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000799 {
800 detachBuffer(buffer);
801 }
Jamie Madill893ab082014-05-16 16:56:10 -0400802
James Darpinian4d9d4832018-03-13 12:43:28 -0700803 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000804}
805
806void Context::deleteShader(GLuint shader)
807{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500808 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000809}
810
811void Context::deleteProgram(GLuint program)
812{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500813 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000814}
815
816void Context::deleteTexture(GLuint texture)
817{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500818 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000819 {
820 detachTexture(texture);
821 }
822
Jamie Madill6c1f6712017-02-14 19:08:04 -0500823 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000824}
825
826void Context::deleteRenderbuffer(GLuint renderbuffer)
827{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500828 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000829 {
830 detachRenderbuffer(renderbuffer);
831 }
Jamie Madill893ab082014-05-16 16:56:10 -0400832
Jamie Madill6c1f6712017-02-14 19:08:04 -0500833 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000834}
835
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400836void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400837{
838 // The spec specifies the underlying Fence object is not deleted until all current
839 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
840 // and since our API is currently designed for being called from a single thread, we can delete
841 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400842 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400843}
844
Yunchao Hea336b902017-08-02 16:05:21 +0800845void Context::deleteProgramPipeline(GLuint pipeline)
846{
847 if (mState.mPipelines->getProgramPipeline(pipeline))
848 {
849 detachProgramPipeline(pipeline);
850 }
851
852 mState.mPipelines->deleteObject(this, pipeline);
853}
854
Sami Väisänene45e53b2016-05-25 10:36:04 +0300855void Context::deletePaths(GLuint first, GLsizei range)
856{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500857 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300858}
859
Brandon Jones59770802018-04-02 13:18:42 -0700860bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300861{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500862 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300863 if (pathObj == nullptr)
864 return false;
865
866 return pathObj->hasPathData();
867}
868
Brandon Jones59770802018-04-02 13:18:42 -0700869bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300870{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500871 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300872}
873
Brandon Jones59770802018-04-02 13:18:42 -0700874void Context::pathCommands(GLuint path,
875 GLsizei numCommands,
876 const GLubyte *commands,
877 GLsizei numCoords,
878 GLenum coordType,
879 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300880{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500881 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300882
883 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
884}
885
Jamie Madill007530e2017-12-28 14:27:04 -0500886void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300887{
Jamie Madill007530e2017-12-28 14:27:04 -0500888 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300889
890 switch (pname)
891 {
892 case GL_PATH_STROKE_WIDTH_CHROMIUM:
893 pathObj->setStrokeWidth(value);
894 break;
895 case GL_PATH_END_CAPS_CHROMIUM:
896 pathObj->setEndCaps(static_cast<GLenum>(value));
897 break;
898 case GL_PATH_JOIN_STYLE_CHROMIUM:
899 pathObj->setJoinStyle(static_cast<GLenum>(value));
900 break;
901 case GL_PATH_MITER_LIMIT_CHROMIUM:
902 pathObj->setMiterLimit(value);
903 break;
904 case GL_PATH_STROKE_BOUND_CHROMIUM:
905 pathObj->setStrokeBound(value);
906 break;
907 default:
908 UNREACHABLE();
909 break;
910 }
911}
912
Jamie Madill007530e2017-12-28 14:27:04 -0500913void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300914{
Jamie Madill007530e2017-12-28 14:27:04 -0500915 // TODO(jmadill): Should use proper clamping/casting.
916 pathParameterf(path, pname, static_cast<GLfloat>(value));
917}
918
919void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
920{
921 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300922
923 switch (pname)
924 {
925 case GL_PATH_STROKE_WIDTH_CHROMIUM:
926 *value = pathObj->getStrokeWidth();
927 break;
928 case GL_PATH_END_CAPS_CHROMIUM:
929 *value = static_cast<GLfloat>(pathObj->getEndCaps());
930 break;
931 case GL_PATH_JOIN_STYLE_CHROMIUM:
932 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
933 break;
934 case GL_PATH_MITER_LIMIT_CHROMIUM:
935 *value = pathObj->getMiterLimit();
936 break;
937 case GL_PATH_STROKE_BOUND_CHROMIUM:
938 *value = pathObj->getStrokeBound();
939 break;
940 default:
941 UNREACHABLE();
942 break;
943 }
944}
945
Jamie Madill007530e2017-12-28 14:27:04 -0500946void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
947{
948 GLfloat val = 0.0f;
949 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
950 if (value)
951 *value = static_cast<GLint>(val);
952}
953
Brandon Jones59770802018-04-02 13:18:42 -0700954void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300955{
956 mGLState.setPathStencilFunc(func, ref, mask);
957}
958
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000959void Context::deleteFramebuffer(GLuint framebuffer)
960{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500961 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000962 {
963 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000964 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500965
Jamie Madill6c1f6712017-02-14 19:08:04 -0500966 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000967}
968
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500969void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000970{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500971 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000972 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500973 GLuint fence = fences[i];
974
975 FenceNV *fenceObject = nullptr;
976 if (mFenceNVMap.erase(fence, &fenceObject))
977 {
978 mFenceNVHandleAllocator.release(fence);
979 delete fenceObject;
980 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000981 }
982}
983
Geoff Lang70d0f492015-12-10 17:45:46 -0500984Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000985{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500986 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000987}
988
Geoff Lang70d0f492015-12-10 17:45:46 -0500989Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000990{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500991 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000992}
993
Jamie Madill70b5bb02017-08-28 13:32:37 -0400994Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400995{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400996 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400997}
998
Jamie Madill57a89722013-07-02 11:57:03 -0400999VertexArray *Context::getVertexArray(GLuint handle) const
1000{
Jamie Madill96a483b2017-06-27 16:49:21 -04001001 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -04001002}
1003
Jamie Madilldc356042013-07-19 16:36:57 -04001004Sampler *Context::getSampler(GLuint handle) const
1005{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001006 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -04001007}
1008
Geoff Langc8058452014-02-03 12:04:11 -05001009TransformFeedback *Context::getTransformFeedback(GLuint handle) const
1010{
Jamie Madill96a483b2017-06-27 16:49:21 -04001011 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -05001012}
1013
Yunchao Hea336b902017-08-02 16:05:21 +08001014ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
1015{
1016 return mState.mPipelines->getProgramPipeline(handle);
1017}
1018
Geoff Lang75359662018-04-11 01:42:27 -04001019gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001020{
1021 switch (identifier)
1022 {
1023 case GL_BUFFER:
1024 return getBuffer(name);
1025 case GL_SHADER:
1026 return getShader(name);
1027 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04001028 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -05001029 case GL_VERTEX_ARRAY:
1030 return getVertexArray(name);
1031 case GL_QUERY:
1032 return getQuery(name);
1033 case GL_TRANSFORM_FEEDBACK:
1034 return getTransformFeedback(name);
1035 case GL_SAMPLER:
1036 return getSampler(name);
1037 case GL_TEXTURE:
1038 return getTexture(name);
1039 case GL_RENDERBUFFER:
1040 return getRenderbuffer(name);
1041 case GL_FRAMEBUFFER:
1042 return getFramebuffer(name);
1043 default:
1044 UNREACHABLE();
1045 return nullptr;
1046 }
1047}
1048
Geoff Lang75359662018-04-11 01:42:27 -04001049gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001050{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001051 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001052}
1053
Martin Radev9d901792016-07-15 15:58:58 +03001054void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1055{
Geoff Lang75359662018-04-11 01:42:27 -04001056 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001057 ASSERT(object != nullptr);
1058
1059 std::string labelName = GetObjectLabelFromPointer(length, label);
1060 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001061
1062 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1063 // specified object is active until we do this.
1064 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001065}
1066
1067void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1068{
Geoff Lang75359662018-04-11 01:42:27 -04001069 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001070 ASSERT(object != nullptr);
1071
1072 std::string labelName = GetObjectLabelFromPointer(length, label);
1073 object->setLabel(labelName);
1074}
1075
1076void Context::getObjectLabel(GLenum identifier,
1077 GLuint name,
1078 GLsizei bufSize,
1079 GLsizei *length,
1080 GLchar *label) const
1081{
Geoff Lang75359662018-04-11 01:42:27 -04001082 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001083 ASSERT(object != nullptr);
1084
1085 const std::string &objectLabel = object->getLabel();
1086 GetObjectLabelBase(objectLabel, bufSize, length, label);
1087}
1088
1089void Context::getObjectPtrLabel(const void *ptr,
1090 GLsizei bufSize,
1091 GLsizei *length,
1092 GLchar *label) const
1093{
Geoff Lang75359662018-04-11 01:42:27 -04001094 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001095 ASSERT(object != nullptr);
1096
1097 const std::string &objectLabel = object->getLabel();
1098 GetObjectLabelBase(objectLabel, bufSize, length, label);
1099}
1100
Jamie Madilldc356042013-07-19 16:36:57 -04001101bool Context::isSampler(GLuint samplerName) const
1102{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001103 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001104}
1105
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001106void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001107{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001108 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001109
Jamie Madilldedd7b92014-11-05 16:30:36 -05001110 if (handle == 0)
1111 {
1112 texture = mZeroTextures[target].get();
1113 }
1114 else
1115 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001116 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001117 }
1118
1119 ASSERT(texture);
Jamie Madill14246812018-10-03 17:51:16 -04001120 ANGLE_CONTEXT_TRY(mGLState.setSamplerTexture(this, target, texture));
Jamie Madilld84b6732018-09-06 15:54:35 -04001121 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001122}
1123
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001124void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001125{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001126 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1127 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001128 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001129 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001130}
1131
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001132void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001133{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001134 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1135 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001136 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001137 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001138 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001139}
1140
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001141void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001142{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001143 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001144 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001145 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001146 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001147}
1148
Shao80957d92017-02-20 21:25:59 +08001149void Context::bindVertexBuffer(GLuint bindingIndex,
1150 GLuint bufferHandle,
1151 GLintptr offset,
1152 GLsizei stride)
1153{
1154 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001155 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001156 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001157}
1158
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001159void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001160{
Geoff Lang76b10c92014-09-05 16:28:14 -04001161 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001162 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001163 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001164 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001165 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001166}
1167
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001168void Context::bindImageTexture(GLuint unit,
1169 GLuint texture,
1170 GLint level,
1171 GLboolean layered,
1172 GLint layer,
1173 GLenum access,
1174 GLenum format)
1175{
1176 Texture *tex = mState.mTextures->getTexture(texture);
1177 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1178}
1179
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001180void Context::useProgram(GLuint program)
1181{
Jamie Madille3bb6b72018-10-03 17:51:15 -04001182 ANGLE_CONTEXT_TRY(mGLState.setProgram(this, getProgramResolveLink(program)));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001183 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001184}
1185
Jiajia Qin5451d532017-11-16 17:16:34 +08001186void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1187{
1188 UNIMPLEMENTED();
1189}
1190
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001191void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001192{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001193 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001194 TransformFeedback *transformFeedback =
1195 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001196 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Jamie Madilld84b6732018-09-06 15:54:35 -04001197 mStateCache.onTransformFeedbackChange(this);
Geoff Langc8058452014-02-03 12:04:11 -05001198}
1199
Yunchao Hea336b902017-08-02 16:05:21 +08001200void Context::bindProgramPipeline(GLuint pipelineHandle)
1201{
1202 ProgramPipeline *pipeline =
1203 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1204 mGLState.setProgramPipelineBinding(this, pipeline);
1205}
1206
Corentin Wallezad3ae902018-03-09 13:40:42 -05001207void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001208{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001209 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001210 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001211
Geoff Lang5aad9672014-09-08 11:10:42 -04001212 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001213 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001214
1215 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001216 mGLState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001217 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001218}
1219
Corentin Wallezad3ae902018-03-09 13:40:42 -05001220void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001221{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001222 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001223 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001224
Jamie Madill5188a272018-07-25 10:53:56 -04001225 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001226
Geoff Lang5aad9672014-09-08 11:10:42 -04001227 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001228 mGLState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001229 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001230}
1231
Corentin Wallezad3ae902018-03-09 13:40:42 -05001232void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001233{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001234 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001235
1236 Query *queryObject = getQuery(id, true, target);
1237 ASSERT(queryObject);
1238
Jamie Madill5188a272018-07-25 10:53:56 -04001239 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001240}
1241
Corentin Wallezad3ae902018-03-09 13:40:42 -05001242void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001243{
1244 switch (pname)
1245 {
1246 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001247 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001248 break;
1249 case GL_QUERY_COUNTER_BITS_EXT:
1250 switch (target)
1251 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001252 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001253 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1254 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001255 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001256 params[0] = getExtensions().queryCounterBitsTimestamp;
1257 break;
1258 default:
1259 UNREACHABLE();
1260 params[0] = 0;
1261 break;
1262 }
1263 break;
1264 default:
1265 UNREACHABLE();
1266 return;
1267 }
1268}
1269
Corentin Wallezad3ae902018-03-09 13:40:42 -05001270void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001271 GLenum pname,
1272 GLsizei bufSize,
1273 GLsizei *length,
1274 GLint *params)
1275{
1276 getQueryiv(target, pname, params);
1277}
1278
Geoff Lang2186c382016-10-14 10:54:54 -04001279void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001280{
Jamie Madill5188a272018-07-25 10:53:56 -04001281 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001282}
1283
Brandon Jones59770802018-04-02 13:18:42 -07001284void Context::getQueryObjectivRobust(GLuint id,
1285 GLenum pname,
1286 GLsizei bufSize,
1287 GLsizei *length,
1288 GLint *params)
1289{
1290 getQueryObjectiv(id, pname, params);
1291}
1292
Geoff Lang2186c382016-10-14 10:54:54 -04001293void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001294{
Jamie Madill5188a272018-07-25 10:53:56 -04001295 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001296}
1297
Brandon Jones59770802018-04-02 13:18:42 -07001298void Context::getQueryObjectuivRobust(GLuint id,
1299 GLenum pname,
1300 GLsizei bufSize,
1301 GLsizei *length,
1302 GLuint *params)
1303{
1304 getQueryObjectuiv(id, pname, params);
1305}
1306
Geoff Lang2186c382016-10-14 10:54:54 -04001307void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001308{
Jamie Madill5188a272018-07-25 10:53:56 -04001309 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001310}
1311
Brandon Jones59770802018-04-02 13:18:42 -07001312void Context::getQueryObjecti64vRobust(GLuint id,
1313 GLenum pname,
1314 GLsizei bufSize,
1315 GLsizei *length,
1316 GLint64 *params)
1317{
1318 getQueryObjecti64v(id, pname, params);
1319}
1320
Geoff Lang2186c382016-10-14 10:54:54 -04001321void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001322{
Jamie Madill5188a272018-07-25 10:53:56 -04001323 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001324}
1325
Brandon Jones59770802018-04-02 13:18:42 -07001326void Context::getQueryObjectui64vRobust(GLuint id,
1327 GLenum pname,
1328 GLsizei bufSize,
1329 GLsizei *length,
1330 GLuint64 *params)
1331{
1332 getQueryObjectui64v(id, pname, params);
1333}
1334
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001335Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001336{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001337 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001338}
1339
Jamie Madill2f348d22017-06-05 10:50:59 -04001340FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001341{
Jamie Madill96a483b2017-06-27 16:49:21 -04001342 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001343}
1344
Corentin Wallezad3ae902018-03-09 13:40:42 -05001345Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001346{
Jamie Madill96a483b2017-06-27 16:49:21 -04001347 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001348 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001349 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001350 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001351
1352 Query *query = mQueryMap.query(handle);
1353 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001354 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001355 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001356 query = new Query(mImplementation->createQuery(type), handle);
1357 query->addRef();
1358 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001359 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001360 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001361}
1362
Geoff Lang70d0f492015-12-10 17:45:46 -05001363Query *Context::getQuery(GLuint handle) const
1364{
Jamie Madill96a483b2017-06-27 16:49:21 -04001365 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001366}
1367
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001368Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001369{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001370 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1371 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001372}
1373
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001374Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001375{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001376 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001377}
1378
Geoff Lang492a7e42014-11-05 13:27:06 -05001379Compiler *Context::getCompiler() const
1380{
Jamie Madill2f348d22017-06-05 10:50:59 -04001381 if (mCompiler.get() == nullptr)
1382 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001383 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001384 }
1385 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001386}
1387
Jamie Madillc1d770e2017-04-13 17:31:24 -04001388void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001389{
1390 switch (pname)
1391 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001392 case GL_SHADER_COMPILER:
1393 *params = GL_TRUE;
1394 break;
1395 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1396 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1397 break;
1398 default:
1399 mGLState.getBooleanv(pname, params);
1400 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001401 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001402}
1403
Jamie Madillc1d770e2017-04-13 17:31:24 -04001404void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001405{
Shannon Woods53a94a82014-06-24 15:20:36 -04001406 // Queries about context capabilities and maximums are answered by Context.
1407 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001408 switch (pname)
1409 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001410 case GL_ALIASED_LINE_WIDTH_RANGE:
1411 params[0] = mCaps.minAliasedLineWidth;
1412 params[1] = mCaps.maxAliasedLineWidth;
1413 break;
1414 case GL_ALIASED_POINT_SIZE_RANGE:
1415 params[0] = mCaps.minAliasedPointSize;
1416 params[1] = mCaps.maxAliasedPointSize;
1417 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001418 case GL_SMOOTH_POINT_SIZE_RANGE:
1419 params[0] = mCaps.minSmoothPointSize;
1420 params[1] = mCaps.maxSmoothPointSize;
1421 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001422 case GL_SMOOTH_LINE_WIDTH_RANGE:
1423 params[0] = mCaps.minSmoothLineWidth;
1424 params[1] = mCaps.maxSmoothLineWidth;
1425 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001426 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1427 ASSERT(mExtensions.textureFilterAnisotropic);
1428 *params = mExtensions.maxTextureAnisotropy;
1429 break;
1430 case GL_MAX_TEXTURE_LOD_BIAS:
1431 *params = mCaps.maxLODBias;
1432 break;
1433
1434 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1435 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1436 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001437 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1438 // GLES1 constants for modelview/projection matrix.
1439 if (getClientVersion() < Version(2, 0))
1440 {
1441 mGLState.getFloatv(pname, params);
1442 }
1443 else
1444 {
1445 ASSERT(mExtensions.pathRendering);
1446 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1447 memcpy(params, m, 16 * sizeof(GLfloat));
1448 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001449 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001450 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001451
Jamie Madill231c7f52017-04-26 13:45:37 -04001452 default:
1453 mGLState.getFloatv(pname, params);
1454 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001455 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001456}
1457
Jamie Madillc1d770e2017-04-13 17:31:24 -04001458void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001459{
Shannon Woods53a94a82014-06-24 15:20:36 -04001460 // Queries about context capabilities and maximums are answered by Context.
1461 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001462
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001463 switch (pname)
1464 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001465 case GL_MAX_VERTEX_ATTRIBS:
1466 *params = mCaps.maxVertexAttributes;
1467 break;
1468 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1469 *params = mCaps.maxVertexUniformVectors;
1470 break;
1471 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001472 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001473 break;
1474 case GL_MAX_VARYING_VECTORS:
1475 *params = mCaps.maxVaryingVectors;
1476 break;
1477 case GL_MAX_VARYING_COMPONENTS:
1478 *params = mCaps.maxVertexOutputComponents;
1479 break;
1480 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1481 *params = mCaps.maxCombinedTextureImageUnits;
1482 break;
1483 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001484 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001485 break;
1486 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001487 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001488 break;
1489 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1490 *params = mCaps.maxFragmentUniformVectors;
1491 break;
1492 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001493 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001494 break;
1495 case GL_MAX_RENDERBUFFER_SIZE:
1496 *params = mCaps.maxRenderbufferSize;
1497 break;
1498 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1499 *params = mCaps.maxColorAttachments;
1500 break;
1501 case GL_MAX_DRAW_BUFFERS_EXT:
1502 *params = mCaps.maxDrawBuffers;
1503 break;
1504 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1505 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1506 case GL_SUBPIXEL_BITS:
1507 *params = 4;
1508 break;
1509 case GL_MAX_TEXTURE_SIZE:
1510 *params = mCaps.max2DTextureSize;
1511 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001512 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1513 *params = mCaps.maxRectangleTextureSize;
1514 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001515 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1516 *params = mCaps.maxCubeMapTextureSize;
1517 break;
1518 case GL_MAX_3D_TEXTURE_SIZE:
1519 *params = mCaps.max3DTextureSize;
1520 break;
1521 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1522 *params = mCaps.maxArrayTextureLayers;
1523 break;
1524 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1525 *params = mCaps.uniformBufferOffsetAlignment;
1526 break;
1527 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1528 *params = mCaps.maxUniformBufferBindings;
1529 break;
1530 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001531 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001532 break;
1533 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001534 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001535 break;
1536 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1537 *params = mCaps.maxCombinedTextureImageUnits;
1538 break;
1539 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1540 *params = mCaps.maxVertexOutputComponents;
1541 break;
1542 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1543 *params = mCaps.maxFragmentInputComponents;
1544 break;
1545 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1546 *params = mCaps.minProgramTexelOffset;
1547 break;
1548 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1549 *params = mCaps.maxProgramTexelOffset;
1550 break;
1551 case GL_MAJOR_VERSION:
1552 *params = getClientVersion().major;
1553 break;
1554 case GL_MINOR_VERSION:
1555 *params = getClientVersion().minor;
1556 break;
1557 case GL_MAX_ELEMENTS_INDICES:
1558 *params = mCaps.maxElementsIndices;
1559 break;
1560 case GL_MAX_ELEMENTS_VERTICES:
1561 *params = mCaps.maxElementsVertices;
1562 break;
1563 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1564 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1565 break;
1566 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1567 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1568 break;
1569 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1570 *params = mCaps.maxTransformFeedbackSeparateComponents;
1571 break;
1572 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1573 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1574 break;
1575 case GL_MAX_SAMPLES_ANGLE:
1576 *params = mCaps.maxSamples;
1577 break;
1578 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001579 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001580 params[0] = mCaps.maxViewportWidth;
1581 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001582 }
1583 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001584 case GL_COMPRESSED_TEXTURE_FORMATS:
1585 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1586 params);
1587 break;
1588 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1589 *params = mResetStrategy;
1590 break;
1591 case GL_NUM_SHADER_BINARY_FORMATS:
1592 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1593 break;
1594 case GL_SHADER_BINARY_FORMATS:
1595 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1596 break;
1597 case GL_NUM_PROGRAM_BINARY_FORMATS:
1598 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1599 break;
1600 case GL_PROGRAM_BINARY_FORMATS:
1601 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1602 break;
1603 case GL_NUM_EXTENSIONS:
1604 *params = static_cast<GLint>(mExtensionStrings.size());
1605 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001606
Geoff Lang38f24ee2018-10-01 13:04:59 -04001607 // GL_ANGLE_request_extension
1608 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1609 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1610 break;
1611
Jamie Madill231c7f52017-04-26 13:45:37 -04001612 // GL_KHR_debug
1613 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1614 *params = mExtensions.maxDebugMessageLength;
1615 break;
1616 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1617 *params = mExtensions.maxDebugLoggedMessages;
1618 break;
1619 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1620 *params = mExtensions.maxDebugGroupStackDepth;
1621 break;
1622 case GL_MAX_LABEL_LENGTH:
1623 *params = mExtensions.maxLabelLength;
1624 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001625
Martin Radeve5285d22017-07-14 16:23:53 +03001626 // GL_ANGLE_multiview
1627 case GL_MAX_VIEWS_ANGLE:
1628 *params = mExtensions.maxViews;
1629 break;
1630
Jamie Madill231c7f52017-04-26 13:45:37 -04001631 // GL_EXT_disjoint_timer_query
1632 case GL_GPU_DISJOINT_EXT:
1633 *params = mImplementation->getGPUDisjoint();
1634 break;
1635 case GL_MAX_FRAMEBUFFER_WIDTH:
1636 *params = mCaps.maxFramebufferWidth;
1637 break;
1638 case GL_MAX_FRAMEBUFFER_HEIGHT:
1639 *params = mCaps.maxFramebufferHeight;
1640 break;
1641 case GL_MAX_FRAMEBUFFER_SAMPLES:
1642 *params = mCaps.maxFramebufferSamples;
1643 break;
1644 case GL_MAX_SAMPLE_MASK_WORDS:
1645 *params = mCaps.maxSampleMaskWords;
1646 break;
1647 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1648 *params = mCaps.maxColorTextureSamples;
1649 break;
1650 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1651 *params = mCaps.maxDepthTextureSamples;
1652 break;
1653 case GL_MAX_INTEGER_SAMPLES:
1654 *params = mCaps.maxIntegerSamples;
1655 break;
1656 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1657 *params = mCaps.maxVertexAttribRelativeOffset;
1658 break;
1659 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1660 *params = mCaps.maxVertexAttribBindings;
1661 break;
1662 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1663 *params = mCaps.maxVertexAttribStride;
1664 break;
1665 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001666 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001667 break;
1668 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001669 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001670 break;
1671 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001672 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001673 break;
1674 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001675 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001676 break;
1677 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001678 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001679 break;
1680 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001681 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001682 break;
1683 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001684 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001685 break;
1686 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001687 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001688 break;
1689 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1690 *params = mCaps.minProgramTextureGatherOffset;
1691 break;
1692 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1693 *params = mCaps.maxProgramTextureGatherOffset;
1694 break;
1695 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1696 *params = mCaps.maxComputeWorkGroupInvocations;
1697 break;
1698 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001699 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001700 break;
1701 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001702 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001703 break;
1704 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1705 *params = mCaps.maxComputeSharedMemorySize;
1706 break;
1707 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001708 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001709 break;
1710 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001711 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001712 break;
1713 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001714 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001715 break;
1716 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001717 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001718 break;
1719 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001720 *params =
1721 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001722 break;
1723 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001724 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001725 break;
1726 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1727 *params = mCaps.maxCombinedShaderOutputResources;
1728 break;
1729 case GL_MAX_UNIFORM_LOCATIONS:
1730 *params = mCaps.maxUniformLocations;
1731 break;
1732 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1733 *params = mCaps.maxAtomicCounterBufferBindings;
1734 break;
1735 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1736 *params = mCaps.maxAtomicCounterBufferSize;
1737 break;
1738 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1739 *params = mCaps.maxCombinedAtomicCounterBuffers;
1740 break;
1741 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1742 *params = mCaps.maxCombinedAtomicCounters;
1743 break;
1744 case GL_MAX_IMAGE_UNITS:
1745 *params = mCaps.maxImageUnits;
1746 break;
1747 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1748 *params = mCaps.maxCombinedImageUniforms;
1749 break;
1750 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1751 *params = mCaps.maxShaderStorageBufferBindings;
1752 break;
1753 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1754 *params = mCaps.maxCombinedShaderStorageBlocks;
1755 break;
1756 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1757 *params = mCaps.shaderStorageBufferOffsetAlignment;
1758 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001759
1760 // GL_EXT_geometry_shader
1761 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1762 *params = mCaps.maxFramebufferLayers;
1763 break;
1764 case GL_LAYER_PROVOKING_VERTEX_EXT:
1765 *params = mCaps.layerProvokingVertex;
1766 break;
1767 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001768 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001769 break;
1770 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001771 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001772 break;
1773 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001774 *params =
1775 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001776 break;
1777 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1778 *params = mCaps.maxGeometryInputComponents;
1779 break;
1780 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1781 *params = mCaps.maxGeometryOutputComponents;
1782 break;
1783 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1784 *params = mCaps.maxGeometryOutputVertices;
1785 break;
1786 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1787 *params = mCaps.maxGeometryTotalOutputComponents;
1788 break;
1789 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1790 *params = mCaps.maxGeometryShaderInvocations;
1791 break;
1792 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001793 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001794 break;
1795 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001796 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001797 break;
1798 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001799 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001800 break;
1801 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001802 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001803 break;
1804 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001805 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001806 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001807 // GLES1 emulation: Caps queries
1808 case GL_MAX_TEXTURE_UNITS:
1809 *params = mCaps.maxMultitextureUnits;
1810 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001811 case GL_MAX_MODELVIEW_STACK_DEPTH:
1812 *params = mCaps.maxModelviewMatrixStackDepth;
1813 break;
1814 case GL_MAX_PROJECTION_STACK_DEPTH:
1815 *params = mCaps.maxProjectionMatrixStackDepth;
1816 break;
1817 case GL_MAX_TEXTURE_STACK_DEPTH:
1818 *params = mCaps.maxTextureMatrixStackDepth;
1819 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001820 case GL_MAX_LIGHTS:
1821 *params = mCaps.maxLights;
1822 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001823 case GL_MAX_CLIP_PLANES:
1824 *params = mCaps.maxClipPlanes;
1825 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001826 // GLES1 emulation: Vertex attribute queries
1827 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1828 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1829 case GL_COLOR_ARRAY_BUFFER_BINDING:
1830 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1831 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1832 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1833 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1834 break;
1835 case GL_VERTEX_ARRAY_STRIDE:
1836 case GL_NORMAL_ARRAY_STRIDE:
1837 case GL_COLOR_ARRAY_STRIDE:
1838 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1839 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1840 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1841 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1842 break;
1843 case GL_VERTEX_ARRAY_SIZE:
1844 case GL_COLOR_ARRAY_SIZE:
1845 case GL_TEXTURE_COORD_ARRAY_SIZE:
1846 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1847 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1848 break;
1849 case GL_VERTEX_ARRAY_TYPE:
1850 case GL_COLOR_ARRAY_TYPE:
1851 case GL_NORMAL_ARRAY_TYPE:
1852 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1853 case GL_TEXTURE_COORD_ARRAY_TYPE:
1854 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1855 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1856 break;
1857
jchen1082af6202018-06-22 10:59:52 +08001858 // GL_KHR_parallel_shader_compile
1859 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1860 *params = mGLState.getMaxShaderCompilerThreads();
1861 break;
1862
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001863 // GL_EXT_blend_func_extended
1864 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
1865 *params = mExtensions.maxDualSourceDrawBuffers;
1866 break;
1867
Jamie Madill231c7f52017-04-26 13:45:37 -04001868 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001869 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001870 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001871 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001872}
1873
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001874void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001875{
Shannon Woods53a94a82014-06-24 15:20:36 -04001876 // Queries about context capabilities and maximums are answered by Context.
1877 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001878 switch (pname)
1879 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001880 case GL_MAX_ELEMENT_INDEX:
1881 *params = mCaps.maxElementIndex;
1882 break;
1883 case GL_MAX_UNIFORM_BLOCK_SIZE:
1884 *params = mCaps.maxUniformBlockSize;
1885 break;
1886 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001887 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001888 break;
1889 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001890 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001891 break;
1892 case GL_MAX_SERVER_WAIT_TIMEOUT:
1893 *params = mCaps.maxServerWaitTimeout;
1894 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001895
Jamie Madill231c7f52017-04-26 13:45:37 -04001896 // GL_EXT_disjoint_timer_query
1897 case GL_TIMESTAMP_EXT:
1898 *params = mImplementation->getTimestamp();
1899 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001900
Jamie Madill231c7f52017-04-26 13:45:37 -04001901 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1902 *params = mCaps.maxShaderStorageBlockSize;
1903 break;
1904 default:
1905 UNREACHABLE();
1906 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001907 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001908}
1909
Geoff Lang70d0f492015-12-10 17:45:46 -05001910void Context::getPointerv(GLenum pname, void **params) const
1911{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001912 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001913}
1914
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001915void Context::getPointervRobustANGLERobust(GLenum pname,
1916 GLsizei bufSize,
1917 GLsizei *length,
1918 void **params)
1919{
1920 UNIMPLEMENTED();
1921}
1922
Martin Radev66fb8202016-07-28 11:45:20 +03001923void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001924{
Shannon Woods53a94a82014-06-24 15:20:36 -04001925 // Queries about context capabilities and maximums are answered by Context.
1926 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001927
1928 GLenum nativeType;
1929 unsigned int numParams;
1930 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1931 ASSERT(queryStatus);
1932
1933 if (nativeType == GL_INT)
1934 {
1935 switch (target)
1936 {
1937 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1938 ASSERT(index < 3u);
1939 *data = mCaps.maxComputeWorkGroupCount[index];
1940 break;
1941 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1942 ASSERT(index < 3u);
1943 *data = mCaps.maxComputeWorkGroupSize[index];
1944 break;
1945 default:
1946 mGLState.getIntegeri_v(target, index, data);
1947 }
1948 }
1949 else
1950 {
1951 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1952 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001953}
1954
Brandon Jones59770802018-04-02 13:18:42 -07001955void Context::getIntegeri_vRobust(GLenum target,
1956 GLuint index,
1957 GLsizei bufSize,
1958 GLsizei *length,
1959 GLint *data)
1960{
1961 getIntegeri_v(target, index, data);
1962}
1963
Martin Radev66fb8202016-07-28 11:45:20 +03001964void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001965{
Shannon Woods53a94a82014-06-24 15:20:36 -04001966 // Queries about context capabilities and maximums are answered by Context.
1967 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001968
1969 GLenum nativeType;
1970 unsigned int numParams;
1971 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1972 ASSERT(queryStatus);
1973
1974 if (nativeType == GL_INT_64_ANGLEX)
1975 {
1976 mGLState.getInteger64i_v(target, index, data);
1977 }
1978 else
1979 {
1980 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1981 }
1982}
1983
Brandon Jones59770802018-04-02 13:18:42 -07001984void Context::getInteger64i_vRobust(GLenum target,
1985 GLuint index,
1986 GLsizei bufSize,
1987 GLsizei *length,
1988 GLint64 *data)
1989{
1990 getInteger64i_v(target, index, data);
1991}
1992
Martin Radev66fb8202016-07-28 11:45:20 +03001993void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1994{
1995 // Queries about context capabilities and maximums are answered by Context.
1996 // Queries about current GL state values are answered by State.
1997
1998 GLenum nativeType;
1999 unsigned int numParams;
2000 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
2001 ASSERT(queryStatus);
2002
2003 if (nativeType == GL_BOOL)
2004 {
2005 mGLState.getBooleani_v(target, index, data);
2006 }
2007 else
2008 {
2009 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
2010 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04002011}
2012
Brandon Jones59770802018-04-02 13:18:42 -07002013void Context::getBooleani_vRobust(GLenum target,
2014 GLuint index,
2015 GLsizei bufSize,
2016 GLsizei *length,
2017 GLboolean *data)
2018{
2019 getBooleani_v(target, index, data);
2020}
2021
Corentin Wallez336129f2017-10-17 15:55:40 -04002022void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002023{
2024 Buffer *buffer = mGLState.getTargetBuffer(target);
2025 QueryBufferParameteriv(buffer, pname, params);
2026}
2027
Brandon Jones59770802018-04-02 13:18:42 -07002028void Context::getBufferParameterivRobust(BufferBinding target,
2029 GLenum pname,
2030 GLsizei bufSize,
2031 GLsizei *length,
2032 GLint *params)
2033{
2034 getBufferParameteriv(target, pname, params);
2035}
2036
He Yunchao010e4db2017-03-03 14:22:06 +08002037void Context::getFramebufferAttachmentParameteriv(GLenum target,
2038 GLenum attachment,
2039 GLenum pname,
2040 GLint *params)
2041{
2042 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002043 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002044}
2045
Brandon Jones59770802018-04-02 13:18:42 -07002046void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2047 GLenum attachment,
2048 GLenum pname,
2049 GLsizei bufSize,
2050 GLsizei *length,
2051 GLint *params)
2052{
2053 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2054}
2055
He Yunchao010e4db2017-03-03 14:22:06 +08002056void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2057{
2058 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2059 QueryRenderbufferiv(this, renderbuffer, pname, params);
2060}
2061
Brandon Jones59770802018-04-02 13:18:42 -07002062void Context::getRenderbufferParameterivRobust(GLenum target,
2063 GLenum pname,
2064 GLsizei bufSize,
2065 GLsizei *length,
2066 GLint *params)
2067{
2068 getRenderbufferParameteriv(target, pname, params);
2069}
2070
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002071void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002072{
2073 Texture *texture = getTargetTexture(target);
2074 QueryTexParameterfv(texture, pname, params);
2075}
2076
Brandon Jones59770802018-04-02 13:18:42 -07002077void Context::getTexParameterfvRobust(TextureType target,
2078 GLenum pname,
2079 GLsizei bufSize,
2080 GLsizei *length,
2081 GLfloat *params)
2082{
2083 getTexParameterfv(target, pname, params);
2084}
2085
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002086void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002087{
2088 Texture *texture = getTargetTexture(target);
2089 QueryTexParameteriv(texture, pname, params);
2090}
Jiajia Qin5451d532017-11-16 17:16:34 +08002091
Brandon Jones59770802018-04-02 13:18:42 -07002092void Context::getTexParameterivRobust(TextureType target,
2093 GLenum pname,
2094 GLsizei bufSize,
2095 GLsizei *length,
2096 GLint *params)
2097{
2098 getTexParameteriv(target, pname, params);
2099}
2100
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002101void Context::getTexParameterIivRobust(TextureType target,
2102 GLenum pname,
2103 GLsizei bufSize,
2104 GLsizei *length,
2105 GLint *params)
2106{
2107 UNIMPLEMENTED();
2108}
2109
2110void Context::getTexParameterIuivRobust(TextureType target,
2111 GLenum pname,
2112 GLsizei bufSize,
2113 GLsizei *length,
2114 GLuint *params)
2115{
2116 UNIMPLEMENTED();
2117}
2118
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002119void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002120{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002121 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002122 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002123}
2124
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002125void Context::getTexLevelParameterivRobust(TextureTarget target,
2126 GLint level,
2127 GLenum pname,
2128 GLsizei bufSize,
2129 GLsizei *length,
2130 GLint *params)
2131{
2132 UNIMPLEMENTED();
2133}
2134
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002135void Context::getTexLevelParameterfv(TextureTarget target,
2136 GLint level,
2137 GLenum pname,
2138 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002139{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002140 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002141 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002142}
2143
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002144void Context::getTexLevelParameterfvRobust(TextureTarget target,
2145 GLint level,
2146 GLenum pname,
2147 GLsizei bufSize,
2148 GLsizei *length,
2149 GLfloat *params)
2150{
2151 UNIMPLEMENTED();
2152}
2153
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002154void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002155{
2156 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002157 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002158 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002159}
2160
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002161void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002162{
2163 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002164 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002165 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002166}
2167
Brandon Jones59770802018-04-02 13:18:42 -07002168void Context::texParameterfvRobust(TextureType target,
2169 GLenum pname,
2170 GLsizei bufSize,
2171 const GLfloat *params)
2172{
2173 texParameterfv(target, pname, params);
2174}
2175
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002176void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002177{
2178 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002179 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002180 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002181}
2182
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002183void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002184{
2185 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002186 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002187 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002188}
2189
Brandon Jones59770802018-04-02 13:18:42 -07002190void Context::texParameterivRobust(TextureType target,
2191 GLenum pname,
2192 GLsizei bufSize,
2193 const GLint *params)
2194{
2195 texParameteriv(target, pname, params);
2196}
2197
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002198void Context::texParameterIivRobust(TextureType target,
2199 GLenum pname,
2200 GLsizei bufSize,
2201 const GLint *params)
2202{
2203 UNIMPLEMENTED();
2204}
2205
2206void Context::texParameterIuivRobust(TextureType target,
2207 GLenum pname,
2208 GLsizei bufSize,
2209 const GLuint *params)
2210{
2211 UNIMPLEMENTED();
2212}
2213
Jamie Madill493f9572018-05-24 19:52:15 -04002214void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002215{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002216 // No-op if count draws no primitives for given mode
2217 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002218 {
2219 return;
2220 }
2221
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002222 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002223 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002224 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002225}
2226
Jamie Madill493f9572018-05-24 19:52:15 -04002227void Context::drawArraysInstanced(PrimitiveMode mode,
2228 GLint first,
2229 GLsizei count,
2230 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002231{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002232 // No-op if count draws no primitives for given mode
2233 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002234 {
2235 return;
2236 }
2237
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002238 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002239 ANGLE_CONTEXT_TRY(
2240 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002241 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2242 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002243}
2244
Jamie Madill493f9572018-05-24 19:52:15 -04002245void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002246{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002247 // No-op if count draws no primitives for given mode
2248 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002249 {
2250 return;
2251 }
2252
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002253 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002254 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002255}
2256
Jamie Madill493f9572018-05-24 19:52:15 -04002257void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002258 GLsizei count,
2259 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002260 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002261 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002262{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002263 // No-op if count draws no primitives for given mode
2264 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002265 {
2266 return;
2267 }
2268
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002269 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002270 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002271 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002272}
2273
Jamie Madill493f9572018-05-24 19:52:15 -04002274void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002275 GLuint start,
2276 GLuint end,
2277 GLsizei count,
2278 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002279 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002280{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002281 // No-op if count draws no primitives for given mode
2282 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002283 {
2284 return;
2285 }
2286
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002287 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002288 ANGLE_CONTEXT_TRY(
2289 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002290}
2291
Jamie Madill493f9572018-05-24 19:52:15 -04002292void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002293{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002294 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002295 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002296}
2297
Jamie Madill493f9572018-05-24 19:52:15 -04002298void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002299{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002300 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002301 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002302}
2303
Jamie Madill675fe712016-12-19 13:07:54 -05002304void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002305{
Jamie Madillafa02a22017-11-23 12:57:38 -05002306 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002307}
2308
Jamie Madill675fe712016-12-19 13:07:54 -05002309void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002310{
Jamie Madillafa02a22017-11-23 12:57:38 -05002311 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002312}
2313
Austin Kinross6ee1e782015-05-29 17:05:37 -07002314void Context::insertEventMarker(GLsizei length, const char *marker)
2315{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002316 ASSERT(mImplementation);
2317 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002318}
2319
2320void Context::pushGroupMarker(GLsizei length, const char *marker)
2321{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002322 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002323
2324 if (marker == nullptr)
2325 {
2326 // From the EXT_debug_marker spec,
2327 // "If <marker> is null then an empty string is pushed on the stack."
2328 mImplementation->pushGroupMarker(length, "");
2329 }
2330 else
2331 {
2332 mImplementation->pushGroupMarker(length, marker);
2333 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002334}
2335
2336void Context::popGroupMarker()
2337{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002338 ASSERT(mImplementation);
2339 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002340}
2341
Geoff Langd8605522016-04-13 10:19:12 -04002342void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2343{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002344 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002345 ASSERT(programObject);
2346
2347 programObject->bindUniformLocation(location, name);
2348}
2349
Brandon Jones59770802018-04-02 13:18:42 -07002350void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002351{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002352 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002353}
2354
Brandon Jones59770802018-04-02 13:18:42 -07002355void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002356{
2357 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2358}
2359
Brandon Jones59770802018-04-02 13:18:42 -07002360void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002361{
2362 GLfloat I[16];
2363 angle::Matrix<GLfloat>::setToIdentity(I);
2364
2365 mGLState.loadPathRenderingMatrix(matrixMode, I);
2366}
2367
2368void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2369{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002370 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002371 if (!pathObj)
2372 return;
2373
Geoff Lang9bf86f02018-07-26 11:46:34 -04002374 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002375
2376 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2377}
2378
2379void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2380{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002381 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002382 if (!pathObj)
2383 return;
2384
Geoff Lang9bf86f02018-07-26 11:46:34 -04002385 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002386
2387 mImplementation->stencilStrokePath(pathObj, reference, mask);
2388}
2389
2390void Context::coverFillPath(GLuint path, GLenum coverMode)
2391{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002392 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002393 if (!pathObj)
2394 return;
2395
Geoff Lang9bf86f02018-07-26 11:46:34 -04002396 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002397
2398 mImplementation->coverFillPath(pathObj, coverMode);
2399}
2400
2401void Context::coverStrokePath(GLuint path, GLenum coverMode)
2402{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002403 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002404 if (!pathObj)
2405 return;
2406
Geoff Lang9bf86f02018-07-26 11:46:34 -04002407 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002408
2409 mImplementation->coverStrokePath(pathObj, coverMode);
2410}
2411
2412void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2413{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002414 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002415 if (!pathObj)
2416 return;
2417
Geoff Lang9bf86f02018-07-26 11:46:34 -04002418 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002419
2420 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2421}
2422
2423void Context::stencilThenCoverStrokePath(GLuint path,
2424 GLint reference,
2425 GLuint mask,
2426 GLenum coverMode)
2427{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002428 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002429 if (!pathObj)
2430 return;
2431
Geoff Lang9bf86f02018-07-26 11:46:34 -04002432 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002433
2434 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2435}
2436
Sami Väisänend59ca052016-06-21 16:10:00 +03002437void Context::coverFillPathInstanced(GLsizei numPaths,
2438 GLenum pathNameType,
2439 const void *paths,
2440 GLuint pathBase,
2441 GLenum coverMode,
2442 GLenum transformType,
2443 const GLfloat *transformValues)
2444{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002445 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002446
Geoff Lang9bf86f02018-07-26 11:46:34 -04002447 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002448
2449 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2450}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002451
Sami Väisänend59ca052016-06-21 16:10:00 +03002452void Context::coverStrokePathInstanced(GLsizei numPaths,
2453 GLenum pathNameType,
2454 const void *paths,
2455 GLuint pathBase,
2456 GLenum coverMode,
2457 GLenum transformType,
2458 const GLfloat *transformValues)
2459{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002460 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002461
2462 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002463 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002464
2465 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2466 transformValues);
2467}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002468
Sami Väisänend59ca052016-06-21 16:10:00 +03002469void Context::stencilFillPathInstanced(GLsizei numPaths,
2470 GLenum pathNameType,
2471 const void *paths,
2472 GLuint pathBase,
2473 GLenum fillMode,
2474 GLuint mask,
2475 GLenum transformType,
2476 const GLfloat *transformValues)
2477{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002478 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002479
2480 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002481 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002482
2483 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2484 transformValues);
2485}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002486
Sami Väisänend59ca052016-06-21 16:10:00 +03002487void Context::stencilStrokePathInstanced(GLsizei numPaths,
2488 GLenum pathNameType,
2489 const void *paths,
2490 GLuint pathBase,
2491 GLint reference,
2492 GLuint mask,
2493 GLenum transformType,
2494 const GLfloat *transformValues)
2495{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002496 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002497
Geoff Lang9bf86f02018-07-26 11:46:34 -04002498 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002499
2500 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2501 transformValues);
2502}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002503
Sami Väisänend59ca052016-06-21 16:10:00 +03002504void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2505 GLenum pathNameType,
2506 const void *paths,
2507 GLuint pathBase,
2508 GLenum fillMode,
2509 GLuint mask,
2510 GLenum coverMode,
2511 GLenum transformType,
2512 const GLfloat *transformValues)
2513{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002514 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002515
Geoff Lang9bf86f02018-07-26 11:46:34 -04002516 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002517
2518 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2519 transformType, transformValues);
2520}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002521
Sami Väisänend59ca052016-06-21 16:10:00 +03002522void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2523 GLenum pathNameType,
2524 const void *paths,
2525 GLuint pathBase,
2526 GLint reference,
2527 GLuint mask,
2528 GLenum coverMode,
2529 GLenum transformType,
2530 const GLfloat *transformValues)
2531{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002532 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002533
Geoff Lang9bf86f02018-07-26 11:46:34 -04002534 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002535
2536 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2537 transformType, transformValues);
2538}
2539
Sami Väisänen46eaa942016-06-29 10:26:37 +03002540void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2541{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002542 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002543
2544 programObject->bindFragmentInputLocation(location, name);
2545}
2546
2547void Context::programPathFragmentInputGen(GLuint program,
2548 GLint location,
2549 GLenum genMode,
2550 GLint components,
2551 const GLfloat *coeffs)
2552{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002553 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002554
jchen103fd614d2018-08-13 12:21:58 +08002555 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002556}
2557
jchen1015015f72017-03-16 13:54:21 +08002558GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2559{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002560 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002561 return QueryProgramResourceIndex(programObject, programInterface, name);
2562}
2563
jchen10fd7c3b52017-03-21 15:36:03 +08002564void Context::getProgramResourceName(GLuint program,
2565 GLenum programInterface,
2566 GLuint index,
2567 GLsizei bufSize,
2568 GLsizei *length,
2569 GLchar *name)
2570{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002571 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002572 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2573}
2574
jchen10191381f2017-04-11 13:59:04 +08002575GLint Context::getProgramResourceLocation(GLuint program,
2576 GLenum programInterface,
2577 const GLchar *name)
2578{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002579 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002580 return QueryProgramResourceLocation(programObject, programInterface, name);
2581}
2582
jchen10880683b2017-04-12 16:21:55 +08002583void Context::getProgramResourceiv(GLuint program,
2584 GLenum programInterface,
2585 GLuint index,
2586 GLsizei propCount,
2587 const GLenum *props,
2588 GLsizei bufSize,
2589 GLsizei *length,
2590 GLint *params)
2591{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002592 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002593 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2594 length, params);
2595}
2596
jchen10d9cd7b72017-08-30 15:04:25 +08002597void Context::getProgramInterfaceiv(GLuint program,
2598 GLenum programInterface,
2599 GLenum pname,
2600 GLint *params)
2601{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002602 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002603 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2604}
2605
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002606void Context::getProgramInterfaceivRobust(GLuint program,
2607 GLenum programInterface,
2608 GLenum pname,
2609 GLsizei bufSize,
2610 GLsizei *length,
2611 GLint *params)
2612{
2613 UNIMPLEMENTED();
2614}
2615
Jamie Madill306b6c12018-07-27 08:12:49 -04002616void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002617{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002618 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002619}
2620
2621// Get one of the recorded errors and clear its flag, if any.
2622// [OpenGL ES 2.0.24] section 2.5 page 13.
2623GLenum Context::getError()
2624{
Geoff Langda5777c2014-07-11 09:52:58 -04002625 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002626 {
Geoff Langda5777c2014-07-11 09:52:58 -04002627 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002628 }
Geoff Langda5777c2014-07-11 09:52:58 -04002629 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002630 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002631 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002632 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002633}
2634
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002635// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002636void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002637{
2638 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002639 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002640 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002641 mContextLostForced = true;
2642 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002643 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002644}
2645
Jamie Madillfa920eb2018-01-04 11:45:50 -05002646GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002647{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002648 // Even if the application doesn't want to know about resets, we want to know
2649 // as it will allow us to skip all the calls.
2650 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002651 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002652 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002653 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002654 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002655 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002656
2657 // EXT_robustness, section 2.6: If the reset notification behavior is
2658 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2659 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2660 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002661 }
2662
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002663 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2664 // status should be returned at least once, and GL_NO_ERROR should be returned
2665 // once the device has finished resetting.
2666 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002667 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002668 ASSERT(mResetStatus == GL_NO_ERROR);
2669 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002670
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002671 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002672 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002673 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002674 }
2675 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002676 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002677 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002678 // If markContextLost was used to mark the context lost then
2679 // assume that is not recoverable, and continue to report the
2680 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002681 mResetStatus = mImplementation->getResetStatus();
2682 }
Jamie Madill893ab082014-05-16 16:56:10 -04002683
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002684 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002685}
2686
2687bool Context::isResetNotificationEnabled()
2688{
2689 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2690}
2691
Corentin Walleze3b10e82015-05-20 11:06:25 -04002692const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002693{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002694 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002695}
2696
2697EGLenum Context::getClientType() const
2698{
2699 return mClientType;
2700}
2701
2702EGLenum Context::getRenderBuffer() const
2703{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002704 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2705 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002706 {
2707 return EGL_NONE;
2708 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002709
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002710 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002711 ASSERT(backAttachment != nullptr);
2712 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002713}
2714
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002715VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002716{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002717 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002718 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2719 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002720 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002721 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2722 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002723
Jamie Madill96a483b2017-06-27 16:49:21 -04002724 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002725 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002726
2727 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002728}
2729
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002730TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002731{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002732 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002733 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2734 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002735 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002736 transformFeedback =
2737 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002738 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002739 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002740 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002741
2742 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002743}
2744
2745bool Context::isVertexArrayGenerated(GLuint vertexArray)
2746{
Jamie Madill96a483b2017-06-27 16:49:21 -04002747 ASSERT(mVertexArrayMap.contains(0));
2748 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002749}
2750
2751bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2752{
Jamie Madill96a483b2017-06-27 16:49:21 -04002753 ASSERT(mTransformFeedbackMap.contains(0));
2754 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002755}
2756
Shannon Woods53a94a82014-06-24 15:20:36 -04002757void Context::detachTexture(GLuint texture)
2758{
2759 // Simple pass-through to State's detachTexture method, as textures do not require
2760 // allocation map management either here or in the resource manager at detach time.
2761 // Zero textures are held by the Context, and we don't attempt to request them from
2762 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002763 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002764}
2765
James Darpinian4d9d4832018-03-13 12:43:28 -07002766void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002767{
Yuly Novikov5807a532015-12-03 13:01:22 -05002768 // Simple pass-through to State's detachBuffer method, since
2769 // only buffer attachments to container objects that are bound to the current context
2770 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002771
Yuly Novikov5807a532015-12-03 13:01:22 -05002772 // [OpenGL ES 3.2] section 5.1.2 page 45:
2773 // Attachments to unbound container objects, such as
2774 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2775 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002776 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002777}
2778
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002779void Context::detachFramebuffer(GLuint framebuffer)
2780{
Shannon Woods53a94a82014-06-24 15:20:36 -04002781 // Framebuffer detachment is handled by Context, because 0 is a valid
2782 // Framebuffer object, and a pointer to it must be passed from Context
2783 // to State at binding time.
2784
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002785 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002786 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2787 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2788 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002789
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002790 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002791 {
2792 bindReadFramebuffer(0);
2793 }
2794
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002795 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002796 {
2797 bindDrawFramebuffer(0);
2798 }
2799}
2800
2801void Context::detachRenderbuffer(GLuint renderbuffer)
2802{
Jamie Madilla02315b2017-02-23 14:14:47 -05002803 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002804}
2805
Jamie Madill57a89722013-07-02 11:57:03 -04002806void Context::detachVertexArray(GLuint vertexArray)
2807{
Jamie Madill77a72f62015-04-14 11:18:32 -04002808 // Vertex array detachment is handled by Context, because 0 is a valid
2809 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002810 // binding time.
2811
Jamie Madill57a89722013-07-02 11:57:03 -04002812 // [OpenGL ES 3.0.2] section 2.10 page 43:
2813 // If a vertex array object that is currently bound is deleted, the binding
2814 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002815 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002816 {
2817 bindVertexArray(0);
2818 }
2819}
2820
Geoff Langc8058452014-02-03 12:04:11 -05002821void Context::detachTransformFeedback(GLuint transformFeedback)
2822{
Corentin Walleza2257da2016-04-19 16:43:12 -04002823 // Transform feedback detachment is handled by Context, because 0 is a valid
2824 // transform feedback, and a pointer to it must be passed from Context to State at
2825 // binding time.
2826
2827 // The OpenGL specification doesn't mention what should happen when the currently bound
2828 // transform feedback object is deleted. Since it is a container object, we treat it like
2829 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002830 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002831 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002832 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002833 }
Geoff Langc8058452014-02-03 12:04:11 -05002834}
2835
Jamie Madilldc356042013-07-19 16:36:57 -04002836void Context::detachSampler(GLuint sampler)
2837{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002838 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002839}
2840
Yunchao Hea336b902017-08-02 16:05:21 +08002841void Context::detachProgramPipeline(GLuint pipeline)
2842{
2843 mGLState.detachProgramPipeline(this, pipeline);
2844}
2845
Jamie Madill3ef140a2017-08-26 23:11:21 -04002846void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002847{
Shaodde78e82017-05-22 14:13:27 +08002848 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002849 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002850}
2851
Jamie Madille29d1672013-07-19 16:36:57 -04002852void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2853{
Geoff Langc1984ed2016-10-07 12:41:00 -04002854 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002855 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002856 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002857}
Jamie Madille29d1672013-07-19 16:36:57 -04002858
Geoff Langc1984ed2016-10-07 12:41:00 -04002859void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2860{
2861 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002862 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002863 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002864}
2865
Brandon Jones59770802018-04-02 13:18:42 -07002866void Context::samplerParameterivRobust(GLuint sampler,
2867 GLenum pname,
2868 GLsizei bufSize,
2869 const GLint *param)
2870{
2871 samplerParameteriv(sampler, pname, param);
2872}
2873
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002874void Context::samplerParameterIivRobust(GLuint sampler,
2875 GLenum pname,
2876 GLsizei bufSize,
2877 const GLint *param)
2878{
2879 UNIMPLEMENTED();
2880}
2881
2882void Context::samplerParameterIuivRobust(GLuint sampler,
2883 GLenum pname,
2884 GLsizei bufSize,
2885 const GLuint *param)
2886{
2887 UNIMPLEMENTED();
2888}
2889
Jamie Madille29d1672013-07-19 16:36:57 -04002890void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2891{
Geoff Langc1984ed2016-10-07 12:41:00 -04002892 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002893 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002894 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002895}
2896
Geoff Langc1984ed2016-10-07 12:41:00 -04002897void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002898{
Geoff Langc1984ed2016-10-07 12:41:00 -04002899 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002900 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002901 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002902}
2903
Brandon Jones59770802018-04-02 13:18:42 -07002904void Context::samplerParameterfvRobust(GLuint sampler,
2905 GLenum pname,
2906 GLsizei bufSize,
2907 const GLfloat *param)
2908{
2909 samplerParameterfv(sampler, pname, param);
2910}
2911
Geoff Langc1984ed2016-10-07 12:41:00 -04002912void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002913{
Geoff Langc1984ed2016-10-07 12:41:00 -04002914 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002915 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002916 QuerySamplerParameteriv(samplerObject, pname, params);
2917}
Jamie Madill9675b802013-07-19 16:36:59 -04002918
Brandon Jones59770802018-04-02 13:18:42 -07002919void Context::getSamplerParameterivRobust(GLuint sampler,
2920 GLenum pname,
2921 GLsizei bufSize,
2922 GLsizei *length,
2923 GLint *params)
2924{
2925 getSamplerParameteriv(sampler, pname, params);
2926}
2927
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002928void Context::getSamplerParameterIivRobust(GLuint sampler,
2929 GLenum pname,
2930 GLsizei bufSize,
2931 GLsizei *length,
2932 GLint *params)
2933{
2934 UNIMPLEMENTED();
2935}
2936
2937void Context::getSamplerParameterIuivRobust(GLuint sampler,
2938 GLenum pname,
2939 GLsizei bufSize,
2940 GLsizei *length,
2941 GLuint *params)
2942{
2943 UNIMPLEMENTED();
2944}
2945
Geoff Langc1984ed2016-10-07 12:41:00 -04002946void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2947{
2948 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002949 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002950 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04002951}
2952
Brandon Jones59770802018-04-02 13:18:42 -07002953void Context::getSamplerParameterfvRobust(GLuint sampler,
2954 GLenum pname,
2955 GLsizei bufSize,
2956 GLsizei *length,
2957 GLfloat *params)
2958{
2959 getSamplerParameterfv(sampler, pname, params);
2960}
2961
Olli Etuahof0fee072016-03-30 15:11:58 +03002962void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2963{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002964 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08002965 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002966}
2967
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002968void Context::initRendererString()
2969{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002970 std::ostringstream rendererString;
2971 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002972 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002973 rendererString << ")";
2974
Geoff Langcec35902014-04-16 10:52:36 -04002975 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002976}
2977
Geoff Langc339c4e2016-11-29 10:37:36 -05002978void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002979{
Geoff Langc339c4e2016-11-29 10:37:36 -05002980 const Version &clientVersion = getClientVersion();
2981
2982 std::ostringstream versionString;
2983 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2984 << ANGLE_VERSION_STRING << ")";
2985 mVersionString = MakeStaticString(versionString.str());
2986
2987 std::ostringstream shadingLanguageVersionString;
2988 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2989 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2990 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
2991 << ")";
2992 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002993}
2994
Geoff Langcec35902014-04-16 10:52:36 -04002995void Context::initExtensionStrings()
2996{
Geoff Langc339c4e2016-11-29 10:37:36 -05002997 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
2998 std::ostringstream combinedStringStream;
2999 std::copy(strings.begin(), strings.end(),
3000 std::ostream_iterator<const char *>(combinedStringStream, " "));
3001 return MakeStaticString(combinedStringStream.str());
3002 };
3003
3004 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003005 for (const auto &extensionString : mExtensions.getStrings())
3006 {
3007 mExtensionStrings.push_back(MakeStaticString(extensionString));
3008 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003009 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003010
Geoff Langc339c4e2016-11-29 10:37:36 -05003011 mRequestableExtensionStrings.clear();
3012 for (const auto &extensionInfo : GetExtensionInfoMap())
3013 {
3014 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003015 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003016 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003017 {
3018 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3019 }
3020 }
3021 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003022}
3023
Geoff Langc339c4e2016-11-29 10:37:36 -05003024const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003025{
Geoff Langc339c4e2016-11-29 10:37:36 -05003026 switch (name)
3027 {
3028 case GL_VENDOR:
3029 return reinterpret_cast<const GLubyte *>("Google Inc.");
3030
3031 case GL_RENDERER:
3032 return reinterpret_cast<const GLubyte *>(mRendererString);
3033
3034 case GL_VERSION:
3035 return reinterpret_cast<const GLubyte *>(mVersionString);
3036
3037 case GL_SHADING_LANGUAGE_VERSION:
3038 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3039
3040 case GL_EXTENSIONS:
3041 return reinterpret_cast<const GLubyte *>(mExtensionString);
3042
3043 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3044 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3045
3046 default:
3047 UNREACHABLE();
3048 return nullptr;
3049 }
Geoff Langcec35902014-04-16 10:52:36 -04003050}
3051
Geoff Langc339c4e2016-11-29 10:37:36 -05003052const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003053{
Geoff Langc339c4e2016-11-29 10:37:36 -05003054 switch (name)
3055 {
3056 case GL_EXTENSIONS:
3057 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3058
3059 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3060 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3061
3062 default:
3063 UNREACHABLE();
3064 return nullptr;
3065 }
Geoff Langcec35902014-04-16 10:52:36 -04003066}
3067
3068size_t Context::getExtensionStringCount() const
3069{
3070 return mExtensionStrings.size();
3071}
3072
Geoff Lang111a99e2017-10-17 10:58:41 -04003073bool Context::isExtensionRequestable(const char *name)
3074{
3075 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3076 auto extension = extensionInfos.find(name);
3077
Geoff Lang111a99e2017-10-17 10:58:41 -04003078 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003079 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003080}
3081
Geoff Langc339c4e2016-11-29 10:37:36 -05003082void Context::requestExtension(const char *name)
3083{
3084 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3085 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3086 const auto &extension = extensionInfos.at(name);
3087 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003088 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003089
3090 if (mExtensions.*(extension.ExtensionsMember))
3091 {
3092 // Extension already enabled
3093 return;
3094 }
3095
3096 mExtensions.*(extension.ExtensionsMember) = true;
3097 updateCaps();
3098 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003099
Jamie Madill2f348d22017-06-05 10:50:59 -04003100 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3101 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003102
Jamie Madill81c2e252017-09-09 23:32:46 -04003103 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3104 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003105 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003106 for (auto &zeroTexture : mZeroTextures)
3107 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003108 if (zeroTexture.get() != nullptr)
3109 {
3110 zeroTexture->signalDirty(this, InitState::Initialized);
3111 }
Geoff Lang9aded172017-04-05 11:07:56 -04003112 }
3113
Jamie Madillb983a4b2018-08-01 11:34:51 -04003114 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003115}
3116
3117size_t Context::getRequestableExtensionStringCount() const
3118{
3119 return mRequestableExtensionStrings.size();
3120}
3121
Jamie Madill493f9572018-05-24 19:52:15 -04003122void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003123{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003124 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003125 ASSERT(transformFeedback != nullptr);
3126 ASSERT(!transformFeedback->isPaused());
3127
Jamie Madill6c1f6712017-02-14 19:08:04 -05003128 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003129 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003130}
3131
3132bool Context::hasActiveTransformFeedback(GLuint program) const
3133{
3134 for (auto pair : mTransformFeedbackMap)
3135 {
3136 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3137 {
3138 return true;
3139 }
3140 }
3141 return false;
3142}
3143
Geoff Lang33f11fb2018-05-07 13:42:47 -04003144Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003145{
3146 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3147
jchen1082af6202018-06-22 10:59:52 +08003148 // Explicitly enable GL_KHR_parallel_shader_compile
3149 supportedExtensions.parallelShaderCompile = true;
3150
Geoff Langb0f917f2017-12-05 13:41:54 -05003151 if (getClientVersion() < ES_2_0)
3152 {
3153 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003154 supportedExtensions.pointSizeArray = true;
3155 supportedExtensions.textureCubeMap = true;
3156 supportedExtensions.pointSprite = true;
3157 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003158 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003159 }
3160
3161 if (getClientVersion() < ES_3_0)
3162 {
3163 // Disable ES3+ extensions
3164 supportedExtensions.colorBufferFloat = false;
3165 supportedExtensions.eglImageExternalEssl3 = false;
3166 supportedExtensions.textureNorm16 = false;
3167 supportedExtensions.multiview = false;
3168 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003169 supportedExtensions.copyTexture3d = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003170 }
3171
3172 if (getClientVersion() < ES_3_1)
3173 {
3174 // Disable ES3.1+ extensions
3175 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003176
3177 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3178 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003179 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003180 }
3181
3182 if (getClientVersion() > ES_2_0)
3183 {
3184 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3185 // supportedExtensions.sRGB = false;
3186 }
3187
3188 // Some extensions are always available because they are implemented in the GL layer.
3189 supportedExtensions.bindUniformLocation = true;
3190 supportedExtensions.vertexArrayObject = true;
3191 supportedExtensions.bindGeneratesResource = true;
3192 supportedExtensions.clientArrays = true;
3193 supportedExtensions.requestExtension = true;
3194
3195 // Enable the no error extension if the context was created with the flag.
3196 supportedExtensions.noError = mSkipValidation;
3197
3198 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003199 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003200
3201 // Explicitly enable GL_KHR_debug
3202 supportedExtensions.debug = true;
3203 supportedExtensions.maxDebugMessageLength = 1024;
3204 supportedExtensions.maxDebugLoggedMessages = 1024;
3205 supportedExtensions.maxDebugGroupStackDepth = 1024;
3206 supportedExtensions.maxLabelLength = 1024;
3207
3208 // Explicitly enable GL_ANGLE_robust_client_memory
3209 supportedExtensions.robustClientMemory = true;
3210
3211 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003212 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003213
3214 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3215 // supports it.
3216 supportedExtensions.robustBufferAccessBehavior =
3217 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3218
3219 // Enable the cache control query unconditionally.
3220 supportedExtensions.programCacheControl = true;
3221
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003222 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003223 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003224 {
3225 // GL_ANGLE_explicit_context_gles1
3226 supportedExtensions.explicitContextGles1 = true;
3227 // GL_ANGLE_explicit_context
3228 supportedExtensions.explicitContext = true;
3229 }
3230
Geoff Langb0f917f2017-12-05 13:41:54 -05003231 return supportedExtensions;
3232}
3233
Geoff Lang33f11fb2018-05-07 13:42:47 -04003234void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003235{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003236 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003237
Geoff Lang33f11fb2018-05-07 13:42:47 -04003238 mSupportedExtensions = generateSupportedExtensions();
3239 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003240
3241 mLimitations = mImplementation->getNativeLimitations();
3242
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003243 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3244 if (getClientVersion() < Version(2, 0))
3245 {
3246 mCaps.maxMultitextureUnits = 4;
3247 mCaps.maxClipPlanes = 6;
3248 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003249 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3250 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3251 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003252 mCaps.minSmoothPointSize = 1.0f;
3253 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003254 mCaps.minSmoothLineWidth = 1.0f;
3255 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003256 }
3257
Luc Ferronad2ae932018-06-11 15:31:17 -04003258 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003259 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003260
Luc Ferronad2ae932018-06-11 15:31:17 -04003261 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3262
Jamie Madill0f80ed82017-09-19 00:24:56 -04003263 if (getClientVersion() < ES_3_1)
3264 {
3265 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3266 }
3267 else
3268 {
3269 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3270 }
Geoff Lang301d1612014-07-09 10:34:37 -04003271
Jiawei Shao54aafe52018-04-27 14:54:57 +08003272 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3273 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003274 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3275
Jamie Madill0f80ed82017-09-19 00:24:56 -04003276 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3277 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3278
3279 // Limit textures as well, so we can use fast bitsets with texture bindings.
3280 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003281 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3282 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3283 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3284 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003285
Jiawei Shaodb342272017-09-27 10:21:45 +08003286 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3287
Geoff Langc287ea62016-09-16 14:46:51 -04003288 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003289 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003290 for (const auto &extensionInfo : GetExtensionInfoMap())
3291 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003292 // If the user has requested that extensions start disabled and they are requestable,
3293 // disable them.
3294 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003295 {
3296 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3297 }
3298 }
3299
3300 // Generate texture caps
3301 updateCaps();
3302}
3303
3304void Context::updateCaps()
3305{
Geoff Lang900013c2014-07-07 11:32:19 -04003306 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003307 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003308
Jamie Madill7b62cf92017-11-02 15:20:49 -04003309 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003310 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003311 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003312 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003313
Geoff Lang0d8b7242015-09-09 14:56:53 -04003314 // Update the format caps based on the client version and extensions.
3315 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3316 // ES3.
3317 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003318 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003319 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003320 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003321 formatCaps.textureAttachment =
3322 formatCaps.textureAttachment &&
3323 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3324 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3325 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003326
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003327 // OpenGL ES does not support multisampling with non-rendererable formats
3328 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003329 if (!formatCaps.renderbuffer ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003330 (getClientVersion() < ES_3_1 &&
3331 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003332 {
Geoff Langd87878e2014-09-19 15:42:59 -04003333 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003334 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003335 else
3336 {
3337 // We may have limited the max samples for some required renderbuffer formats due to
3338 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3339 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3340
3341 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3342 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3343 // exception of signed and unsigned integer formats."
3344 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3345 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3346 {
3347 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3348 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3349 }
3350
3351 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3352 if (getClientVersion() >= ES_3_1)
3353 {
3354 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3355 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3356 // the exception that the signed and unsigned integer formats are required only to
3357 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3358 // multisamples, which must be at least one."
3359 if (formatInfo.componentType == GL_INT ||
3360 formatInfo.componentType == GL_UNSIGNED_INT)
3361 {
3362 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3363 }
3364
3365 // GLES 3.1 section 19.3.1.
3366 if (formatCaps.texturable)
3367 {
3368 if (formatInfo.depthBits > 0)
3369 {
3370 mCaps.maxDepthTextureSamples =
3371 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3372 }
3373 else if (formatInfo.redBits > 0)
3374 {
3375 mCaps.maxColorTextureSamples =
3376 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3377 }
3378 }
3379 }
3380 }
Geoff Langd87878e2014-09-19 15:42:59 -04003381
3382 if (formatCaps.texturable && formatInfo.compressed)
3383 {
Geoff Langca271392017-04-05 12:30:00 -04003384 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003385 }
3386
Geoff Langca271392017-04-05 12:30:00 -04003387 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003388 }
Jamie Madill32447362017-06-28 14:53:52 -04003389
3390 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003391 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003392 {
3393 mMemoryProgramCache = nullptr;
3394 }
Corentin Walleze4477002017-12-01 14:39:58 -05003395
3396 // Compute which buffer types are allowed
3397 mValidBufferBindings.reset();
3398 mValidBufferBindings.set(BufferBinding::ElementArray);
3399 mValidBufferBindings.set(BufferBinding::Array);
3400
3401 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3402 {
3403 mValidBufferBindings.set(BufferBinding::PixelPack);
3404 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3405 }
3406
3407 if (getClientVersion() >= ES_3_0)
3408 {
3409 mValidBufferBindings.set(BufferBinding::CopyRead);
3410 mValidBufferBindings.set(BufferBinding::CopyWrite);
3411 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3412 mValidBufferBindings.set(BufferBinding::Uniform);
3413 }
3414
3415 if (getClientVersion() >= ES_3_1)
3416 {
3417 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3418 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3419 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3420 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3421 }
jchen107ae70d82018-07-06 13:47:01 +08003422
3423 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Geoff Lang493daf52014-07-03 13:38:44 -04003424}
3425
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003426void Context::initWorkarounds()
3427{
Jamie Madill761b02c2017-06-23 16:27:06 -04003428 // Apply back-end workarounds.
3429 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3430
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003431 // Lose the context upon out of memory error if the application is
3432 // expecting to watch for those events.
3433 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
3434}
3435
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003436// Return true if the draw is a no-op, else return false.
3437// A no-op draw occurs if the count of vertices is less than the minimum required to
3438// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3439bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3440{
3441 return count < kMinimumPrimitiveCounts[mode];
3442}
3443
3444bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3445{
3446 return (instanceCount == 0) || noopDraw(mode, count);
3447}
3448
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003449Error Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003450{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003451 if (mGLES1Renderer)
3452 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003453 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003454 }
3455
Geoff Lang9bf86f02018-07-26 11:46:34 -04003456 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003457
3458 if (isRobustResourceInitEnabled())
3459 {
3460 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3461 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3462 }
3463
Geoff Langa8cb2872018-03-09 16:09:40 -05003464 ANGLE_TRY(syncDirtyBits());
Geoff Langd4fff502017-09-22 11:28:28 -04003465 return NoError();
3466}
3467
3468Error Context::prepareForClear(GLbitfield mask)
3469{
Geoff Langa8cb2872018-03-09 16:09:40 -05003470 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003471 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003472 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003473 return NoError();
3474}
3475
3476Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3477{
Geoff Langa8cb2872018-03-09 16:09:40 -05003478 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003479 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3480 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003481 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003482 return NoError();
3483}
3484
Geoff Langa8cb2872018-03-09 16:09:40 -05003485Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003486{
Geoff Langa8cb2872018-03-09 16:09:40 -05003487 ANGLE_TRY(syncDirtyObjects(objectMask));
3488 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003489 return NoError();
3490}
3491
Geoff Langa8cb2872018-03-09 16:09:40 -05003492Error Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003493{
3494 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill189ad872018-07-09 13:32:37 -04003495 ANGLE_TRY(mImplementation->syncState(this, dirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003496 mGLState.clearDirtyBits();
3497 return NoError();
3498}
3499
Geoff Langa8cb2872018-03-09 16:09:40 -05003500Error Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003501{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003502 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill189ad872018-07-09 13:32:37 -04003503 ANGLE_TRY(mImplementation->syncState(this, dirtyBits));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003504 mGLState.clearDirtyBits(dirtyBits);
Jamie Madillbc918e72018-03-08 09:47:21 -05003505 return NoError();
Jamie Madill1b94d432015-08-07 13:23:23 -04003506}
Jamie Madillc29968b2016-01-20 11:17:23 -05003507
Geoff Langa8cb2872018-03-09 16:09:40 -05003508Error Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003509{
3510 return mGLState.syncDirtyObjects(this, objectMask);
3511}
3512
Jamie Madillc29968b2016-01-20 11:17:23 -05003513void Context::blitFramebuffer(GLint srcX0,
3514 GLint srcY0,
3515 GLint srcX1,
3516 GLint srcY1,
3517 GLint dstX0,
3518 GLint dstY0,
3519 GLint dstX1,
3520 GLint dstY1,
3521 GLbitfield mask,
3522 GLenum filter)
3523{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003524 if (mask == 0)
3525 {
3526 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3527 // buffers are copied.
3528 return;
3529 }
3530
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003531 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003532 ASSERT(drawFramebuffer);
3533
3534 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3535 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3536
Jamie Madillbc918e72018-03-08 09:47:21 -05003537 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003538
Jamie Madillc564c072017-06-01 12:45:42 -04003539 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003540}
Jamie Madillc29968b2016-01-20 11:17:23 -05003541
3542void Context::clear(GLbitfield mask)
3543{
Geoff Langd4fff502017-09-22 11:28:28 -04003544 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3545 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003546}
3547
3548void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3549{
Olli Etuaho78df3362018-10-05 16:43:27 +03003550 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3551 const FramebufferAttachment *attachment = nullptr;
3552 if (buffer == GL_DEPTH)
3553 {
3554 attachment = framebufferObject->getDepthbuffer();
3555 }
3556 if (buffer == GL_COLOR &&
3557 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3558 {
3559 attachment = framebufferObject->getColorbuffer(drawbuffer);
3560 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003561 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3562 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003563 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003564 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003565 return;
3566 }
Geoff Langd4fff502017-09-22 11:28:28 -04003567 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003568 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003569}
3570
3571void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3572{
Olli Etuaho78df3362018-10-05 16:43:27 +03003573 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3574 const FramebufferAttachment *attachment = nullptr;
3575 if (buffer == GL_COLOR &&
3576 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3577 {
3578 attachment = framebufferObject->getColorbuffer(drawbuffer);
3579 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003580 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3581 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003582 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003583 {
3584 return;
3585 }
Geoff Langd4fff502017-09-22 11:28:28 -04003586 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003587 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003588}
3589
3590void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3591{
Olli Etuaho78df3362018-10-05 16:43:27 +03003592 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3593 const FramebufferAttachment *attachment = nullptr;
3594 if (buffer == GL_STENCIL)
3595 {
3596 attachment = framebufferObject->getStencilbuffer();
3597 }
3598 if (buffer == GL_COLOR &&
3599 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3600 {
3601 attachment = framebufferObject->getColorbuffer(drawbuffer);
3602 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003603 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3604 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003605 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003606 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003607 return;
3608 }
Geoff Langd4fff502017-09-22 11:28:28 -04003609 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003610 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003611}
3612
3613void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3614{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003615 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003616 ASSERT(framebufferObject);
3617
3618 // If a buffer is not present, the clear has no effect
3619 if (framebufferObject->getDepthbuffer() == nullptr &&
3620 framebufferObject->getStencilbuffer() == nullptr)
3621 {
3622 return;
3623 }
3624
Geoff Langd4fff502017-09-22 11:28:28 -04003625 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3626 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003627}
3628
3629void Context::readPixels(GLint x,
3630 GLint y,
3631 GLsizei width,
3632 GLsizei height,
3633 GLenum format,
3634 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003635 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003636{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003637 if (width == 0 || height == 0)
3638 {
3639 return;
3640 }
3641
Jamie Madillbc918e72018-03-08 09:47:21 -05003642 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003643
Jamie Madillb6664922017-07-25 12:55:04 -04003644 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3645 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003646
3647 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003648 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003649}
3650
Brandon Jones59770802018-04-02 13:18:42 -07003651void Context::readPixelsRobust(GLint x,
3652 GLint y,
3653 GLsizei width,
3654 GLsizei height,
3655 GLenum format,
3656 GLenum type,
3657 GLsizei bufSize,
3658 GLsizei *length,
3659 GLsizei *columns,
3660 GLsizei *rows,
3661 void *pixels)
3662{
3663 readPixels(x, y, width, height, format, type, pixels);
3664}
3665
3666void Context::readnPixelsRobust(GLint x,
3667 GLint y,
3668 GLsizei width,
3669 GLsizei height,
3670 GLenum format,
3671 GLenum type,
3672 GLsizei bufSize,
3673 GLsizei *length,
3674 GLsizei *columns,
3675 GLsizei *rows,
3676 void *data)
3677{
3678 readPixels(x, y, width, height, format, type, data);
3679}
3680
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003681void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003682 GLint level,
3683 GLenum internalformat,
3684 GLint x,
3685 GLint y,
3686 GLsizei width,
3687 GLsizei height,
3688 GLint border)
3689{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003690 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003691 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003692
Jamie Madillc29968b2016-01-20 11:17:23 -05003693 Rectangle sourceArea(x, y, width, height);
3694
Jamie Madill05b35b22017-10-03 09:01:44 -04003695 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003696 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003697 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003698}
3699
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003700void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003701 GLint level,
3702 GLint xoffset,
3703 GLint yoffset,
3704 GLint x,
3705 GLint y,
3706 GLsizei width,
3707 GLsizei height)
3708{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003709 if (width == 0 || height == 0)
3710 {
3711 return;
3712 }
3713
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003714 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003715 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003716
Jamie Madillc29968b2016-01-20 11:17:23 -05003717 Offset destOffset(xoffset, yoffset, 0);
3718 Rectangle sourceArea(x, y, width, height);
3719
Jamie Madill05b35b22017-10-03 09:01:44 -04003720 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003721 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003722 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003723}
3724
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003725void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003726 GLint level,
3727 GLint xoffset,
3728 GLint yoffset,
3729 GLint zoffset,
3730 GLint x,
3731 GLint y,
3732 GLsizei width,
3733 GLsizei height)
3734{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003735 if (width == 0 || height == 0)
3736 {
3737 return;
3738 }
3739
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003740 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003741 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003742
Jamie Madillc29968b2016-01-20 11:17:23 -05003743 Offset destOffset(xoffset, yoffset, zoffset);
3744 Rectangle sourceArea(x, y, width, height);
3745
Jamie Madill05b35b22017-10-03 09:01:44 -04003746 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3747 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003748 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3749 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003750}
3751
3752void Context::framebufferTexture2D(GLenum target,
3753 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003754 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003755 GLuint texture,
3756 GLint level)
3757{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003758 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003759 ASSERT(framebuffer);
3760
3761 if (texture != 0)
3762 {
3763 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003764 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003765 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003766 }
3767 else
3768 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003769 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003770 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003771
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003772 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003773}
3774
3775void Context::framebufferRenderbuffer(GLenum target,
3776 GLenum attachment,
3777 GLenum renderbuffertarget,
3778 GLuint renderbuffer)
3779{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003780 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003781 ASSERT(framebuffer);
3782
3783 if (renderbuffer != 0)
3784 {
3785 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003786
Jamie Madillcc129372018-04-12 09:13:18 -04003787 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003788 renderbufferObject);
3789 }
3790 else
3791 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003792 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003793 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003794
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003795 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003796}
3797
3798void Context::framebufferTextureLayer(GLenum target,
3799 GLenum attachment,
3800 GLuint texture,
3801 GLint level,
3802 GLint layer)
3803{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003804 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003805 ASSERT(framebuffer);
3806
3807 if (texture != 0)
3808 {
3809 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003810 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003811 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003812 }
3813 else
3814 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003815 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003816 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003817
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003818 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003819}
3820
Brandon Jones59770802018-04-02 13:18:42 -07003821void Context::framebufferTextureMultiviewLayered(GLenum target,
3822 GLenum attachment,
3823 GLuint texture,
3824 GLint level,
3825 GLint baseViewIndex,
3826 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003827{
Martin Radev82ef7742017-08-08 17:44:58 +03003828 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3829 ASSERT(framebuffer);
3830
3831 if (texture != 0)
3832 {
3833 Texture *textureObj = getTexture(texture);
3834
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003835 ImageIndex index;
3836 if (textureObj->getType() == TextureType::_2DArray)
3837 {
3838 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3839 }
3840 else
3841 {
3842 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3843 ASSERT(level == 0);
3844 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3845 }
Martin Radev82ef7742017-08-08 17:44:58 +03003846 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3847 numViews, baseViewIndex);
3848 }
3849 else
3850 {
3851 framebuffer->resetAttachment(this, attachment);
3852 }
3853
3854 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003855}
3856
Brandon Jones59770802018-04-02 13:18:42 -07003857void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3858 GLenum attachment,
3859 GLuint texture,
3860 GLint level,
3861 GLsizei numViews,
3862 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003863{
Martin Radev5dae57b2017-07-14 16:15:55 +03003864 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3865 ASSERT(framebuffer);
3866
3867 if (texture != 0)
3868 {
3869 Texture *textureObj = getTexture(texture);
3870
3871 ImageIndex index = ImageIndex::Make2D(level);
3872 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3873 textureObj, numViews, viewportOffsets);
3874 }
3875 else
3876 {
3877 framebuffer->resetAttachment(this, attachment);
3878 }
3879
3880 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003881}
3882
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003883void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3884{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003885 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3886 ASSERT(framebuffer);
3887
3888 if (texture != 0)
3889 {
3890 Texture *textureObj = getTexture(texture);
3891
3892 ImageIndex index = ImageIndex::MakeFromType(
3893 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3894 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3895 }
3896 else
3897 {
3898 framebuffer->resetAttachment(this, attachment);
3899 }
3900
3901 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003902}
3903
Jamie Madillc29968b2016-01-20 11:17:23 -05003904void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3905{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003906 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003907 ASSERT(framebuffer);
3908 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003909 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003910 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003911}
3912
3913void Context::readBuffer(GLenum mode)
3914{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003915 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003916 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003917 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003918}
3919
3920void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3921{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003922 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003923 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003924
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003925 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003926 ASSERT(framebuffer);
3927
3928 // The specification isn't clear what should be done when the framebuffer isn't complete.
3929 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003930 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003931}
3932
3933void Context::invalidateFramebuffer(GLenum target,
3934 GLsizei numAttachments,
3935 const GLenum *attachments)
3936{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003937 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003938 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003939
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003940 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003941 ASSERT(framebuffer);
3942
Jamie Madill427064d2018-04-13 16:20:34 -04003943 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003944 {
Jamie Madill437fa652016-05-03 15:13:24 -04003945 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003946 }
Jamie Madill437fa652016-05-03 15:13:24 -04003947
Jamie Madill4928b7c2017-06-20 12:57:39 -04003948 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003949}
3950
3951void Context::invalidateSubFramebuffer(GLenum target,
3952 GLsizei numAttachments,
3953 const GLenum *attachments,
3954 GLint x,
3955 GLint y,
3956 GLsizei width,
3957 GLsizei height)
3958{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003959 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003960 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003961
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003962 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003963 ASSERT(framebuffer);
3964
Jamie Madill427064d2018-04-13 16:20:34 -04003965 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003966 {
Jamie Madill437fa652016-05-03 15:13:24 -04003967 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003968 }
Jamie Madill437fa652016-05-03 15:13:24 -04003969
3970 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003971 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003972}
3973
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003974void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003975 GLint level,
3976 GLint internalformat,
3977 GLsizei width,
3978 GLsizei height,
3979 GLint border,
3980 GLenum format,
3981 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003982 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003983{
Jamie Madillbc918e72018-03-08 09:47:21 -05003984 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003985
3986 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003987 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003988 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07003989 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003990}
3991
Brandon Jones59770802018-04-02 13:18:42 -07003992void Context::texImage2DRobust(TextureTarget target,
3993 GLint level,
3994 GLint internalformat,
3995 GLsizei width,
3996 GLsizei height,
3997 GLint border,
3998 GLenum format,
3999 GLenum type,
4000 GLsizei bufSize,
4001 const void *pixels)
4002{
4003 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4004}
4005
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004006void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004007 GLint level,
4008 GLint internalformat,
4009 GLsizei width,
4010 GLsizei height,
4011 GLsizei depth,
4012 GLint border,
4013 GLenum format,
4014 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004015 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004016{
Jamie Madillbc918e72018-03-08 09:47:21 -05004017 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004018
4019 Extents size(width, height, depth);
4020 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004021 handleError(texture->setImage(this, mGLState.getUnpackState(),
4022 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004023 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004024}
4025
Brandon Jones59770802018-04-02 13:18:42 -07004026void Context::texImage3DRobust(TextureType target,
4027 GLint level,
4028 GLint internalformat,
4029 GLsizei width,
4030 GLsizei height,
4031 GLsizei depth,
4032 GLint border,
4033 GLenum format,
4034 GLenum type,
4035 GLsizei bufSize,
4036 const void *pixels)
4037{
4038 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4039}
4040
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004041void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004042 GLint level,
4043 GLint xoffset,
4044 GLint yoffset,
4045 GLsizei width,
4046 GLsizei height,
4047 GLenum format,
4048 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004049 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004050{
4051 // Zero sized uploads are valid but no-ops
4052 if (width == 0 || height == 0)
4053 {
4054 return;
4055 }
4056
Jamie Madillbc918e72018-03-08 09:47:21 -05004057 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004058
4059 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004060 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004061
4062 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4063
4064 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4065 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004066}
4067
Brandon Jones59770802018-04-02 13:18:42 -07004068void Context::texSubImage2DRobust(TextureTarget target,
4069 GLint level,
4070 GLint xoffset,
4071 GLint yoffset,
4072 GLsizei width,
4073 GLsizei height,
4074 GLenum format,
4075 GLenum type,
4076 GLsizei bufSize,
4077 const void *pixels)
4078{
4079 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4080}
4081
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004082void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004083 GLint level,
4084 GLint xoffset,
4085 GLint yoffset,
4086 GLint zoffset,
4087 GLsizei width,
4088 GLsizei height,
4089 GLsizei depth,
4090 GLenum format,
4091 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004092 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004093{
4094 // Zero sized uploads are valid but no-ops
4095 if (width == 0 || height == 0 || depth == 0)
4096 {
4097 return;
4098 }
4099
Jamie Madillbc918e72018-03-08 09:47:21 -05004100 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004101
4102 Box area(xoffset, yoffset, zoffset, width, height, depth);
4103 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004104
4105 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4106
4107 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004108 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004109 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004110}
4111
Brandon Jones59770802018-04-02 13:18:42 -07004112void Context::texSubImage3DRobust(TextureType target,
4113 GLint level,
4114 GLint xoffset,
4115 GLint yoffset,
4116 GLint zoffset,
4117 GLsizei width,
4118 GLsizei height,
4119 GLsizei depth,
4120 GLenum format,
4121 GLenum type,
4122 GLsizei bufSize,
4123 const void *pixels)
4124{
4125 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4126 pixels);
4127}
4128
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004129void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004130 GLint level,
4131 GLenum internalformat,
4132 GLsizei width,
4133 GLsizei height,
4134 GLint border,
4135 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004136 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004137{
Jamie Madillbc918e72018-03-08 09:47:21 -05004138 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004139
4140 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004141 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004142 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4143 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004144 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004145}
4146
Brandon Jones59770802018-04-02 13:18:42 -07004147void Context::compressedTexImage2DRobust(TextureTarget target,
4148 GLint level,
4149 GLenum internalformat,
4150 GLsizei width,
4151 GLsizei height,
4152 GLint border,
4153 GLsizei imageSize,
4154 GLsizei dataSize,
4155 const GLvoid *data)
4156{
4157 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4158}
4159
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004160void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004161 GLint level,
4162 GLenum internalformat,
4163 GLsizei width,
4164 GLsizei height,
4165 GLsizei depth,
4166 GLint border,
4167 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004168 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004169{
Jamie Madillbc918e72018-03-08 09:47:21 -05004170 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004171
4172 Extents size(width, height, depth);
4173 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004174 handleError(texture->setCompressedImage(
4175 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004176 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004177}
4178
Brandon Jones59770802018-04-02 13:18:42 -07004179void Context::compressedTexImage3DRobust(TextureType target,
4180 GLint level,
4181 GLenum internalformat,
4182 GLsizei width,
4183 GLsizei height,
4184 GLsizei depth,
4185 GLint border,
4186 GLsizei imageSize,
4187 GLsizei dataSize,
4188 const GLvoid *data)
4189{
4190 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4191 data);
4192}
4193
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004194void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004195 GLint level,
4196 GLint xoffset,
4197 GLint yoffset,
4198 GLsizei width,
4199 GLsizei height,
4200 GLenum format,
4201 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004202 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004203{
Jamie Madillbc918e72018-03-08 09:47:21 -05004204 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004205
4206 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004207 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004208 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4209 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004210 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004211}
4212
Brandon Jones59770802018-04-02 13:18:42 -07004213void Context::compressedTexSubImage2DRobust(TextureTarget target,
4214 GLint level,
4215 GLint xoffset,
4216 GLint yoffset,
4217 GLsizei width,
4218 GLsizei height,
4219 GLenum format,
4220 GLsizei imageSize,
4221 GLsizei dataSize,
4222 const GLvoid *data)
4223{
4224 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4225 data);
4226}
4227
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004228void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004229 GLint level,
4230 GLint xoffset,
4231 GLint yoffset,
4232 GLint zoffset,
4233 GLsizei width,
4234 GLsizei height,
4235 GLsizei depth,
4236 GLenum format,
4237 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004238 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004239{
4240 // Zero sized uploads are valid but no-ops
4241 if (width == 0 || height == 0)
4242 {
4243 return;
4244 }
4245
Jamie Madillbc918e72018-03-08 09:47:21 -05004246 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004247
4248 Box area(xoffset, yoffset, zoffset, width, height, depth);
4249 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004250 handleError(texture->setCompressedSubImage(
4251 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004252 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004253}
4254
Brandon Jones59770802018-04-02 13:18:42 -07004255void Context::compressedTexSubImage3DRobust(TextureType target,
4256 GLint level,
4257 GLint xoffset,
4258 GLint yoffset,
4259 GLint zoffset,
4260 GLsizei width,
4261 GLsizei height,
4262 GLsizei depth,
4263 GLenum format,
4264 GLsizei imageSize,
4265 GLsizei dataSize,
4266 const GLvoid *data)
4267{
4268 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4269 imageSize, data);
4270}
4271
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004272void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004273{
4274 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004275 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004276}
4277
Jamie Madill007530e2017-12-28 14:27:04 -05004278void Context::copyTexture(GLuint sourceId,
4279 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004280 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004281 GLuint destId,
4282 GLint destLevel,
4283 GLint internalFormat,
4284 GLenum destType,
4285 GLboolean unpackFlipY,
4286 GLboolean unpackPremultiplyAlpha,
4287 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004288{
Jamie Madillbc918e72018-03-08 09:47:21 -05004289 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004290
4291 gl::Texture *sourceTexture = getTexture(sourceId);
4292 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004293 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4294 sourceLevel, ConvertToBool(unpackFlipY),
4295 ConvertToBool(unpackPremultiplyAlpha),
4296 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004297}
4298
Jamie Madill007530e2017-12-28 14:27:04 -05004299void Context::copySubTexture(GLuint sourceId,
4300 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004301 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004302 GLuint destId,
4303 GLint destLevel,
4304 GLint xoffset,
4305 GLint yoffset,
4306 GLint x,
4307 GLint y,
4308 GLsizei width,
4309 GLsizei height,
4310 GLboolean unpackFlipY,
4311 GLboolean unpackPremultiplyAlpha,
4312 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004313{
4314 // Zero sized copies are valid but no-ops
4315 if (width == 0 || height == 0)
4316 {
4317 return;
4318 }
4319
Jamie Madillbc918e72018-03-08 09:47:21 -05004320 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004321
4322 gl::Texture *sourceTexture = getTexture(sourceId);
4323 gl::Texture *destTexture = getTexture(destId);
4324 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004325 Box box(x, y, 0, width, height, 1);
4326 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4327 ConvertToBool(unpackFlipY),
4328 ConvertToBool(unpackPremultiplyAlpha),
4329 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4330}
4331
4332void Context::copyTexture3D(GLuint sourceId,
4333 GLint sourceLevel,
4334 TextureTarget destTarget,
4335 GLuint destId,
4336 GLint destLevel,
4337 GLint internalFormat,
4338 GLenum destType,
4339 GLboolean unpackFlipY,
4340 GLboolean unpackPremultiplyAlpha,
4341 GLboolean unpackUnmultiplyAlpha)
4342{
4343 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4344
4345 Texture *sourceTexture = getTexture(sourceId);
4346 Texture *destTexture = getTexture(destId);
4347 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4348 sourceLevel, ConvertToBool(unpackFlipY),
4349 ConvertToBool(unpackPremultiplyAlpha),
4350 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4351}
4352
4353void Context::copySubTexture3D(GLuint sourceId,
4354 GLint sourceLevel,
4355 TextureTarget destTarget,
4356 GLuint destId,
4357 GLint destLevel,
4358 GLint xoffset,
4359 GLint yoffset,
4360 GLint zoffset,
4361 GLint x,
4362 GLint y,
4363 GLint z,
4364 GLsizei width,
4365 GLsizei height,
4366 GLsizei depth,
4367 GLboolean unpackFlipY,
4368 GLboolean unpackPremultiplyAlpha,
4369 GLboolean unpackUnmultiplyAlpha)
4370{
4371 // Zero sized copies are valid but no-ops
4372 if (width == 0 || height == 0 || depth == 0)
4373 {
4374 return;
4375 }
4376
4377 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4378
4379 Texture *sourceTexture = getTexture(sourceId);
4380 Texture *destTexture = getTexture(destId);
4381 Offset offset(xoffset, yoffset, zoffset);
4382 Box box(x, y, z, width, height, depth);
4383 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004384 ConvertToBool(unpackFlipY),
4385 ConvertToBool(unpackPremultiplyAlpha),
4386 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004387}
4388
Jamie Madill007530e2017-12-28 14:27:04 -05004389void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004390{
Jamie Madillbc918e72018-03-08 09:47:21 -05004391 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004392
4393 gl::Texture *sourceTexture = getTexture(sourceId);
4394 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004395 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004396}
4397
Corentin Wallez336129f2017-10-17 15:55:40 -04004398void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004399{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004400 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004401 ASSERT(buffer);
4402
Geoff Lang496c02d2016-10-20 11:38:11 -07004403 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004404}
4405
Brandon Jones59770802018-04-02 13:18:42 -07004406void Context::getBufferPointervRobust(BufferBinding target,
4407 GLenum pname,
4408 GLsizei bufSize,
4409 GLsizei *length,
4410 void **params)
4411{
4412 getBufferPointerv(target, pname, params);
4413}
4414
Corentin Wallez336129f2017-10-17 15:55:40 -04004415void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004416{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004417 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004418 ASSERT(buffer);
4419
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004420 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004421 if (error.isError())
4422 {
Jamie Madill437fa652016-05-03 15:13:24 -04004423 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004424 return nullptr;
4425 }
4426
4427 return buffer->getMapPointer();
4428}
4429
Corentin Wallez336129f2017-10-17 15:55:40 -04004430GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004431{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004432 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004433 ASSERT(buffer);
4434
4435 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004436 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004437 if (error.isError())
4438 {
Jamie Madill437fa652016-05-03 15:13:24 -04004439 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004440 return GL_FALSE;
4441 }
4442
4443 return result;
4444}
4445
Corentin Wallez336129f2017-10-17 15:55:40 -04004446void *Context::mapBufferRange(BufferBinding target,
4447 GLintptr offset,
4448 GLsizeiptr length,
4449 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004450{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004451 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004452 ASSERT(buffer);
4453
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004454 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004455 if (error.isError())
4456 {
Jamie Madill437fa652016-05-03 15:13:24 -04004457 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004458 return nullptr;
4459 }
4460
4461 return buffer->getMapPointer();
4462}
4463
Corentin Wallez336129f2017-10-17 15:55:40 -04004464void Context::flushMappedBufferRange(BufferBinding /*target*/,
4465 GLintptr /*offset*/,
4466 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004467{
4468 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4469}
4470
Jamie Madillbc918e72018-03-08 09:47:21 -05004471Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004472{
Geoff Langa8cb2872018-03-09 16:09:40 -05004473 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004474}
4475
Jamie Madillbc918e72018-03-08 09:47:21 -05004476Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004477{
Geoff Langa8cb2872018-03-09 16:09:40 -05004478 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004479}
4480
Jamie Madillbc918e72018-03-08 09:47:21 -05004481Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004482{
Geoff Langa8cb2872018-03-09 16:09:40 -05004483 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004484}
4485
Geoff Lang9bf86f02018-07-26 11:46:34 -04004486Error Context::syncStateForPathOperation()
4487{
4488 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4489
4490 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4491 ANGLE_TRY(syncDirtyBits());
4492
4493 return NoError();
4494}
4495
Jiajia Qin5451d532017-11-16 17:16:34 +08004496void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4497{
4498 UNIMPLEMENTED();
4499}
4500
Jamie Madillc20ab272016-06-09 07:20:46 -07004501void Context::activeTexture(GLenum texture)
4502{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004503 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004504}
4505
Jamie Madill876429b2017-04-20 15:46:24 -04004506void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004507{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004508 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004509}
4510
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004511void Context::blendEquation(GLenum mode)
4512{
4513 mGLState.setBlendEquation(mode, mode);
4514}
4515
Jamie Madillc20ab272016-06-09 07:20:46 -07004516void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4517{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004518 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004519}
4520
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004521void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4522{
4523 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4524}
4525
Jamie Madillc20ab272016-06-09 07:20:46 -07004526void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4527{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004528 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004529}
4530
Jamie Madill876429b2017-04-20 15:46:24 -04004531void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004532{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004533 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004534}
4535
Jamie Madill876429b2017-04-20 15:46:24 -04004536void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004537{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004538 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07004539}
4540
4541void Context::clearStencil(GLint s)
4542{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004543 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004544}
4545
4546void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4547{
Geoff Lang92019432017-11-20 13:09:34 -05004548 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4549 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004550}
4551
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004552void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004553{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004554 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004555}
4556
4557void Context::depthFunc(GLenum func)
4558{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004559 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004560}
4561
4562void Context::depthMask(GLboolean flag)
4563{
Geoff Lang92019432017-11-20 13:09:34 -05004564 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004565}
4566
Jamie Madill876429b2017-04-20 15:46:24 -04004567void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004568{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004569 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07004570}
4571
4572void Context::disable(GLenum cap)
4573{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004574 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004575 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004576}
4577
4578void Context::disableVertexAttribArray(GLuint index)
4579{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004580 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004581 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004582}
4583
4584void Context::enable(GLenum cap)
4585{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004586 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004587 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004588}
4589
4590void Context::enableVertexAttribArray(GLuint index)
4591{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004592 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004593 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004594}
4595
4596void Context::frontFace(GLenum mode)
4597{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004598 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004599}
4600
4601void Context::hint(GLenum target, GLenum mode)
4602{
4603 switch (target)
4604 {
4605 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004606 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004607 break;
4608
4609 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004610 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004611 break;
4612
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004613 case GL_PERSPECTIVE_CORRECTION_HINT:
4614 case GL_POINT_SMOOTH_HINT:
4615 case GL_LINE_SMOOTH_HINT:
4616 case GL_FOG_HINT:
4617 mGLState.gles1().setHint(target, mode);
4618 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004619 default:
4620 UNREACHABLE();
4621 return;
4622 }
4623}
4624
4625void Context::lineWidth(GLfloat width)
4626{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004627 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004628}
4629
4630void Context::pixelStorei(GLenum pname, GLint param)
4631{
4632 switch (pname)
4633 {
4634 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004635 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004636 break;
4637
4638 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004639 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004640 break;
4641
4642 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004643 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004644 break;
4645
4646 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004647 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004648 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004649 break;
4650
4651 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004652 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004653 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004654 break;
4655
4656 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004657 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004658 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004659 break;
4660
4661 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004662 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004663 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004664 break;
4665
4666 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004667 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004668 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004669 break;
4670
4671 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004672 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004673 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004674 break;
4675
4676 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004677 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004678 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004679 break;
4680
4681 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004682 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004683 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004684 break;
4685
4686 default:
4687 UNREACHABLE();
4688 return;
4689 }
4690}
4691
4692void Context::polygonOffset(GLfloat factor, GLfloat units)
4693{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004694 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004695}
4696
Jamie Madill876429b2017-04-20 15:46:24 -04004697void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004698{
Geoff Lang92019432017-11-20 13:09:34 -05004699 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004700}
4701
Jiawei Shaodb342272017-09-27 10:21:45 +08004702void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4703{
4704 mGLState.setSampleMaskParams(maskNumber, mask);
4705}
4706
Jamie Madillc20ab272016-06-09 07:20:46 -07004707void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4708{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004709 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004710}
4711
4712void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4713{
4714 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4715 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004716 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004717 }
4718
4719 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4720 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004721 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004722 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004723
4724 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004725}
4726
4727void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4728{
4729 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4730 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004731 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004732 }
4733
4734 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4735 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004736 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004737 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004738
4739 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004740}
4741
4742void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4743{
4744 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4745 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004746 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004747 }
4748
4749 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4750 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004751 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004752 }
4753}
4754
4755void Context::vertexAttrib1f(GLuint index, GLfloat x)
4756{
4757 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004758 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004759 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004760}
4761
4762void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4763{
4764 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004765 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004766 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004767}
4768
4769void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4770{
4771 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004772 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004773 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004774}
4775
4776void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4777{
4778 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004779 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004780 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004781}
4782
4783void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4784{
4785 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004786 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004787 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004788}
4789
4790void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4791{
4792 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004793 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004794 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004795}
4796
4797void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4798{
4799 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004800 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004801 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004802}
4803
4804void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4805{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004806 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004807 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004808}
4809
4810void Context::vertexAttribPointer(GLuint index,
4811 GLint size,
4812 GLenum type,
4813 GLboolean normalized,
4814 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004815 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004816{
Corentin Wallez336129f2017-10-17 15:55:40 -04004817 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004818 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004819 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004820}
4821
Shao80957d92017-02-20 21:25:59 +08004822void Context::vertexAttribFormat(GLuint attribIndex,
4823 GLint size,
4824 GLenum type,
4825 GLboolean normalized,
4826 GLuint relativeOffset)
4827{
Geoff Lang92019432017-11-20 13:09:34 -05004828 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004829 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004830 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004831}
4832
4833void Context::vertexAttribIFormat(GLuint attribIndex,
4834 GLint size,
4835 GLenum type,
4836 GLuint relativeOffset)
4837{
4838 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004839 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004840}
4841
4842void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4843{
Shaodde78e82017-05-22 14:13:27 +08004844 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004845 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004846}
4847
Jiajia Qin5451d532017-11-16 17:16:34 +08004848void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004849{
4850 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004851 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004852}
4853
Jamie Madillc20ab272016-06-09 07:20:46 -07004854void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4855{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004856 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004857}
4858
4859void Context::vertexAttribIPointer(GLuint index,
4860 GLint size,
4861 GLenum type,
4862 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004863 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004864{
Corentin Wallez336129f2017-10-17 15:55:40 -04004865 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4866 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004867 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004868}
4869
4870void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4871{
4872 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004873 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004874 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004875}
4876
4877void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4878{
4879 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004880 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004881 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004882}
4883
4884void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4885{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004886 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004887 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004888}
4889
4890void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4891{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004892 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004893 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004894}
4895
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004896void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4897{
4898 const VertexAttribCurrentValueData &currentValues =
4899 getGLState().getVertexAttribCurrentValue(index);
4900 const VertexArray *vao = getGLState().getVertexArray();
4901 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4902 currentValues, pname, params);
4903}
4904
Brandon Jones59770802018-04-02 13:18:42 -07004905void Context::getVertexAttribivRobust(GLuint index,
4906 GLenum pname,
4907 GLsizei bufSize,
4908 GLsizei *length,
4909 GLint *params)
4910{
4911 getVertexAttribiv(index, pname, params);
4912}
4913
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004914void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4915{
4916 const VertexAttribCurrentValueData &currentValues =
4917 getGLState().getVertexAttribCurrentValue(index);
4918 const VertexArray *vao = getGLState().getVertexArray();
4919 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4920 currentValues, pname, params);
4921}
4922
Brandon Jones59770802018-04-02 13:18:42 -07004923void Context::getVertexAttribfvRobust(GLuint index,
4924 GLenum pname,
4925 GLsizei bufSize,
4926 GLsizei *length,
4927 GLfloat *params)
4928{
4929 getVertexAttribfv(index, pname, params);
4930}
4931
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004932void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4933{
4934 const VertexAttribCurrentValueData &currentValues =
4935 getGLState().getVertexAttribCurrentValue(index);
4936 const VertexArray *vao = getGLState().getVertexArray();
4937 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4938 currentValues, pname, params);
4939}
4940
Brandon Jones59770802018-04-02 13:18:42 -07004941void Context::getVertexAttribIivRobust(GLuint index,
4942 GLenum pname,
4943 GLsizei bufSize,
4944 GLsizei *length,
4945 GLint *params)
4946{
4947 getVertexAttribIiv(index, pname, params);
4948}
4949
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004950void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4951{
4952 const VertexAttribCurrentValueData &currentValues =
4953 getGLState().getVertexAttribCurrentValue(index);
4954 const VertexArray *vao = getGLState().getVertexArray();
4955 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4956 currentValues, pname, params);
4957}
4958
Brandon Jones59770802018-04-02 13:18:42 -07004959void Context::getVertexAttribIuivRobust(GLuint index,
4960 GLenum pname,
4961 GLsizei bufSize,
4962 GLsizei *length,
4963 GLuint *params)
4964{
4965 getVertexAttribIuiv(index, pname, params);
4966}
4967
Jamie Madill876429b2017-04-20 15:46:24 -04004968void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004969{
4970 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4971 QueryVertexAttribPointerv(attrib, pname, pointer);
4972}
4973
Brandon Jones59770802018-04-02 13:18:42 -07004974void Context::getVertexAttribPointervRobust(GLuint index,
4975 GLenum pname,
4976 GLsizei bufSize,
4977 GLsizei *length,
4978 void **pointer)
4979{
4980 getVertexAttribPointerv(index, pname, pointer);
4981}
4982
Jamie Madillc20ab272016-06-09 07:20:46 -07004983void Context::debugMessageControl(GLenum source,
4984 GLenum type,
4985 GLenum severity,
4986 GLsizei count,
4987 const GLuint *ids,
4988 GLboolean enabled)
4989{
4990 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004991 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05004992 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07004993}
4994
4995void Context::debugMessageInsert(GLenum source,
4996 GLenum type,
4997 GLuint id,
4998 GLenum severity,
4999 GLsizei length,
5000 const GLchar *buf)
5001{
5002 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005003 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005004}
5005
5006void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5007{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005008 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005009}
5010
5011GLuint Context::getDebugMessageLog(GLuint count,
5012 GLsizei bufSize,
5013 GLenum *sources,
5014 GLenum *types,
5015 GLuint *ids,
5016 GLenum *severities,
5017 GLsizei *lengths,
5018 GLchar *messageLog)
5019{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005020 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5021 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005022}
5023
5024void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5025{
5026 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005027 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005028 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005029}
5030
5031void Context::popDebugGroup()
5032{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005033 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005034 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005035}
5036
Corentin Wallez336129f2017-10-17 15:55:40 -04005037void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005038{
5039 Buffer *buffer = mGLState.getTargetBuffer(target);
5040 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005041 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005042}
5043
Corentin Wallez336129f2017-10-17 15:55:40 -04005044void Context::bufferSubData(BufferBinding target,
5045 GLintptr offset,
5046 GLsizeiptr size,
5047 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005048{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005049 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005050 {
5051 return;
5052 }
5053
5054 Buffer *buffer = mGLState.getTargetBuffer(target);
5055 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005056 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005057}
5058
Jamie Madillef300b12016-10-07 15:12:09 -04005059void Context::attachShader(GLuint program, GLuint shader)
5060{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005061 Program *programObject = mState.mShaderPrograms->getProgram(program);
5062 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005063 ASSERT(programObject && shaderObject);
5064 programObject->attachShader(shaderObject);
5065}
5066
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005067const Workarounds &Context::getWorkarounds() const
5068{
5069 return mWorkarounds;
5070}
5071
Corentin Wallez336129f2017-10-17 15:55:40 -04005072void Context::copyBufferSubData(BufferBinding readTarget,
5073 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005074 GLintptr readOffset,
5075 GLintptr writeOffset,
5076 GLsizeiptr size)
5077{
5078 // if size is zero, the copy is a successful no-op
5079 if (size == 0)
5080 {
5081 return;
5082 }
5083
5084 // TODO(jmadill): cache these.
5085 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5086 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5087
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005088 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005089}
5090
Jamie Madill01a80ee2016-11-07 12:06:18 -05005091void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5092{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005093 // Ideally we could share the program query with the validation layer if possible.
5094 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005095 ASSERT(programObject);
5096 programObject->bindAttributeLocation(index, name);
5097}
5098
Corentin Wallez336129f2017-10-17 15:55:40 -04005099void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005100{
Corentin Wallez336129f2017-10-17 15:55:40 -04005101 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5102 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005103 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005104}
5105
Corentin Wallez336129f2017-10-17 15:55:40 -04005106void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005107{
5108 bindBufferRange(target, index, buffer, 0, 0);
5109}
5110
Corentin Wallez336129f2017-10-17 15:55:40 -04005111void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005112 GLuint index,
5113 GLuint buffer,
5114 GLintptr offset,
5115 GLsizeiptr size)
5116{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005117 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5118 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5119 if (target == BufferBinding::Uniform)
5120 {
5121 mUniformBufferObserverBindings[index].bind(object ? object->getImplementation() : nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04005122 mStateCache.onUniformBufferStateChange(this);
5123 }
5124 else
5125 {
5126 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005127 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005128}
5129
Jamie Madill01a80ee2016-11-07 12:06:18 -05005130void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5131{
5132 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5133 {
5134 bindReadFramebuffer(framebuffer);
5135 }
5136
5137 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5138 {
5139 bindDrawFramebuffer(framebuffer);
5140 }
5141}
5142
5143void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5144{
5145 ASSERT(target == GL_RENDERBUFFER);
5146 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005147 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005148 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005149}
5150
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005151void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005152 GLsizei samples,
5153 GLenum internalformat,
5154 GLsizei width,
5155 GLsizei height,
5156 GLboolean fixedsamplelocations)
5157{
5158 Extents size(width, height, 1);
5159 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005160 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5161 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005162}
5163
Olli Etuaho89664842018-08-24 14:45:36 +03005164void Context::texStorage3DMultisample(TextureType target,
5165 GLsizei samples,
5166 GLenum internalformat,
5167 GLsizei width,
5168 GLsizei height,
5169 GLsizei depth,
5170 GLboolean fixedsamplelocations)
5171{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005172 Extents size(width, height, depth);
5173 Texture *texture = getTargetTexture(target);
5174 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5175 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005176}
5177
JiangYizhoubddc46b2016-12-09 09:50:51 +08005178void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5179{
JiangYizhou5b03f472017-01-09 10:22:53 +08005180 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5181 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005182 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005183 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005184
5185 switch (pname)
5186 {
5187 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005188 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005189 break;
5190 default:
5191 UNREACHABLE();
5192 }
5193}
5194
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005195void Context::getMultisamplefvRobust(GLenum pname,
5196 GLuint index,
5197 GLsizei bufSize,
5198 GLsizei *length,
5199 GLfloat *val)
5200{
5201 UNIMPLEMENTED();
5202}
5203
Jamie Madille8fb6402017-02-14 17:56:40 -05005204void Context::renderbufferStorage(GLenum target,
5205 GLenum internalformat,
5206 GLsizei width,
5207 GLsizei height)
5208{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005209 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5210 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5211
Jamie Madille8fb6402017-02-14 17:56:40 -05005212 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005213 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005214}
5215
5216void Context::renderbufferStorageMultisample(GLenum target,
5217 GLsizei samples,
5218 GLenum internalformat,
5219 GLsizei width,
5220 GLsizei height)
5221{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005222 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5223 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005224
5225 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005226 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005227 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005228}
5229
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005230void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5231{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005232 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005233 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005234}
5235
JiangYizhoue18e6392017-02-20 10:32:23 +08005236void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5237{
5238 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5239 QueryFramebufferParameteriv(framebuffer, pname, params);
5240}
5241
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005242void Context::getFramebufferParameterivRobust(GLenum target,
5243 GLenum pname,
5244 GLsizei bufSize,
5245 GLsizei *length,
5246 GLint *params)
5247{
5248 UNIMPLEMENTED();
5249}
5250
Jiajia Qin5451d532017-11-16 17:16:34 +08005251void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005252{
5253 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005254 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005255}
5256
Jamie Madilldec86232018-07-11 09:01:18 -04005257bool Context::getScratchBuffer(size_t requstedSizeBytes,
5258 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005259{
Jamie Madilldec86232018-07-11 09:01:18 -04005260 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005261}
5262
Jamie Madilldec86232018-07-11 09:01:18 -04005263bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5264 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005265{
Jamie Madilldec86232018-07-11 09:01:18 -04005266 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005267}
5268
Xinghua Cao10a4d432017-11-28 14:46:26 +08005269Error Context::prepareForDispatch()
5270{
Geoff Langa8cb2872018-03-09 16:09:40 -05005271 ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005272
5273 if (isRobustResourceInitEnabled())
5274 {
5275 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5276 }
5277
5278 return NoError();
5279}
5280
Xinghua Cao2b396592017-03-29 15:36:04 +08005281void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5282{
5283 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5284 {
5285 return;
5286 }
5287
Xinghua Cao10a4d432017-11-28 14:46:26 +08005288 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005289 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005290}
5291
Jiajia Qin5451d532017-11-16 17:16:34 +08005292void Context::dispatchComputeIndirect(GLintptr indirect)
5293{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005294 ANGLE_CONTEXT_TRY(prepareForDispatch());
5295 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005296}
5297
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005298void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005299 GLsizei levels,
5300 GLenum internalFormat,
5301 GLsizei width,
5302 GLsizei height)
5303{
5304 Extents size(width, height, 1);
5305 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005306 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005307}
5308
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005309void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005310 GLsizei levels,
5311 GLenum internalFormat,
5312 GLsizei width,
5313 GLsizei height,
5314 GLsizei depth)
5315{
5316 Extents size(width, height, depth);
5317 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005318 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005319}
5320
Jiajia Qin5451d532017-11-16 17:16:34 +08005321void Context::memoryBarrier(GLbitfield barriers)
5322{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005323 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005324}
5325
5326void Context::memoryBarrierByRegion(GLbitfield barriers)
5327{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005328 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005329}
5330
Jamie Madillc1d770e2017-04-13 17:31:24 -04005331GLenum Context::checkFramebufferStatus(GLenum target)
5332{
5333 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5334 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005335 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005336}
5337
5338void Context::compileShader(GLuint shader)
5339{
5340 Shader *shaderObject = GetValidShader(this, shader);
5341 if (!shaderObject)
5342 {
5343 return;
5344 }
5345 shaderObject->compile(this);
5346}
5347
5348void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5349{
5350 for (int i = 0; i < n; i++)
5351 {
5352 deleteBuffer(buffers[i]);
5353 }
5354}
5355
5356void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5357{
5358 for (int i = 0; i < n; i++)
5359 {
5360 if (framebuffers[i] != 0)
5361 {
5362 deleteFramebuffer(framebuffers[i]);
5363 }
5364 }
5365}
5366
5367void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5368{
5369 for (int i = 0; i < n; i++)
5370 {
5371 deleteRenderbuffer(renderbuffers[i]);
5372 }
5373}
5374
5375void Context::deleteTextures(GLsizei n, const GLuint *textures)
5376{
5377 for (int i = 0; i < n; i++)
5378 {
5379 if (textures[i] != 0)
5380 {
5381 deleteTexture(textures[i]);
5382 }
5383 }
5384}
5385
5386void Context::detachShader(GLuint program, GLuint shader)
5387{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005388 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005389 ASSERT(programObject);
5390
5391 Shader *shaderObject = getShader(shader);
5392 ASSERT(shaderObject);
5393
5394 programObject->detachShader(this, shaderObject);
5395}
5396
5397void Context::genBuffers(GLsizei n, GLuint *buffers)
5398{
5399 for (int i = 0; i < n; i++)
5400 {
5401 buffers[i] = createBuffer();
5402 }
5403}
5404
5405void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5406{
5407 for (int i = 0; i < n; i++)
5408 {
5409 framebuffers[i] = createFramebuffer();
5410 }
5411}
5412
5413void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5414{
5415 for (int i = 0; i < n; i++)
5416 {
5417 renderbuffers[i] = createRenderbuffer();
5418 }
5419}
5420
5421void Context::genTextures(GLsizei n, GLuint *textures)
5422{
5423 for (int i = 0; i < n; i++)
5424 {
5425 textures[i] = createTexture();
5426 }
5427}
5428
5429void Context::getActiveAttrib(GLuint program,
5430 GLuint index,
5431 GLsizei bufsize,
5432 GLsizei *length,
5433 GLint *size,
5434 GLenum *type,
5435 GLchar *name)
5436{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005437 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005438 ASSERT(programObject);
5439 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5440}
5441
5442void Context::getActiveUniform(GLuint program,
5443 GLuint index,
5444 GLsizei bufsize,
5445 GLsizei *length,
5446 GLint *size,
5447 GLenum *type,
5448 GLchar *name)
5449{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005450 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005451 ASSERT(programObject);
5452 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5453}
5454
5455void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5456{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005457 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005458 ASSERT(programObject);
5459 programObject->getAttachedShaders(maxcount, count, shaders);
5460}
5461
5462GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5463{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005464 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005465 ASSERT(programObject);
5466 return programObject->getAttributeLocation(name);
5467}
5468
5469void Context::getBooleanv(GLenum pname, GLboolean *params)
5470{
5471 GLenum nativeType;
5472 unsigned int numParams = 0;
5473 getQueryParameterInfo(pname, &nativeType, &numParams);
5474
5475 if (nativeType == GL_BOOL)
5476 {
5477 getBooleanvImpl(pname, params);
5478 }
5479 else
5480 {
5481 CastStateValues(this, nativeType, pname, numParams, params);
5482 }
5483}
5484
Brandon Jones59770802018-04-02 13:18:42 -07005485void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5486{
5487 getBooleanv(pname, params);
5488}
5489
Jamie Madillc1d770e2017-04-13 17:31:24 -04005490void Context::getFloatv(GLenum pname, GLfloat *params)
5491{
5492 GLenum nativeType;
5493 unsigned int numParams = 0;
5494 getQueryParameterInfo(pname, &nativeType, &numParams);
5495
5496 if (nativeType == GL_FLOAT)
5497 {
5498 getFloatvImpl(pname, params);
5499 }
5500 else
5501 {
5502 CastStateValues(this, nativeType, pname, numParams, params);
5503 }
5504}
5505
Brandon Jones59770802018-04-02 13:18:42 -07005506void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5507{
5508 getFloatv(pname, params);
5509}
5510
Jamie Madillc1d770e2017-04-13 17:31:24 -04005511void Context::getIntegerv(GLenum pname, GLint *params)
5512{
5513 GLenum nativeType;
5514 unsigned int numParams = 0;
5515 getQueryParameterInfo(pname, &nativeType, &numParams);
5516
5517 if (nativeType == GL_INT)
5518 {
5519 getIntegervImpl(pname, params);
5520 }
5521 else
5522 {
5523 CastStateValues(this, nativeType, pname, numParams, params);
5524 }
5525}
5526
Brandon Jones59770802018-04-02 13:18:42 -07005527void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5528{
5529 getIntegerv(pname, data);
5530}
5531
Jamie Madillc1d770e2017-04-13 17:31:24 -04005532void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5533{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005534 // Don't resolve link if checking the link completion status.
5535 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5536 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005537 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005538 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005539}
5540
Brandon Jones59770802018-04-02 13:18:42 -07005541void Context::getProgramivRobust(GLuint program,
5542 GLenum pname,
5543 GLsizei bufSize,
5544 GLsizei *length,
5545 GLint *params)
5546{
5547 getProgramiv(program, pname, params);
5548}
5549
Jiajia Qin5451d532017-11-16 17:16:34 +08005550void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5551{
5552 UNIMPLEMENTED();
5553}
5554
Jamie Madillbe849e42017-05-02 15:49:00 -04005555void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005556{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005557 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005558 ASSERT(programObject);
5559 programObject->getInfoLog(bufsize, length, infolog);
5560}
5561
Jiajia Qin5451d532017-11-16 17:16:34 +08005562void Context::getProgramPipelineInfoLog(GLuint pipeline,
5563 GLsizei bufSize,
5564 GLsizei *length,
5565 GLchar *infoLog)
5566{
5567 UNIMPLEMENTED();
5568}
5569
Jamie Madillc1d770e2017-04-13 17:31:24 -04005570void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5571{
5572 Shader *shaderObject = getShader(shader);
5573 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005574 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005575}
5576
Brandon Jones59770802018-04-02 13:18:42 -07005577void Context::getShaderivRobust(GLuint shader,
5578 GLenum pname,
5579 GLsizei bufSize,
5580 GLsizei *length,
5581 GLint *params)
5582{
5583 getShaderiv(shader, pname, params);
5584}
5585
Jamie Madillc1d770e2017-04-13 17:31:24 -04005586void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5587{
5588 Shader *shaderObject = getShader(shader);
5589 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005590 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005591}
5592
5593void Context::getShaderPrecisionFormat(GLenum shadertype,
5594 GLenum precisiontype,
5595 GLint *range,
5596 GLint *precision)
5597{
5598 // TODO(jmadill): Compute shaders.
5599
5600 switch (shadertype)
5601 {
5602 case GL_VERTEX_SHADER:
5603 switch (precisiontype)
5604 {
5605 case GL_LOW_FLOAT:
5606 mCaps.vertexLowpFloat.get(range, precision);
5607 break;
5608 case GL_MEDIUM_FLOAT:
5609 mCaps.vertexMediumpFloat.get(range, precision);
5610 break;
5611 case GL_HIGH_FLOAT:
5612 mCaps.vertexHighpFloat.get(range, precision);
5613 break;
5614
5615 case GL_LOW_INT:
5616 mCaps.vertexLowpInt.get(range, precision);
5617 break;
5618 case GL_MEDIUM_INT:
5619 mCaps.vertexMediumpInt.get(range, precision);
5620 break;
5621 case GL_HIGH_INT:
5622 mCaps.vertexHighpInt.get(range, precision);
5623 break;
5624
5625 default:
5626 UNREACHABLE();
5627 return;
5628 }
5629 break;
5630
5631 case GL_FRAGMENT_SHADER:
5632 switch (precisiontype)
5633 {
5634 case GL_LOW_FLOAT:
5635 mCaps.fragmentLowpFloat.get(range, precision);
5636 break;
5637 case GL_MEDIUM_FLOAT:
5638 mCaps.fragmentMediumpFloat.get(range, precision);
5639 break;
5640 case GL_HIGH_FLOAT:
5641 mCaps.fragmentHighpFloat.get(range, precision);
5642 break;
5643
5644 case GL_LOW_INT:
5645 mCaps.fragmentLowpInt.get(range, precision);
5646 break;
5647 case GL_MEDIUM_INT:
5648 mCaps.fragmentMediumpInt.get(range, precision);
5649 break;
5650 case GL_HIGH_INT:
5651 mCaps.fragmentHighpInt.get(range, precision);
5652 break;
5653
5654 default:
5655 UNREACHABLE();
5656 return;
5657 }
5658 break;
5659
5660 default:
5661 UNREACHABLE();
5662 return;
5663 }
5664}
5665
5666void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5667{
5668 Shader *shaderObject = getShader(shader);
5669 ASSERT(shaderObject);
5670 shaderObject->getSource(bufsize, length, source);
5671}
5672
5673void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5674{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005675 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005676 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005677 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005678}
5679
Brandon Jones59770802018-04-02 13:18:42 -07005680void Context::getUniformfvRobust(GLuint program,
5681 GLint location,
5682 GLsizei bufSize,
5683 GLsizei *length,
5684 GLfloat *params)
5685{
5686 getUniformfv(program, location, params);
5687}
5688
Jamie Madillc1d770e2017-04-13 17:31:24 -04005689void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5690{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005691 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005692 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005693 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005694}
5695
Brandon Jones59770802018-04-02 13:18:42 -07005696void Context::getUniformivRobust(GLuint program,
5697 GLint location,
5698 GLsizei bufSize,
5699 GLsizei *length,
5700 GLint *params)
5701{
5702 getUniformiv(program, location, params);
5703}
5704
Jamie Madillc1d770e2017-04-13 17:31:24 -04005705GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5706{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005707 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005708 ASSERT(programObject);
5709 return programObject->getUniformLocation(name);
5710}
5711
5712GLboolean Context::isBuffer(GLuint buffer)
5713{
5714 if (buffer == 0)
5715 {
5716 return GL_FALSE;
5717 }
5718
5719 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5720}
5721
5722GLboolean Context::isEnabled(GLenum cap)
5723{
5724 return mGLState.getEnableFeature(cap);
5725}
5726
5727GLboolean Context::isFramebuffer(GLuint framebuffer)
5728{
5729 if (framebuffer == 0)
5730 {
5731 return GL_FALSE;
5732 }
5733
5734 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5735}
5736
5737GLboolean Context::isProgram(GLuint program)
5738{
5739 if (program == 0)
5740 {
5741 return GL_FALSE;
5742 }
5743
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005744 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005745}
5746
5747GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5748{
5749 if (renderbuffer == 0)
5750 {
5751 return GL_FALSE;
5752 }
5753
5754 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5755}
5756
5757GLboolean Context::isShader(GLuint shader)
5758{
5759 if (shader == 0)
5760 {
5761 return GL_FALSE;
5762 }
5763
5764 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5765}
5766
5767GLboolean Context::isTexture(GLuint texture)
5768{
5769 if (texture == 0)
5770 {
5771 return GL_FALSE;
5772 }
5773
5774 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5775}
5776
5777void Context::linkProgram(GLuint program)
5778{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005779 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005780 ASSERT(programObject);
5781 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08005782
5783 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
5784 // don't need to worry that:
5785 // 1. Draw calls after link use the new executable code or the old one depending on the link
5786 // result.
5787 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
5788 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
5789 // ProgramD3D.
5790 if (programObject->isInUse())
5791 {
Jamie Madill785e8a02018-10-04 17:42:00 -04005792 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04005793 if (programObject->isLinked())
5794 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04005795 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04005796 }
jchen107ae70d82018-07-06 13:47:01 +08005797 mStateCache.onProgramExecutableChange(this);
5798 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005799}
5800
5801void Context::releaseShaderCompiler()
5802{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005803 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005804}
5805
5806void Context::shaderBinary(GLsizei n,
5807 const GLuint *shaders,
5808 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005809 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005810 GLsizei length)
5811{
5812 // No binary shader formats are supported.
5813 UNIMPLEMENTED();
5814}
5815
Olli Etuaho0ca09752018-09-24 11:00:50 +03005816void Context::bindFragDataLocationIndexed(GLuint program,
5817 GLuint colorNumber,
5818 GLuint index,
5819 const char *name)
5820{
5821 Program *programObject = getProgramNoResolveLink(program);
5822 programObject->bindFragmentOutputLocation(colorNumber, name);
5823 programObject->bindFragmentOutputIndex(index, name);
5824}
5825
5826void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
5827{
5828 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
5829}
5830
5831int Context::getFragDataIndex(GLuint program, const char *name)
5832{
5833 Program *programObject = getProgramResolveLink(program);
5834 return programObject->getFragDataIndex(name);
5835}
5836
5837int Context::getProgramResourceLocationIndex(GLuint program,
5838 GLenum programInterface,
5839 const char *name)
5840{
5841 Program *programObject = getProgramResolveLink(program);
5842 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
5843 return programObject->getFragDataIndex(name);
5844}
5845
Jamie Madillc1d770e2017-04-13 17:31:24 -04005846void Context::shaderSource(GLuint shader,
5847 GLsizei count,
5848 const GLchar *const *string,
5849 const GLint *length)
5850{
5851 Shader *shaderObject = getShader(shader);
5852 ASSERT(shaderObject);
5853 shaderObject->setSource(count, string, length);
5854}
5855
5856void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5857{
5858 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5859}
5860
5861void Context::stencilMask(GLuint mask)
5862{
5863 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5864}
5865
5866void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5867{
5868 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5869}
5870
5871void Context::uniform1f(GLint location, GLfloat x)
5872{
5873 Program *program = mGLState.getProgram();
5874 program->setUniform1fv(location, 1, &x);
5875}
5876
5877void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5878{
5879 Program *program = mGLState.getProgram();
5880 program->setUniform1fv(location, count, v);
5881}
5882
Jamie Madill7e4eff12018-08-08 15:49:26 -04005883void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005884{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005885 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04005886 {
5887 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04005888 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04005889 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005890}
5891
Jamie Madill7e4eff12018-08-08 15:49:26 -04005892void Context::uniform1i(GLint location, GLint x)
5893{
5894 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
5895}
5896
Jamie Madillc1d770e2017-04-13 17:31:24 -04005897void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5898{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005899 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005900}
5901
5902void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5903{
5904 GLfloat xy[2] = {x, y};
5905 Program *program = mGLState.getProgram();
5906 program->setUniform2fv(location, 1, xy);
5907}
5908
5909void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5910{
5911 Program *program = mGLState.getProgram();
5912 program->setUniform2fv(location, count, v);
5913}
5914
5915void Context::uniform2i(GLint location, GLint x, GLint y)
5916{
5917 GLint xy[2] = {x, y};
5918 Program *program = mGLState.getProgram();
5919 program->setUniform2iv(location, 1, xy);
5920}
5921
5922void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
5923{
5924 Program *program = mGLState.getProgram();
5925 program->setUniform2iv(location, count, v);
5926}
5927
5928void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5929{
5930 GLfloat xyz[3] = {x, y, z};
5931 Program *program = mGLState.getProgram();
5932 program->setUniform3fv(location, 1, xyz);
5933}
5934
5935void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
5936{
5937 Program *program = mGLState.getProgram();
5938 program->setUniform3fv(location, count, v);
5939}
5940
5941void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
5942{
5943 GLint xyz[3] = {x, y, z};
5944 Program *program = mGLState.getProgram();
5945 program->setUniform3iv(location, 1, xyz);
5946}
5947
5948void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
5949{
5950 Program *program = mGLState.getProgram();
5951 program->setUniform3iv(location, count, v);
5952}
5953
5954void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5955{
5956 GLfloat xyzw[4] = {x, y, z, w};
5957 Program *program = mGLState.getProgram();
5958 program->setUniform4fv(location, 1, xyzw);
5959}
5960
5961void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
5962{
5963 Program *program = mGLState.getProgram();
5964 program->setUniform4fv(location, count, v);
5965}
5966
5967void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5968{
5969 GLint xyzw[4] = {x, y, z, w};
5970 Program *program = mGLState.getProgram();
5971 program->setUniform4iv(location, 1, xyzw);
5972}
5973
5974void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
5975{
5976 Program *program = mGLState.getProgram();
5977 program->setUniform4iv(location, count, v);
5978}
5979
5980void Context::uniformMatrix2fv(GLint location,
5981 GLsizei count,
5982 GLboolean transpose,
5983 const GLfloat *value)
5984{
5985 Program *program = mGLState.getProgram();
5986 program->setUniformMatrix2fv(location, count, transpose, value);
5987}
5988
5989void Context::uniformMatrix3fv(GLint location,
5990 GLsizei count,
5991 GLboolean transpose,
5992 const GLfloat *value)
5993{
5994 Program *program = mGLState.getProgram();
5995 program->setUniformMatrix3fv(location, count, transpose, value);
5996}
5997
5998void Context::uniformMatrix4fv(GLint location,
5999 GLsizei count,
6000 GLboolean transpose,
6001 const GLfloat *value)
6002{
6003 Program *program = mGLState.getProgram();
6004 program->setUniformMatrix4fv(location, count, transpose, value);
6005}
6006
6007void Context::validateProgram(GLuint program)
6008{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006009 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006010 ASSERT(programObject);
6011 programObject->validate(mCaps);
6012}
6013
Jiajia Qin5451d532017-11-16 17:16:34 +08006014void Context::validateProgramPipeline(GLuint pipeline)
6015{
6016 UNIMPLEMENTED();
6017}
6018
Jamie Madilld04908b2017-06-09 14:15:35 -04006019void Context::getProgramBinary(GLuint program,
6020 GLsizei bufSize,
6021 GLsizei *length,
6022 GLenum *binaryFormat,
6023 void *binary)
6024{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006025 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006026 ASSERT(programObject != nullptr);
6027
6028 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
6029}
6030
6031void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6032{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006033 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006034 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006035
Jamie Madilld04908b2017-06-09 14:15:35 -04006036 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006037 if (programObject->isInUse())
6038 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006039 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006040 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006041 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006042}
6043
Jamie Madillff325f12017-08-26 15:06:05 -04006044void Context::uniform1ui(GLint location, GLuint v0)
6045{
6046 Program *program = mGLState.getProgram();
6047 program->setUniform1uiv(location, 1, &v0);
6048}
6049
6050void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6051{
6052 Program *program = mGLState.getProgram();
6053 const GLuint xy[] = {v0, v1};
6054 program->setUniform2uiv(location, 1, xy);
6055}
6056
6057void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6058{
6059 Program *program = mGLState.getProgram();
6060 const GLuint xyz[] = {v0, v1, v2};
6061 program->setUniform3uiv(location, 1, xyz);
6062}
6063
6064void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6065{
6066 Program *program = mGLState.getProgram();
6067 const GLuint xyzw[] = {v0, v1, v2, v3};
6068 program->setUniform4uiv(location, 1, xyzw);
6069}
6070
6071void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6072{
6073 Program *program = mGLState.getProgram();
6074 program->setUniform1uiv(location, count, value);
6075}
6076void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6077{
6078 Program *program = mGLState.getProgram();
6079 program->setUniform2uiv(location, count, value);
6080}
6081
6082void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6083{
6084 Program *program = mGLState.getProgram();
6085 program->setUniform3uiv(location, count, value);
6086}
6087
6088void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6089{
6090 Program *program = mGLState.getProgram();
6091 program->setUniform4uiv(location, count, value);
6092}
6093
Jamie Madillf0e04492017-08-26 15:28:42 -04006094void Context::genQueries(GLsizei n, GLuint *ids)
6095{
6096 for (GLsizei i = 0; i < n; i++)
6097 {
6098 GLuint handle = mQueryHandleAllocator.allocate();
6099 mQueryMap.assign(handle, nullptr);
6100 ids[i] = handle;
6101 }
6102}
6103
6104void Context::deleteQueries(GLsizei n, const GLuint *ids)
6105{
6106 for (int i = 0; i < n; i++)
6107 {
6108 GLuint query = ids[i];
6109
6110 Query *queryObject = nullptr;
6111 if (mQueryMap.erase(query, &queryObject))
6112 {
6113 mQueryHandleAllocator.release(query);
6114 if (queryObject)
6115 {
6116 queryObject->release(this);
6117 }
6118 }
6119 }
6120}
6121
6122GLboolean Context::isQuery(GLuint id)
6123{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006124 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006125}
6126
Jamie Madillc8c95812017-08-26 18:40:09 -04006127void Context::uniformMatrix2x3fv(GLint location,
6128 GLsizei count,
6129 GLboolean transpose,
6130 const GLfloat *value)
6131{
6132 Program *program = mGLState.getProgram();
6133 program->setUniformMatrix2x3fv(location, count, transpose, value);
6134}
6135
6136void Context::uniformMatrix3x2fv(GLint location,
6137 GLsizei count,
6138 GLboolean transpose,
6139 const GLfloat *value)
6140{
6141 Program *program = mGLState.getProgram();
6142 program->setUniformMatrix3x2fv(location, count, transpose, value);
6143}
6144
6145void Context::uniformMatrix2x4fv(GLint location,
6146 GLsizei count,
6147 GLboolean transpose,
6148 const GLfloat *value)
6149{
6150 Program *program = mGLState.getProgram();
6151 program->setUniformMatrix2x4fv(location, count, transpose, value);
6152}
6153
6154void Context::uniformMatrix4x2fv(GLint location,
6155 GLsizei count,
6156 GLboolean transpose,
6157 const GLfloat *value)
6158{
6159 Program *program = mGLState.getProgram();
6160 program->setUniformMatrix4x2fv(location, count, transpose, value);
6161}
6162
6163void Context::uniformMatrix3x4fv(GLint location,
6164 GLsizei count,
6165 GLboolean transpose,
6166 const GLfloat *value)
6167{
6168 Program *program = mGLState.getProgram();
6169 program->setUniformMatrix3x4fv(location, count, transpose, value);
6170}
6171
6172void Context::uniformMatrix4x3fv(GLint location,
6173 GLsizei count,
6174 GLboolean transpose,
6175 const GLfloat *value)
6176{
6177 Program *program = mGLState.getProgram();
6178 program->setUniformMatrix4x3fv(location, count, transpose, value);
6179}
6180
Jamie Madilld7576732017-08-26 18:49:50 -04006181void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6182{
6183 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6184 {
6185 GLuint vertexArray = arrays[arrayIndex];
6186
6187 if (arrays[arrayIndex] != 0)
6188 {
6189 VertexArray *vertexArrayObject = nullptr;
6190 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6191 {
6192 if (vertexArrayObject != nullptr)
6193 {
6194 detachVertexArray(vertexArray);
6195 vertexArrayObject->onDestroy(this);
6196 }
6197
6198 mVertexArrayHandleAllocator.release(vertexArray);
6199 }
6200 }
6201 }
6202}
6203
6204void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6205{
6206 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6207 {
6208 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6209 mVertexArrayMap.assign(vertexArray, nullptr);
6210 arrays[arrayIndex] = vertexArray;
6211 }
6212}
6213
6214bool Context::isVertexArray(GLuint array)
6215{
6216 if (array == 0)
6217 {
6218 return GL_FALSE;
6219 }
6220
6221 VertexArray *vao = getVertexArray(array);
6222 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6223}
6224
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006225void Context::endTransformFeedback()
6226{
6227 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6228 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006229 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006230}
6231
6232void Context::transformFeedbackVaryings(GLuint program,
6233 GLsizei count,
6234 const GLchar *const *varyings,
6235 GLenum bufferMode)
6236{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006237 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006238 ASSERT(programObject);
6239 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6240}
6241
6242void Context::getTransformFeedbackVarying(GLuint program,
6243 GLuint index,
6244 GLsizei bufSize,
6245 GLsizei *length,
6246 GLsizei *size,
6247 GLenum *type,
6248 GLchar *name)
6249{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006250 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006251 ASSERT(programObject);
6252 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6253}
6254
6255void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6256{
6257 for (int i = 0; i < n; i++)
6258 {
6259 GLuint transformFeedback = ids[i];
6260 if (transformFeedback == 0)
6261 {
6262 continue;
6263 }
6264
6265 TransformFeedback *transformFeedbackObject = nullptr;
6266 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6267 {
6268 if (transformFeedbackObject != nullptr)
6269 {
6270 detachTransformFeedback(transformFeedback);
6271 transformFeedbackObject->release(this);
6272 }
6273
6274 mTransformFeedbackHandleAllocator.release(transformFeedback);
6275 }
6276 }
6277}
6278
6279void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6280{
6281 for (int i = 0; i < n; i++)
6282 {
6283 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6284 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6285 ids[i] = transformFeedback;
6286 }
6287}
6288
6289bool Context::isTransformFeedback(GLuint id)
6290{
6291 if (id == 0)
6292 {
6293 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6294 // returns FALSE
6295 return GL_FALSE;
6296 }
6297
6298 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6299 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6300}
6301
6302void Context::pauseTransformFeedback()
6303{
6304 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6305 transformFeedback->pause();
6306}
6307
6308void Context::resumeTransformFeedback()
6309{
6310 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6311 transformFeedback->resume();
6312}
6313
Jamie Madill12e957f2017-08-26 21:42:26 -04006314void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6315{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006316 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006317 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006318}
6319
Brandon Jones59770802018-04-02 13:18:42 -07006320void Context::getUniformuivRobust(GLuint program,
6321 GLint location,
6322 GLsizei bufSize,
6323 GLsizei *length,
6324 GLuint *params)
6325{
6326 getUniformuiv(program, location, params);
6327}
6328
Jamie Madill12e957f2017-08-26 21:42:26 -04006329GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6330{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006331 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006332 return programObject->getFragDataLocation(name);
6333}
6334
6335void Context::getUniformIndices(GLuint program,
6336 GLsizei uniformCount,
6337 const GLchar *const *uniformNames,
6338 GLuint *uniformIndices)
6339{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006340 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006341 if (!programObject->isLinked())
6342 {
6343 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6344 {
6345 uniformIndices[uniformId] = GL_INVALID_INDEX;
6346 }
6347 }
6348 else
6349 {
6350 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6351 {
6352 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6353 }
6354 }
6355}
6356
6357void Context::getActiveUniformsiv(GLuint program,
6358 GLsizei uniformCount,
6359 const GLuint *uniformIndices,
6360 GLenum pname,
6361 GLint *params)
6362{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006363 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006364 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6365 {
6366 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006367 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006368 }
6369}
6370
6371GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6372{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006373 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006374 return programObject->getUniformBlockIndex(uniformBlockName);
6375}
6376
6377void Context::getActiveUniformBlockiv(GLuint program,
6378 GLuint uniformBlockIndex,
6379 GLenum pname,
6380 GLint *params)
6381{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006382 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006383 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6384}
6385
Brandon Jones59770802018-04-02 13:18:42 -07006386void Context::getActiveUniformBlockivRobust(GLuint program,
6387 GLuint uniformBlockIndex,
6388 GLenum pname,
6389 GLsizei bufSize,
6390 GLsizei *length,
6391 GLint *params)
6392{
6393 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6394}
6395
Jamie Madill12e957f2017-08-26 21:42:26 -04006396void Context::getActiveUniformBlockName(GLuint program,
6397 GLuint uniformBlockIndex,
6398 GLsizei bufSize,
6399 GLsizei *length,
6400 GLchar *uniformBlockName)
6401{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006402 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006403 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6404}
6405
6406void Context::uniformBlockBinding(GLuint program,
6407 GLuint uniformBlockIndex,
6408 GLuint uniformBlockBinding)
6409{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006410 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006411 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006412
6413 if (programObject->isInUse())
6414 {
6415 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006416 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006417 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006418}
6419
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006420GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6421{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006422 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6423 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006424
Jamie Madill70b5bb02017-08-28 13:32:37 -04006425 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006426 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006427 if (error.isError())
6428 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006429 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006430 handleError(error);
6431 return nullptr;
6432 }
6433
Jamie Madill70b5bb02017-08-28 13:32:37 -04006434 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006435}
6436
6437GLboolean Context::isSync(GLsync sync)
6438{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006439 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006440}
6441
6442GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6443{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006444 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006445
6446 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006447 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006448 return result;
6449}
6450
6451void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6452{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006453 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006454 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006455}
6456
6457void Context::getInteger64v(GLenum pname, GLint64 *params)
6458{
6459 GLenum nativeType = GL_NONE;
6460 unsigned int numParams = 0;
6461 getQueryParameterInfo(pname, &nativeType, &numParams);
6462
6463 if (nativeType == GL_INT_64_ANGLEX)
6464 {
6465 getInteger64vImpl(pname, params);
6466 }
6467 else
6468 {
6469 CastStateValues(this, nativeType, pname, numParams, params);
6470 }
6471}
6472
Brandon Jones59770802018-04-02 13:18:42 -07006473void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6474{
6475 getInteger64v(pname, data);
6476}
6477
Corentin Wallez336129f2017-10-17 15:55:40 -04006478void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006479{
6480 Buffer *buffer = mGLState.getTargetBuffer(target);
6481 QueryBufferParameteri64v(buffer, pname, params);
6482}
6483
Brandon Jones59770802018-04-02 13:18:42 -07006484void Context::getBufferParameteri64vRobust(BufferBinding target,
6485 GLenum pname,
6486 GLsizei bufSize,
6487 GLsizei *length,
6488 GLint64 *params)
6489{
6490 getBufferParameteri64v(target, pname, params);
6491}
6492
Jamie Madill3ef140a2017-08-26 23:11:21 -04006493void Context::genSamplers(GLsizei count, GLuint *samplers)
6494{
6495 for (int i = 0; i < count; i++)
6496 {
6497 samplers[i] = mState.mSamplers->createSampler();
6498 }
6499}
6500
6501void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6502{
6503 for (int i = 0; i < count; i++)
6504 {
6505 GLuint sampler = samplers[i];
6506
6507 if (mState.mSamplers->getSampler(sampler))
6508 {
6509 detachSampler(sampler);
6510 }
6511
6512 mState.mSamplers->deleteObject(this, sampler);
6513 }
6514}
6515
6516void Context::getInternalformativ(GLenum target,
6517 GLenum internalformat,
6518 GLenum pname,
6519 GLsizei bufSize,
6520 GLint *params)
6521{
6522 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6523 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6524}
6525
Brandon Jones59770802018-04-02 13:18:42 -07006526void Context::getInternalformativRobust(GLenum target,
6527 GLenum internalformat,
6528 GLenum pname,
6529 GLsizei bufSize,
6530 GLsizei *length,
6531 GLint *params)
6532{
6533 getInternalformativ(target, internalformat, pname, bufSize, params);
6534}
6535
Jiajia Qin5451d532017-11-16 17:16:34 +08006536void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6537{
6538 programUniform1iv(program, location, 1, &v0);
6539}
6540
6541void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6542{
6543 GLint xy[2] = {v0, v1};
6544 programUniform2iv(program, location, 1, xy);
6545}
6546
6547void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6548{
6549 GLint xyz[3] = {v0, v1, v2};
6550 programUniform3iv(program, location, 1, xyz);
6551}
6552
6553void Context::programUniform4i(GLuint program,
6554 GLint location,
6555 GLint v0,
6556 GLint v1,
6557 GLint v2,
6558 GLint v3)
6559{
6560 GLint xyzw[4] = {v0, v1, v2, v3};
6561 programUniform4iv(program, location, 1, xyzw);
6562}
6563
6564void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6565{
6566 programUniform1uiv(program, location, 1, &v0);
6567}
6568
6569void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6570{
6571 GLuint xy[2] = {v0, v1};
6572 programUniform2uiv(program, location, 1, xy);
6573}
6574
6575void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6576{
6577 GLuint xyz[3] = {v0, v1, v2};
6578 programUniform3uiv(program, location, 1, xyz);
6579}
6580
6581void Context::programUniform4ui(GLuint program,
6582 GLint location,
6583 GLuint v0,
6584 GLuint v1,
6585 GLuint v2,
6586 GLuint v3)
6587{
6588 GLuint xyzw[4] = {v0, v1, v2, v3};
6589 programUniform4uiv(program, location, 1, xyzw);
6590}
6591
6592void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6593{
6594 programUniform1fv(program, location, 1, &v0);
6595}
6596
6597void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6598{
6599 GLfloat xy[2] = {v0, v1};
6600 programUniform2fv(program, location, 1, xy);
6601}
6602
6603void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6604{
6605 GLfloat xyz[3] = {v0, v1, v2};
6606 programUniform3fv(program, location, 1, xyz);
6607}
6608
6609void Context::programUniform4f(GLuint program,
6610 GLint location,
6611 GLfloat v0,
6612 GLfloat v1,
6613 GLfloat v2,
6614 GLfloat v3)
6615{
6616 GLfloat xyzw[4] = {v0, v1, v2, v3};
6617 programUniform4fv(program, location, 1, xyzw);
6618}
6619
Jamie Madill81c2e252017-09-09 23:32:46 -04006620void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6621{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006622 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006623 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006624 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006625}
6626
Jiajia Qin5451d532017-11-16 17:16:34 +08006627void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6628{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006629 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006630 ASSERT(programObject);
6631 programObject->setUniform2iv(location, count, value);
6632}
6633
6634void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6635{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006636 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006637 ASSERT(programObject);
6638 programObject->setUniform3iv(location, count, value);
6639}
6640
6641void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6642{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006643 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006644 ASSERT(programObject);
6645 programObject->setUniform4iv(location, count, value);
6646}
6647
6648void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6649{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006650 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006651 ASSERT(programObject);
6652 programObject->setUniform1uiv(location, count, value);
6653}
6654
6655void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6656{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006657 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006658 ASSERT(programObject);
6659 programObject->setUniform2uiv(location, count, value);
6660}
6661
6662void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6663{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006664 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006665 ASSERT(programObject);
6666 programObject->setUniform3uiv(location, count, value);
6667}
6668
6669void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6670{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006671 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006672 ASSERT(programObject);
6673 programObject->setUniform4uiv(location, count, value);
6674}
6675
6676void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6677{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006678 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006679 ASSERT(programObject);
6680 programObject->setUniform1fv(location, count, value);
6681}
6682
6683void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6684{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006685 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006686 ASSERT(programObject);
6687 programObject->setUniform2fv(location, count, value);
6688}
6689
6690void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6691{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006692 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006693 ASSERT(programObject);
6694 programObject->setUniform3fv(location, count, value);
6695}
6696
6697void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6698{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006699 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006700 ASSERT(programObject);
6701 programObject->setUniform4fv(location, count, value);
6702}
6703
6704void Context::programUniformMatrix2fv(GLuint program,
6705 GLint location,
6706 GLsizei count,
6707 GLboolean transpose,
6708 const GLfloat *value)
6709{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006710 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006711 ASSERT(programObject);
6712 programObject->setUniformMatrix2fv(location, count, transpose, value);
6713}
6714
6715void Context::programUniformMatrix3fv(GLuint program,
6716 GLint location,
6717 GLsizei count,
6718 GLboolean transpose,
6719 const GLfloat *value)
6720{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006721 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006722 ASSERT(programObject);
6723 programObject->setUniformMatrix3fv(location, count, transpose, value);
6724}
6725
6726void Context::programUniformMatrix4fv(GLuint program,
6727 GLint location,
6728 GLsizei count,
6729 GLboolean transpose,
6730 const GLfloat *value)
6731{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006732 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006733 ASSERT(programObject);
6734 programObject->setUniformMatrix4fv(location, count, transpose, value);
6735}
6736
6737void Context::programUniformMatrix2x3fv(GLuint program,
6738 GLint location,
6739 GLsizei count,
6740 GLboolean transpose,
6741 const GLfloat *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->setUniformMatrix2x3fv(location, count, transpose, value);
6746}
6747
6748void Context::programUniformMatrix3x2fv(GLuint program,
6749 GLint location,
6750 GLsizei count,
6751 GLboolean transpose,
6752 const GLfloat *value)
6753{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006754 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006755 ASSERT(programObject);
6756 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6757}
6758
6759void Context::programUniformMatrix2x4fv(GLuint program,
6760 GLint location,
6761 GLsizei count,
6762 GLboolean transpose,
6763 const GLfloat *value)
6764{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006765 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006766 ASSERT(programObject);
6767 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6768}
6769
6770void Context::programUniformMatrix4x2fv(GLuint program,
6771 GLint location,
6772 GLsizei count,
6773 GLboolean transpose,
6774 const GLfloat *value)
6775{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006776 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006777 ASSERT(programObject);
6778 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6779}
6780
6781void Context::programUniformMatrix3x4fv(GLuint program,
6782 GLint location,
6783 GLsizei count,
6784 GLboolean transpose,
6785 const GLfloat *value)
6786{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006787 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006788 ASSERT(programObject);
6789 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6790}
6791
6792void Context::programUniformMatrix4x3fv(GLuint program,
6793 GLint location,
6794 GLsizei count,
6795 GLboolean transpose,
6796 const GLfloat *value)
6797{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006798 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006799 ASSERT(programObject);
6800 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6801}
6802
Jamie Madill81c2e252017-09-09 23:32:46 -04006803void Context::onTextureChange(const Texture *texture)
6804{
6805 // Conservatively assume all textures are dirty.
6806 // TODO(jmadill): More fine-grained update.
6807 mGLState.setObjectDirty(GL_TEXTURE);
6808}
6809
James Darpiniane8a93c62018-01-04 18:02:24 -08006810bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6811{
6812 return mGLState.isCurrentTransformFeedback(tf);
6813}
James Darpiniane8a93c62018-01-04 18:02:24 -08006814
Yunchao Hea336b902017-08-02 16:05:21 +08006815void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6816{
6817 for (int i = 0; i < count; i++)
6818 {
6819 pipelines[i] = createProgramPipeline();
6820 }
6821}
6822
6823void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6824{
6825 for (int i = 0; i < count; i++)
6826 {
6827 if (pipelines[i] != 0)
6828 {
6829 deleteProgramPipeline(pipelines[i]);
6830 }
6831 }
6832}
6833
6834GLboolean Context::isProgramPipeline(GLuint pipeline)
6835{
6836 if (pipeline == 0)
6837 {
6838 return GL_FALSE;
6839 }
6840
6841 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6842}
6843
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006844void Context::finishFenceNV(GLuint fence)
6845{
6846 FenceNV *fenceObject = getFenceNV(fence);
6847
6848 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04006849 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006850}
6851
6852void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6853{
6854 FenceNV *fenceObject = getFenceNV(fence);
6855
6856 ASSERT(fenceObject && fenceObject->isSet());
6857
6858 switch (pname)
6859 {
6860 case GL_FENCE_STATUS_NV:
6861 {
6862 // GL_NV_fence spec:
6863 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6864 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6865 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6866 GLboolean status = GL_TRUE;
6867 if (fenceObject->getStatus() != GL_TRUE)
6868 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006869 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006870 }
6871 *params = status;
6872 break;
6873 }
6874
6875 case GL_FENCE_CONDITION_NV:
6876 {
6877 *params = static_cast<GLint>(fenceObject->getCondition());
6878 break;
6879 }
6880
6881 default:
6882 UNREACHABLE();
6883 }
6884}
6885
6886void Context::getTranslatedShaderSource(GLuint shader,
6887 GLsizei bufsize,
6888 GLsizei *length,
6889 GLchar *source)
6890{
6891 Shader *shaderObject = getShader(shader);
6892 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08006893 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006894}
6895
6896void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6897{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006898 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006899 ASSERT(programObject);
6900
6901 programObject->getUniformfv(this, location, params);
6902}
6903
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006904void Context::getnUniformfvRobust(GLuint program,
6905 GLint location,
6906 GLsizei bufSize,
6907 GLsizei *length,
6908 GLfloat *params)
6909{
6910 UNIMPLEMENTED();
6911}
6912
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006913void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
6914{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006915 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006916 ASSERT(programObject);
6917
6918 programObject->getUniformiv(this, location, params);
6919}
6920
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006921void Context::getnUniformivRobust(GLuint program,
6922 GLint location,
6923 GLsizei bufSize,
6924 GLsizei *length,
6925 GLint *params)
6926{
6927 UNIMPLEMENTED();
6928}
6929
6930void Context::getnUniformuivRobust(GLuint program,
6931 GLint location,
6932 GLsizei bufSize,
6933 GLsizei *length,
6934 GLuint *params)
6935{
6936 UNIMPLEMENTED();
6937}
6938
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006939GLboolean Context::isFenceNV(GLuint fence)
6940{
6941 FenceNV *fenceObject = getFenceNV(fence);
6942
6943 if (fenceObject == nullptr)
6944 {
6945 return GL_FALSE;
6946 }
6947
6948 // GL_NV_fence spec:
6949 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
6950 // existing fence.
6951 return fenceObject->isSet();
6952}
6953
6954void Context::readnPixels(GLint x,
6955 GLint y,
6956 GLsizei width,
6957 GLsizei height,
6958 GLenum format,
6959 GLenum type,
6960 GLsizei bufSize,
6961 void *data)
6962{
6963 return readPixels(x, y, width, height, format, type, data);
6964}
6965
Jamie Madill007530e2017-12-28 14:27:04 -05006966void Context::setFenceNV(GLuint fence, GLenum condition)
6967{
6968 ASSERT(condition == GL_ALL_COMPLETED_NV);
6969
6970 FenceNV *fenceObject = getFenceNV(fence);
6971 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04006972 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05006973}
6974
6975GLboolean Context::testFenceNV(GLuint fence)
6976{
6977 FenceNV *fenceObject = getFenceNV(fence);
6978
6979 ASSERT(fenceObject != nullptr);
6980 ASSERT(fenceObject->isSet() == GL_TRUE);
6981
6982 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04006983 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05006984 if (error.isError())
6985 {
6986 handleError(error);
6987 return GL_TRUE;
6988 }
6989
6990 return result;
6991}
6992
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006993void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006994{
6995 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07006996 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05006997 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05006998}
6999
Jamie Madillfa920eb2018-01-04 11:45:50 -05007000void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007001{
7002 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007003 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05007004 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
7005}
7006
Jamie Madillfa920eb2018-01-04 11:45:50 -05007007void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7008{
7009 UNIMPLEMENTED();
7010}
7011
Jamie Madill5b772312018-03-08 20:28:32 -05007012bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7013{
7014 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7015 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7016 // to the fact that it is stored internally as a float, and so would require conversion
7017 // if returned from Context::getIntegerv. Since this conversion is already implemented
7018 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7019 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7020 // application.
7021 switch (pname)
7022 {
7023 case GL_COMPRESSED_TEXTURE_FORMATS:
7024 {
7025 *type = GL_INT;
7026 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7027 return true;
7028 }
7029 case GL_SHADER_BINARY_FORMATS:
7030 {
7031 *type = GL_INT;
7032 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7033 return true;
7034 }
7035
7036 case GL_MAX_VERTEX_ATTRIBS:
7037 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7038 case GL_MAX_VARYING_VECTORS:
7039 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7040 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7041 case GL_MAX_TEXTURE_IMAGE_UNITS:
7042 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7043 case GL_MAX_RENDERBUFFER_SIZE:
7044 case GL_NUM_SHADER_BINARY_FORMATS:
7045 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7046 case GL_ARRAY_BUFFER_BINDING:
7047 case GL_FRAMEBUFFER_BINDING:
7048 case GL_RENDERBUFFER_BINDING:
7049 case GL_CURRENT_PROGRAM:
7050 case GL_PACK_ALIGNMENT:
7051 case GL_UNPACK_ALIGNMENT:
7052 case GL_GENERATE_MIPMAP_HINT:
7053 case GL_RED_BITS:
7054 case GL_GREEN_BITS:
7055 case GL_BLUE_BITS:
7056 case GL_ALPHA_BITS:
7057 case GL_DEPTH_BITS:
7058 case GL_STENCIL_BITS:
7059 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7060 case GL_CULL_FACE_MODE:
7061 case GL_FRONT_FACE:
7062 case GL_ACTIVE_TEXTURE:
7063 case GL_STENCIL_FUNC:
7064 case GL_STENCIL_VALUE_MASK:
7065 case GL_STENCIL_REF:
7066 case GL_STENCIL_FAIL:
7067 case GL_STENCIL_PASS_DEPTH_FAIL:
7068 case GL_STENCIL_PASS_DEPTH_PASS:
7069 case GL_STENCIL_BACK_FUNC:
7070 case GL_STENCIL_BACK_VALUE_MASK:
7071 case GL_STENCIL_BACK_REF:
7072 case GL_STENCIL_BACK_FAIL:
7073 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7074 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7075 case GL_DEPTH_FUNC:
7076 case GL_BLEND_SRC_RGB:
7077 case GL_BLEND_SRC_ALPHA:
7078 case GL_BLEND_DST_RGB:
7079 case GL_BLEND_DST_ALPHA:
7080 case GL_BLEND_EQUATION_RGB:
7081 case GL_BLEND_EQUATION_ALPHA:
7082 case GL_STENCIL_WRITEMASK:
7083 case GL_STENCIL_BACK_WRITEMASK:
7084 case GL_STENCIL_CLEAR_VALUE:
7085 case GL_SUBPIXEL_BITS:
7086 case GL_MAX_TEXTURE_SIZE:
7087 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7088 case GL_SAMPLE_BUFFERS:
7089 case GL_SAMPLES:
7090 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7091 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7092 case GL_TEXTURE_BINDING_2D:
7093 case GL_TEXTURE_BINDING_CUBE_MAP:
7094 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7095 {
7096 *type = GL_INT;
7097 *numParams = 1;
7098 return true;
7099 }
7100 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7101 {
7102 if (!getExtensions().packReverseRowOrder)
7103 {
7104 return false;
7105 }
7106 *type = GL_INT;
7107 *numParams = 1;
7108 return true;
7109 }
7110 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7111 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7112 {
7113 if (!getExtensions().textureRectangle)
7114 {
7115 return false;
7116 }
7117 *type = GL_INT;
7118 *numParams = 1;
7119 return true;
7120 }
7121 case GL_MAX_DRAW_BUFFERS_EXT:
7122 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7123 {
7124 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7125 {
7126 return false;
7127 }
7128 *type = GL_INT;
7129 *numParams = 1;
7130 return true;
7131 }
7132 case GL_MAX_VIEWPORT_DIMS:
7133 {
7134 *type = GL_INT;
7135 *numParams = 2;
7136 return true;
7137 }
7138 case GL_VIEWPORT:
7139 case GL_SCISSOR_BOX:
7140 {
7141 *type = GL_INT;
7142 *numParams = 4;
7143 return true;
7144 }
7145 case GL_SHADER_COMPILER:
7146 case GL_SAMPLE_COVERAGE_INVERT:
7147 case GL_DEPTH_WRITEMASK:
7148 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7149 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7150 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7151 // bool-natural
7152 case GL_SAMPLE_COVERAGE:
7153 case GL_SCISSOR_TEST:
7154 case GL_STENCIL_TEST:
7155 case GL_DEPTH_TEST:
7156 case GL_BLEND:
7157 case GL_DITHER:
7158 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7159 {
7160 *type = GL_BOOL;
7161 *numParams = 1;
7162 return true;
7163 }
7164 case GL_COLOR_WRITEMASK:
7165 {
7166 *type = GL_BOOL;
7167 *numParams = 4;
7168 return true;
7169 }
7170 case GL_POLYGON_OFFSET_FACTOR:
7171 case GL_POLYGON_OFFSET_UNITS:
7172 case GL_SAMPLE_COVERAGE_VALUE:
7173 case GL_DEPTH_CLEAR_VALUE:
7174 case GL_LINE_WIDTH:
7175 {
7176 *type = GL_FLOAT;
7177 *numParams = 1;
7178 return true;
7179 }
7180 case GL_ALIASED_LINE_WIDTH_RANGE:
7181 case GL_ALIASED_POINT_SIZE_RANGE:
7182 case GL_DEPTH_RANGE:
7183 {
7184 *type = GL_FLOAT;
7185 *numParams = 2;
7186 return true;
7187 }
7188 case GL_COLOR_CLEAR_VALUE:
7189 case GL_BLEND_COLOR:
7190 {
7191 *type = GL_FLOAT;
7192 *numParams = 4;
7193 return true;
7194 }
7195 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7196 if (!getExtensions().textureFilterAnisotropic)
7197 {
7198 return false;
7199 }
7200 *type = GL_FLOAT;
7201 *numParams = 1;
7202 return true;
7203 case GL_TIMESTAMP_EXT:
7204 if (!getExtensions().disjointTimerQuery)
7205 {
7206 return false;
7207 }
7208 *type = GL_INT_64_ANGLEX;
7209 *numParams = 1;
7210 return true;
7211 case GL_GPU_DISJOINT_EXT:
7212 if (!getExtensions().disjointTimerQuery)
7213 {
7214 return false;
7215 }
7216 *type = GL_INT;
7217 *numParams = 1;
7218 return true;
7219 case GL_COVERAGE_MODULATION_CHROMIUM:
7220 if (!getExtensions().framebufferMixedSamples)
7221 {
7222 return false;
7223 }
7224 *type = GL_INT;
7225 *numParams = 1;
7226 return true;
7227 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7228 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7229 {
7230 return false;
7231 }
7232 *type = GL_INT;
7233 *numParams = 1;
7234 return true;
7235 }
7236
7237 if (getExtensions().debug)
7238 {
7239 switch (pname)
7240 {
7241 case GL_DEBUG_LOGGED_MESSAGES:
7242 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7243 case GL_DEBUG_GROUP_STACK_DEPTH:
7244 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7245 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7246 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7247 case GL_MAX_LABEL_LENGTH:
7248 *type = GL_INT;
7249 *numParams = 1;
7250 return true;
7251
7252 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7253 case GL_DEBUG_OUTPUT:
7254 *type = GL_BOOL;
7255 *numParams = 1;
7256 return true;
7257 }
7258 }
7259
7260 if (getExtensions().multisampleCompatibility)
7261 {
7262 switch (pname)
7263 {
7264 case GL_MULTISAMPLE_EXT:
7265 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7266 *type = GL_BOOL;
7267 *numParams = 1;
7268 return true;
7269 }
7270 }
7271
7272 if (getExtensions().pathRendering)
7273 {
7274 switch (pname)
7275 {
7276 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7277 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7278 *type = GL_FLOAT;
7279 *numParams = 16;
7280 return true;
7281 }
7282 }
7283
7284 if (getExtensions().bindGeneratesResource)
7285 {
7286 switch (pname)
7287 {
7288 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7289 *type = GL_BOOL;
7290 *numParams = 1;
7291 return true;
7292 }
7293 }
7294
7295 if (getExtensions().clientArrays)
7296 {
7297 switch (pname)
7298 {
7299 case GL_CLIENT_ARRAYS_ANGLE:
7300 *type = GL_BOOL;
7301 *numParams = 1;
7302 return true;
7303 }
7304 }
7305
7306 if (getExtensions().sRGBWriteControl)
7307 {
7308 switch (pname)
7309 {
7310 case GL_FRAMEBUFFER_SRGB_EXT:
7311 *type = GL_BOOL;
7312 *numParams = 1;
7313 return true;
7314 }
7315 }
7316
7317 if (getExtensions().robustResourceInitialization &&
7318 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7319 {
7320 *type = GL_BOOL;
7321 *numParams = 1;
7322 return true;
7323 }
7324
7325 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7326 {
7327 *type = GL_BOOL;
7328 *numParams = 1;
7329 return true;
7330 }
7331
jchen1082af6202018-06-22 10:59:52 +08007332 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7333 {
7334 *type = GL_INT;
7335 *numParams = 1;
7336 return true;
7337 }
7338
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007339 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7340 {
7341 *type = GL_INT;
7342 *numParams = 1;
7343 return true;
7344 }
7345
Jamie Madill5b772312018-03-08 20:28:32 -05007346 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7347 switch (pname)
7348 {
7349 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7350 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7351 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7352 {
7353 return false;
7354 }
7355 *type = GL_INT;
7356 *numParams = 1;
7357 return true;
7358
7359 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7360 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7361 {
7362 return false;
7363 }
7364 *type = GL_INT;
7365 *numParams = 1;
7366 return true;
7367
7368 case GL_PROGRAM_BINARY_FORMATS_OES:
7369 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7370 {
7371 return false;
7372 }
7373 *type = GL_INT;
7374 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7375 return true;
7376
7377 case GL_PACK_ROW_LENGTH:
7378 case GL_PACK_SKIP_ROWS:
7379 case GL_PACK_SKIP_PIXELS:
7380 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7381 {
7382 return false;
7383 }
7384 *type = GL_INT;
7385 *numParams = 1;
7386 return true;
7387 case GL_UNPACK_ROW_LENGTH:
7388 case GL_UNPACK_SKIP_ROWS:
7389 case GL_UNPACK_SKIP_PIXELS:
7390 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7391 {
7392 return false;
7393 }
7394 *type = GL_INT;
7395 *numParams = 1;
7396 return true;
7397 case GL_VERTEX_ARRAY_BINDING:
7398 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7399 {
7400 return false;
7401 }
7402 *type = GL_INT;
7403 *numParams = 1;
7404 return true;
7405 case GL_PIXEL_PACK_BUFFER_BINDING:
7406 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7407 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7408 {
7409 return false;
7410 }
7411 *type = GL_INT;
7412 *numParams = 1;
7413 return true;
7414 case GL_MAX_SAMPLES:
7415 {
7416 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7417 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7418 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7419 {
7420 return false;
7421 }
7422 *type = GL_INT;
7423 *numParams = 1;
7424 return true;
7425
7426 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7427 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7428 {
7429 return false;
7430 }
7431 *type = GL_INT;
7432 *numParams = 1;
7433 return true;
7434 }
7435 }
7436
7437 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7438 {
7439 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7440 {
7441 return false;
7442 }
7443 *type = GL_INT;
7444 *numParams = 1;
7445 return true;
7446 }
7447
7448 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7449 {
7450 *type = GL_INT;
7451 *numParams = 1;
7452 return true;
7453 }
7454
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007455 if (getClientVersion() < Version(2, 0))
7456 {
7457 switch (pname)
7458 {
7459 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007460 case GL_CLIENT_ACTIVE_TEXTURE:
7461 case GL_MATRIX_MODE:
7462 case GL_MAX_TEXTURE_UNITS:
7463 case GL_MAX_MODELVIEW_STACK_DEPTH:
7464 case GL_MAX_PROJECTION_STACK_DEPTH:
7465 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007466 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007467 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007468 case GL_VERTEX_ARRAY_STRIDE:
7469 case GL_NORMAL_ARRAY_STRIDE:
7470 case GL_COLOR_ARRAY_STRIDE:
7471 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7472 case GL_VERTEX_ARRAY_SIZE:
7473 case GL_COLOR_ARRAY_SIZE:
7474 case GL_TEXTURE_COORD_ARRAY_SIZE:
7475 case GL_VERTEX_ARRAY_TYPE:
7476 case GL_NORMAL_ARRAY_TYPE:
7477 case GL_COLOR_ARRAY_TYPE:
7478 case GL_TEXTURE_COORD_ARRAY_TYPE:
7479 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7480 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7481 case GL_COLOR_ARRAY_BUFFER_BINDING:
7482 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7483 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7484 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7485 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007486 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007487 case GL_MODELVIEW_STACK_DEPTH:
7488 case GL_PROJECTION_STACK_DEPTH:
7489 case GL_TEXTURE_STACK_DEPTH:
7490 case GL_LOGIC_OP_MODE:
7491 case GL_BLEND_SRC:
7492 case GL_BLEND_DST:
7493 case GL_PERSPECTIVE_CORRECTION_HINT:
7494 case GL_POINT_SMOOTH_HINT:
7495 case GL_LINE_SMOOTH_HINT:
7496 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007497 *type = GL_INT;
7498 *numParams = 1;
7499 return true;
7500 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007501 case GL_FOG_DENSITY:
7502 case GL_FOG_START:
7503 case GL_FOG_END:
7504 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007505 case GL_POINT_SIZE:
7506 case GL_POINT_SIZE_MIN:
7507 case GL_POINT_SIZE_MAX:
7508 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007509 *type = GL_FLOAT;
7510 *numParams = 1;
7511 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007512 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007513 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007514 *type = GL_FLOAT;
7515 *numParams = 2;
7516 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007517 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007518 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007519 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007520 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007521 *type = GL_FLOAT;
7522 *numParams = 4;
7523 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007524 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007525 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007526 *type = GL_FLOAT;
7527 *numParams = 3;
7528 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007529 case GL_MODELVIEW_MATRIX:
7530 case GL_PROJECTION_MATRIX:
7531 case GL_TEXTURE_MATRIX:
7532 *type = GL_FLOAT;
7533 *numParams = 16;
7534 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007535 case GL_LIGHT_MODEL_TWO_SIDE:
7536 *type = GL_BOOL;
7537 *numParams = 1;
7538 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007539 }
7540 }
7541
Jamie Madill5b772312018-03-08 20:28:32 -05007542 if (getClientVersion() < Version(3, 0))
7543 {
7544 return false;
7545 }
7546
7547 // Check for ES3.0+ parameter names
7548 switch (pname)
7549 {
7550 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7551 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7552 case GL_UNIFORM_BUFFER_BINDING:
7553 case GL_TRANSFORM_FEEDBACK_BINDING:
7554 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7555 case GL_COPY_READ_BUFFER_BINDING:
7556 case GL_COPY_WRITE_BUFFER_BINDING:
7557 case GL_SAMPLER_BINDING:
7558 case GL_READ_BUFFER:
7559 case GL_TEXTURE_BINDING_3D:
7560 case GL_TEXTURE_BINDING_2D_ARRAY:
7561 case GL_MAX_3D_TEXTURE_SIZE:
7562 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7563 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7564 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7565 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7566 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7567 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7568 case GL_MAX_VARYING_COMPONENTS:
7569 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7570 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7571 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7572 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7573 case GL_NUM_EXTENSIONS:
7574 case GL_MAJOR_VERSION:
7575 case GL_MINOR_VERSION:
7576 case GL_MAX_ELEMENTS_INDICES:
7577 case GL_MAX_ELEMENTS_VERTICES:
7578 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7579 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7580 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7581 case GL_UNPACK_IMAGE_HEIGHT:
7582 case GL_UNPACK_SKIP_IMAGES:
7583 {
7584 *type = GL_INT;
7585 *numParams = 1;
7586 return true;
7587 }
7588
7589 case GL_MAX_ELEMENT_INDEX:
7590 case GL_MAX_UNIFORM_BLOCK_SIZE:
7591 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7592 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7593 case GL_MAX_SERVER_WAIT_TIMEOUT:
7594 {
7595 *type = GL_INT_64_ANGLEX;
7596 *numParams = 1;
7597 return true;
7598 }
7599
7600 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7601 case GL_TRANSFORM_FEEDBACK_PAUSED:
7602 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7603 case GL_RASTERIZER_DISCARD:
7604 {
7605 *type = GL_BOOL;
7606 *numParams = 1;
7607 return true;
7608 }
7609
7610 case GL_MAX_TEXTURE_LOD_BIAS:
7611 {
7612 *type = GL_FLOAT;
7613 *numParams = 1;
7614 return true;
7615 }
7616 }
7617
7618 if (getExtensions().requestExtension)
7619 {
7620 switch (pname)
7621 {
7622 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7623 *type = GL_INT;
7624 *numParams = 1;
7625 return true;
7626 }
7627 }
7628
7629 if (getClientVersion() < Version(3, 1))
7630 {
7631 return false;
7632 }
7633
7634 switch (pname)
7635 {
7636 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7637 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7638 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7639 case GL_MAX_FRAMEBUFFER_WIDTH:
7640 case GL_MAX_FRAMEBUFFER_HEIGHT:
7641 case GL_MAX_FRAMEBUFFER_SAMPLES:
7642 case GL_MAX_SAMPLE_MASK_WORDS:
7643 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7644 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7645 case GL_MAX_INTEGER_SAMPLES:
7646 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7647 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7648 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7649 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7650 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7651 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7652 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7653 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7654 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7655 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7656 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7657 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7658 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7659 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7660 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7661 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7662 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7663 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7664 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7665 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7666 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7667 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7668 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7669 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7670 case GL_MAX_UNIFORM_LOCATIONS:
7671 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7672 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7673 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7674 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7675 case GL_MAX_IMAGE_UNITS:
7676 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7677 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7678 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7679 case GL_SHADER_STORAGE_BUFFER_BINDING:
7680 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7681 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007682 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007683 *type = GL_INT;
7684 *numParams = 1;
7685 return true;
7686 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7687 *type = GL_INT_64_ANGLEX;
7688 *numParams = 1;
7689 return true;
7690 case GL_SAMPLE_MASK:
7691 *type = GL_BOOL;
7692 *numParams = 1;
7693 return true;
7694 }
7695
7696 if (getExtensions().geometryShader)
7697 {
7698 switch (pname)
7699 {
7700 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7701 case GL_LAYER_PROVOKING_VERTEX_EXT:
7702 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7703 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7704 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7705 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7706 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7707 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7708 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7709 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7710 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7711 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7712 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7713 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7714 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7715 *type = GL_INT;
7716 *numParams = 1;
7717 return true;
7718 }
7719 }
7720
7721 return false;
7722}
7723
7724bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7725{
7726 if (getClientVersion() < Version(3, 0))
7727 {
7728 return false;
7729 }
7730
7731 switch (target)
7732 {
7733 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7734 case GL_UNIFORM_BUFFER_BINDING:
7735 {
7736 *type = GL_INT;
7737 *numParams = 1;
7738 return true;
7739 }
7740 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7741 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7742 case GL_UNIFORM_BUFFER_START:
7743 case GL_UNIFORM_BUFFER_SIZE:
7744 {
7745 *type = GL_INT_64_ANGLEX;
7746 *numParams = 1;
7747 return true;
7748 }
7749 }
7750
7751 if (getClientVersion() < Version(3, 1))
7752 {
7753 return false;
7754 }
7755
7756 switch (target)
7757 {
7758 case GL_IMAGE_BINDING_LAYERED:
7759 {
7760 *type = GL_BOOL;
7761 *numParams = 1;
7762 return true;
7763 }
7764 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7765 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7766 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7767 case GL_SHADER_STORAGE_BUFFER_BINDING:
7768 case GL_VERTEX_BINDING_BUFFER:
7769 case GL_VERTEX_BINDING_DIVISOR:
7770 case GL_VERTEX_BINDING_OFFSET:
7771 case GL_VERTEX_BINDING_STRIDE:
7772 case GL_SAMPLE_MASK_VALUE:
7773 case GL_IMAGE_BINDING_NAME:
7774 case GL_IMAGE_BINDING_LEVEL:
7775 case GL_IMAGE_BINDING_LAYER:
7776 case GL_IMAGE_BINDING_ACCESS:
7777 case GL_IMAGE_BINDING_FORMAT:
7778 {
7779 *type = GL_INT;
7780 *numParams = 1;
7781 return true;
7782 }
7783 case GL_ATOMIC_COUNTER_BUFFER_START:
7784 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7785 case GL_SHADER_STORAGE_BUFFER_START:
7786 case GL_SHADER_STORAGE_BUFFER_SIZE:
7787 {
7788 *type = GL_INT_64_ANGLEX;
7789 *numParams = 1;
7790 return true;
7791 }
7792 }
7793
7794 return false;
7795}
7796
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007797Program *Context::getProgramResolveLink(GLuint handle) const
7798{
7799 Program *program = mState.mShaderPrograms->getProgram(handle);
7800 if (program)
7801 {
Jamie Madill785e8a02018-10-04 17:42:00 -04007802 program->resolveLink(this);
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007803 }
7804 return program;
7805}
7806
7807Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05007808{
7809 return mState.mShaderPrograms->getProgram(handle);
7810}
7811
7812Shader *Context::getShader(GLuint handle) const
7813{
7814 return mState.mShaderPrograms->getShader(handle);
7815}
7816
7817bool Context::isTextureGenerated(GLuint texture) const
7818{
7819 return mState.mTextures->isHandleGenerated(texture);
7820}
7821
Jamie Madill5b772312018-03-08 20:28:32 -05007822bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7823{
7824 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7825}
7826
7827bool Context::isFramebufferGenerated(GLuint framebuffer) const
7828{
7829 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7830}
7831
7832bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7833{
7834 return mState.mPipelines->isHandleGenerated(pipeline);
7835}
7836
7837bool Context::usingDisplayTextureShareGroup() const
7838{
7839 return mDisplayTextureShareGroup;
7840}
7841
7842GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7843{
7844 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7845 internalformat == GL_DEPTH_STENCIL
7846 ? GL_DEPTH24_STENCIL8
7847 : internalformat;
7848}
7849
jchen1082af6202018-06-22 10:59:52 +08007850void Context::maxShaderCompilerThreads(GLuint count)
7851{
jchen107ae70d82018-07-06 13:47:01 +08007852 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08007853 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08007854 // A count of zero specifies a request for no parallel compiling or linking.
7855 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
7856 {
7857 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
7858 }
7859 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08007860}
7861
Jamie Madill2eb65032018-07-30 10:25:57 -04007862bool Context::isGLES1() const
7863{
7864 return mState.getClientVersion() < Version(2, 0);
7865}
7866
Jamie Madilla11819d2018-07-30 10:26:01 -04007867void Context::onSubjectStateChange(const Context *context,
7868 angle::SubjectIndex index,
7869 angle::SubjectMessage message)
7870{
Jamie Madilla11819d2018-07-30 10:26:01 -04007871 switch (index)
7872 {
7873 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007874 switch (message)
7875 {
7876 case angle::SubjectMessage::CONTENTS_CHANGED:
7877 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
7878 mStateCache.onVertexArrayBufferContentsChange(this);
7879 break;
7880 case angle::SubjectMessage::RESOURCE_MAPPED:
7881 case angle::SubjectMessage::RESOURCE_UNMAPPED:
7882 case angle::SubjectMessage::BINDING_CHANGED:
7883 mStateCache.onVertexArrayBufferStateChange(this);
7884 break;
7885 default:
7886 break;
7887 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007888 break;
7889
7890 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007891 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7892 {
7893 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
7894 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007895 break;
7896
7897 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007898 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7899 {
7900 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
7901 }
7902 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04007903 break;
7904
7905 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04007906 if (index < kTextureMaxSubjectIndex)
7907 {
7908 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04007909 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007910 }
Jamie Madille25b8002018-09-20 13:39:49 -04007911 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04007912 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04007913 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04007914 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007915 }
Jamie Madille25b8002018-09-20 13:39:49 -04007916 else
7917 {
7918 ASSERT(index < kSamplerMaxSubjectIndex);
7919 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
7920 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007921 break;
7922 }
7923}
7924
Jamie Madill6b873dd2018-07-12 23:56:30 -04007925// ErrorSet implementation.
7926ErrorSet::ErrorSet(Context *context) : mContext(context)
7927{
7928}
7929
7930ErrorSet::~ErrorSet() = default;
7931
Jamie Madill306b6c12018-07-27 08:12:49 -04007932void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04007933{
7934 // This internal enum is used to filter internal errors that are already handled.
7935 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
7936 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
7937 {
7938 return;
7939 }
7940
7941 if (ANGLE_UNLIKELY(error.isError()))
7942 {
7943 GLenum code = error.getCode();
7944 mErrors.insert(code);
Jamie Madill785e8a02018-10-04 17:42:00 -04007945
Jamie Madill6b873dd2018-07-12 23:56:30 -04007946 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
7947 {
7948 mContext->markContextLost();
7949 }
7950
7951 ASSERT(!error.getMessage().empty());
7952 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
7953 error.getID(), GL_DEBUG_SEVERITY_HIGH,
7954 error.getMessage());
7955 }
7956}
7957
7958bool ErrorSet::empty() const
7959{
7960 return mErrors.empty();
7961}
7962
7963GLenum ErrorSet::popError()
7964{
7965 ASSERT(!empty());
7966 GLenum error = *mErrors.begin();
7967 mErrors.erase(mErrors.begin());
7968 return error;
7969}
Jamie Madilldc358af2018-07-31 11:22:13 -04007970
7971// StateCache implementation.
Jamie Madill16e28fd2018-09-12 11:03:05 -04007972StateCache::StateCache(Context *context)
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007973 : mCachedHasAnyEnabledClientAttrib(false),
7974 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04007975 mCachedInstancedVertexElementLimit(0),
7976 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madilldc358af2018-07-31 11:22:13 -04007977{
Jamie Madill16e28fd2018-09-12 11:03:05 -04007978 updateValidDrawModes(context);
Jamie Madilldc358af2018-07-31 11:22:13 -04007979}
7980
7981StateCache::~StateCache() = default;
7982
7983void StateCache::updateActiveAttribsMask(Context *context)
7984{
7985 bool isGLES1 = context->isGLES1();
7986 const State &glState = context->getGLState();
7987
7988 if (!isGLES1 && !glState.getProgram())
7989 {
7990 mCachedActiveBufferedAttribsMask = AttributesMask();
7991 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04007992 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04007993 return;
7994 }
7995
7996 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
7997 : glState.getProgram()->getActiveAttribLocationsMask();
7998
7999 const VertexArray *vao = glState.getVertexArray();
8000 ASSERT(vao);
8001
8002 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8003 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008004 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008005
Jamie Madill0a17e482018-08-31 17:19:11 -04008006 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8007 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008008 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008009 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8010}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008011
8012void StateCache::updateVertexElementLimits(Context *context)
8013{
8014 const VertexArray *vao = context->getGLState().getVertexArray();
8015
8016 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8017 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8018
8019 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8020 // If there are no buffered attributes then we should not limit the draw call count.
8021 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8022 {
8023 return;
8024 }
8025
8026 const auto &vertexAttribs = vao->getVertexAttributes();
8027 const auto &vertexBindings = vao->getVertexBindings();
8028
8029 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8030 {
8031 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8032 ASSERT(attrib.enabled);
8033
8034 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8035 ASSERT(context->isGLES1() ||
8036 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8037
8038 GLint64 limit = attrib.getCachedElementLimit();
8039 if (binding.getDivisor() > 0)
8040 {
8041 mCachedInstancedVertexElementLimit =
8042 std::min(mCachedInstancedVertexElementLimit, limit);
8043 }
8044 else
8045 {
8046 mCachedNonInstancedVertexElementLimit =
8047 std::min(mCachedNonInstancedVertexElementLimit, limit);
8048 }
8049 }
8050}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008051
Jamie Madilld84b6732018-09-06 15:54:35 -04008052void StateCache::updateBasicDrawStatesError()
8053{
8054 mCachedBasicDrawStatesError = kInvalidPointer;
8055}
8056
8057intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8058{
8059 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8060 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8061 return mCachedBasicDrawStatesError;
8062}
8063
Jamie Madillc43cdad2018-08-08 15:49:25 -04008064void StateCache::onVertexArrayBindingChange(Context *context)
8065{
8066 updateActiveAttribsMask(context);
8067 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008068 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008069}
8070
8071void StateCache::onProgramExecutableChange(Context *context)
8072{
8073 updateActiveAttribsMask(context);
8074 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008075 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008076 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008077}
8078
Jamie Madilld84b6732018-09-06 15:54:35 -04008079void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008080{
8081 updateVertexElementLimits(context);
8082}
8083
Jamie Madilld84b6732018-09-06 15:54:35 -04008084void StateCache::onVertexArrayBufferContentsChange(Context *context)
8085{
8086 updateVertexElementLimits(context);
8087 updateBasicDrawStatesError();
8088}
8089
Jamie Madillc43cdad2018-08-08 15:49:25 -04008090void StateCache::onVertexArrayStateChange(Context *context)
8091{
8092 updateActiveAttribsMask(context);
8093 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008094 updateBasicDrawStatesError();
8095}
8096
8097void StateCache::onVertexArrayBufferStateChange(Context *context)
8098{
8099 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008100}
8101
8102void StateCache::onGLES1ClientStateChange(Context *context)
8103{
8104 updateActiveAttribsMask(context);
8105}
Jamie Madilld84b6732018-09-06 15:54:35 -04008106
8107void StateCache::onDrawFramebufferChange(Context *context)
8108{
8109 updateBasicDrawStatesError();
8110}
8111
8112void StateCache::onContextCapChange(Context *context)
8113{
8114 updateBasicDrawStatesError();
8115}
8116
8117void StateCache::onStencilStateChange(Context *context)
8118{
8119 updateBasicDrawStatesError();
8120}
8121
8122void StateCache::onDefaultVertexAttributeChange(Context *context)
8123{
8124 updateBasicDrawStatesError();
8125}
8126
8127void StateCache::onActiveTextureChange(Context *context)
8128{
8129 updateBasicDrawStatesError();
8130}
8131
8132void StateCache::onQueryChange(Context *context)
8133{
8134 updateBasicDrawStatesError();
8135}
8136
8137void StateCache::onTransformFeedbackChange(Context *context)
8138{
8139 updateBasicDrawStatesError();
8140}
8141
8142void StateCache::onUniformBufferStateChange(Context *context)
8143{
8144 updateBasicDrawStatesError();
8145}
8146
8147void StateCache::onBufferBindingChange(Context *context)
8148{
8149 updateBasicDrawStatesError();
8150}
Jamie Madill526a6f62018-09-12 11:03:05 -04008151
8152void StateCache::updateValidDrawModes(Context *context)
8153{
8154 Program *program = context->getGLState().getProgram();
8155 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8156 {
8157 mCachedValidDrawModes = {{
8158 true, /* Points */
8159 true, /* Lines */
8160 true, /* LineLoop */
8161 true, /* LineStrip */
8162 true, /* Triangles */
8163 true, /* TriangleStrip */
8164 true, /* TriangleFan */
8165 false, /* LinesAdjacency */
8166 false, /* LineStripAdjacency */
8167 false, /* TrianglesAdjacency */
8168 false, /* TriangleStripAdjacency */
8169 false, /* InvalidEnum */
8170 }};
8171 }
8172 else
8173 {
8174 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8175
8176 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8177
8178 mCachedValidDrawModes = {{
8179 gsMode == PrimitiveMode::Points, /* Points */
8180 gsMode == PrimitiveMode::Lines, /* Lines */
8181 gsMode == PrimitiveMode::Lines, /* LineLoop */
8182 gsMode == PrimitiveMode::Lines, /* LineStrip */
8183 gsMode == PrimitiveMode::Triangles, /* Triangles */
8184 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8185 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8186 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8187 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8188 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8189 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8190 false, /* InvalidEnum */
8191 }};
8192 }
8193}
Jamie Madillc29968b2016-01-20 11:17:23 -05008194} // namespace gl