blob: d428b84334aa0fbc786fdb55fb0338bd0cde3fd0 [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{
201 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
202}
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{
213 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
214}
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 = {{
263 /* Points */ 1,
264 /* Lines */ 2,
265 /* LineLoop */ 2,
266 /* LineStrip */ 2,
267 /* Triangles */ 3,
268 /* TriangleStrip */ 3,
269 /* TriangleFan */ 3,
270 /* LinesAdjacency */ 2,
271 /* LineStripAdjacency */ 2,
272 /* TrianglesAdjacency */ 3,
273 /* TriangleStripAdjacency */ 3,
274}};
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,
309 kVertexArraySubjectIndex = kUniformBufferMaxSubjectIndex,
310 kReadFramebufferSubjectIndex,
311 kDrawFramebufferSubjectIndex
312};
Geoff Langf6db0982015-08-25 13:04:00 -0400313} // anonymous namespace
314
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000315namespace gl
316{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000317
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400318Context::Context(rx::EGLImplFactory *implFactory,
319 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400320 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500321 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400322 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500323 const egl::AttributeMap &attribs,
Brandon Jones2b0cdcc2018-05-02 08:02:50 -0700324 const egl::DisplayExtensions &displayExtensions,
325 const egl::ClientExtensions &clientExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500326 : mState(reinterpret_cast<ContextID>(this),
327 shareContext ? &shareContext->mState : nullptr,
328 shareTextures,
329 GetClientVersion(attribs),
330 &mGLState,
331 mCaps,
332 mTextureCaps,
333 mExtensions,
334 mLimitations),
335 mSkipValidation(GetNoError(attribs)),
336 mDisplayTextureShareGroup(shareTextures != nullptr),
337 mSavedArgsType(nullptr),
Geoff Lang3cacf692018-06-20 16:49:57 -0400338 mImplementation(implFactory->createContext(mState, config, shareContext, attribs)),
Geoff Lang75359662018-04-11 01:42:27 -0400339 mLabel(nullptr),
Jamie Madill2f348d22017-06-05 10:50:59 -0400340 mCompiler(),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400341 mGLState(GetDebug(attribs),
342 GetBindGeneratesResource(attribs),
343 GetClientArraysEnabled(attribs),
344 GetRobustResourceInit(attribs),
345 memoryProgramCache != nullptr),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400346 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500347 mClientType(EGL_OPENGL_ES_API),
Jamie Madill6b873dd2018-07-12 23:56:30 -0400348 mErrors(this),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500349 mHasBeenCurrent(false),
350 mContextLost(false),
351 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700352 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500353 mResetStrategy(GetResetStrategy(attribs)),
354 mRobustAccess(GetRobustAccess(attribs)),
Geoff Lang33f11fb2018-05-07 13:42:47 -0400355 mSurfacelessSupported(displayExtensions.surfacelessContext),
356 mExplicitContextAvailable(clientExtensions.explicitContext),
Jamie Madill61e16b42017-06-19 11:13:23 -0400357 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
358 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madille14951e2017-03-09 18:55:16 -0500359 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400360 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400361 mMemoryProgramCache(memoryProgramCache),
Jamie Madilla11819d2018-07-30 10:26:01 -0400362 mVertexArrayObserverBinding(this, kVertexArraySubjectIndex),
363 mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex),
364 mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400365 mScratchBuffer(1000u),
jchen107ae70d82018-07-06 13:47:01 +0800366 mZeroFilledBuffer(1000u),
367 mThreadPool(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000368{
Jamie Madill5b772312018-03-08 20:28:32 -0500369 // Needed to solve a Clang warning of unused variables.
Jamie Madillc6dbc252018-04-30 19:07:56 -0400370 ANGLE_UNUSED_VARIABLE(mSavedArgsType);
371 ANGLE_UNUSED_VARIABLE(mParamsBuffer);
Jamie Madill6d32cef2018-08-14 02:34:28 -0400372
373 for (angle::SubjectIndex uboIndex = kUniformBuffer0SubjectIndex;
374 uboIndex < kUniformBufferMaxSubjectIndex; ++uboIndex)
375 {
376 mUniformBufferObserverBindings.emplace_back(this, uboIndex);
377 }
Geoff Lang33f11fb2018-05-07 13:42:47 -0400378}
Jamie Madill5b772312018-03-08 20:28:32 -0500379
Geoff Lang33f11fb2018-05-07 13:42:47 -0400380void Context::initialize()
381{
382 mImplementation->setMemoryProgramCache(mMemoryProgramCache);
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400383
Geoff Lang33f11fb2018-05-07 13:42:47 -0400384 initCaps();
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700385 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400386
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400387 mGLState.initialize(this);
Régis Fénéon83107972015-02-05 12:57:44 +0100388
Shannon Woods53a94a82014-06-24 15:20:36 -0400389 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400390
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000391 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400392 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000393 // and cube map texture state vectors respectively associated with them.
394 // In order that access to these initial textures not be lost, they are treated as texture
395 // objects all of whose names are 0.
396
Corentin Wallez99d492c2018-02-27 15:17:10 -0500397 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800398 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500399
Corentin Wallez99d492c2018-02-27 15:17:10 -0500400 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800401 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400402
Geoff Langeb66a6e2016-10-31 13:06:12 -0400403 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400404 {
405 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500406 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800407 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400408
Corentin Wallez99d492c2018-02-27 15:17:10 -0500409 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800410 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400411 }
Geoff Lang3b573612016-10-31 14:08:10 -0400412 if (getClientVersion() >= Version(3, 1))
413 {
Olli Etuahod310a432018-08-24 15:40:23 +0300414 // TODO(http://anglebug.com/2775): These could also be enabled via extension
Geoff Lang3b573612016-10-31 14:08:10 -0400415 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500416 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800417 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Olli Etuahod310a432018-08-24 15:40:23 +0300418 Texture *zeroTexture2DMultisampleArray =
419 new Texture(mImplementation.get(), 0, TextureType::_2DMultisampleArray);
420 mZeroTextures[TextureType::_2DMultisampleArray].set(this, zeroTexture2DMultisampleArray);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800421
Jiajia Qin6eafb042016-12-27 17:04:07 +0800422 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
423 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800424 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800425 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800426
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800427 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
428 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400429 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800430 }
Geoff Lang3b573612016-10-31 14:08:10 -0400431 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000432
Geoff Langb0f917f2017-12-05 13:41:54 -0500433 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400434 {
435 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500436 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800437 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400438 }
439
Geoff Langb0f917f2017-12-05 13:41:54 -0500440 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400441 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500442 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800443 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400444 }
445
Jamie Madill4928b7c2017-06-20 12:57:39 -0400446 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500447
Jamie Madill57a89722013-07-02 11:57:03 -0400448 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000449
Geoff Langeb66a6e2016-10-31 13:06:12 -0400450 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400451 {
452 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
453 // In the initial state, a default transform feedback object is bound and treated as
454 // a transform feedback object with a name of zero. That object is bound any time
455 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400456 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400457 }
Geoff Langc8058452014-02-03 12:04:11 -0500458
Corentin Wallez336129f2017-10-17 15:55:40 -0400459 for (auto type : angle::AllEnums<BufferBinding>())
460 {
461 bindBuffer(type, 0);
462 }
463
464 bindRenderbuffer(GL_RENDERBUFFER, 0);
465
466 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
467 {
468 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
469 }
470
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700471 // Initialize GLES1 renderer if appropriate.
472 if (getClientVersion() < Version(2, 0))
473 {
474 mGLES1Renderer.reset(new GLES1Renderer());
475 }
476
Jamie Madillad9f24e2016-02-12 09:27:24 -0500477 // Initialize dirty bit masks
Geoff Lang9bf86f02018-07-26 11:46:34 -0400478 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
479 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
480 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400481 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400482
483 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
484 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
485 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
486
Jamie Madillc67323a2017-11-02 23:11:41 -0400487 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500488 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500489 // No dirty objects.
490
491 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400492 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500493 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400494 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500495 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
496
497 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
498 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
499 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
500 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
501 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
502 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
503 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
504 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
505 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
506 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
507 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400508 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500509 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
510
511 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
512 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700513 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400514 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
515 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500516 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
517 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400518
Xinghua Cao10a4d432017-11-28 14:46:26 +0800519 // TODO(xinghua.cao@intel.com): add other dirty bits and dirty objects.
520 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
521 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
522 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
523 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
524 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800525 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800526 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400527 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800528
Jamie Madillb4927eb2018-07-16 11:39:46 -0400529 mImplementation->setErrorSet(&mErrors);
530
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400531 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000532}
533
Jamie Madill4928b7c2017-06-20 12:57:39 -0400534egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000535{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700536 if (mGLES1Renderer)
537 {
538 mGLES1Renderer->onDestroy(this, &mGLState);
539 }
540
Jamie Madille7b3fe22018-04-05 09:42:46 -0400541 // Delete the Surface first to trigger a finish() in Vulkan.
Jamie Madille7b3fe22018-04-05 09:42:46 -0400542 ANGLE_TRY(releaseSurface(display));
543
Corentin Wallez80b24112015-08-25 16:41:57 -0400544 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000545 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400546 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000547 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400548 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000549
Corentin Wallez80b24112015-08-25 16:41:57 -0400550 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000551 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400552 if (query.second != nullptr)
553 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400554 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400555 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000556 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400557 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000558
Corentin Wallez80b24112015-08-25 16:41:57 -0400559 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400560 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400561 if (vertexArray.second)
562 {
563 vertexArray.second->onDestroy(this);
564 }
Jamie Madill57a89722013-07-02 11:57:03 -0400565 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400566 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400567
Corentin Wallez80b24112015-08-25 16:41:57 -0400568 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500569 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500570 if (transformFeedback.second != nullptr)
571 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500572 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500573 }
Geoff Langc8058452014-02-03 12:04:11 -0500574 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400575 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500576
Jamie Madill5b772312018-03-08 20:28:32 -0500577 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400578 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800579 if (zeroTexture.get() != nullptr)
580 {
581 ANGLE_TRY(zeroTexture->onDestroy(this));
582 zeroTexture.set(this, nullptr);
583 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400584 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000585
Jamie Madill2f348d22017-06-05 10:50:59 -0400586 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500587
Jamie Madill4928b7c2017-06-20 12:57:39 -0400588 mGLState.reset(this);
589
Jamie Madill6c1f6712017-02-14 19:08:04 -0500590 mState.mBuffers->release(this);
591 mState.mShaderPrograms->release(this);
592 mState.mTextures->release(this);
593 mState.mRenderbuffers->release(this);
594 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400595 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500596 mState.mPaths->release(this);
597 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800598 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400599
jchen107ae70d82018-07-06 13:47:01 +0800600 mThreadPool.reset();
601
Jamie Madill76e471e2017-10-21 09:56:01 -0400602 mImplementation->onDestroy(this);
603
Jamie Madill4928b7c2017-06-20 12:57:39 -0400604 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000605}
606
Jamie Madill70ee0f62017-02-06 16:04:20 -0500607Context::~Context()
608{
609}
610
Geoff Lang75359662018-04-11 01:42:27 -0400611void Context::setLabel(EGLLabelKHR label)
612{
613 mLabel = label;
614}
615
616EGLLabelKHR Context::getLabel() const
617{
618 return mLabel;
619}
620
Jamie Madill4928b7c2017-06-20 12:57:39 -0400621egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000622{
Jamie Madill61e16b42017-06-19 11:13:23 -0400623 mCurrentDisplay = display;
624
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000625 if (!mHasBeenCurrent)
626 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400627 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000628 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500629 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400630 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000631
Corentin Wallezc295e512017-01-27 17:47:50 -0500632 int width = 0;
633 int height = 0;
634 if (surface != nullptr)
635 {
636 width = surface->getWidth();
637 height = surface->getHeight();
638 }
639
640 mGLState.setViewportParams(0, 0, width, height);
641 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000642
643 mHasBeenCurrent = true;
644 }
645
Jamie Madill1b94d432015-08-07 13:23:23 -0400646 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700647 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400648 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400649
Jamie Madill4928b7c2017-06-20 12:57:39 -0400650 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500651
652 Framebuffer *newDefault = nullptr;
653 if (surface != nullptr)
654 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400655 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500656 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400657 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500658 }
659 else
660 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400661 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500662 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000663
Corentin Wallez37c39792015-08-20 14:19:46 -0400664 // Update default framebuffer, the binding of the previous default
665 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400666 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400667 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700668 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400669 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400670 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400671 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700672 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400673 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400674 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400675 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400676 }
Ian Ewell292f0052016-02-04 10:37:32 -0500677
678 // Notify the renderer of a context switch
Luc Ferron5396f2a2018-07-12 08:24:23 -0400679 ANGLE_TRY(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400680 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000681}
682
Jamie Madill4928b7c2017-06-20 12:57:39 -0400683egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400684{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400685 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400686
Geoff Langbf7b95d2018-05-01 16:48:21 -0400687 // Remove the default framebuffer
688 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500689 {
690 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400691 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500692 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400693
694 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500695 {
696 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400697 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500698 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400699
700 if (defaultFramebuffer)
701 {
702 defaultFramebuffer->onDestroy(this);
703 delete defaultFramebuffer;
704 }
705
Corentin Wallezc295e512017-01-27 17:47:50 -0500706 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
707
708 if (mCurrentSurface)
709 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400710 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500711 mCurrentSurface = nullptr;
712 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400713
714 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400715}
716
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000717GLuint Context::createBuffer()
718{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500719 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000720}
721
722GLuint Context::createProgram()
723{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500724 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000725}
726
Jiawei Shao385b3e02018-03-21 09:43:28 +0800727GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000728{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500729 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000730}
731
732GLuint Context::createTexture()
733{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500734 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000735}
736
737GLuint Context::createRenderbuffer()
738{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500739 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000740}
741
Brandon Jones59770802018-04-02 13:18:42 -0700742GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300743{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500744 auto resultOrError = mState.mPaths->createPaths(mImplementation.get(), range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300745 if (resultOrError.isError())
746 {
747 handleError(resultOrError.getError());
748 return 0;
749 }
750 return resultOrError.getResult();
751}
752
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000753// Returns an unused framebuffer name
754GLuint Context::createFramebuffer()
755{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500756 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000757}
758
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500759void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000760{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500761 for (int i = 0; i < n; i++)
762 {
763 GLuint handle = mFenceNVHandleAllocator.allocate();
764 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
765 fences[i] = handle;
766 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000767}
768
Yunchao Hea336b902017-08-02 16:05:21 +0800769GLuint Context::createProgramPipeline()
770{
771 return mState.mPipelines->createProgramPipeline();
772}
773
Jiawei Shao385b3e02018-03-21 09:43:28 +0800774GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800775{
776 UNIMPLEMENTED();
777 return 0u;
778}
779
James Darpinian4d9d4832018-03-13 12:43:28 -0700780void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000781{
James Darpinian4d9d4832018-03-13 12:43:28 -0700782 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
783 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000784 {
785 detachBuffer(buffer);
786 }
Jamie Madill893ab082014-05-16 16:56:10 -0400787
James Darpinian4d9d4832018-03-13 12:43:28 -0700788 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000789}
790
791void Context::deleteShader(GLuint shader)
792{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500793 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000794}
795
796void Context::deleteProgram(GLuint program)
797{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500798 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000799}
800
801void Context::deleteTexture(GLuint texture)
802{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500803 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000804 {
805 detachTexture(texture);
806 }
807
Jamie Madill6c1f6712017-02-14 19:08:04 -0500808 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000809}
810
811void Context::deleteRenderbuffer(GLuint renderbuffer)
812{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500813 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000814 {
815 detachRenderbuffer(renderbuffer);
816 }
Jamie Madill893ab082014-05-16 16:56:10 -0400817
Jamie Madill6c1f6712017-02-14 19:08:04 -0500818 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000819}
820
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400821void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400822{
823 // The spec specifies the underlying Fence object is not deleted until all current
824 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
825 // and since our API is currently designed for being called from a single thread, we can delete
826 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400827 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400828}
829
Yunchao Hea336b902017-08-02 16:05:21 +0800830void Context::deleteProgramPipeline(GLuint pipeline)
831{
832 if (mState.mPipelines->getProgramPipeline(pipeline))
833 {
834 detachProgramPipeline(pipeline);
835 }
836
837 mState.mPipelines->deleteObject(this, pipeline);
838}
839
Sami Väisänene45e53b2016-05-25 10:36:04 +0300840void Context::deletePaths(GLuint first, GLsizei range)
841{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500842 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300843}
844
Brandon Jones59770802018-04-02 13:18:42 -0700845bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300846{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500847 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300848 if (pathObj == nullptr)
849 return false;
850
851 return pathObj->hasPathData();
852}
853
Brandon Jones59770802018-04-02 13:18:42 -0700854bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300855{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500856 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300857}
858
Brandon Jones59770802018-04-02 13:18:42 -0700859void Context::pathCommands(GLuint path,
860 GLsizei numCommands,
861 const GLubyte *commands,
862 GLsizei numCoords,
863 GLenum coordType,
864 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300865{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500866 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300867
868 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
869}
870
Jamie Madill007530e2017-12-28 14:27:04 -0500871void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300872{
Jamie Madill007530e2017-12-28 14:27:04 -0500873 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300874
875 switch (pname)
876 {
877 case GL_PATH_STROKE_WIDTH_CHROMIUM:
878 pathObj->setStrokeWidth(value);
879 break;
880 case GL_PATH_END_CAPS_CHROMIUM:
881 pathObj->setEndCaps(static_cast<GLenum>(value));
882 break;
883 case GL_PATH_JOIN_STYLE_CHROMIUM:
884 pathObj->setJoinStyle(static_cast<GLenum>(value));
885 break;
886 case GL_PATH_MITER_LIMIT_CHROMIUM:
887 pathObj->setMiterLimit(value);
888 break;
889 case GL_PATH_STROKE_BOUND_CHROMIUM:
890 pathObj->setStrokeBound(value);
891 break;
892 default:
893 UNREACHABLE();
894 break;
895 }
896}
897
Jamie Madill007530e2017-12-28 14:27:04 -0500898void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300899{
Jamie Madill007530e2017-12-28 14:27:04 -0500900 // TODO(jmadill): Should use proper clamping/casting.
901 pathParameterf(path, pname, static_cast<GLfloat>(value));
902}
903
904void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
905{
906 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300907
908 switch (pname)
909 {
910 case GL_PATH_STROKE_WIDTH_CHROMIUM:
911 *value = pathObj->getStrokeWidth();
912 break;
913 case GL_PATH_END_CAPS_CHROMIUM:
914 *value = static_cast<GLfloat>(pathObj->getEndCaps());
915 break;
916 case GL_PATH_JOIN_STYLE_CHROMIUM:
917 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
918 break;
919 case GL_PATH_MITER_LIMIT_CHROMIUM:
920 *value = pathObj->getMiterLimit();
921 break;
922 case GL_PATH_STROKE_BOUND_CHROMIUM:
923 *value = pathObj->getStrokeBound();
924 break;
925 default:
926 UNREACHABLE();
927 break;
928 }
929}
930
Jamie Madill007530e2017-12-28 14:27:04 -0500931void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
932{
933 GLfloat val = 0.0f;
934 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
935 if (value)
936 *value = static_cast<GLint>(val);
937}
938
Brandon Jones59770802018-04-02 13:18:42 -0700939void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300940{
941 mGLState.setPathStencilFunc(func, ref, mask);
942}
943
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000944void Context::deleteFramebuffer(GLuint framebuffer)
945{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500946 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000947 {
948 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000949 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500950
Jamie Madill6c1f6712017-02-14 19:08:04 -0500951 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000952}
953
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500954void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000955{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500956 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000957 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500958 GLuint fence = fences[i];
959
960 FenceNV *fenceObject = nullptr;
961 if (mFenceNVMap.erase(fence, &fenceObject))
962 {
963 mFenceNVHandleAllocator.release(fence);
964 delete fenceObject;
965 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000966 }
967}
968
Geoff Lang70d0f492015-12-10 17:45:46 -0500969Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000970{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500971 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000972}
973
Jamie Madill570f7c82014-07-03 10:38:54 -0400974Texture *Context::getTexture(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000975{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500976 return mState.mTextures->getTexture(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000977}
978
Geoff Lang70d0f492015-12-10 17:45:46 -0500979Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000980{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500981 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000982}
983
Jamie Madill70b5bb02017-08-28 13:32:37 -0400984Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400985{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400986 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400987}
988
Jamie Madill57a89722013-07-02 11:57:03 -0400989VertexArray *Context::getVertexArray(GLuint handle) const
990{
Jamie Madill96a483b2017-06-27 16:49:21 -0400991 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400992}
993
Jamie Madilldc356042013-07-19 16:36:57 -0400994Sampler *Context::getSampler(GLuint handle) const
995{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500996 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -0400997}
998
Geoff Langc8058452014-02-03 12:04:11 -0500999TransformFeedback *Context::getTransformFeedback(GLuint handle) const
1000{
Jamie Madill96a483b2017-06-27 16:49:21 -04001001 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -05001002}
1003
Yunchao Hea336b902017-08-02 16:05:21 +08001004ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
1005{
1006 return mState.mPipelines->getProgramPipeline(handle);
1007}
1008
Geoff Lang75359662018-04-11 01:42:27 -04001009gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001010{
1011 switch (identifier)
1012 {
1013 case GL_BUFFER:
1014 return getBuffer(name);
1015 case GL_SHADER:
1016 return getShader(name);
1017 case GL_PROGRAM:
1018 return getProgram(name);
1019 case GL_VERTEX_ARRAY:
1020 return getVertexArray(name);
1021 case GL_QUERY:
1022 return getQuery(name);
1023 case GL_TRANSFORM_FEEDBACK:
1024 return getTransformFeedback(name);
1025 case GL_SAMPLER:
1026 return getSampler(name);
1027 case GL_TEXTURE:
1028 return getTexture(name);
1029 case GL_RENDERBUFFER:
1030 return getRenderbuffer(name);
1031 case GL_FRAMEBUFFER:
1032 return getFramebuffer(name);
1033 default:
1034 UNREACHABLE();
1035 return nullptr;
1036 }
1037}
1038
Geoff Lang75359662018-04-11 01:42:27 -04001039gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001040{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001041 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001042}
1043
Martin Radev9d901792016-07-15 15:58:58 +03001044void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1045{
Geoff Lang75359662018-04-11 01:42:27 -04001046 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001047 ASSERT(object != nullptr);
1048
1049 std::string labelName = GetObjectLabelFromPointer(length, label);
1050 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001051
1052 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1053 // specified object is active until we do this.
1054 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001055}
1056
1057void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1058{
Geoff Lang75359662018-04-11 01:42:27 -04001059 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001060 ASSERT(object != nullptr);
1061
1062 std::string labelName = GetObjectLabelFromPointer(length, label);
1063 object->setLabel(labelName);
1064}
1065
1066void Context::getObjectLabel(GLenum identifier,
1067 GLuint name,
1068 GLsizei bufSize,
1069 GLsizei *length,
1070 GLchar *label) const
1071{
Geoff Lang75359662018-04-11 01:42:27 -04001072 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001073 ASSERT(object != nullptr);
1074
1075 const std::string &objectLabel = object->getLabel();
1076 GetObjectLabelBase(objectLabel, bufSize, length, label);
1077}
1078
1079void Context::getObjectPtrLabel(const void *ptr,
1080 GLsizei bufSize,
1081 GLsizei *length,
1082 GLchar *label) const
1083{
Geoff Lang75359662018-04-11 01:42:27 -04001084 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001085 ASSERT(object != nullptr);
1086
1087 const std::string &objectLabel = object->getLabel();
1088 GetObjectLabelBase(objectLabel, bufSize, length, label);
1089}
1090
Jamie Madilldc356042013-07-19 16:36:57 -04001091bool Context::isSampler(GLuint samplerName) const
1092{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001093 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001094}
1095
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001096void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001097{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001098 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001099
Jamie Madilldedd7b92014-11-05 16:30:36 -05001100 if (handle == 0)
1101 {
1102 texture = mZeroTextures[target].get();
1103 }
1104 else
1105 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001106 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001107 }
1108
1109 ASSERT(texture);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001110 mGLState.setSamplerTexture(this, target, texture);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001111}
1112
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001113void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001114{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001115 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1116 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001117 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001118 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001119}
1120
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001121void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001122{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001123 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1124 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001125 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001126 mDrawFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001127}
1128
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001129void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001130{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001131 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001132 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001133 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001134 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001135}
1136
Shao80957d92017-02-20 21:25:59 +08001137void Context::bindVertexBuffer(GLuint bindingIndex,
1138 GLuint bufferHandle,
1139 GLintptr offset,
1140 GLsizei stride)
1141{
1142 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001143 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001144 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001145}
1146
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001147void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001148{
Geoff Lang76b10c92014-09-05 16:28:14 -04001149 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001150 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001151 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001152 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001153}
1154
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001155void Context::bindImageTexture(GLuint unit,
1156 GLuint texture,
1157 GLint level,
1158 GLboolean layered,
1159 GLint layer,
1160 GLenum access,
1161 GLenum format)
1162{
1163 Texture *tex = mState.mTextures->getTexture(texture);
1164 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1165}
1166
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001167void Context::useProgram(GLuint program)
1168{
Jamie Madill6c1f6712017-02-14 19:08:04 -05001169 mGLState.setProgram(this, getProgram(program));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001170 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001171}
1172
Jiajia Qin5451d532017-11-16 17:16:34 +08001173void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1174{
1175 UNIMPLEMENTED();
1176}
1177
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001178void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001179{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001180 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001181 TransformFeedback *transformFeedback =
1182 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001183 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -05001184}
1185
Yunchao Hea336b902017-08-02 16:05:21 +08001186void Context::bindProgramPipeline(GLuint pipelineHandle)
1187{
1188 ProgramPipeline *pipeline =
1189 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1190 mGLState.setProgramPipelineBinding(this, pipeline);
1191}
1192
Corentin Wallezad3ae902018-03-09 13:40:42 -05001193void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001194{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001195 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001196 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001197
Geoff Lang5aad9672014-09-08 11:10:42 -04001198 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001199 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001200
1201 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001202 mGLState.setActiveQuery(this, target, queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001203}
1204
Corentin Wallezad3ae902018-03-09 13:40:42 -05001205void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001206{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001207 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001208 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001209
Jamie Madill5188a272018-07-25 10:53:56 -04001210 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001211
Geoff Lang5aad9672014-09-08 11:10:42 -04001212 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001213 mGLState.setActiveQuery(this, target, nullptr);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001214}
1215
Corentin Wallezad3ae902018-03-09 13:40:42 -05001216void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001217{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001218 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001219
1220 Query *queryObject = getQuery(id, true, target);
1221 ASSERT(queryObject);
1222
Jamie Madill5188a272018-07-25 10:53:56 -04001223 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001224}
1225
Corentin Wallezad3ae902018-03-09 13:40:42 -05001226void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001227{
1228 switch (pname)
1229 {
1230 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001231 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001232 break;
1233 case GL_QUERY_COUNTER_BITS_EXT:
1234 switch (target)
1235 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001236 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001237 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1238 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001239 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001240 params[0] = getExtensions().queryCounterBitsTimestamp;
1241 break;
1242 default:
1243 UNREACHABLE();
1244 params[0] = 0;
1245 break;
1246 }
1247 break;
1248 default:
1249 UNREACHABLE();
1250 return;
1251 }
1252}
1253
Corentin Wallezad3ae902018-03-09 13:40:42 -05001254void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001255 GLenum pname,
1256 GLsizei bufSize,
1257 GLsizei *length,
1258 GLint *params)
1259{
1260 getQueryiv(target, pname, params);
1261}
1262
Geoff Lang2186c382016-10-14 10:54:54 -04001263void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001264{
Jamie Madill5188a272018-07-25 10:53:56 -04001265 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001266}
1267
Brandon Jones59770802018-04-02 13:18:42 -07001268void Context::getQueryObjectivRobust(GLuint id,
1269 GLenum pname,
1270 GLsizei bufSize,
1271 GLsizei *length,
1272 GLint *params)
1273{
1274 getQueryObjectiv(id, pname, params);
1275}
1276
Geoff Lang2186c382016-10-14 10:54:54 -04001277void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001278{
Jamie Madill5188a272018-07-25 10:53:56 -04001279 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001280}
1281
Brandon Jones59770802018-04-02 13:18:42 -07001282void Context::getQueryObjectuivRobust(GLuint id,
1283 GLenum pname,
1284 GLsizei bufSize,
1285 GLsizei *length,
1286 GLuint *params)
1287{
1288 getQueryObjectuiv(id, pname, params);
1289}
1290
Geoff Lang2186c382016-10-14 10:54:54 -04001291void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001292{
Jamie Madill5188a272018-07-25 10:53:56 -04001293 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001294}
1295
Brandon Jones59770802018-04-02 13:18:42 -07001296void Context::getQueryObjecti64vRobust(GLuint id,
1297 GLenum pname,
1298 GLsizei bufSize,
1299 GLsizei *length,
1300 GLint64 *params)
1301{
1302 getQueryObjecti64v(id, pname, params);
1303}
1304
Geoff Lang2186c382016-10-14 10:54:54 -04001305void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001306{
Jamie Madill5188a272018-07-25 10:53:56 -04001307 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001308}
1309
Brandon Jones59770802018-04-02 13:18:42 -07001310void Context::getQueryObjectui64vRobust(GLuint id,
1311 GLenum pname,
1312 GLsizei bufSize,
1313 GLsizei *length,
1314 GLuint64 *params)
1315{
1316 getQueryObjectui64v(id, pname, params);
1317}
1318
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001319Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001320{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001321 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001322}
1323
Jamie Madill2f348d22017-06-05 10:50:59 -04001324FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001325{
Jamie Madill96a483b2017-06-27 16:49:21 -04001326 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001327}
1328
Corentin Wallezad3ae902018-03-09 13:40:42 -05001329Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001330{
Jamie Madill96a483b2017-06-27 16:49:21 -04001331 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001332 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001333 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001334 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001335
1336 Query *query = mQueryMap.query(handle);
1337 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001338 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001339 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001340 query = new Query(mImplementation->createQuery(type), handle);
1341 query->addRef();
1342 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001343 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001344 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001345}
1346
Geoff Lang70d0f492015-12-10 17:45:46 -05001347Query *Context::getQuery(GLuint handle) const
1348{
Jamie Madill96a483b2017-06-27 16:49:21 -04001349 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001350}
1351
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001352Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001353{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001354 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1355 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001356}
1357
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001358Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001359{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001360 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001361}
1362
Geoff Lang492a7e42014-11-05 13:27:06 -05001363Compiler *Context::getCompiler() const
1364{
Jamie Madill2f348d22017-06-05 10:50:59 -04001365 if (mCompiler.get() == nullptr)
1366 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001367 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001368 }
1369 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001370}
1371
Jamie Madillc1d770e2017-04-13 17:31:24 -04001372void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001373{
1374 switch (pname)
1375 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001376 case GL_SHADER_COMPILER:
1377 *params = GL_TRUE;
1378 break;
1379 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1380 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1381 break;
1382 default:
1383 mGLState.getBooleanv(pname, params);
1384 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001385 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001386}
1387
Jamie Madillc1d770e2017-04-13 17:31:24 -04001388void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001389{
Shannon Woods53a94a82014-06-24 15:20:36 -04001390 // Queries about context capabilities and maximums are answered by Context.
1391 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001392 switch (pname)
1393 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001394 case GL_ALIASED_LINE_WIDTH_RANGE:
1395 params[0] = mCaps.minAliasedLineWidth;
1396 params[1] = mCaps.maxAliasedLineWidth;
1397 break;
1398 case GL_ALIASED_POINT_SIZE_RANGE:
1399 params[0] = mCaps.minAliasedPointSize;
1400 params[1] = mCaps.maxAliasedPointSize;
1401 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001402 case GL_SMOOTH_POINT_SIZE_RANGE:
1403 params[0] = mCaps.minSmoothPointSize;
1404 params[1] = mCaps.maxSmoothPointSize;
1405 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001406 case GL_SMOOTH_LINE_WIDTH_RANGE:
1407 params[0] = mCaps.minSmoothLineWidth;
1408 params[1] = mCaps.maxSmoothLineWidth;
1409 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001410 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1411 ASSERT(mExtensions.textureFilterAnisotropic);
1412 *params = mExtensions.maxTextureAnisotropy;
1413 break;
1414 case GL_MAX_TEXTURE_LOD_BIAS:
1415 *params = mCaps.maxLODBias;
1416 break;
1417
1418 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1419 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1420 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001421 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1422 // GLES1 constants for modelview/projection matrix.
1423 if (getClientVersion() < Version(2, 0))
1424 {
1425 mGLState.getFloatv(pname, params);
1426 }
1427 else
1428 {
1429 ASSERT(mExtensions.pathRendering);
1430 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1431 memcpy(params, m, 16 * sizeof(GLfloat));
1432 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001433 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001434 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001435
Jamie Madill231c7f52017-04-26 13:45:37 -04001436 default:
1437 mGLState.getFloatv(pname, params);
1438 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001439 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001440}
1441
Jamie Madillc1d770e2017-04-13 17:31:24 -04001442void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001443{
Shannon Woods53a94a82014-06-24 15:20:36 -04001444 // Queries about context capabilities and maximums are answered by Context.
1445 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001446
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001447 switch (pname)
1448 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001449 case GL_MAX_VERTEX_ATTRIBS:
1450 *params = mCaps.maxVertexAttributes;
1451 break;
1452 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1453 *params = mCaps.maxVertexUniformVectors;
1454 break;
1455 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001456 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001457 break;
1458 case GL_MAX_VARYING_VECTORS:
1459 *params = mCaps.maxVaryingVectors;
1460 break;
1461 case GL_MAX_VARYING_COMPONENTS:
1462 *params = mCaps.maxVertexOutputComponents;
1463 break;
1464 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1465 *params = mCaps.maxCombinedTextureImageUnits;
1466 break;
1467 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001468 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001469 break;
1470 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001471 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001472 break;
1473 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1474 *params = mCaps.maxFragmentUniformVectors;
1475 break;
1476 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001477 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001478 break;
1479 case GL_MAX_RENDERBUFFER_SIZE:
1480 *params = mCaps.maxRenderbufferSize;
1481 break;
1482 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1483 *params = mCaps.maxColorAttachments;
1484 break;
1485 case GL_MAX_DRAW_BUFFERS_EXT:
1486 *params = mCaps.maxDrawBuffers;
1487 break;
1488 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1489 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1490 case GL_SUBPIXEL_BITS:
1491 *params = 4;
1492 break;
1493 case GL_MAX_TEXTURE_SIZE:
1494 *params = mCaps.max2DTextureSize;
1495 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001496 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1497 *params = mCaps.maxRectangleTextureSize;
1498 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001499 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1500 *params = mCaps.maxCubeMapTextureSize;
1501 break;
1502 case GL_MAX_3D_TEXTURE_SIZE:
1503 *params = mCaps.max3DTextureSize;
1504 break;
1505 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1506 *params = mCaps.maxArrayTextureLayers;
1507 break;
1508 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1509 *params = mCaps.uniformBufferOffsetAlignment;
1510 break;
1511 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1512 *params = mCaps.maxUniformBufferBindings;
1513 break;
1514 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001515 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001516 break;
1517 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001518 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001519 break;
1520 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1521 *params = mCaps.maxCombinedTextureImageUnits;
1522 break;
1523 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1524 *params = mCaps.maxVertexOutputComponents;
1525 break;
1526 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1527 *params = mCaps.maxFragmentInputComponents;
1528 break;
1529 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1530 *params = mCaps.minProgramTexelOffset;
1531 break;
1532 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1533 *params = mCaps.maxProgramTexelOffset;
1534 break;
1535 case GL_MAJOR_VERSION:
1536 *params = getClientVersion().major;
1537 break;
1538 case GL_MINOR_VERSION:
1539 *params = getClientVersion().minor;
1540 break;
1541 case GL_MAX_ELEMENTS_INDICES:
1542 *params = mCaps.maxElementsIndices;
1543 break;
1544 case GL_MAX_ELEMENTS_VERTICES:
1545 *params = mCaps.maxElementsVertices;
1546 break;
1547 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1548 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1549 break;
1550 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1551 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1552 break;
1553 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1554 *params = mCaps.maxTransformFeedbackSeparateComponents;
1555 break;
1556 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1557 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1558 break;
1559 case GL_MAX_SAMPLES_ANGLE:
1560 *params = mCaps.maxSamples;
1561 break;
1562 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001563 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001564 params[0] = mCaps.maxViewportWidth;
1565 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001566 }
1567 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001568 case GL_COMPRESSED_TEXTURE_FORMATS:
1569 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1570 params);
1571 break;
1572 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1573 *params = mResetStrategy;
1574 break;
1575 case GL_NUM_SHADER_BINARY_FORMATS:
1576 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1577 break;
1578 case GL_SHADER_BINARY_FORMATS:
1579 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1580 break;
1581 case GL_NUM_PROGRAM_BINARY_FORMATS:
1582 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1583 break;
1584 case GL_PROGRAM_BINARY_FORMATS:
1585 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1586 break;
1587 case GL_NUM_EXTENSIONS:
1588 *params = static_cast<GLint>(mExtensionStrings.size());
1589 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001590
Jamie Madill231c7f52017-04-26 13:45:37 -04001591 // GL_KHR_debug
1592 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1593 *params = mExtensions.maxDebugMessageLength;
1594 break;
1595 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1596 *params = mExtensions.maxDebugLoggedMessages;
1597 break;
1598 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1599 *params = mExtensions.maxDebugGroupStackDepth;
1600 break;
1601 case GL_MAX_LABEL_LENGTH:
1602 *params = mExtensions.maxLabelLength;
1603 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001604
Martin Radeve5285d22017-07-14 16:23:53 +03001605 // GL_ANGLE_multiview
1606 case GL_MAX_VIEWS_ANGLE:
1607 *params = mExtensions.maxViews;
1608 break;
1609
Jamie Madill231c7f52017-04-26 13:45:37 -04001610 // GL_EXT_disjoint_timer_query
1611 case GL_GPU_DISJOINT_EXT:
1612 *params = mImplementation->getGPUDisjoint();
1613 break;
1614 case GL_MAX_FRAMEBUFFER_WIDTH:
1615 *params = mCaps.maxFramebufferWidth;
1616 break;
1617 case GL_MAX_FRAMEBUFFER_HEIGHT:
1618 *params = mCaps.maxFramebufferHeight;
1619 break;
1620 case GL_MAX_FRAMEBUFFER_SAMPLES:
1621 *params = mCaps.maxFramebufferSamples;
1622 break;
1623 case GL_MAX_SAMPLE_MASK_WORDS:
1624 *params = mCaps.maxSampleMaskWords;
1625 break;
1626 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1627 *params = mCaps.maxColorTextureSamples;
1628 break;
1629 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1630 *params = mCaps.maxDepthTextureSamples;
1631 break;
1632 case GL_MAX_INTEGER_SAMPLES:
1633 *params = mCaps.maxIntegerSamples;
1634 break;
1635 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1636 *params = mCaps.maxVertexAttribRelativeOffset;
1637 break;
1638 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1639 *params = mCaps.maxVertexAttribBindings;
1640 break;
1641 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1642 *params = mCaps.maxVertexAttribStride;
1643 break;
1644 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001645 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001646 break;
1647 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001648 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001649 break;
1650 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001651 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001652 break;
1653 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001654 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001655 break;
1656 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001657 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001658 break;
1659 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001660 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001661 break;
1662 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001663 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001664 break;
1665 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001666 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001667 break;
1668 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1669 *params = mCaps.minProgramTextureGatherOffset;
1670 break;
1671 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1672 *params = mCaps.maxProgramTextureGatherOffset;
1673 break;
1674 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1675 *params = mCaps.maxComputeWorkGroupInvocations;
1676 break;
1677 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001678 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001679 break;
1680 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001681 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001682 break;
1683 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1684 *params = mCaps.maxComputeSharedMemorySize;
1685 break;
1686 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001687 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001688 break;
1689 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001690 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001691 break;
1692 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001693 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001694 break;
1695 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001696 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001697 break;
1698 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001699 *params =
1700 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001701 break;
1702 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001703 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001704 break;
1705 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1706 *params = mCaps.maxCombinedShaderOutputResources;
1707 break;
1708 case GL_MAX_UNIFORM_LOCATIONS:
1709 *params = mCaps.maxUniformLocations;
1710 break;
1711 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1712 *params = mCaps.maxAtomicCounterBufferBindings;
1713 break;
1714 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1715 *params = mCaps.maxAtomicCounterBufferSize;
1716 break;
1717 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1718 *params = mCaps.maxCombinedAtomicCounterBuffers;
1719 break;
1720 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1721 *params = mCaps.maxCombinedAtomicCounters;
1722 break;
1723 case GL_MAX_IMAGE_UNITS:
1724 *params = mCaps.maxImageUnits;
1725 break;
1726 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1727 *params = mCaps.maxCombinedImageUniforms;
1728 break;
1729 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1730 *params = mCaps.maxShaderStorageBufferBindings;
1731 break;
1732 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1733 *params = mCaps.maxCombinedShaderStorageBlocks;
1734 break;
1735 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1736 *params = mCaps.shaderStorageBufferOffsetAlignment;
1737 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001738
1739 // GL_EXT_geometry_shader
1740 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1741 *params = mCaps.maxFramebufferLayers;
1742 break;
1743 case GL_LAYER_PROVOKING_VERTEX_EXT:
1744 *params = mCaps.layerProvokingVertex;
1745 break;
1746 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001747 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001748 break;
1749 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001750 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001751 break;
1752 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001753 *params =
1754 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001755 break;
1756 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1757 *params = mCaps.maxGeometryInputComponents;
1758 break;
1759 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1760 *params = mCaps.maxGeometryOutputComponents;
1761 break;
1762 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1763 *params = mCaps.maxGeometryOutputVertices;
1764 break;
1765 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1766 *params = mCaps.maxGeometryTotalOutputComponents;
1767 break;
1768 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1769 *params = mCaps.maxGeometryShaderInvocations;
1770 break;
1771 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001772 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001773 break;
1774 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001775 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001776 break;
1777 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001778 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001779 break;
1780 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001781 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001782 break;
1783 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001784 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001785 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001786 // GLES1 emulation: Caps queries
1787 case GL_MAX_TEXTURE_UNITS:
1788 *params = mCaps.maxMultitextureUnits;
1789 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001790 case GL_MAX_MODELVIEW_STACK_DEPTH:
1791 *params = mCaps.maxModelviewMatrixStackDepth;
1792 break;
1793 case GL_MAX_PROJECTION_STACK_DEPTH:
1794 *params = mCaps.maxProjectionMatrixStackDepth;
1795 break;
1796 case GL_MAX_TEXTURE_STACK_DEPTH:
1797 *params = mCaps.maxTextureMatrixStackDepth;
1798 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001799 case GL_MAX_LIGHTS:
1800 *params = mCaps.maxLights;
1801 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001802 case GL_MAX_CLIP_PLANES:
1803 *params = mCaps.maxClipPlanes;
1804 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001805 // GLES1 emulation: Vertex attribute queries
1806 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1807 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1808 case GL_COLOR_ARRAY_BUFFER_BINDING:
1809 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1810 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1811 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1812 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1813 break;
1814 case GL_VERTEX_ARRAY_STRIDE:
1815 case GL_NORMAL_ARRAY_STRIDE:
1816 case GL_COLOR_ARRAY_STRIDE:
1817 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1818 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1819 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1820 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1821 break;
1822 case GL_VERTEX_ARRAY_SIZE:
1823 case GL_COLOR_ARRAY_SIZE:
1824 case GL_TEXTURE_COORD_ARRAY_SIZE:
1825 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1826 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1827 break;
1828 case GL_VERTEX_ARRAY_TYPE:
1829 case GL_COLOR_ARRAY_TYPE:
1830 case GL_NORMAL_ARRAY_TYPE:
1831 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1832 case GL_TEXTURE_COORD_ARRAY_TYPE:
1833 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1834 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1835 break;
1836
jchen1082af6202018-06-22 10:59:52 +08001837 // GL_KHR_parallel_shader_compile
1838 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1839 *params = mGLState.getMaxShaderCompilerThreads();
1840 break;
1841
Jamie Madill231c7f52017-04-26 13:45:37 -04001842 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001843 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001844 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001845 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001846}
1847
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001848void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001849{
Shannon Woods53a94a82014-06-24 15:20:36 -04001850 // Queries about context capabilities and maximums are answered by Context.
1851 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001852 switch (pname)
1853 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001854 case GL_MAX_ELEMENT_INDEX:
1855 *params = mCaps.maxElementIndex;
1856 break;
1857 case GL_MAX_UNIFORM_BLOCK_SIZE:
1858 *params = mCaps.maxUniformBlockSize;
1859 break;
1860 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001861 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001862 break;
1863 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001864 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001865 break;
1866 case GL_MAX_SERVER_WAIT_TIMEOUT:
1867 *params = mCaps.maxServerWaitTimeout;
1868 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001869
Jamie Madill231c7f52017-04-26 13:45:37 -04001870 // GL_EXT_disjoint_timer_query
1871 case GL_TIMESTAMP_EXT:
1872 *params = mImplementation->getTimestamp();
1873 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001874
Jamie Madill231c7f52017-04-26 13:45:37 -04001875 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1876 *params = mCaps.maxShaderStorageBlockSize;
1877 break;
1878 default:
1879 UNREACHABLE();
1880 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001881 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001882}
1883
Geoff Lang70d0f492015-12-10 17:45:46 -05001884void Context::getPointerv(GLenum pname, void **params) const
1885{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001886 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001887}
1888
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001889void Context::getPointervRobustANGLERobust(GLenum pname,
1890 GLsizei bufSize,
1891 GLsizei *length,
1892 void **params)
1893{
1894 UNIMPLEMENTED();
1895}
1896
Martin Radev66fb8202016-07-28 11:45:20 +03001897void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001898{
Shannon Woods53a94a82014-06-24 15:20:36 -04001899 // Queries about context capabilities and maximums are answered by Context.
1900 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001901
1902 GLenum nativeType;
1903 unsigned int numParams;
1904 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1905 ASSERT(queryStatus);
1906
1907 if (nativeType == GL_INT)
1908 {
1909 switch (target)
1910 {
1911 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1912 ASSERT(index < 3u);
1913 *data = mCaps.maxComputeWorkGroupCount[index];
1914 break;
1915 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1916 ASSERT(index < 3u);
1917 *data = mCaps.maxComputeWorkGroupSize[index];
1918 break;
1919 default:
1920 mGLState.getIntegeri_v(target, index, data);
1921 }
1922 }
1923 else
1924 {
1925 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1926 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001927}
1928
Brandon Jones59770802018-04-02 13:18:42 -07001929void Context::getIntegeri_vRobust(GLenum target,
1930 GLuint index,
1931 GLsizei bufSize,
1932 GLsizei *length,
1933 GLint *data)
1934{
1935 getIntegeri_v(target, index, data);
1936}
1937
Martin Radev66fb8202016-07-28 11:45:20 +03001938void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001939{
Shannon Woods53a94a82014-06-24 15:20:36 -04001940 // Queries about context capabilities and maximums are answered by Context.
1941 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001942
1943 GLenum nativeType;
1944 unsigned int numParams;
1945 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1946 ASSERT(queryStatus);
1947
1948 if (nativeType == GL_INT_64_ANGLEX)
1949 {
1950 mGLState.getInteger64i_v(target, index, data);
1951 }
1952 else
1953 {
1954 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1955 }
1956}
1957
Brandon Jones59770802018-04-02 13:18:42 -07001958void Context::getInteger64i_vRobust(GLenum target,
1959 GLuint index,
1960 GLsizei bufSize,
1961 GLsizei *length,
1962 GLint64 *data)
1963{
1964 getInteger64i_v(target, index, data);
1965}
1966
Martin Radev66fb8202016-07-28 11:45:20 +03001967void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1968{
1969 // Queries about context capabilities and maximums are answered by Context.
1970 // Queries about current GL state values are answered by State.
1971
1972 GLenum nativeType;
1973 unsigned int numParams;
1974 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1975 ASSERT(queryStatus);
1976
1977 if (nativeType == GL_BOOL)
1978 {
1979 mGLState.getBooleani_v(target, index, data);
1980 }
1981 else
1982 {
1983 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1984 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001985}
1986
Brandon Jones59770802018-04-02 13:18:42 -07001987void Context::getBooleani_vRobust(GLenum target,
1988 GLuint index,
1989 GLsizei bufSize,
1990 GLsizei *length,
1991 GLboolean *data)
1992{
1993 getBooleani_v(target, index, data);
1994}
1995
Corentin Wallez336129f2017-10-17 15:55:40 -04001996void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001997{
1998 Buffer *buffer = mGLState.getTargetBuffer(target);
1999 QueryBufferParameteriv(buffer, pname, params);
2000}
2001
Brandon Jones59770802018-04-02 13:18:42 -07002002void Context::getBufferParameterivRobust(BufferBinding target,
2003 GLenum pname,
2004 GLsizei bufSize,
2005 GLsizei *length,
2006 GLint *params)
2007{
2008 getBufferParameteriv(target, pname, params);
2009}
2010
He Yunchao010e4db2017-03-03 14:22:06 +08002011void Context::getFramebufferAttachmentParameteriv(GLenum target,
2012 GLenum attachment,
2013 GLenum pname,
2014 GLint *params)
2015{
2016 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002017 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002018}
2019
Brandon Jones59770802018-04-02 13:18:42 -07002020void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2021 GLenum attachment,
2022 GLenum pname,
2023 GLsizei bufSize,
2024 GLsizei *length,
2025 GLint *params)
2026{
2027 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2028}
2029
He Yunchao010e4db2017-03-03 14:22:06 +08002030void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2031{
2032 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2033 QueryRenderbufferiv(this, renderbuffer, pname, params);
2034}
2035
Brandon Jones59770802018-04-02 13:18:42 -07002036void Context::getRenderbufferParameterivRobust(GLenum target,
2037 GLenum pname,
2038 GLsizei bufSize,
2039 GLsizei *length,
2040 GLint *params)
2041{
2042 getRenderbufferParameteriv(target, pname, params);
2043}
2044
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002045void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002046{
2047 Texture *texture = getTargetTexture(target);
2048 QueryTexParameterfv(texture, pname, params);
2049}
2050
Brandon Jones59770802018-04-02 13:18:42 -07002051void Context::getTexParameterfvRobust(TextureType target,
2052 GLenum pname,
2053 GLsizei bufSize,
2054 GLsizei *length,
2055 GLfloat *params)
2056{
2057 getTexParameterfv(target, pname, params);
2058}
2059
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002060void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002061{
2062 Texture *texture = getTargetTexture(target);
2063 QueryTexParameteriv(texture, pname, params);
2064}
Jiajia Qin5451d532017-11-16 17:16:34 +08002065
Brandon Jones59770802018-04-02 13:18:42 -07002066void Context::getTexParameterivRobust(TextureType target,
2067 GLenum pname,
2068 GLsizei bufSize,
2069 GLsizei *length,
2070 GLint *params)
2071{
2072 getTexParameteriv(target, pname, params);
2073}
2074
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002075void Context::getTexParameterIivRobust(TextureType target,
2076 GLenum pname,
2077 GLsizei bufSize,
2078 GLsizei *length,
2079 GLint *params)
2080{
2081 UNIMPLEMENTED();
2082}
2083
2084void Context::getTexParameterIuivRobust(TextureType target,
2085 GLenum pname,
2086 GLsizei bufSize,
2087 GLsizei *length,
2088 GLuint *params)
2089{
2090 UNIMPLEMENTED();
2091}
2092
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002093void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002094{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002095 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002096 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002097}
2098
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002099void Context::getTexLevelParameterivRobust(TextureTarget target,
2100 GLint level,
2101 GLenum pname,
2102 GLsizei bufSize,
2103 GLsizei *length,
2104 GLint *params)
2105{
2106 UNIMPLEMENTED();
2107}
2108
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002109void Context::getTexLevelParameterfv(TextureTarget target,
2110 GLint level,
2111 GLenum pname,
2112 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002113{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002114 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002115 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002116}
2117
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002118void Context::getTexLevelParameterfvRobust(TextureTarget target,
2119 GLint level,
2120 GLenum pname,
2121 GLsizei bufSize,
2122 GLsizei *length,
2123 GLfloat *params)
2124{
2125 UNIMPLEMENTED();
2126}
2127
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002128void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002129{
2130 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002131 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002132 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002133}
2134
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002135void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002136{
2137 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002138 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002139 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002140}
2141
Brandon Jones59770802018-04-02 13:18:42 -07002142void Context::texParameterfvRobust(TextureType target,
2143 GLenum pname,
2144 GLsizei bufSize,
2145 const GLfloat *params)
2146{
2147 texParameterfv(target, pname, params);
2148}
2149
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002150void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002151{
2152 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002153 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002154 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002155}
2156
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002157void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002158{
2159 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002160 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002161 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002162}
2163
Brandon Jones59770802018-04-02 13:18:42 -07002164void Context::texParameterivRobust(TextureType target,
2165 GLenum pname,
2166 GLsizei bufSize,
2167 const GLint *params)
2168{
2169 texParameteriv(target, pname, params);
2170}
2171
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002172void Context::texParameterIivRobust(TextureType target,
2173 GLenum pname,
2174 GLsizei bufSize,
2175 const GLint *params)
2176{
2177 UNIMPLEMENTED();
2178}
2179
2180void Context::texParameterIuivRobust(TextureType target,
2181 GLenum pname,
2182 GLsizei bufSize,
2183 const GLuint *params)
2184{
2185 UNIMPLEMENTED();
2186}
2187
Jamie Madill493f9572018-05-24 19:52:15 -04002188void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002189{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002190 // No-op if count draws no primitives for given mode
2191 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002192 {
2193 return;
2194 }
2195
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002196 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002197 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002198 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002199}
2200
Jamie Madill493f9572018-05-24 19:52:15 -04002201void Context::drawArraysInstanced(PrimitiveMode mode,
2202 GLint first,
2203 GLsizei count,
2204 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002205{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002206 // No-op if count draws no primitives for given mode
2207 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002208 {
2209 return;
2210 }
2211
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002212 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002213 ANGLE_CONTEXT_TRY(
2214 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002215 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2216 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002217}
2218
Jamie Madill493f9572018-05-24 19:52:15 -04002219void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002220{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002221 // No-op if count draws no primitives for given mode
2222 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002223 {
2224 return;
2225 }
2226
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002227 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002228 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002229}
2230
Jamie Madill493f9572018-05-24 19:52:15 -04002231void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002232 GLsizei count,
2233 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002234 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002235 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002236{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002237 // No-op if count draws no primitives for given mode
2238 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002239 {
2240 return;
2241 }
2242
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002243 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002244 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002245 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002246}
2247
Jamie Madill493f9572018-05-24 19:52:15 -04002248void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002249 GLuint start,
2250 GLuint end,
2251 GLsizei count,
2252 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002253 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002254{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002255 // No-op if count draws no primitives for given mode
2256 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002257 {
2258 return;
2259 }
2260
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002261 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002262 ANGLE_CONTEXT_TRY(
2263 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002264}
2265
Jamie Madill493f9572018-05-24 19:52:15 -04002266void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002267{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002268 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002269 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002270}
2271
Jamie Madill493f9572018-05-24 19:52:15 -04002272void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002273{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002274 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002275 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002276}
2277
Jamie Madill675fe712016-12-19 13:07:54 -05002278void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002279{
Jamie Madillafa02a22017-11-23 12:57:38 -05002280 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002281}
2282
Jamie Madill675fe712016-12-19 13:07:54 -05002283void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002284{
Jamie Madillafa02a22017-11-23 12:57:38 -05002285 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002286}
2287
Austin Kinross6ee1e782015-05-29 17:05:37 -07002288void Context::insertEventMarker(GLsizei length, const char *marker)
2289{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002290 ASSERT(mImplementation);
2291 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002292}
2293
2294void Context::pushGroupMarker(GLsizei length, const char *marker)
2295{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002296 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002297
2298 if (marker == nullptr)
2299 {
2300 // From the EXT_debug_marker spec,
2301 // "If <marker> is null then an empty string is pushed on the stack."
2302 mImplementation->pushGroupMarker(length, "");
2303 }
2304 else
2305 {
2306 mImplementation->pushGroupMarker(length, marker);
2307 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002308}
2309
2310void Context::popGroupMarker()
2311{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002312 ASSERT(mImplementation);
2313 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002314}
2315
Geoff Langd8605522016-04-13 10:19:12 -04002316void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2317{
2318 Program *programObject = getProgram(program);
2319 ASSERT(programObject);
2320
2321 programObject->bindUniformLocation(location, name);
2322}
2323
Brandon Jones59770802018-04-02 13:18:42 -07002324void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002325{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002326 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002327}
2328
Brandon Jones59770802018-04-02 13:18:42 -07002329void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002330{
2331 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2332}
2333
Brandon Jones59770802018-04-02 13:18:42 -07002334void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002335{
2336 GLfloat I[16];
2337 angle::Matrix<GLfloat>::setToIdentity(I);
2338
2339 mGLState.loadPathRenderingMatrix(matrixMode, I);
2340}
2341
2342void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2343{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002344 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002345 if (!pathObj)
2346 return;
2347
Geoff Lang9bf86f02018-07-26 11:46:34 -04002348 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002349
2350 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2351}
2352
2353void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2354{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002355 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002356 if (!pathObj)
2357 return;
2358
Geoff Lang9bf86f02018-07-26 11:46:34 -04002359 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002360
2361 mImplementation->stencilStrokePath(pathObj, reference, mask);
2362}
2363
2364void Context::coverFillPath(GLuint path, GLenum coverMode)
2365{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002366 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002367 if (!pathObj)
2368 return;
2369
Geoff Lang9bf86f02018-07-26 11:46:34 -04002370 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002371
2372 mImplementation->coverFillPath(pathObj, coverMode);
2373}
2374
2375void Context::coverStrokePath(GLuint path, GLenum coverMode)
2376{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002377 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002378 if (!pathObj)
2379 return;
2380
Geoff Lang9bf86f02018-07-26 11:46:34 -04002381 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002382
2383 mImplementation->coverStrokePath(pathObj, coverMode);
2384}
2385
2386void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2387{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002388 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002389 if (!pathObj)
2390 return;
2391
Geoff Lang9bf86f02018-07-26 11:46:34 -04002392 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002393
2394 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2395}
2396
2397void Context::stencilThenCoverStrokePath(GLuint path,
2398 GLint reference,
2399 GLuint mask,
2400 GLenum coverMode)
2401{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002402 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002403 if (!pathObj)
2404 return;
2405
Geoff Lang9bf86f02018-07-26 11:46:34 -04002406 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002407
2408 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2409}
2410
Sami Väisänend59ca052016-06-21 16:10:00 +03002411void Context::coverFillPathInstanced(GLsizei numPaths,
2412 GLenum pathNameType,
2413 const void *paths,
2414 GLuint pathBase,
2415 GLenum coverMode,
2416 GLenum transformType,
2417 const GLfloat *transformValues)
2418{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002419 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002420
Geoff Lang9bf86f02018-07-26 11:46:34 -04002421 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002422
2423 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2424}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002425
Sami Väisänend59ca052016-06-21 16:10:00 +03002426void Context::coverStrokePathInstanced(GLsizei numPaths,
2427 GLenum pathNameType,
2428 const void *paths,
2429 GLuint pathBase,
2430 GLenum coverMode,
2431 GLenum transformType,
2432 const GLfloat *transformValues)
2433{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002434 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002435
2436 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002437 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002438
2439 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2440 transformValues);
2441}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002442
Sami Väisänend59ca052016-06-21 16:10:00 +03002443void Context::stencilFillPathInstanced(GLsizei numPaths,
2444 GLenum pathNameType,
2445 const void *paths,
2446 GLuint pathBase,
2447 GLenum fillMode,
2448 GLuint mask,
2449 GLenum transformType,
2450 const GLfloat *transformValues)
2451{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002452 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002453
2454 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002455 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002456
2457 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2458 transformValues);
2459}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002460
Sami Väisänend59ca052016-06-21 16:10:00 +03002461void Context::stencilStrokePathInstanced(GLsizei numPaths,
2462 GLenum pathNameType,
2463 const void *paths,
2464 GLuint pathBase,
2465 GLint reference,
2466 GLuint mask,
2467 GLenum transformType,
2468 const GLfloat *transformValues)
2469{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002470 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002471
Geoff Lang9bf86f02018-07-26 11:46:34 -04002472 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002473
2474 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2475 transformValues);
2476}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002477
Sami Väisänend59ca052016-06-21 16:10:00 +03002478void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2479 GLenum pathNameType,
2480 const void *paths,
2481 GLuint pathBase,
2482 GLenum fillMode,
2483 GLuint mask,
2484 GLenum coverMode,
2485 GLenum transformType,
2486 const GLfloat *transformValues)
2487{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002488 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002489
Geoff Lang9bf86f02018-07-26 11:46:34 -04002490 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002491
2492 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2493 transformType, transformValues);
2494}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002495
Sami Väisänend59ca052016-06-21 16:10:00 +03002496void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2497 GLenum pathNameType,
2498 const void *paths,
2499 GLuint pathBase,
2500 GLint reference,
2501 GLuint mask,
2502 GLenum coverMode,
2503 GLenum transformType,
2504 const GLfloat *transformValues)
2505{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002506 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002507
Geoff Lang9bf86f02018-07-26 11:46:34 -04002508 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002509
2510 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2511 transformType, transformValues);
2512}
2513
Sami Väisänen46eaa942016-06-29 10:26:37 +03002514void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2515{
2516 auto *programObject = getProgram(program);
2517
2518 programObject->bindFragmentInputLocation(location, name);
2519}
2520
2521void Context::programPathFragmentInputGen(GLuint program,
2522 GLint location,
2523 GLenum genMode,
2524 GLint components,
2525 const GLfloat *coeffs)
2526{
2527 auto *programObject = getProgram(program);
2528
jchen103fd614d2018-08-13 12:21:58 +08002529 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002530}
2531
jchen1015015f72017-03-16 13:54:21 +08002532GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2533{
jchen10fd7c3b52017-03-21 15:36:03 +08002534 const auto *programObject = getProgram(program);
jchen1015015f72017-03-16 13:54:21 +08002535 return QueryProgramResourceIndex(programObject, programInterface, name);
2536}
2537
jchen10fd7c3b52017-03-21 15:36:03 +08002538void Context::getProgramResourceName(GLuint program,
2539 GLenum programInterface,
2540 GLuint index,
2541 GLsizei bufSize,
2542 GLsizei *length,
2543 GLchar *name)
2544{
2545 const auto *programObject = getProgram(program);
2546 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2547}
2548
jchen10191381f2017-04-11 13:59:04 +08002549GLint Context::getProgramResourceLocation(GLuint program,
2550 GLenum programInterface,
2551 const GLchar *name)
2552{
2553 const auto *programObject = getProgram(program);
2554 return QueryProgramResourceLocation(programObject, programInterface, name);
2555}
2556
jchen10880683b2017-04-12 16:21:55 +08002557void Context::getProgramResourceiv(GLuint program,
2558 GLenum programInterface,
2559 GLuint index,
2560 GLsizei propCount,
2561 const GLenum *props,
2562 GLsizei bufSize,
2563 GLsizei *length,
2564 GLint *params)
2565{
2566 const auto *programObject = getProgram(program);
2567 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2568 length, params);
2569}
2570
jchen10d9cd7b72017-08-30 15:04:25 +08002571void Context::getProgramInterfaceiv(GLuint program,
2572 GLenum programInterface,
2573 GLenum pname,
2574 GLint *params)
2575{
2576 const auto *programObject = getProgram(program);
2577 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2578}
2579
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002580void Context::getProgramInterfaceivRobust(GLuint program,
2581 GLenum programInterface,
2582 GLenum pname,
2583 GLsizei bufSize,
2584 GLsizei *length,
2585 GLint *params)
2586{
2587 UNIMPLEMENTED();
2588}
2589
Jamie Madill306b6c12018-07-27 08:12:49 -04002590void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002591{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002592 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002593}
2594
2595// Get one of the recorded errors and clear its flag, if any.
2596// [OpenGL ES 2.0.24] section 2.5 page 13.
2597GLenum Context::getError()
2598{
Geoff Langda5777c2014-07-11 09:52:58 -04002599 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002600 {
Geoff Langda5777c2014-07-11 09:52:58 -04002601 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002602 }
Geoff Langda5777c2014-07-11 09:52:58 -04002603 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002604 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002605 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002606 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002607}
2608
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002609// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002610void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002611{
2612 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002613 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002614 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002615 mContextLostForced = true;
2616 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002617 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002618}
2619
Jamie Madill427064d2018-04-13 16:20:34 -04002620bool Context::isContextLost() const
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002621{
2622 return mContextLost;
2623}
2624
Jamie Madillfa920eb2018-01-04 11:45:50 -05002625GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002626{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002627 // Even if the application doesn't want to know about resets, we want to know
2628 // as it will allow us to skip all the calls.
2629 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002630 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002631 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002632 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002633 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002634 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002635
2636 // EXT_robustness, section 2.6: If the reset notification behavior is
2637 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2638 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2639 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002640 }
2641
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002642 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2643 // status should be returned at least once, and GL_NO_ERROR should be returned
2644 // once the device has finished resetting.
2645 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002646 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002647 ASSERT(mResetStatus == GL_NO_ERROR);
2648 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002649
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002650 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002651 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002652 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002653 }
2654 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002655 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002656 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002657 // If markContextLost was used to mark the context lost then
2658 // assume that is not recoverable, and continue to report the
2659 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002660 mResetStatus = mImplementation->getResetStatus();
2661 }
Jamie Madill893ab082014-05-16 16:56:10 -04002662
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002663 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002664}
2665
2666bool Context::isResetNotificationEnabled()
2667{
2668 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2669}
2670
Corentin Walleze3b10e82015-05-20 11:06:25 -04002671const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002672{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002673 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002674}
2675
2676EGLenum Context::getClientType() const
2677{
2678 return mClientType;
2679}
2680
2681EGLenum Context::getRenderBuffer() const
2682{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002683 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2684 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002685 {
2686 return EGL_NONE;
2687 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002688
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002689 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002690 ASSERT(backAttachment != nullptr);
2691 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002692}
2693
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002694VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002695{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002696 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002697 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2698 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002699 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002700 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2701 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002702
Jamie Madill96a483b2017-06-27 16:49:21 -04002703 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002704 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002705
2706 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002707}
2708
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002709TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002710{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002711 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002712 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2713 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002714 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002715 transformFeedback =
2716 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002717 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002718 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002719 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002720
2721 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002722}
2723
2724bool Context::isVertexArrayGenerated(GLuint vertexArray)
2725{
Jamie Madill96a483b2017-06-27 16:49:21 -04002726 ASSERT(mVertexArrayMap.contains(0));
2727 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002728}
2729
2730bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2731{
Jamie Madill96a483b2017-06-27 16:49:21 -04002732 ASSERT(mTransformFeedbackMap.contains(0));
2733 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002734}
2735
Shannon Woods53a94a82014-06-24 15:20:36 -04002736void Context::detachTexture(GLuint texture)
2737{
2738 // Simple pass-through to State's detachTexture method, as textures do not require
2739 // allocation map management either here or in the resource manager at detach time.
2740 // Zero textures are held by the Context, and we don't attempt to request them from
2741 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002742 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002743}
2744
James Darpinian4d9d4832018-03-13 12:43:28 -07002745void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002746{
Yuly Novikov5807a532015-12-03 13:01:22 -05002747 // Simple pass-through to State's detachBuffer method, since
2748 // only buffer attachments to container objects that are bound to the current context
2749 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002750
Yuly Novikov5807a532015-12-03 13:01:22 -05002751 // [OpenGL ES 3.2] section 5.1.2 page 45:
2752 // Attachments to unbound container objects, such as
2753 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2754 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002755 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002756}
2757
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002758void Context::detachFramebuffer(GLuint framebuffer)
2759{
Shannon Woods53a94a82014-06-24 15:20:36 -04002760 // Framebuffer detachment is handled by Context, because 0 is a valid
2761 // Framebuffer object, and a pointer to it must be passed from Context
2762 // to State at binding time.
2763
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002764 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002765 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2766 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2767 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002768
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002769 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002770 {
2771 bindReadFramebuffer(0);
2772 }
2773
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002774 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002775 {
2776 bindDrawFramebuffer(0);
2777 }
2778}
2779
2780void Context::detachRenderbuffer(GLuint renderbuffer)
2781{
Jamie Madilla02315b2017-02-23 14:14:47 -05002782 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002783}
2784
Jamie Madill57a89722013-07-02 11:57:03 -04002785void Context::detachVertexArray(GLuint vertexArray)
2786{
Jamie Madill77a72f62015-04-14 11:18:32 -04002787 // Vertex array detachment is handled by Context, because 0 is a valid
2788 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002789 // binding time.
2790
Jamie Madill57a89722013-07-02 11:57:03 -04002791 // [OpenGL ES 3.0.2] section 2.10 page 43:
2792 // If a vertex array object that is currently bound is deleted, the binding
2793 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002794 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002795 {
2796 bindVertexArray(0);
2797 }
2798}
2799
Geoff Langc8058452014-02-03 12:04:11 -05002800void Context::detachTransformFeedback(GLuint transformFeedback)
2801{
Corentin Walleza2257da2016-04-19 16:43:12 -04002802 // Transform feedback detachment is handled by Context, because 0 is a valid
2803 // transform feedback, and a pointer to it must be passed from Context to State at
2804 // binding time.
2805
2806 // The OpenGL specification doesn't mention what should happen when the currently bound
2807 // transform feedback object is deleted. Since it is a container object, we treat it like
2808 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002809 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002810 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002811 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002812 }
Geoff Langc8058452014-02-03 12:04:11 -05002813}
2814
Jamie Madilldc356042013-07-19 16:36:57 -04002815void Context::detachSampler(GLuint sampler)
2816{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002817 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002818}
2819
Yunchao Hea336b902017-08-02 16:05:21 +08002820void Context::detachProgramPipeline(GLuint pipeline)
2821{
2822 mGLState.detachProgramPipeline(this, pipeline);
2823}
2824
Jamie Madill3ef140a2017-08-26 23:11:21 -04002825void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002826{
Shaodde78e82017-05-22 14:13:27 +08002827 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002828 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002829}
2830
Jamie Madille29d1672013-07-19 16:36:57 -04002831void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2832{
Geoff Langc1984ed2016-10-07 12:41:00 -04002833 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002834 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002835 SetSamplerParameteri(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002836 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002837}
Jamie Madille29d1672013-07-19 16:36:57 -04002838
Geoff Langc1984ed2016-10-07 12:41:00 -04002839void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2840{
2841 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002842 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002843 SetSamplerParameteriv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002844 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002845}
2846
Brandon Jones59770802018-04-02 13:18:42 -07002847void Context::samplerParameterivRobust(GLuint sampler,
2848 GLenum pname,
2849 GLsizei bufSize,
2850 const GLint *param)
2851{
2852 samplerParameteriv(sampler, pname, param);
2853}
2854
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002855void Context::samplerParameterIivRobust(GLuint sampler,
2856 GLenum pname,
2857 GLsizei bufSize,
2858 const GLint *param)
2859{
2860 UNIMPLEMENTED();
2861}
2862
2863void Context::samplerParameterIuivRobust(GLuint sampler,
2864 GLenum pname,
2865 GLsizei bufSize,
2866 const GLuint *param)
2867{
2868 UNIMPLEMENTED();
2869}
2870
Jamie Madille29d1672013-07-19 16:36:57 -04002871void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2872{
Geoff Langc1984ed2016-10-07 12:41:00 -04002873 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002874 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002875 SetSamplerParameterf(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002876 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002877}
2878
Geoff Langc1984ed2016-10-07 12:41:00 -04002879void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002880{
Geoff Langc1984ed2016-10-07 12:41:00 -04002881 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002882 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002883 SetSamplerParameterfv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002884 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002885}
2886
Brandon Jones59770802018-04-02 13:18:42 -07002887void Context::samplerParameterfvRobust(GLuint sampler,
2888 GLenum pname,
2889 GLsizei bufSize,
2890 const GLfloat *param)
2891{
2892 samplerParameterfv(sampler, pname, param);
2893}
2894
Geoff Langc1984ed2016-10-07 12:41:00 -04002895void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002896{
Geoff Langc1984ed2016-10-07 12:41:00 -04002897 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002898 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002899 QuerySamplerParameteriv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002900 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002901}
Jamie Madill9675b802013-07-19 16:36:59 -04002902
Brandon Jones59770802018-04-02 13:18:42 -07002903void Context::getSamplerParameterivRobust(GLuint sampler,
2904 GLenum pname,
2905 GLsizei bufSize,
2906 GLsizei *length,
2907 GLint *params)
2908{
2909 getSamplerParameteriv(sampler, pname, params);
2910}
2911
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002912void Context::getSamplerParameterIivRobust(GLuint sampler,
2913 GLenum pname,
2914 GLsizei bufSize,
2915 GLsizei *length,
2916 GLint *params)
2917{
2918 UNIMPLEMENTED();
2919}
2920
2921void Context::getSamplerParameterIuivRobust(GLuint sampler,
2922 GLenum pname,
2923 GLsizei bufSize,
2924 GLsizei *length,
2925 GLuint *params)
2926{
2927 UNIMPLEMENTED();
2928}
2929
Geoff Langc1984ed2016-10-07 12:41:00 -04002930void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2931{
2932 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002933 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002934 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002935 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002936}
2937
Brandon Jones59770802018-04-02 13:18:42 -07002938void Context::getSamplerParameterfvRobust(GLuint sampler,
2939 GLenum pname,
2940 GLsizei bufSize,
2941 GLsizei *length,
2942 GLfloat *params)
2943{
2944 getSamplerParameterfv(sampler, pname, params);
2945}
2946
Olli Etuahof0fee072016-03-30 15:11:58 +03002947void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2948{
2949 gl::Program *programObject = getProgram(program);
Yunchao He61afff12017-03-14 15:34:03 +08002950 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002951}
2952
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002953void Context::initRendererString()
2954{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002955 std::ostringstream rendererString;
2956 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002957 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002958 rendererString << ")";
2959
Geoff Langcec35902014-04-16 10:52:36 -04002960 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002961}
2962
Geoff Langc339c4e2016-11-29 10:37:36 -05002963void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002964{
Geoff Langc339c4e2016-11-29 10:37:36 -05002965 const Version &clientVersion = getClientVersion();
2966
2967 std::ostringstream versionString;
2968 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2969 << ANGLE_VERSION_STRING << ")";
2970 mVersionString = MakeStaticString(versionString.str());
2971
2972 std::ostringstream shadingLanguageVersionString;
2973 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2974 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2975 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
2976 << ")";
2977 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002978}
2979
Geoff Langcec35902014-04-16 10:52:36 -04002980void Context::initExtensionStrings()
2981{
Geoff Langc339c4e2016-11-29 10:37:36 -05002982 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
2983 std::ostringstream combinedStringStream;
2984 std::copy(strings.begin(), strings.end(),
2985 std::ostream_iterator<const char *>(combinedStringStream, " "));
2986 return MakeStaticString(combinedStringStream.str());
2987 };
2988
2989 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002990 for (const auto &extensionString : mExtensions.getStrings())
2991 {
2992 mExtensionStrings.push_back(MakeStaticString(extensionString));
2993 }
Geoff Langc339c4e2016-11-29 10:37:36 -05002994 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002995
Geoff Langc339c4e2016-11-29 10:37:36 -05002996 mRequestableExtensionStrings.clear();
2997 for (const auto &extensionInfo : GetExtensionInfoMap())
2998 {
2999 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003000 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003001 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003002 {
3003 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3004 }
3005 }
3006 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003007}
3008
Geoff Langc339c4e2016-11-29 10:37:36 -05003009const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003010{
Geoff Langc339c4e2016-11-29 10:37:36 -05003011 switch (name)
3012 {
3013 case GL_VENDOR:
3014 return reinterpret_cast<const GLubyte *>("Google Inc.");
3015
3016 case GL_RENDERER:
3017 return reinterpret_cast<const GLubyte *>(mRendererString);
3018
3019 case GL_VERSION:
3020 return reinterpret_cast<const GLubyte *>(mVersionString);
3021
3022 case GL_SHADING_LANGUAGE_VERSION:
3023 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3024
3025 case GL_EXTENSIONS:
3026 return reinterpret_cast<const GLubyte *>(mExtensionString);
3027
3028 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3029 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3030
3031 default:
3032 UNREACHABLE();
3033 return nullptr;
3034 }
Geoff Langcec35902014-04-16 10:52:36 -04003035}
3036
Geoff Langc339c4e2016-11-29 10:37:36 -05003037const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003038{
Geoff Langc339c4e2016-11-29 10:37:36 -05003039 switch (name)
3040 {
3041 case GL_EXTENSIONS:
3042 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3043
3044 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3045 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3046
3047 default:
3048 UNREACHABLE();
3049 return nullptr;
3050 }
Geoff Langcec35902014-04-16 10:52:36 -04003051}
3052
3053size_t Context::getExtensionStringCount() const
3054{
3055 return mExtensionStrings.size();
3056}
3057
Geoff Lang111a99e2017-10-17 10:58:41 -04003058bool Context::isExtensionRequestable(const char *name)
3059{
3060 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3061 auto extension = extensionInfos.find(name);
3062
Geoff Lang111a99e2017-10-17 10:58:41 -04003063 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003064 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003065}
3066
Geoff Langc339c4e2016-11-29 10:37:36 -05003067void Context::requestExtension(const char *name)
3068{
3069 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3070 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3071 const auto &extension = extensionInfos.at(name);
3072 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003073 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003074
3075 if (mExtensions.*(extension.ExtensionsMember))
3076 {
3077 // Extension already enabled
3078 return;
3079 }
3080
3081 mExtensions.*(extension.ExtensionsMember) = true;
3082 updateCaps();
3083 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003084
Jamie Madill2f348d22017-06-05 10:50:59 -04003085 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3086 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003087
Jamie Madill81c2e252017-09-09 23:32:46 -04003088 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3089 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003090 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003091 for (auto &zeroTexture : mZeroTextures)
3092 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003093 if (zeroTexture.get() != nullptr)
3094 {
3095 zeroTexture->signalDirty(this, InitState::Initialized);
3096 }
Geoff Lang9aded172017-04-05 11:07:56 -04003097 }
3098
Jamie Madillb983a4b2018-08-01 11:34:51 -04003099 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003100}
3101
3102size_t Context::getRequestableExtensionStringCount() const
3103{
3104 return mRequestableExtensionStrings.size();
3105}
3106
Jamie Madill493f9572018-05-24 19:52:15 -04003107void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003108{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003109 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003110 ASSERT(transformFeedback != nullptr);
3111 ASSERT(!transformFeedback->isPaused());
3112
Jamie Madill6c1f6712017-02-14 19:08:04 -05003113 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003114}
3115
3116bool Context::hasActiveTransformFeedback(GLuint program) const
3117{
3118 for (auto pair : mTransformFeedbackMap)
3119 {
3120 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3121 {
3122 return true;
3123 }
3124 }
3125 return false;
3126}
3127
Geoff Lang33f11fb2018-05-07 13:42:47 -04003128Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003129{
3130 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3131
jchen1082af6202018-06-22 10:59:52 +08003132 // Explicitly enable GL_KHR_parallel_shader_compile
3133 supportedExtensions.parallelShaderCompile = true;
3134
Geoff Langb0f917f2017-12-05 13:41:54 -05003135 if (getClientVersion() < ES_2_0)
3136 {
3137 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003138 supportedExtensions.pointSizeArray = true;
3139 supportedExtensions.textureCubeMap = true;
3140 supportedExtensions.pointSprite = true;
3141 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003142 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003143 }
3144
3145 if (getClientVersion() < ES_3_0)
3146 {
3147 // Disable ES3+ extensions
3148 supportedExtensions.colorBufferFloat = false;
3149 supportedExtensions.eglImageExternalEssl3 = false;
3150 supportedExtensions.textureNorm16 = false;
3151 supportedExtensions.multiview = false;
3152 supportedExtensions.maxViews = 1u;
3153 }
3154
3155 if (getClientVersion() < ES_3_1)
3156 {
3157 // Disable ES3.1+ extensions
3158 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003159
3160 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3161 // once 2D multisample texture extension is exposed there.
3162 supportedExtensions.textureMultisampleArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003163 }
3164
3165 if (getClientVersion() > ES_2_0)
3166 {
3167 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3168 // supportedExtensions.sRGB = false;
3169 }
3170
3171 // Some extensions are always available because they are implemented in the GL layer.
3172 supportedExtensions.bindUniformLocation = true;
3173 supportedExtensions.vertexArrayObject = true;
3174 supportedExtensions.bindGeneratesResource = true;
3175 supportedExtensions.clientArrays = true;
3176 supportedExtensions.requestExtension = true;
3177
3178 // Enable the no error extension if the context was created with the flag.
3179 supportedExtensions.noError = mSkipValidation;
3180
3181 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003182 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003183
3184 // Explicitly enable GL_KHR_debug
3185 supportedExtensions.debug = true;
3186 supportedExtensions.maxDebugMessageLength = 1024;
3187 supportedExtensions.maxDebugLoggedMessages = 1024;
3188 supportedExtensions.maxDebugGroupStackDepth = 1024;
3189 supportedExtensions.maxLabelLength = 1024;
3190
3191 // Explicitly enable GL_ANGLE_robust_client_memory
3192 supportedExtensions.robustClientMemory = true;
3193
3194 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003195 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003196
3197 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3198 // supports it.
3199 supportedExtensions.robustBufferAccessBehavior =
3200 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3201
3202 // Enable the cache control query unconditionally.
3203 supportedExtensions.programCacheControl = true;
3204
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003205 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003206 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003207 {
3208 // GL_ANGLE_explicit_context_gles1
3209 supportedExtensions.explicitContextGles1 = true;
3210 // GL_ANGLE_explicit_context
3211 supportedExtensions.explicitContext = true;
3212 }
3213
Geoff Langb0f917f2017-12-05 13:41:54 -05003214 return supportedExtensions;
3215}
3216
Geoff Lang33f11fb2018-05-07 13:42:47 -04003217void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003218{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003219 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003220
Geoff Lang33f11fb2018-05-07 13:42:47 -04003221 mSupportedExtensions = generateSupportedExtensions();
3222 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003223
3224 mLimitations = mImplementation->getNativeLimitations();
3225
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003226 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3227 if (getClientVersion() < Version(2, 0))
3228 {
3229 mCaps.maxMultitextureUnits = 4;
3230 mCaps.maxClipPlanes = 6;
3231 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003232 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3233 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3234 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003235 mCaps.minSmoothPointSize = 1.0f;
3236 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003237 mCaps.minSmoothLineWidth = 1.0f;
3238 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003239 }
3240
Luc Ferronad2ae932018-06-11 15:31:17 -04003241 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003242 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003243
Luc Ferronad2ae932018-06-11 15:31:17 -04003244 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3245
Jamie Madill0f80ed82017-09-19 00:24:56 -04003246 if (getClientVersion() < ES_3_1)
3247 {
3248 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3249 }
3250 else
3251 {
3252 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3253 }
Geoff Lang301d1612014-07-09 10:34:37 -04003254
Jiawei Shao54aafe52018-04-27 14:54:57 +08003255 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3256 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003257 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3258
Jamie Madill0f80ed82017-09-19 00:24:56 -04003259 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3260 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3261
3262 // Limit textures as well, so we can use fast bitsets with texture bindings.
3263 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003264 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3265 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3266 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3267 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003268
Jiawei Shaodb342272017-09-27 10:21:45 +08003269 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3270
Geoff Langc287ea62016-09-16 14:46:51 -04003271 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003272 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003273 for (const auto &extensionInfo : GetExtensionInfoMap())
3274 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003275 // If the user has requested that extensions start disabled and they are requestable,
3276 // disable them.
3277 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003278 {
3279 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3280 }
3281 }
3282
3283 // Generate texture caps
3284 updateCaps();
3285}
3286
3287void Context::updateCaps()
3288{
Geoff Lang900013c2014-07-07 11:32:19 -04003289 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003290 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003291
Jamie Madill7b62cf92017-11-02 15:20:49 -04003292 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003293 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003294 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003295 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003296
Geoff Lang0d8b7242015-09-09 14:56:53 -04003297 // Update the format caps based on the client version and extensions.
3298 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3299 // ES3.
3300 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003301 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003302 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003303 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003304 formatCaps.textureAttachment =
3305 formatCaps.textureAttachment &&
3306 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3307 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3308 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003309
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003310 // OpenGL ES does not support multisampling with non-rendererable formats
3311 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003312 if (!formatCaps.renderbuffer ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003313 (getClientVersion() < ES_3_1 &&
3314 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003315 {
Geoff Langd87878e2014-09-19 15:42:59 -04003316 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003317 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003318 else
3319 {
3320 // We may have limited the max samples for some required renderbuffer formats due to
3321 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3322 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3323
3324 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3325 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3326 // exception of signed and unsigned integer formats."
3327 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3328 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3329 {
3330 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3331 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3332 }
3333
3334 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3335 if (getClientVersion() >= ES_3_1)
3336 {
3337 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3338 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3339 // the exception that the signed and unsigned integer formats are required only to
3340 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3341 // multisamples, which must be at least one."
3342 if (formatInfo.componentType == GL_INT ||
3343 formatInfo.componentType == GL_UNSIGNED_INT)
3344 {
3345 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3346 }
3347
3348 // GLES 3.1 section 19.3.1.
3349 if (formatCaps.texturable)
3350 {
3351 if (formatInfo.depthBits > 0)
3352 {
3353 mCaps.maxDepthTextureSamples =
3354 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3355 }
3356 else if (formatInfo.redBits > 0)
3357 {
3358 mCaps.maxColorTextureSamples =
3359 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3360 }
3361 }
3362 }
3363 }
Geoff Langd87878e2014-09-19 15:42:59 -04003364
3365 if (formatCaps.texturable && formatInfo.compressed)
3366 {
Geoff Langca271392017-04-05 12:30:00 -04003367 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003368 }
3369
Geoff Langca271392017-04-05 12:30:00 -04003370 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003371 }
Jamie Madill32447362017-06-28 14:53:52 -04003372
3373 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003374 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003375 {
3376 mMemoryProgramCache = nullptr;
3377 }
Corentin Walleze4477002017-12-01 14:39:58 -05003378
3379 // Compute which buffer types are allowed
3380 mValidBufferBindings.reset();
3381 mValidBufferBindings.set(BufferBinding::ElementArray);
3382 mValidBufferBindings.set(BufferBinding::Array);
3383
3384 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3385 {
3386 mValidBufferBindings.set(BufferBinding::PixelPack);
3387 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3388 }
3389
3390 if (getClientVersion() >= ES_3_0)
3391 {
3392 mValidBufferBindings.set(BufferBinding::CopyRead);
3393 mValidBufferBindings.set(BufferBinding::CopyWrite);
3394 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3395 mValidBufferBindings.set(BufferBinding::Uniform);
3396 }
3397
3398 if (getClientVersion() >= ES_3_1)
3399 {
3400 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3401 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3402 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3403 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3404 }
jchen107ae70d82018-07-06 13:47:01 +08003405
3406 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Geoff Lang493daf52014-07-03 13:38:44 -04003407}
3408
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003409void Context::initWorkarounds()
3410{
Jamie Madill761b02c2017-06-23 16:27:06 -04003411 // Apply back-end workarounds.
3412 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3413
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003414 // Lose the context upon out of memory error if the application is
3415 // expecting to watch for those events.
3416 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
3417}
3418
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003419// Return true if the draw is a no-op, else return false.
3420// A no-op draw occurs if the count of vertices is less than the minimum required to
3421// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3422bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3423{
3424 return count < kMinimumPrimitiveCounts[mode];
3425}
3426
3427bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3428{
3429 return (instanceCount == 0) || noopDraw(mode, count);
3430}
3431
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003432Error Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003433{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003434 if (mGLES1Renderer)
3435 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003436 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003437 }
3438
Geoff Lang9bf86f02018-07-26 11:46:34 -04003439 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003440
3441 if (isRobustResourceInitEnabled())
3442 {
3443 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3444 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3445 }
3446
Geoff Langa8cb2872018-03-09 16:09:40 -05003447 ANGLE_TRY(syncDirtyBits());
Geoff Langd4fff502017-09-22 11:28:28 -04003448 return NoError();
3449}
3450
3451Error Context::prepareForClear(GLbitfield mask)
3452{
Geoff Langa8cb2872018-03-09 16:09:40 -05003453 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003454 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003455 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003456 return NoError();
3457}
3458
3459Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3460{
Geoff Langa8cb2872018-03-09 16:09:40 -05003461 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003462 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3463 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003464 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003465 return NoError();
3466}
3467
Geoff Langa8cb2872018-03-09 16:09:40 -05003468Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003469{
Geoff Langa8cb2872018-03-09 16:09:40 -05003470 ANGLE_TRY(syncDirtyObjects(objectMask));
3471 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003472 return NoError();
3473}
3474
Geoff Langa8cb2872018-03-09 16:09:40 -05003475Error Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003476{
3477 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill189ad872018-07-09 13:32:37 -04003478 ANGLE_TRY(mImplementation->syncState(this, dirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003479 mGLState.clearDirtyBits();
3480 return NoError();
3481}
3482
Geoff Langa8cb2872018-03-09 16:09:40 -05003483Error Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003484{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003485 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill189ad872018-07-09 13:32:37 -04003486 ANGLE_TRY(mImplementation->syncState(this, dirtyBits));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003487 mGLState.clearDirtyBits(dirtyBits);
Jamie Madillbc918e72018-03-08 09:47:21 -05003488 return NoError();
Jamie Madill1b94d432015-08-07 13:23:23 -04003489}
Jamie Madillc29968b2016-01-20 11:17:23 -05003490
Geoff Langa8cb2872018-03-09 16:09:40 -05003491Error Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003492{
3493 return mGLState.syncDirtyObjects(this, objectMask);
3494}
3495
Jamie Madillc29968b2016-01-20 11:17:23 -05003496void Context::blitFramebuffer(GLint srcX0,
3497 GLint srcY0,
3498 GLint srcX1,
3499 GLint srcY1,
3500 GLint dstX0,
3501 GLint dstY0,
3502 GLint dstX1,
3503 GLint dstY1,
3504 GLbitfield mask,
3505 GLenum filter)
3506{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003507 if (mask == 0)
3508 {
3509 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3510 // buffers are copied.
3511 return;
3512 }
3513
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003514 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003515 ASSERT(drawFramebuffer);
3516
3517 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3518 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3519
Jamie Madillbc918e72018-03-08 09:47:21 -05003520 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003521
Jamie Madillc564c072017-06-01 12:45:42 -04003522 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003523}
Jamie Madillc29968b2016-01-20 11:17:23 -05003524
3525void Context::clear(GLbitfield mask)
3526{
Geoff Langd4fff502017-09-22 11:28:28 -04003527 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3528 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003529}
3530
3531void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3532{
Geoff Langd4fff502017-09-22 11:28:28 -04003533 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3534 ANGLE_CONTEXT_TRY(
3535 mGLState.getDrawFramebuffer()->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003536}
3537
3538void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3539{
Geoff Langd4fff502017-09-22 11:28:28 -04003540 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3541 ANGLE_CONTEXT_TRY(
3542 mGLState.getDrawFramebuffer()->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003543}
3544
3545void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3546{
Geoff Langd4fff502017-09-22 11:28:28 -04003547 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3548 ANGLE_CONTEXT_TRY(
3549 mGLState.getDrawFramebuffer()->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003550}
3551
3552void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3553{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003554 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003555 ASSERT(framebufferObject);
3556
3557 // If a buffer is not present, the clear has no effect
3558 if (framebufferObject->getDepthbuffer() == nullptr &&
3559 framebufferObject->getStencilbuffer() == nullptr)
3560 {
3561 return;
3562 }
3563
Geoff Langd4fff502017-09-22 11:28:28 -04003564 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3565 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003566}
3567
3568void Context::readPixels(GLint x,
3569 GLint y,
3570 GLsizei width,
3571 GLsizei height,
3572 GLenum format,
3573 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003574 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003575{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003576 if (width == 0 || height == 0)
3577 {
3578 return;
3579 }
3580
Jamie Madillbc918e72018-03-08 09:47:21 -05003581 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003582
Jamie Madillb6664922017-07-25 12:55:04 -04003583 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3584 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003585
3586 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003587 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003588}
3589
Brandon Jones59770802018-04-02 13:18:42 -07003590void Context::readPixelsRobust(GLint x,
3591 GLint y,
3592 GLsizei width,
3593 GLsizei height,
3594 GLenum format,
3595 GLenum type,
3596 GLsizei bufSize,
3597 GLsizei *length,
3598 GLsizei *columns,
3599 GLsizei *rows,
3600 void *pixels)
3601{
3602 readPixels(x, y, width, height, format, type, pixels);
3603}
3604
3605void Context::readnPixelsRobust(GLint x,
3606 GLint y,
3607 GLsizei width,
3608 GLsizei height,
3609 GLenum format,
3610 GLenum type,
3611 GLsizei bufSize,
3612 GLsizei *length,
3613 GLsizei *columns,
3614 GLsizei *rows,
3615 void *data)
3616{
3617 readPixels(x, y, width, height, format, type, data);
3618}
3619
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003620void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003621 GLint level,
3622 GLenum internalformat,
3623 GLint x,
3624 GLint y,
3625 GLsizei width,
3626 GLsizei height,
3627 GLint border)
3628{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003629 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003630 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003631
Jamie Madillc29968b2016-01-20 11:17:23 -05003632 Rectangle sourceArea(x, y, width, height);
3633
Jamie Madill05b35b22017-10-03 09:01:44 -04003634 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003635 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003636 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003637}
3638
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003639void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003640 GLint level,
3641 GLint xoffset,
3642 GLint yoffset,
3643 GLint x,
3644 GLint y,
3645 GLsizei width,
3646 GLsizei height)
3647{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003648 if (width == 0 || height == 0)
3649 {
3650 return;
3651 }
3652
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003653 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003654 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003655
Jamie Madillc29968b2016-01-20 11:17:23 -05003656 Offset destOffset(xoffset, yoffset, 0);
3657 Rectangle sourceArea(x, y, width, height);
3658
Jamie Madill05b35b22017-10-03 09:01:44 -04003659 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003660 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003661 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003662}
3663
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003664void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003665 GLint level,
3666 GLint xoffset,
3667 GLint yoffset,
3668 GLint zoffset,
3669 GLint x,
3670 GLint y,
3671 GLsizei width,
3672 GLsizei height)
3673{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003674 if (width == 0 || height == 0)
3675 {
3676 return;
3677 }
3678
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003679 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003680 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003681
Jamie Madillc29968b2016-01-20 11:17:23 -05003682 Offset destOffset(xoffset, yoffset, zoffset);
3683 Rectangle sourceArea(x, y, width, height);
3684
Jamie Madill05b35b22017-10-03 09:01:44 -04003685 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3686 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003687 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3688 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003689}
3690
3691void Context::framebufferTexture2D(GLenum target,
3692 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003693 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003694 GLuint texture,
3695 GLint level)
3696{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003697 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003698 ASSERT(framebuffer);
3699
3700 if (texture != 0)
3701 {
3702 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003703 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003704 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003705 }
3706 else
3707 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003708 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003709 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003710
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003711 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003712}
3713
3714void Context::framebufferRenderbuffer(GLenum target,
3715 GLenum attachment,
3716 GLenum renderbuffertarget,
3717 GLuint renderbuffer)
3718{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003719 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003720 ASSERT(framebuffer);
3721
3722 if (renderbuffer != 0)
3723 {
3724 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003725
Jamie Madillcc129372018-04-12 09:13:18 -04003726 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003727 renderbufferObject);
3728 }
3729 else
3730 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003731 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003732 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003733
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003734 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003735}
3736
3737void Context::framebufferTextureLayer(GLenum target,
3738 GLenum attachment,
3739 GLuint texture,
3740 GLint level,
3741 GLint layer)
3742{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003743 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003744 ASSERT(framebuffer);
3745
3746 if (texture != 0)
3747 {
3748 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003749 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003750 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003751 }
3752 else
3753 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003754 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003755 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003756
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003757 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003758}
3759
Brandon Jones59770802018-04-02 13:18:42 -07003760void Context::framebufferTextureMultiviewLayered(GLenum target,
3761 GLenum attachment,
3762 GLuint texture,
3763 GLint level,
3764 GLint baseViewIndex,
3765 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003766{
Martin Radev82ef7742017-08-08 17:44:58 +03003767 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3768 ASSERT(framebuffer);
3769
3770 if (texture != 0)
3771 {
3772 Texture *textureObj = getTexture(texture);
3773
Martin Radev18b75ba2017-08-15 15:50:40 +03003774 ImageIndex index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
Martin Radev82ef7742017-08-08 17:44:58 +03003775 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3776 numViews, baseViewIndex);
3777 }
3778 else
3779 {
3780 framebuffer->resetAttachment(this, attachment);
3781 }
3782
3783 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003784}
3785
Brandon Jones59770802018-04-02 13:18:42 -07003786void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3787 GLenum attachment,
3788 GLuint texture,
3789 GLint level,
3790 GLsizei numViews,
3791 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003792{
Martin Radev5dae57b2017-07-14 16:15:55 +03003793 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3794 ASSERT(framebuffer);
3795
3796 if (texture != 0)
3797 {
3798 Texture *textureObj = getTexture(texture);
3799
3800 ImageIndex index = ImageIndex::Make2D(level);
3801 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3802 textureObj, numViews, viewportOffsets);
3803 }
3804 else
3805 {
3806 framebuffer->resetAttachment(this, attachment);
3807 }
3808
3809 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003810}
3811
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003812void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3813{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003814 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3815 ASSERT(framebuffer);
3816
3817 if (texture != 0)
3818 {
3819 Texture *textureObj = getTexture(texture);
3820
3821 ImageIndex index = ImageIndex::MakeFromType(
3822 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3823 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3824 }
3825 else
3826 {
3827 framebuffer->resetAttachment(this, attachment);
3828 }
3829
3830 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003831}
3832
Jamie Madillc29968b2016-01-20 11:17:23 -05003833void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3834{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003835 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003836 ASSERT(framebuffer);
3837 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003838 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003839}
3840
3841void Context::readBuffer(GLenum mode)
3842{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003843 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003844 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003845 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003846}
3847
3848void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3849{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003850 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003851 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003852
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003853 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003854 ASSERT(framebuffer);
3855
3856 // The specification isn't clear what should be done when the framebuffer isn't complete.
3857 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003858 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003859}
3860
3861void Context::invalidateFramebuffer(GLenum target,
3862 GLsizei numAttachments,
3863 const GLenum *attachments)
3864{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003865 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003866 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003867
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003868 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003869 ASSERT(framebuffer);
3870
Jamie Madill427064d2018-04-13 16:20:34 -04003871 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003872 {
Jamie Madill437fa652016-05-03 15:13:24 -04003873 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003874 }
Jamie Madill437fa652016-05-03 15:13:24 -04003875
Jamie Madill4928b7c2017-06-20 12:57:39 -04003876 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003877}
3878
3879void Context::invalidateSubFramebuffer(GLenum target,
3880 GLsizei numAttachments,
3881 const GLenum *attachments,
3882 GLint x,
3883 GLint y,
3884 GLsizei width,
3885 GLsizei height)
3886{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003887 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003888 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003889
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003890 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003891 ASSERT(framebuffer);
3892
Jamie Madill427064d2018-04-13 16:20:34 -04003893 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003894 {
Jamie Madill437fa652016-05-03 15:13:24 -04003895 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003896 }
Jamie Madill437fa652016-05-03 15:13:24 -04003897
3898 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003899 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003900}
3901
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003902void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003903 GLint level,
3904 GLint internalformat,
3905 GLsizei width,
3906 GLsizei height,
3907 GLint border,
3908 GLenum format,
3909 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003910 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003911{
Jamie Madillbc918e72018-03-08 09:47:21 -05003912 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003913
3914 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003915 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003916 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07003917 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003918}
3919
Brandon Jones59770802018-04-02 13:18:42 -07003920void Context::texImage2DRobust(TextureTarget target,
3921 GLint level,
3922 GLint internalformat,
3923 GLsizei width,
3924 GLsizei height,
3925 GLint border,
3926 GLenum format,
3927 GLenum type,
3928 GLsizei bufSize,
3929 const void *pixels)
3930{
3931 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
3932}
3933
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003934void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003935 GLint level,
3936 GLint internalformat,
3937 GLsizei width,
3938 GLsizei height,
3939 GLsizei depth,
3940 GLint border,
3941 GLenum format,
3942 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003943 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003944{
Jamie Madillbc918e72018-03-08 09:47:21 -05003945 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003946
3947 Extents size(width, height, depth);
3948 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003949 handleError(texture->setImage(this, mGLState.getUnpackState(),
3950 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07003951 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003952}
3953
Brandon Jones59770802018-04-02 13:18:42 -07003954void Context::texImage3DRobust(TextureType target,
3955 GLint level,
3956 GLint internalformat,
3957 GLsizei width,
3958 GLsizei height,
3959 GLsizei depth,
3960 GLint border,
3961 GLenum format,
3962 GLenum type,
3963 GLsizei bufSize,
3964 const void *pixels)
3965{
3966 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
3967}
3968
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003969void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003970 GLint level,
3971 GLint xoffset,
3972 GLint yoffset,
3973 GLsizei width,
3974 GLsizei height,
3975 GLenum format,
3976 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003977 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003978{
3979 // Zero sized uploads are valid but no-ops
3980 if (width == 0 || height == 0)
3981 {
3982 return;
3983 }
3984
Jamie Madillbc918e72018-03-08 09:47:21 -05003985 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003986
3987 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003988 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003989 handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07003990 type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003991}
3992
Brandon Jones59770802018-04-02 13:18:42 -07003993void Context::texSubImage2DRobust(TextureTarget target,
3994 GLint level,
3995 GLint xoffset,
3996 GLint yoffset,
3997 GLsizei width,
3998 GLsizei height,
3999 GLenum format,
4000 GLenum type,
4001 GLsizei bufSize,
4002 const void *pixels)
4003{
4004 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4005}
4006
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004007void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004008 GLint level,
4009 GLint xoffset,
4010 GLint yoffset,
4011 GLint zoffset,
4012 GLsizei width,
4013 GLsizei height,
4014 GLsizei depth,
4015 GLenum format,
4016 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004017 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004018{
4019 // Zero sized uploads are valid but no-ops
4020 if (width == 0 || height == 0 || depth == 0)
4021 {
4022 return;
4023 }
4024
Jamie Madillbc918e72018-03-08 09:47:21 -05004025 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004026
4027 Box area(xoffset, yoffset, zoffset, width, height, depth);
4028 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004029 handleError(texture->setSubImage(this, mGLState.getUnpackState(),
4030 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004031 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004032}
4033
Brandon Jones59770802018-04-02 13:18:42 -07004034void Context::texSubImage3DRobust(TextureType target,
4035 GLint level,
4036 GLint xoffset,
4037 GLint yoffset,
4038 GLint zoffset,
4039 GLsizei width,
4040 GLsizei height,
4041 GLsizei depth,
4042 GLenum format,
4043 GLenum type,
4044 GLsizei bufSize,
4045 const void *pixels)
4046{
4047 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4048 pixels);
4049}
4050
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004051void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004052 GLint level,
4053 GLenum internalformat,
4054 GLsizei width,
4055 GLsizei height,
4056 GLint border,
4057 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004058 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004059{
Jamie Madillbc918e72018-03-08 09:47:21 -05004060 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004061
4062 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004063 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004064 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4065 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004066 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004067}
4068
Brandon Jones59770802018-04-02 13:18:42 -07004069void Context::compressedTexImage2DRobust(TextureTarget target,
4070 GLint level,
4071 GLenum internalformat,
4072 GLsizei width,
4073 GLsizei height,
4074 GLint border,
4075 GLsizei imageSize,
4076 GLsizei dataSize,
4077 const GLvoid *data)
4078{
4079 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4080}
4081
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004082void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004083 GLint level,
4084 GLenum internalformat,
4085 GLsizei width,
4086 GLsizei height,
4087 GLsizei depth,
4088 GLint border,
4089 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004090 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004091{
Jamie Madillbc918e72018-03-08 09:47:21 -05004092 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004093
4094 Extents size(width, height, depth);
4095 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004096 handleError(texture->setCompressedImage(
4097 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004098 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004099}
4100
Brandon Jones59770802018-04-02 13:18:42 -07004101void Context::compressedTexImage3DRobust(TextureType target,
4102 GLint level,
4103 GLenum internalformat,
4104 GLsizei width,
4105 GLsizei height,
4106 GLsizei depth,
4107 GLint border,
4108 GLsizei imageSize,
4109 GLsizei dataSize,
4110 const GLvoid *data)
4111{
4112 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4113 data);
4114}
4115
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004116void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004117 GLint level,
4118 GLint xoffset,
4119 GLint yoffset,
4120 GLsizei width,
4121 GLsizei height,
4122 GLenum format,
4123 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004124 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004125{
Jamie Madillbc918e72018-03-08 09:47:21 -05004126 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004127
4128 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004129 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004130 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4131 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004132 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004133}
4134
Brandon Jones59770802018-04-02 13:18:42 -07004135void Context::compressedTexSubImage2DRobust(TextureTarget target,
4136 GLint level,
4137 GLint xoffset,
4138 GLint yoffset,
4139 GLsizei width,
4140 GLsizei height,
4141 GLenum format,
4142 GLsizei imageSize,
4143 GLsizei dataSize,
4144 const GLvoid *data)
4145{
4146 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4147 data);
4148}
4149
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004150void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004151 GLint level,
4152 GLint xoffset,
4153 GLint yoffset,
4154 GLint zoffset,
4155 GLsizei width,
4156 GLsizei height,
4157 GLsizei depth,
4158 GLenum format,
4159 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004160 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004161{
4162 // Zero sized uploads are valid but no-ops
4163 if (width == 0 || height == 0)
4164 {
4165 return;
4166 }
4167
Jamie Madillbc918e72018-03-08 09:47:21 -05004168 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004169
4170 Box area(xoffset, yoffset, zoffset, width, height, depth);
4171 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004172 handleError(texture->setCompressedSubImage(
4173 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004174 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004175}
4176
Brandon Jones59770802018-04-02 13:18:42 -07004177void Context::compressedTexSubImage3DRobust(TextureType target,
4178 GLint level,
4179 GLint xoffset,
4180 GLint yoffset,
4181 GLint zoffset,
4182 GLsizei width,
4183 GLsizei height,
4184 GLsizei depth,
4185 GLenum format,
4186 GLsizei imageSize,
4187 GLsizei dataSize,
4188 const GLvoid *data)
4189{
4190 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4191 imageSize, data);
4192}
4193
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004194void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004195{
4196 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004197 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004198}
4199
Jamie Madill007530e2017-12-28 14:27:04 -05004200void Context::copyTexture(GLuint sourceId,
4201 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004202 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004203 GLuint destId,
4204 GLint destLevel,
4205 GLint internalFormat,
4206 GLenum destType,
4207 GLboolean unpackFlipY,
4208 GLboolean unpackPremultiplyAlpha,
4209 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004210{
Jamie Madillbc918e72018-03-08 09:47:21 -05004211 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004212
4213 gl::Texture *sourceTexture = getTexture(sourceId);
4214 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004215 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4216 sourceLevel, ConvertToBool(unpackFlipY),
4217 ConvertToBool(unpackPremultiplyAlpha),
4218 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004219}
4220
Jamie Madill007530e2017-12-28 14:27:04 -05004221void Context::copySubTexture(GLuint sourceId,
4222 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004223 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004224 GLuint destId,
4225 GLint destLevel,
4226 GLint xoffset,
4227 GLint yoffset,
4228 GLint x,
4229 GLint y,
4230 GLsizei width,
4231 GLsizei height,
4232 GLboolean unpackFlipY,
4233 GLboolean unpackPremultiplyAlpha,
4234 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004235{
4236 // Zero sized copies are valid but no-ops
4237 if (width == 0 || height == 0)
4238 {
4239 return;
4240 }
4241
Jamie Madillbc918e72018-03-08 09:47:21 -05004242 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004243
4244 gl::Texture *sourceTexture = getTexture(sourceId);
4245 gl::Texture *destTexture = getTexture(destId);
4246 Offset offset(xoffset, yoffset, 0);
4247 Rectangle area(x, y, width, height);
Geoff Lang92019432017-11-20 13:09:34 -05004248 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, area,
4249 ConvertToBool(unpackFlipY),
4250 ConvertToBool(unpackPremultiplyAlpha),
4251 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004252}
4253
Jamie Madill007530e2017-12-28 14:27:04 -05004254void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004255{
Jamie Madillbc918e72018-03-08 09:47:21 -05004256 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004257
4258 gl::Texture *sourceTexture = getTexture(sourceId);
4259 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004260 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004261}
4262
Corentin Wallez336129f2017-10-17 15:55:40 -04004263void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004264{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004265 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004266 ASSERT(buffer);
4267
Geoff Lang496c02d2016-10-20 11:38:11 -07004268 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004269}
4270
Brandon Jones59770802018-04-02 13:18:42 -07004271void Context::getBufferPointervRobust(BufferBinding target,
4272 GLenum pname,
4273 GLsizei bufSize,
4274 GLsizei *length,
4275 void **params)
4276{
4277 getBufferPointerv(target, pname, params);
4278}
4279
Corentin Wallez336129f2017-10-17 15:55:40 -04004280void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004281{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004282 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004283 ASSERT(buffer);
4284
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004285 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004286 if (error.isError())
4287 {
Jamie Madill437fa652016-05-03 15:13:24 -04004288 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004289 return nullptr;
4290 }
4291
4292 return buffer->getMapPointer();
4293}
4294
Corentin Wallez336129f2017-10-17 15:55:40 -04004295GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004296{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004297 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004298 ASSERT(buffer);
4299
4300 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004301 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004302 if (error.isError())
4303 {
Jamie Madill437fa652016-05-03 15:13:24 -04004304 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004305 return GL_FALSE;
4306 }
4307
4308 return result;
4309}
4310
Corentin Wallez336129f2017-10-17 15:55:40 -04004311void *Context::mapBufferRange(BufferBinding target,
4312 GLintptr offset,
4313 GLsizeiptr length,
4314 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004315{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004316 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004317 ASSERT(buffer);
4318
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004319 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004320 if (error.isError())
4321 {
Jamie Madill437fa652016-05-03 15:13:24 -04004322 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004323 return nullptr;
4324 }
4325
4326 return buffer->getMapPointer();
4327}
4328
Corentin Wallez336129f2017-10-17 15:55:40 -04004329void Context::flushMappedBufferRange(BufferBinding /*target*/,
4330 GLintptr /*offset*/,
4331 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004332{
4333 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4334}
4335
Jamie Madillbc918e72018-03-08 09:47:21 -05004336Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004337{
Geoff Langa8cb2872018-03-09 16:09:40 -05004338 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004339}
4340
Jamie Madillbc918e72018-03-08 09:47:21 -05004341Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004342{
Geoff Langa8cb2872018-03-09 16:09:40 -05004343 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004344}
4345
Jamie Madillbc918e72018-03-08 09:47:21 -05004346Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004347{
Geoff Langa8cb2872018-03-09 16:09:40 -05004348 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004349}
4350
Geoff Lang9bf86f02018-07-26 11:46:34 -04004351Error Context::syncStateForPathOperation()
4352{
4353 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4354
4355 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4356 ANGLE_TRY(syncDirtyBits());
4357
4358 return NoError();
4359}
4360
Jiajia Qin5451d532017-11-16 17:16:34 +08004361void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4362{
4363 UNIMPLEMENTED();
4364}
4365
Jamie Madillc20ab272016-06-09 07:20:46 -07004366void Context::activeTexture(GLenum texture)
4367{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004368 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004369}
4370
Jamie Madill876429b2017-04-20 15:46:24 -04004371void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004372{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004373 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004374}
4375
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004376void Context::blendEquation(GLenum mode)
4377{
4378 mGLState.setBlendEquation(mode, mode);
4379}
4380
Jamie Madillc20ab272016-06-09 07:20:46 -07004381void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4382{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004383 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004384}
4385
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004386void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4387{
4388 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4389}
4390
Jamie Madillc20ab272016-06-09 07:20:46 -07004391void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4392{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004393 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004394}
4395
Jamie Madill876429b2017-04-20 15:46:24 -04004396void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004397{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004398 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004399}
4400
Jamie Madill876429b2017-04-20 15:46:24 -04004401void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004402{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004403 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07004404}
4405
4406void Context::clearStencil(GLint s)
4407{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004408 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004409}
4410
4411void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4412{
Geoff Lang92019432017-11-20 13:09:34 -05004413 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4414 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004415}
4416
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004417void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004418{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004419 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004420}
4421
4422void Context::depthFunc(GLenum func)
4423{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004424 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004425}
4426
4427void Context::depthMask(GLboolean flag)
4428{
Geoff Lang92019432017-11-20 13:09:34 -05004429 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004430}
4431
Jamie Madill876429b2017-04-20 15:46:24 -04004432void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004433{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004434 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07004435}
4436
4437void Context::disable(GLenum cap)
4438{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004439 mGLState.setEnableFeature(cap, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07004440}
4441
4442void Context::disableVertexAttribArray(GLuint index)
4443{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004444 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004445 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004446}
4447
4448void Context::enable(GLenum cap)
4449{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004450 mGLState.setEnableFeature(cap, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07004451}
4452
4453void Context::enableVertexAttribArray(GLuint index)
4454{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004455 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004456 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004457}
4458
4459void Context::frontFace(GLenum mode)
4460{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004461 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004462}
4463
4464void Context::hint(GLenum target, GLenum mode)
4465{
4466 switch (target)
4467 {
4468 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004469 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004470 break;
4471
4472 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004473 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004474 break;
4475
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004476 case GL_PERSPECTIVE_CORRECTION_HINT:
4477 case GL_POINT_SMOOTH_HINT:
4478 case GL_LINE_SMOOTH_HINT:
4479 case GL_FOG_HINT:
4480 mGLState.gles1().setHint(target, mode);
4481 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004482 default:
4483 UNREACHABLE();
4484 return;
4485 }
4486}
4487
4488void Context::lineWidth(GLfloat width)
4489{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004490 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004491}
4492
4493void Context::pixelStorei(GLenum pname, GLint param)
4494{
4495 switch (pname)
4496 {
4497 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004498 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004499 break;
4500
4501 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004502 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004503 break;
4504
4505 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004506 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004507 break;
4508
4509 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004510 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004511 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004512 break;
4513
4514 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004515 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004516 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004517 break;
4518
4519 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004520 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004521 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004522 break;
4523
4524 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004525 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004526 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004527 break;
4528
4529 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004530 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004531 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004532 break;
4533
4534 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004535 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004536 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004537 break;
4538
4539 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004540 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004541 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004542 break;
4543
4544 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004545 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004546 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004547 break;
4548
4549 default:
4550 UNREACHABLE();
4551 return;
4552 }
4553}
4554
4555void Context::polygonOffset(GLfloat factor, GLfloat units)
4556{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004557 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004558}
4559
Jamie Madill876429b2017-04-20 15:46:24 -04004560void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004561{
Geoff Lang92019432017-11-20 13:09:34 -05004562 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004563}
4564
Jiawei Shaodb342272017-09-27 10:21:45 +08004565void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4566{
4567 mGLState.setSampleMaskParams(maskNumber, mask);
4568}
4569
Jamie Madillc20ab272016-06-09 07:20:46 -07004570void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4571{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004572 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004573}
4574
4575void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4576{
4577 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4578 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004579 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004580 }
4581
4582 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4583 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004584 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004585 }
4586}
4587
4588void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4589{
4590 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4591 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004592 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004593 }
4594
4595 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4596 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004597 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004598 }
4599}
4600
4601void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4602{
4603 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4604 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004605 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004606 }
4607
4608 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4609 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004610 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004611 }
4612}
4613
4614void Context::vertexAttrib1f(GLuint index, GLfloat x)
4615{
4616 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004617 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004618}
4619
4620void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4621{
4622 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004623 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004624}
4625
4626void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4627{
4628 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004629 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004630}
4631
4632void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4633{
4634 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004635 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004636}
4637
4638void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4639{
4640 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004641 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004642}
4643
4644void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4645{
4646 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004647 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004648}
4649
4650void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4651{
4652 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004653 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004654}
4655
4656void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4657{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004658 mGLState.setVertexAttribf(index, values);
Jamie Madillc20ab272016-06-09 07:20:46 -07004659}
4660
4661void Context::vertexAttribPointer(GLuint index,
4662 GLint size,
4663 GLenum type,
4664 GLboolean normalized,
4665 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004666 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004667{
Corentin Wallez336129f2017-10-17 15:55:40 -04004668 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004669 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004670 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004671}
4672
Shao80957d92017-02-20 21:25:59 +08004673void Context::vertexAttribFormat(GLuint attribIndex,
4674 GLint size,
4675 GLenum type,
4676 GLboolean normalized,
4677 GLuint relativeOffset)
4678{
Geoff Lang92019432017-11-20 13:09:34 -05004679 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004680 relativeOffset);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004681 mStateCache.onVertexArraySizeChange(this);
Shao80957d92017-02-20 21:25:59 +08004682}
4683
4684void Context::vertexAttribIFormat(GLuint attribIndex,
4685 GLint size,
4686 GLenum type,
4687 GLuint relativeOffset)
4688{
4689 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004690 mStateCache.onVertexArraySizeChange(this);
Shao80957d92017-02-20 21:25:59 +08004691}
4692
4693void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4694{
Shaodde78e82017-05-22 14:13:27 +08004695 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004696 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004697}
4698
Jiajia Qin5451d532017-11-16 17:16:34 +08004699void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004700{
4701 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004702 mStateCache.onVertexArraySizeChange(this);
Shao80957d92017-02-20 21:25:59 +08004703}
4704
Jamie Madillc20ab272016-06-09 07:20:46 -07004705void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4706{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004707 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004708}
4709
4710void Context::vertexAttribIPointer(GLuint index,
4711 GLint size,
4712 GLenum type,
4713 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004714 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004715{
Corentin Wallez336129f2017-10-17 15:55:40 -04004716 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4717 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004718 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004719}
4720
4721void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4722{
4723 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004724 mGLState.setVertexAttribi(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004725}
4726
4727void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4728{
4729 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004730 mGLState.setVertexAttribu(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004731}
4732
4733void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4734{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004735 mGLState.setVertexAttribi(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07004736}
4737
4738void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4739{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004740 mGLState.setVertexAttribu(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07004741}
4742
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004743void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4744{
4745 const VertexAttribCurrentValueData &currentValues =
4746 getGLState().getVertexAttribCurrentValue(index);
4747 const VertexArray *vao = getGLState().getVertexArray();
4748 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4749 currentValues, pname, params);
4750}
4751
Brandon Jones59770802018-04-02 13:18:42 -07004752void Context::getVertexAttribivRobust(GLuint index,
4753 GLenum pname,
4754 GLsizei bufSize,
4755 GLsizei *length,
4756 GLint *params)
4757{
4758 getVertexAttribiv(index, pname, params);
4759}
4760
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004761void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4762{
4763 const VertexAttribCurrentValueData &currentValues =
4764 getGLState().getVertexAttribCurrentValue(index);
4765 const VertexArray *vao = getGLState().getVertexArray();
4766 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4767 currentValues, pname, params);
4768}
4769
Brandon Jones59770802018-04-02 13:18:42 -07004770void Context::getVertexAttribfvRobust(GLuint index,
4771 GLenum pname,
4772 GLsizei bufSize,
4773 GLsizei *length,
4774 GLfloat *params)
4775{
4776 getVertexAttribfv(index, pname, params);
4777}
4778
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004779void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4780{
4781 const VertexAttribCurrentValueData &currentValues =
4782 getGLState().getVertexAttribCurrentValue(index);
4783 const VertexArray *vao = getGLState().getVertexArray();
4784 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4785 currentValues, pname, params);
4786}
4787
Brandon Jones59770802018-04-02 13:18:42 -07004788void Context::getVertexAttribIivRobust(GLuint index,
4789 GLenum pname,
4790 GLsizei bufSize,
4791 GLsizei *length,
4792 GLint *params)
4793{
4794 getVertexAttribIiv(index, pname, params);
4795}
4796
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004797void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4798{
4799 const VertexAttribCurrentValueData &currentValues =
4800 getGLState().getVertexAttribCurrentValue(index);
4801 const VertexArray *vao = getGLState().getVertexArray();
4802 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4803 currentValues, pname, params);
4804}
4805
Brandon Jones59770802018-04-02 13:18:42 -07004806void Context::getVertexAttribIuivRobust(GLuint index,
4807 GLenum pname,
4808 GLsizei bufSize,
4809 GLsizei *length,
4810 GLuint *params)
4811{
4812 getVertexAttribIuiv(index, pname, params);
4813}
4814
Jamie Madill876429b2017-04-20 15:46:24 -04004815void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004816{
4817 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4818 QueryVertexAttribPointerv(attrib, pname, pointer);
4819}
4820
Brandon Jones59770802018-04-02 13:18:42 -07004821void Context::getVertexAttribPointervRobust(GLuint index,
4822 GLenum pname,
4823 GLsizei bufSize,
4824 GLsizei *length,
4825 void **pointer)
4826{
4827 getVertexAttribPointerv(index, pname, pointer);
4828}
4829
Jamie Madillc20ab272016-06-09 07:20:46 -07004830void Context::debugMessageControl(GLenum source,
4831 GLenum type,
4832 GLenum severity,
4833 GLsizei count,
4834 const GLuint *ids,
4835 GLboolean enabled)
4836{
4837 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004838 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05004839 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07004840}
4841
4842void Context::debugMessageInsert(GLenum source,
4843 GLenum type,
4844 GLuint id,
4845 GLenum severity,
4846 GLsizei length,
4847 const GLchar *buf)
4848{
4849 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004850 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07004851}
4852
4853void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
4854{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004855 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07004856}
4857
4858GLuint Context::getDebugMessageLog(GLuint count,
4859 GLsizei bufSize,
4860 GLenum *sources,
4861 GLenum *types,
4862 GLuint *ids,
4863 GLenum *severities,
4864 GLsizei *lengths,
4865 GLchar *messageLog)
4866{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004867 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
4868 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07004869}
4870
4871void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
4872{
4873 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004874 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05004875 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07004876}
4877
4878void Context::popDebugGroup()
4879{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004880 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05004881 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07004882}
4883
Corentin Wallez336129f2017-10-17 15:55:40 -04004884void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04004885{
4886 Buffer *buffer = mGLState.getTargetBuffer(target);
4887 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004888 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04004889}
4890
Corentin Wallez336129f2017-10-17 15:55:40 -04004891void Context::bufferSubData(BufferBinding target,
4892 GLintptr offset,
4893 GLsizeiptr size,
4894 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04004895{
4896 if (data == nullptr)
4897 {
4898 return;
4899 }
4900
4901 Buffer *buffer = mGLState.getTargetBuffer(target);
4902 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004903 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04004904}
4905
Jamie Madillef300b12016-10-07 15:12:09 -04004906void Context::attachShader(GLuint program, GLuint shader)
4907{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05004908 Program *programObject = mState.mShaderPrograms->getProgram(program);
4909 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04004910 ASSERT(programObject && shaderObject);
4911 programObject->attachShader(shaderObject);
4912}
4913
Kenneth Russellf2f6f652016-10-05 19:53:23 -07004914const Workarounds &Context::getWorkarounds() const
4915{
4916 return mWorkarounds;
4917}
4918
Corentin Wallez336129f2017-10-17 15:55:40 -04004919void Context::copyBufferSubData(BufferBinding readTarget,
4920 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04004921 GLintptr readOffset,
4922 GLintptr writeOffset,
4923 GLsizeiptr size)
4924{
4925 // if size is zero, the copy is a successful no-op
4926 if (size == 0)
4927 {
4928 return;
4929 }
4930
4931 // TODO(jmadill): cache these.
4932 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
4933 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
4934
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004935 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04004936}
4937
Jamie Madill01a80ee2016-11-07 12:06:18 -05004938void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
4939{
4940 Program *programObject = getProgram(program);
4941 // TODO(jmadill): Re-use this from the validation if possible.
4942 ASSERT(programObject);
4943 programObject->bindAttributeLocation(index, name);
4944}
4945
Corentin Wallez336129f2017-10-17 15:55:40 -04004946void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004947{
Corentin Wallez336129f2017-10-17 15:55:40 -04004948 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4949 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004950}
4951
Corentin Wallez336129f2017-10-17 15:55:40 -04004952void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08004953{
4954 bindBufferRange(target, index, buffer, 0, 0);
4955}
4956
Corentin Wallez336129f2017-10-17 15:55:40 -04004957void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08004958 GLuint index,
4959 GLuint buffer,
4960 GLintptr offset,
4961 GLsizeiptr size)
4962{
Jamie Madill6d32cef2018-08-14 02:34:28 -04004963 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4964 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
4965 if (target == BufferBinding::Uniform)
4966 {
4967 mUniformBufferObserverBindings[index].bind(object ? object->getImplementation() : nullptr);
4968 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08004969}
4970
Jamie Madill01a80ee2016-11-07 12:06:18 -05004971void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
4972{
4973 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4974 {
4975 bindReadFramebuffer(framebuffer);
4976 }
4977
4978 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4979 {
4980 bindDrawFramebuffer(framebuffer);
4981 }
4982}
4983
4984void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
4985{
4986 ASSERT(target == GL_RENDERBUFFER);
4987 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05004988 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004989 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004990}
4991
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004992void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08004993 GLsizei samples,
4994 GLenum internalformat,
4995 GLsizei width,
4996 GLsizei height,
4997 GLboolean fixedsamplelocations)
4998{
4999 Extents size(width, height, 1);
5000 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005001 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5002 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005003}
5004
Olli Etuaho89664842018-08-24 14:45:36 +03005005void Context::texStorage3DMultisample(TextureType target,
5006 GLsizei samples,
5007 GLenum internalformat,
5008 GLsizei width,
5009 GLsizei height,
5010 GLsizei depth,
5011 GLboolean fixedsamplelocations)
5012{
5013 UNIMPLEMENTED();
5014}
5015
JiangYizhoubddc46b2016-12-09 09:50:51 +08005016void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5017{
JiangYizhou5b03f472017-01-09 10:22:53 +08005018 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5019 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005020 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005021 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005022
5023 switch (pname)
5024 {
5025 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005026 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005027 break;
5028 default:
5029 UNREACHABLE();
5030 }
5031}
5032
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005033void Context::getMultisamplefvRobust(GLenum pname,
5034 GLuint index,
5035 GLsizei bufSize,
5036 GLsizei *length,
5037 GLfloat *val)
5038{
5039 UNIMPLEMENTED();
5040}
5041
Jamie Madille8fb6402017-02-14 17:56:40 -05005042void Context::renderbufferStorage(GLenum target,
5043 GLenum internalformat,
5044 GLsizei width,
5045 GLsizei height)
5046{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005047 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5048 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5049
Jamie Madille8fb6402017-02-14 17:56:40 -05005050 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005051 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005052}
5053
5054void Context::renderbufferStorageMultisample(GLenum target,
5055 GLsizei samples,
5056 GLenum internalformat,
5057 GLsizei width,
5058 GLsizei height)
5059{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005060 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5061 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005062
5063 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005064 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005065 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005066}
5067
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005068void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5069{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005070 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005071 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005072}
5073
JiangYizhoue18e6392017-02-20 10:32:23 +08005074void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5075{
5076 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5077 QueryFramebufferParameteriv(framebuffer, pname, params);
5078}
5079
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005080void Context::getFramebufferParameterivRobust(GLenum target,
5081 GLenum pname,
5082 GLsizei bufSize,
5083 GLsizei *length,
5084 GLint *params)
5085{
5086 UNIMPLEMENTED();
5087}
5088
Jiajia Qin5451d532017-11-16 17:16:34 +08005089void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005090{
5091 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005092 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005093}
5094
Jamie Madilldec86232018-07-11 09:01:18 -04005095bool Context::getScratchBuffer(size_t requstedSizeBytes,
5096 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005097{
Jamie Madilldec86232018-07-11 09:01:18 -04005098 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005099}
5100
Jamie Madilldec86232018-07-11 09:01:18 -04005101bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5102 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005103{
Jamie Madilldec86232018-07-11 09:01:18 -04005104 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005105}
5106
Xinghua Cao10a4d432017-11-28 14:46:26 +08005107Error Context::prepareForDispatch()
5108{
Geoff Langa8cb2872018-03-09 16:09:40 -05005109 ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005110
5111 if (isRobustResourceInitEnabled())
5112 {
5113 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5114 }
5115
5116 return NoError();
5117}
5118
Xinghua Cao2b396592017-03-29 15:36:04 +08005119void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5120{
5121 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5122 {
5123 return;
5124 }
5125
Xinghua Cao10a4d432017-11-28 14:46:26 +08005126 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005127 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005128}
5129
Jiajia Qin5451d532017-11-16 17:16:34 +08005130void Context::dispatchComputeIndirect(GLintptr indirect)
5131{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005132 ANGLE_CONTEXT_TRY(prepareForDispatch());
5133 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005134}
5135
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005136void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005137 GLsizei levels,
5138 GLenum internalFormat,
5139 GLsizei width,
5140 GLsizei height)
5141{
5142 Extents size(width, height, 1);
5143 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005144 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005145}
5146
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005147void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005148 GLsizei levels,
5149 GLenum internalFormat,
5150 GLsizei width,
5151 GLsizei height,
5152 GLsizei depth)
5153{
5154 Extents size(width, height, depth);
5155 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005156 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005157}
5158
Jiajia Qin5451d532017-11-16 17:16:34 +08005159void Context::memoryBarrier(GLbitfield barriers)
5160{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005161 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005162}
5163
5164void Context::memoryBarrierByRegion(GLbitfield barriers)
5165{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005166 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005167}
5168
Jamie Madillc1d770e2017-04-13 17:31:24 -04005169GLenum Context::checkFramebufferStatus(GLenum target)
5170{
5171 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5172 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005173 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005174}
5175
5176void Context::compileShader(GLuint shader)
5177{
5178 Shader *shaderObject = GetValidShader(this, shader);
5179 if (!shaderObject)
5180 {
5181 return;
5182 }
5183 shaderObject->compile(this);
5184}
5185
5186void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5187{
5188 for (int i = 0; i < n; i++)
5189 {
5190 deleteBuffer(buffers[i]);
5191 }
5192}
5193
5194void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5195{
5196 for (int i = 0; i < n; i++)
5197 {
5198 if (framebuffers[i] != 0)
5199 {
5200 deleteFramebuffer(framebuffers[i]);
5201 }
5202 }
5203}
5204
5205void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5206{
5207 for (int i = 0; i < n; i++)
5208 {
5209 deleteRenderbuffer(renderbuffers[i]);
5210 }
5211}
5212
5213void Context::deleteTextures(GLsizei n, const GLuint *textures)
5214{
5215 for (int i = 0; i < n; i++)
5216 {
5217 if (textures[i] != 0)
5218 {
5219 deleteTexture(textures[i]);
5220 }
5221 }
5222}
5223
5224void Context::detachShader(GLuint program, GLuint shader)
5225{
5226 Program *programObject = getProgram(program);
5227 ASSERT(programObject);
5228
5229 Shader *shaderObject = getShader(shader);
5230 ASSERT(shaderObject);
5231
5232 programObject->detachShader(this, shaderObject);
5233}
5234
5235void Context::genBuffers(GLsizei n, GLuint *buffers)
5236{
5237 for (int i = 0; i < n; i++)
5238 {
5239 buffers[i] = createBuffer();
5240 }
5241}
5242
5243void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5244{
5245 for (int i = 0; i < n; i++)
5246 {
5247 framebuffers[i] = createFramebuffer();
5248 }
5249}
5250
5251void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5252{
5253 for (int i = 0; i < n; i++)
5254 {
5255 renderbuffers[i] = createRenderbuffer();
5256 }
5257}
5258
5259void Context::genTextures(GLsizei n, GLuint *textures)
5260{
5261 for (int i = 0; i < n; i++)
5262 {
5263 textures[i] = createTexture();
5264 }
5265}
5266
5267void Context::getActiveAttrib(GLuint program,
5268 GLuint index,
5269 GLsizei bufsize,
5270 GLsizei *length,
5271 GLint *size,
5272 GLenum *type,
5273 GLchar *name)
5274{
5275 Program *programObject = getProgram(program);
5276 ASSERT(programObject);
5277 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5278}
5279
5280void Context::getActiveUniform(GLuint program,
5281 GLuint index,
5282 GLsizei bufsize,
5283 GLsizei *length,
5284 GLint *size,
5285 GLenum *type,
5286 GLchar *name)
5287{
5288 Program *programObject = getProgram(program);
5289 ASSERT(programObject);
5290 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5291}
5292
5293void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5294{
5295 Program *programObject = getProgram(program);
5296 ASSERT(programObject);
5297 programObject->getAttachedShaders(maxcount, count, shaders);
5298}
5299
5300GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5301{
5302 Program *programObject = getProgram(program);
5303 ASSERT(programObject);
5304 return programObject->getAttributeLocation(name);
5305}
5306
5307void Context::getBooleanv(GLenum pname, GLboolean *params)
5308{
5309 GLenum nativeType;
5310 unsigned int numParams = 0;
5311 getQueryParameterInfo(pname, &nativeType, &numParams);
5312
5313 if (nativeType == GL_BOOL)
5314 {
5315 getBooleanvImpl(pname, params);
5316 }
5317 else
5318 {
5319 CastStateValues(this, nativeType, pname, numParams, params);
5320 }
5321}
5322
Brandon Jones59770802018-04-02 13:18:42 -07005323void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5324{
5325 getBooleanv(pname, params);
5326}
5327
Jamie Madillc1d770e2017-04-13 17:31:24 -04005328void Context::getFloatv(GLenum pname, GLfloat *params)
5329{
5330 GLenum nativeType;
5331 unsigned int numParams = 0;
5332 getQueryParameterInfo(pname, &nativeType, &numParams);
5333
5334 if (nativeType == GL_FLOAT)
5335 {
5336 getFloatvImpl(pname, params);
5337 }
5338 else
5339 {
5340 CastStateValues(this, nativeType, pname, numParams, params);
5341 }
5342}
5343
Brandon Jones59770802018-04-02 13:18:42 -07005344void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5345{
5346 getFloatv(pname, params);
5347}
5348
Jamie Madillc1d770e2017-04-13 17:31:24 -04005349void Context::getIntegerv(GLenum pname, GLint *params)
5350{
5351 GLenum nativeType;
5352 unsigned int numParams = 0;
5353 getQueryParameterInfo(pname, &nativeType, &numParams);
5354
5355 if (nativeType == GL_INT)
5356 {
5357 getIntegervImpl(pname, params);
5358 }
5359 else
5360 {
5361 CastStateValues(this, nativeType, pname, numParams, params);
5362 }
5363}
5364
Brandon Jones59770802018-04-02 13:18:42 -07005365void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5366{
5367 getIntegerv(pname, data);
5368}
5369
Jamie Madillc1d770e2017-04-13 17:31:24 -04005370void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5371{
5372 Program *programObject = getProgram(program);
5373 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005374 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005375}
5376
Brandon Jones59770802018-04-02 13:18:42 -07005377void Context::getProgramivRobust(GLuint program,
5378 GLenum pname,
5379 GLsizei bufSize,
5380 GLsizei *length,
5381 GLint *params)
5382{
5383 getProgramiv(program, pname, params);
5384}
5385
Jiajia Qin5451d532017-11-16 17:16:34 +08005386void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5387{
5388 UNIMPLEMENTED();
5389}
5390
Jamie Madillbe849e42017-05-02 15:49:00 -04005391void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005392{
5393 Program *programObject = getProgram(program);
5394 ASSERT(programObject);
5395 programObject->getInfoLog(bufsize, length, infolog);
5396}
5397
Jiajia Qin5451d532017-11-16 17:16:34 +08005398void Context::getProgramPipelineInfoLog(GLuint pipeline,
5399 GLsizei bufSize,
5400 GLsizei *length,
5401 GLchar *infoLog)
5402{
5403 UNIMPLEMENTED();
5404}
5405
Jamie Madillc1d770e2017-04-13 17:31:24 -04005406void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5407{
5408 Shader *shaderObject = getShader(shader);
5409 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005410 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005411}
5412
Brandon Jones59770802018-04-02 13:18:42 -07005413void Context::getShaderivRobust(GLuint shader,
5414 GLenum pname,
5415 GLsizei bufSize,
5416 GLsizei *length,
5417 GLint *params)
5418{
5419 getShaderiv(shader, pname, params);
5420}
5421
Jamie Madillc1d770e2017-04-13 17:31:24 -04005422void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5423{
5424 Shader *shaderObject = getShader(shader);
5425 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005426 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005427}
5428
5429void Context::getShaderPrecisionFormat(GLenum shadertype,
5430 GLenum precisiontype,
5431 GLint *range,
5432 GLint *precision)
5433{
5434 // TODO(jmadill): Compute shaders.
5435
5436 switch (shadertype)
5437 {
5438 case GL_VERTEX_SHADER:
5439 switch (precisiontype)
5440 {
5441 case GL_LOW_FLOAT:
5442 mCaps.vertexLowpFloat.get(range, precision);
5443 break;
5444 case GL_MEDIUM_FLOAT:
5445 mCaps.vertexMediumpFloat.get(range, precision);
5446 break;
5447 case GL_HIGH_FLOAT:
5448 mCaps.vertexHighpFloat.get(range, precision);
5449 break;
5450
5451 case GL_LOW_INT:
5452 mCaps.vertexLowpInt.get(range, precision);
5453 break;
5454 case GL_MEDIUM_INT:
5455 mCaps.vertexMediumpInt.get(range, precision);
5456 break;
5457 case GL_HIGH_INT:
5458 mCaps.vertexHighpInt.get(range, precision);
5459 break;
5460
5461 default:
5462 UNREACHABLE();
5463 return;
5464 }
5465 break;
5466
5467 case GL_FRAGMENT_SHADER:
5468 switch (precisiontype)
5469 {
5470 case GL_LOW_FLOAT:
5471 mCaps.fragmentLowpFloat.get(range, precision);
5472 break;
5473 case GL_MEDIUM_FLOAT:
5474 mCaps.fragmentMediumpFloat.get(range, precision);
5475 break;
5476 case GL_HIGH_FLOAT:
5477 mCaps.fragmentHighpFloat.get(range, precision);
5478 break;
5479
5480 case GL_LOW_INT:
5481 mCaps.fragmentLowpInt.get(range, precision);
5482 break;
5483 case GL_MEDIUM_INT:
5484 mCaps.fragmentMediumpInt.get(range, precision);
5485 break;
5486 case GL_HIGH_INT:
5487 mCaps.fragmentHighpInt.get(range, precision);
5488 break;
5489
5490 default:
5491 UNREACHABLE();
5492 return;
5493 }
5494 break;
5495
5496 default:
5497 UNREACHABLE();
5498 return;
5499 }
5500}
5501
5502void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5503{
5504 Shader *shaderObject = getShader(shader);
5505 ASSERT(shaderObject);
5506 shaderObject->getSource(bufsize, length, source);
5507}
5508
5509void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5510{
5511 Program *programObject = getProgram(program);
5512 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005513 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005514}
5515
Brandon Jones59770802018-04-02 13:18:42 -07005516void Context::getUniformfvRobust(GLuint program,
5517 GLint location,
5518 GLsizei bufSize,
5519 GLsizei *length,
5520 GLfloat *params)
5521{
5522 getUniformfv(program, location, params);
5523}
5524
Jamie Madillc1d770e2017-04-13 17:31:24 -04005525void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5526{
5527 Program *programObject = getProgram(program);
5528 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005529 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005530}
5531
Brandon Jones59770802018-04-02 13:18:42 -07005532void Context::getUniformivRobust(GLuint program,
5533 GLint location,
5534 GLsizei bufSize,
5535 GLsizei *length,
5536 GLint *params)
5537{
5538 getUniformiv(program, location, params);
5539}
5540
Jamie Madillc1d770e2017-04-13 17:31:24 -04005541GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5542{
5543 Program *programObject = getProgram(program);
5544 ASSERT(programObject);
5545 return programObject->getUniformLocation(name);
5546}
5547
5548GLboolean Context::isBuffer(GLuint buffer)
5549{
5550 if (buffer == 0)
5551 {
5552 return GL_FALSE;
5553 }
5554
5555 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5556}
5557
5558GLboolean Context::isEnabled(GLenum cap)
5559{
5560 return mGLState.getEnableFeature(cap);
5561}
5562
5563GLboolean Context::isFramebuffer(GLuint framebuffer)
5564{
5565 if (framebuffer == 0)
5566 {
5567 return GL_FALSE;
5568 }
5569
5570 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5571}
5572
5573GLboolean Context::isProgram(GLuint program)
5574{
5575 if (program == 0)
5576 {
5577 return GL_FALSE;
5578 }
5579
5580 return (getProgram(program) ? GL_TRUE : GL_FALSE);
5581}
5582
5583GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5584{
5585 if (renderbuffer == 0)
5586 {
5587 return GL_FALSE;
5588 }
5589
5590 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5591}
5592
5593GLboolean Context::isShader(GLuint shader)
5594{
5595 if (shader == 0)
5596 {
5597 return GL_FALSE;
5598 }
5599
5600 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5601}
5602
5603GLboolean Context::isTexture(GLuint texture)
5604{
5605 if (texture == 0)
5606 {
5607 return GL_FALSE;
5608 }
5609
5610 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5611}
5612
5613void Context::linkProgram(GLuint program)
5614{
5615 Program *programObject = getProgram(program);
5616 ASSERT(programObject);
5617 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08005618
5619 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
5620 // don't need to worry that:
5621 // 1. Draw calls after link use the new executable code or the old one depending on the link
5622 // result.
5623 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
5624 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
5625 // ProgramD3D.
5626 if (programObject->isInUse())
5627 {
5628 // isLinked() which forces to resolve linking, will be called.
5629 mGLState.onProgramExecutableChange(programObject);
5630 mStateCache.onProgramExecutableChange(this);
5631 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005632}
5633
5634void Context::releaseShaderCompiler()
5635{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005636 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005637}
5638
5639void Context::shaderBinary(GLsizei n,
5640 const GLuint *shaders,
5641 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005642 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005643 GLsizei length)
5644{
5645 // No binary shader formats are supported.
5646 UNIMPLEMENTED();
5647}
5648
5649void Context::shaderSource(GLuint shader,
5650 GLsizei count,
5651 const GLchar *const *string,
5652 const GLint *length)
5653{
5654 Shader *shaderObject = getShader(shader);
5655 ASSERT(shaderObject);
5656 shaderObject->setSource(count, string, length);
5657}
5658
5659void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5660{
5661 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5662}
5663
5664void Context::stencilMask(GLuint mask)
5665{
5666 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5667}
5668
5669void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5670{
5671 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5672}
5673
5674void Context::uniform1f(GLint location, GLfloat x)
5675{
5676 Program *program = mGLState.getProgram();
5677 program->setUniform1fv(location, 1, &x);
5678}
5679
5680void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5681{
5682 Program *program = mGLState.getProgram();
5683 program->setUniform1fv(location, count, v);
5684}
5685
Jamie Madill7e4eff12018-08-08 15:49:26 -04005686void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005687{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005688 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04005689 {
5690 mGLState.setObjectDirty(GL_PROGRAM);
5691 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005692}
5693
Jamie Madill7e4eff12018-08-08 15:49:26 -04005694void Context::uniform1i(GLint location, GLint x)
5695{
5696 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
5697}
5698
Jamie Madillc1d770e2017-04-13 17:31:24 -04005699void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5700{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005701 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005702}
5703
5704void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5705{
5706 GLfloat xy[2] = {x, y};
5707 Program *program = mGLState.getProgram();
5708 program->setUniform2fv(location, 1, xy);
5709}
5710
5711void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5712{
5713 Program *program = mGLState.getProgram();
5714 program->setUniform2fv(location, count, v);
5715}
5716
5717void Context::uniform2i(GLint location, GLint x, GLint y)
5718{
5719 GLint xy[2] = {x, y};
5720 Program *program = mGLState.getProgram();
5721 program->setUniform2iv(location, 1, xy);
5722}
5723
5724void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
5725{
5726 Program *program = mGLState.getProgram();
5727 program->setUniform2iv(location, count, v);
5728}
5729
5730void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5731{
5732 GLfloat xyz[3] = {x, y, z};
5733 Program *program = mGLState.getProgram();
5734 program->setUniform3fv(location, 1, xyz);
5735}
5736
5737void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
5738{
5739 Program *program = mGLState.getProgram();
5740 program->setUniform3fv(location, count, v);
5741}
5742
5743void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
5744{
5745 GLint xyz[3] = {x, y, z};
5746 Program *program = mGLState.getProgram();
5747 program->setUniform3iv(location, 1, xyz);
5748}
5749
5750void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
5751{
5752 Program *program = mGLState.getProgram();
5753 program->setUniform3iv(location, count, v);
5754}
5755
5756void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5757{
5758 GLfloat xyzw[4] = {x, y, z, w};
5759 Program *program = mGLState.getProgram();
5760 program->setUniform4fv(location, 1, xyzw);
5761}
5762
5763void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
5764{
5765 Program *program = mGLState.getProgram();
5766 program->setUniform4fv(location, count, v);
5767}
5768
5769void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5770{
5771 GLint xyzw[4] = {x, y, z, w};
5772 Program *program = mGLState.getProgram();
5773 program->setUniform4iv(location, 1, xyzw);
5774}
5775
5776void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
5777{
5778 Program *program = mGLState.getProgram();
5779 program->setUniform4iv(location, count, v);
5780}
5781
5782void Context::uniformMatrix2fv(GLint location,
5783 GLsizei count,
5784 GLboolean transpose,
5785 const GLfloat *value)
5786{
5787 Program *program = mGLState.getProgram();
5788 program->setUniformMatrix2fv(location, count, transpose, value);
5789}
5790
5791void Context::uniformMatrix3fv(GLint location,
5792 GLsizei count,
5793 GLboolean transpose,
5794 const GLfloat *value)
5795{
5796 Program *program = mGLState.getProgram();
5797 program->setUniformMatrix3fv(location, count, transpose, value);
5798}
5799
5800void Context::uniformMatrix4fv(GLint location,
5801 GLsizei count,
5802 GLboolean transpose,
5803 const GLfloat *value)
5804{
5805 Program *program = mGLState.getProgram();
5806 program->setUniformMatrix4fv(location, count, transpose, value);
5807}
5808
5809void Context::validateProgram(GLuint program)
5810{
5811 Program *programObject = getProgram(program);
5812 ASSERT(programObject);
5813 programObject->validate(mCaps);
5814}
5815
Jiajia Qin5451d532017-11-16 17:16:34 +08005816void Context::validateProgramPipeline(GLuint pipeline)
5817{
5818 UNIMPLEMENTED();
5819}
5820
Jamie Madilld04908b2017-06-09 14:15:35 -04005821void Context::getProgramBinary(GLuint program,
5822 GLsizei bufSize,
5823 GLsizei *length,
5824 GLenum *binaryFormat,
5825 void *binary)
5826{
5827 Program *programObject = getProgram(program);
5828 ASSERT(programObject != nullptr);
5829
5830 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
5831}
5832
5833void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
5834{
5835 Program *programObject = getProgram(program);
5836 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04005837
Jamie Madilld04908b2017-06-09 14:15:35 -04005838 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madillc43cdad2018-08-08 15:49:25 -04005839 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04005840 if (programObject->isInUse())
5841 {
5842 mGLState.setObjectDirty(GL_PROGRAM);
5843 }
Jamie Madilld04908b2017-06-09 14:15:35 -04005844}
5845
Jamie Madillff325f12017-08-26 15:06:05 -04005846void Context::uniform1ui(GLint location, GLuint v0)
5847{
5848 Program *program = mGLState.getProgram();
5849 program->setUniform1uiv(location, 1, &v0);
5850}
5851
5852void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
5853{
5854 Program *program = mGLState.getProgram();
5855 const GLuint xy[] = {v0, v1};
5856 program->setUniform2uiv(location, 1, xy);
5857}
5858
5859void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
5860{
5861 Program *program = mGLState.getProgram();
5862 const GLuint xyz[] = {v0, v1, v2};
5863 program->setUniform3uiv(location, 1, xyz);
5864}
5865
5866void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
5867{
5868 Program *program = mGLState.getProgram();
5869 const GLuint xyzw[] = {v0, v1, v2, v3};
5870 program->setUniform4uiv(location, 1, xyzw);
5871}
5872
5873void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
5874{
5875 Program *program = mGLState.getProgram();
5876 program->setUniform1uiv(location, count, value);
5877}
5878void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
5879{
5880 Program *program = mGLState.getProgram();
5881 program->setUniform2uiv(location, count, value);
5882}
5883
5884void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
5885{
5886 Program *program = mGLState.getProgram();
5887 program->setUniform3uiv(location, count, value);
5888}
5889
5890void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
5891{
5892 Program *program = mGLState.getProgram();
5893 program->setUniform4uiv(location, count, value);
5894}
5895
Jamie Madillf0e04492017-08-26 15:28:42 -04005896void Context::genQueries(GLsizei n, GLuint *ids)
5897{
5898 for (GLsizei i = 0; i < n; i++)
5899 {
5900 GLuint handle = mQueryHandleAllocator.allocate();
5901 mQueryMap.assign(handle, nullptr);
5902 ids[i] = handle;
5903 }
5904}
5905
5906void Context::deleteQueries(GLsizei n, const GLuint *ids)
5907{
5908 for (int i = 0; i < n; i++)
5909 {
5910 GLuint query = ids[i];
5911
5912 Query *queryObject = nullptr;
5913 if (mQueryMap.erase(query, &queryObject))
5914 {
5915 mQueryHandleAllocator.release(query);
5916 if (queryObject)
5917 {
5918 queryObject->release(this);
5919 }
5920 }
5921 }
5922}
5923
5924GLboolean Context::isQuery(GLuint id)
5925{
Corentin Wallezad3ae902018-03-09 13:40:42 -05005926 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04005927}
5928
Jamie Madillc8c95812017-08-26 18:40:09 -04005929void Context::uniformMatrix2x3fv(GLint location,
5930 GLsizei count,
5931 GLboolean transpose,
5932 const GLfloat *value)
5933{
5934 Program *program = mGLState.getProgram();
5935 program->setUniformMatrix2x3fv(location, count, transpose, value);
5936}
5937
5938void Context::uniformMatrix3x2fv(GLint location,
5939 GLsizei count,
5940 GLboolean transpose,
5941 const GLfloat *value)
5942{
5943 Program *program = mGLState.getProgram();
5944 program->setUniformMatrix3x2fv(location, count, transpose, value);
5945}
5946
5947void Context::uniformMatrix2x4fv(GLint location,
5948 GLsizei count,
5949 GLboolean transpose,
5950 const GLfloat *value)
5951{
5952 Program *program = mGLState.getProgram();
5953 program->setUniformMatrix2x4fv(location, count, transpose, value);
5954}
5955
5956void Context::uniformMatrix4x2fv(GLint location,
5957 GLsizei count,
5958 GLboolean transpose,
5959 const GLfloat *value)
5960{
5961 Program *program = mGLState.getProgram();
5962 program->setUniformMatrix4x2fv(location, count, transpose, value);
5963}
5964
5965void Context::uniformMatrix3x4fv(GLint location,
5966 GLsizei count,
5967 GLboolean transpose,
5968 const GLfloat *value)
5969{
5970 Program *program = mGLState.getProgram();
5971 program->setUniformMatrix3x4fv(location, count, transpose, value);
5972}
5973
5974void Context::uniformMatrix4x3fv(GLint location,
5975 GLsizei count,
5976 GLboolean transpose,
5977 const GLfloat *value)
5978{
5979 Program *program = mGLState.getProgram();
5980 program->setUniformMatrix4x3fv(location, count, transpose, value);
5981}
5982
Jamie Madilld7576732017-08-26 18:49:50 -04005983void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
5984{
5985 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5986 {
5987 GLuint vertexArray = arrays[arrayIndex];
5988
5989 if (arrays[arrayIndex] != 0)
5990 {
5991 VertexArray *vertexArrayObject = nullptr;
5992 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
5993 {
5994 if (vertexArrayObject != nullptr)
5995 {
5996 detachVertexArray(vertexArray);
5997 vertexArrayObject->onDestroy(this);
5998 }
5999
6000 mVertexArrayHandleAllocator.release(vertexArray);
6001 }
6002 }
6003 }
6004}
6005
6006void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6007{
6008 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6009 {
6010 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6011 mVertexArrayMap.assign(vertexArray, nullptr);
6012 arrays[arrayIndex] = vertexArray;
6013 }
6014}
6015
6016bool Context::isVertexArray(GLuint array)
6017{
6018 if (array == 0)
6019 {
6020 return GL_FALSE;
6021 }
6022
6023 VertexArray *vao = getVertexArray(array);
6024 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6025}
6026
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006027void Context::endTransformFeedback()
6028{
6029 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6030 transformFeedback->end(this);
6031}
6032
6033void Context::transformFeedbackVaryings(GLuint program,
6034 GLsizei count,
6035 const GLchar *const *varyings,
6036 GLenum bufferMode)
6037{
6038 Program *programObject = getProgram(program);
6039 ASSERT(programObject);
6040 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6041}
6042
6043void Context::getTransformFeedbackVarying(GLuint program,
6044 GLuint index,
6045 GLsizei bufSize,
6046 GLsizei *length,
6047 GLsizei *size,
6048 GLenum *type,
6049 GLchar *name)
6050{
6051 Program *programObject = getProgram(program);
6052 ASSERT(programObject);
6053 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6054}
6055
6056void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6057{
6058 for (int i = 0; i < n; i++)
6059 {
6060 GLuint transformFeedback = ids[i];
6061 if (transformFeedback == 0)
6062 {
6063 continue;
6064 }
6065
6066 TransformFeedback *transformFeedbackObject = nullptr;
6067 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6068 {
6069 if (transformFeedbackObject != nullptr)
6070 {
6071 detachTransformFeedback(transformFeedback);
6072 transformFeedbackObject->release(this);
6073 }
6074
6075 mTransformFeedbackHandleAllocator.release(transformFeedback);
6076 }
6077 }
6078}
6079
6080void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6081{
6082 for (int i = 0; i < n; i++)
6083 {
6084 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6085 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6086 ids[i] = transformFeedback;
6087 }
6088}
6089
6090bool Context::isTransformFeedback(GLuint id)
6091{
6092 if (id == 0)
6093 {
6094 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6095 // returns FALSE
6096 return GL_FALSE;
6097 }
6098
6099 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6100 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6101}
6102
6103void Context::pauseTransformFeedback()
6104{
6105 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6106 transformFeedback->pause();
6107}
6108
6109void Context::resumeTransformFeedback()
6110{
6111 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6112 transformFeedback->resume();
6113}
6114
Jamie Madill12e957f2017-08-26 21:42:26 -04006115void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6116{
6117 const Program *programObject = getProgram(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006118 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006119}
6120
Brandon Jones59770802018-04-02 13:18:42 -07006121void Context::getUniformuivRobust(GLuint program,
6122 GLint location,
6123 GLsizei bufSize,
6124 GLsizei *length,
6125 GLuint *params)
6126{
6127 getUniformuiv(program, location, params);
6128}
6129
Jamie Madill12e957f2017-08-26 21:42:26 -04006130GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6131{
6132 const Program *programObject = getProgram(program);
6133 return programObject->getFragDataLocation(name);
6134}
6135
6136void Context::getUniformIndices(GLuint program,
6137 GLsizei uniformCount,
6138 const GLchar *const *uniformNames,
6139 GLuint *uniformIndices)
6140{
6141 const Program *programObject = getProgram(program);
6142 if (!programObject->isLinked())
6143 {
6144 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6145 {
6146 uniformIndices[uniformId] = GL_INVALID_INDEX;
6147 }
6148 }
6149 else
6150 {
6151 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6152 {
6153 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6154 }
6155 }
6156}
6157
6158void Context::getActiveUniformsiv(GLuint program,
6159 GLsizei uniformCount,
6160 const GLuint *uniformIndices,
6161 GLenum pname,
6162 GLint *params)
6163{
6164 const Program *programObject = getProgram(program);
6165 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6166 {
6167 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006168 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006169 }
6170}
6171
6172GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6173{
6174 const Program *programObject = getProgram(program);
6175 return programObject->getUniformBlockIndex(uniformBlockName);
6176}
6177
6178void Context::getActiveUniformBlockiv(GLuint program,
6179 GLuint uniformBlockIndex,
6180 GLenum pname,
6181 GLint *params)
6182{
6183 const Program *programObject = getProgram(program);
6184 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6185}
6186
Brandon Jones59770802018-04-02 13:18:42 -07006187void Context::getActiveUniformBlockivRobust(GLuint program,
6188 GLuint uniformBlockIndex,
6189 GLenum pname,
6190 GLsizei bufSize,
6191 GLsizei *length,
6192 GLint *params)
6193{
6194 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6195}
6196
Jamie Madill12e957f2017-08-26 21:42:26 -04006197void Context::getActiveUniformBlockName(GLuint program,
6198 GLuint uniformBlockIndex,
6199 GLsizei bufSize,
6200 GLsizei *length,
6201 GLchar *uniformBlockName)
6202{
6203 const Program *programObject = getProgram(program);
6204 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6205}
6206
6207void Context::uniformBlockBinding(GLuint program,
6208 GLuint uniformBlockIndex,
6209 GLuint uniformBlockBinding)
6210{
6211 Program *programObject = getProgram(program);
6212 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006213
6214 if (programObject->isInUse())
6215 {
6216 mGLState.setObjectDirty(GL_PROGRAM);
6217 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006218}
6219
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006220GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6221{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006222 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6223 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006224
Jamie Madill70b5bb02017-08-28 13:32:37 -04006225 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006226 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006227 if (error.isError())
6228 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006229 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006230 handleError(error);
6231 return nullptr;
6232 }
6233
Jamie Madill70b5bb02017-08-28 13:32:37 -04006234 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006235}
6236
6237GLboolean Context::isSync(GLsync sync)
6238{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006239 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006240}
6241
6242GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6243{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006244 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006245
6246 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006247 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006248 return result;
6249}
6250
6251void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6252{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006253 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006254 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006255}
6256
6257void Context::getInteger64v(GLenum pname, GLint64 *params)
6258{
6259 GLenum nativeType = GL_NONE;
6260 unsigned int numParams = 0;
6261 getQueryParameterInfo(pname, &nativeType, &numParams);
6262
6263 if (nativeType == GL_INT_64_ANGLEX)
6264 {
6265 getInteger64vImpl(pname, params);
6266 }
6267 else
6268 {
6269 CastStateValues(this, nativeType, pname, numParams, params);
6270 }
6271}
6272
Brandon Jones59770802018-04-02 13:18:42 -07006273void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6274{
6275 getInteger64v(pname, data);
6276}
6277
Corentin Wallez336129f2017-10-17 15:55:40 -04006278void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006279{
6280 Buffer *buffer = mGLState.getTargetBuffer(target);
6281 QueryBufferParameteri64v(buffer, pname, params);
6282}
6283
Brandon Jones59770802018-04-02 13:18:42 -07006284void Context::getBufferParameteri64vRobust(BufferBinding target,
6285 GLenum pname,
6286 GLsizei bufSize,
6287 GLsizei *length,
6288 GLint64 *params)
6289{
6290 getBufferParameteri64v(target, pname, params);
6291}
6292
Jamie Madill3ef140a2017-08-26 23:11:21 -04006293void Context::genSamplers(GLsizei count, GLuint *samplers)
6294{
6295 for (int i = 0; i < count; i++)
6296 {
6297 samplers[i] = mState.mSamplers->createSampler();
6298 }
6299}
6300
6301void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6302{
6303 for (int i = 0; i < count; i++)
6304 {
6305 GLuint sampler = samplers[i];
6306
6307 if (mState.mSamplers->getSampler(sampler))
6308 {
6309 detachSampler(sampler);
6310 }
6311
6312 mState.mSamplers->deleteObject(this, sampler);
6313 }
6314}
6315
6316void Context::getInternalformativ(GLenum target,
6317 GLenum internalformat,
6318 GLenum pname,
6319 GLsizei bufSize,
6320 GLint *params)
6321{
6322 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6323 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6324}
6325
Brandon Jones59770802018-04-02 13:18:42 -07006326void Context::getInternalformativRobust(GLenum target,
6327 GLenum internalformat,
6328 GLenum pname,
6329 GLsizei bufSize,
6330 GLsizei *length,
6331 GLint *params)
6332{
6333 getInternalformativ(target, internalformat, pname, bufSize, params);
6334}
6335
Jiajia Qin5451d532017-11-16 17:16:34 +08006336void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6337{
6338 programUniform1iv(program, location, 1, &v0);
6339}
6340
6341void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6342{
6343 GLint xy[2] = {v0, v1};
6344 programUniform2iv(program, location, 1, xy);
6345}
6346
6347void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6348{
6349 GLint xyz[3] = {v0, v1, v2};
6350 programUniform3iv(program, location, 1, xyz);
6351}
6352
6353void Context::programUniform4i(GLuint program,
6354 GLint location,
6355 GLint v0,
6356 GLint v1,
6357 GLint v2,
6358 GLint v3)
6359{
6360 GLint xyzw[4] = {v0, v1, v2, v3};
6361 programUniform4iv(program, location, 1, xyzw);
6362}
6363
6364void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6365{
6366 programUniform1uiv(program, location, 1, &v0);
6367}
6368
6369void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6370{
6371 GLuint xy[2] = {v0, v1};
6372 programUniform2uiv(program, location, 1, xy);
6373}
6374
6375void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6376{
6377 GLuint xyz[3] = {v0, v1, v2};
6378 programUniform3uiv(program, location, 1, xyz);
6379}
6380
6381void Context::programUniform4ui(GLuint program,
6382 GLint location,
6383 GLuint v0,
6384 GLuint v1,
6385 GLuint v2,
6386 GLuint v3)
6387{
6388 GLuint xyzw[4] = {v0, v1, v2, v3};
6389 programUniform4uiv(program, location, 1, xyzw);
6390}
6391
6392void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6393{
6394 programUniform1fv(program, location, 1, &v0);
6395}
6396
6397void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6398{
6399 GLfloat xy[2] = {v0, v1};
6400 programUniform2fv(program, location, 1, xy);
6401}
6402
6403void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6404{
6405 GLfloat xyz[3] = {v0, v1, v2};
6406 programUniform3fv(program, location, 1, xyz);
6407}
6408
6409void Context::programUniform4f(GLuint program,
6410 GLint location,
6411 GLfloat v0,
6412 GLfloat v1,
6413 GLfloat v2,
6414 GLfloat v3)
6415{
6416 GLfloat xyzw[4] = {v0, v1, v2, v3};
6417 programUniform4fv(program, location, 1, xyzw);
6418}
6419
Jamie Madill81c2e252017-09-09 23:32:46 -04006420void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6421{
6422 Program *programObject = getProgram(program);
6423 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006424 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006425}
6426
Jiajia Qin5451d532017-11-16 17:16:34 +08006427void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6428{
6429 Program *programObject = getProgram(program);
6430 ASSERT(programObject);
6431 programObject->setUniform2iv(location, count, value);
6432}
6433
6434void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6435{
6436 Program *programObject = getProgram(program);
6437 ASSERT(programObject);
6438 programObject->setUniform3iv(location, count, value);
6439}
6440
6441void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6442{
6443 Program *programObject = getProgram(program);
6444 ASSERT(programObject);
6445 programObject->setUniform4iv(location, count, value);
6446}
6447
6448void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6449{
6450 Program *programObject = getProgram(program);
6451 ASSERT(programObject);
6452 programObject->setUniform1uiv(location, count, value);
6453}
6454
6455void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6456{
6457 Program *programObject = getProgram(program);
6458 ASSERT(programObject);
6459 programObject->setUniform2uiv(location, count, value);
6460}
6461
6462void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6463{
6464 Program *programObject = getProgram(program);
6465 ASSERT(programObject);
6466 programObject->setUniform3uiv(location, count, value);
6467}
6468
6469void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6470{
6471 Program *programObject = getProgram(program);
6472 ASSERT(programObject);
6473 programObject->setUniform4uiv(location, count, value);
6474}
6475
6476void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6477{
6478 Program *programObject = getProgram(program);
6479 ASSERT(programObject);
6480 programObject->setUniform1fv(location, count, value);
6481}
6482
6483void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6484{
6485 Program *programObject = getProgram(program);
6486 ASSERT(programObject);
6487 programObject->setUniform2fv(location, count, value);
6488}
6489
6490void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6491{
6492 Program *programObject = getProgram(program);
6493 ASSERT(programObject);
6494 programObject->setUniform3fv(location, count, value);
6495}
6496
6497void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6498{
6499 Program *programObject = getProgram(program);
6500 ASSERT(programObject);
6501 programObject->setUniform4fv(location, count, value);
6502}
6503
6504void Context::programUniformMatrix2fv(GLuint program,
6505 GLint location,
6506 GLsizei count,
6507 GLboolean transpose,
6508 const GLfloat *value)
6509{
6510 Program *programObject = getProgram(program);
6511 ASSERT(programObject);
6512 programObject->setUniformMatrix2fv(location, count, transpose, value);
6513}
6514
6515void Context::programUniformMatrix3fv(GLuint program,
6516 GLint location,
6517 GLsizei count,
6518 GLboolean transpose,
6519 const GLfloat *value)
6520{
6521 Program *programObject = getProgram(program);
6522 ASSERT(programObject);
6523 programObject->setUniformMatrix3fv(location, count, transpose, value);
6524}
6525
6526void Context::programUniformMatrix4fv(GLuint program,
6527 GLint location,
6528 GLsizei count,
6529 GLboolean transpose,
6530 const GLfloat *value)
6531{
6532 Program *programObject = getProgram(program);
6533 ASSERT(programObject);
6534 programObject->setUniformMatrix4fv(location, count, transpose, value);
6535}
6536
6537void Context::programUniformMatrix2x3fv(GLuint program,
6538 GLint location,
6539 GLsizei count,
6540 GLboolean transpose,
6541 const GLfloat *value)
6542{
6543 Program *programObject = getProgram(program);
6544 ASSERT(programObject);
6545 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6546}
6547
6548void Context::programUniformMatrix3x2fv(GLuint program,
6549 GLint location,
6550 GLsizei count,
6551 GLboolean transpose,
6552 const GLfloat *value)
6553{
6554 Program *programObject = getProgram(program);
6555 ASSERT(programObject);
6556 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6557}
6558
6559void Context::programUniformMatrix2x4fv(GLuint program,
6560 GLint location,
6561 GLsizei count,
6562 GLboolean transpose,
6563 const GLfloat *value)
6564{
6565 Program *programObject = getProgram(program);
6566 ASSERT(programObject);
6567 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6568}
6569
6570void Context::programUniformMatrix4x2fv(GLuint program,
6571 GLint location,
6572 GLsizei count,
6573 GLboolean transpose,
6574 const GLfloat *value)
6575{
6576 Program *programObject = getProgram(program);
6577 ASSERT(programObject);
6578 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6579}
6580
6581void Context::programUniformMatrix3x4fv(GLuint program,
6582 GLint location,
6583 GLsizei count,
6584 GLboolean transpose,
6585 const GLfloat *value)
6586{
6587 Program *programObject = getProgram(program);
6588 ASSERT(programObject);
6589 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6590}
6591
6592void Context::programUniformMatrix4x3fv(GLuint program,
6593 GLint location,
6594 GLsizei count,
6595 GLboolean transpose,
6596 const GLfloat *value)
6597{
6598 Program *programObject = getProgram(program);
6599 ASSERT(programObject);
6600 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6601}
6602
Jamie Madill81c2e252017-09-09 23:32:46 -04006603void Context::onTextureChange(const Texture *texture)
6604{
6605 // Conservatively assume all textures are dirty.
6606 // TODO(jmadill): More fine-grained update.
6607 mGLState.setObjectDirty(GL_TEXTURE);
6608}
6609
James Darpiniane8a93c62018-01-04 18:02:24 -08006610bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6611{
6612 return mGLState.isCurrentTransformFeedback(tf);
6613}
James Darpiniane8a93c62018-01-04 18:02:24 -08006614
Yunchao Hea336b902017-08-02 16:05:21 +08006615void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6616{
6617 for (int i = 0; i < count; i++)
6618 {
6619 pipelines[i] = createProgramPipeline();
6620 }
6621}
6622
6623void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6624{
6625 for (int i = 0; i < count; i++)
6626 {
6627 if (pipelines[i] != 0)
6628 {
6629 deleteProgramPipeline(pipelines[i]);
6630 }
6631 }
6632}
6633
6634GLboolean Context::isProgramPipeline(GLuint pipeline)
6635{
6636 if (pipeline == 0)
6637 {
6638 return GL_FALSE;
6639 }
6640
6641 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6642}
6643
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006644void Context::finishFenceNV(GLuint fence)
6645{
6646 FenceNV *fenceObject = getFenceNV(fence);
6647
6648 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04006649 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006650}
6651
6652void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6653{
6654 FenceNV *fenceObject = getFenceNV(fence);
6655
6656 ASSERT(fenceObject && fenceObject->isSet());
6657
6658 switch (pname)
6659 {
6660 case GL_FENCE_STATUS_NV:
6661 {
6662 // GL_NV_fence spec:
6663 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6664 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6665 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6666 GLboolean status = GL_TRUE;
6667 if (fenceObject->getStatus() != GL_TRUE)
6668 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006669 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006670 }
6671 *params = status;
6672 break;
6673 }
6674
6675 case GL_FENCE_CONDITION_NV:
6676 {
6677 *params = static_cast<GLint>(fenceObject->getCondition());
6678 break;
6679 }
6680
6681 default:
6682 UNREACHABLE();
6683 }
6684}
6685
6686void Context::getTranslatedShaderSource(GLuint shader,
6687 GLsizei bufsize,
6688 GLsizei *length,
6689 GLchar *source)
6690{
6691 Shader *shaderObject = getShader(shader);
6692 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08006693 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006694}
6695
6696void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6697{
6698 Program *programObject = getProgram(program);
6699 ASSERT(programObject);
6700
6701 programObject->getUniformfv(this, location, params);
6702}
6703
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006704void Context::getnUniformfvRobust(GLuint program,
6705 GLint location,
6706 GLsizei bufSize,
6707 GLsizei *length,
6708 GLfloat *params)
6709{
6710 UNIMPLEMENTED();
6711}
6712
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006713void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
6714{
6715 Program *programObject = getProgram(program);
6716 ASSERT(programObject);
6717
6718 programObject->getUniformiv(this, location, params);
6719}
6720
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006721void Context::getnUniformivRobust(GLuint program,
6722 GLint location,
6723 GLsizei bufSize,
6724 GLsizei *length,
6725 GLint *params)
6726{
6727 UNIMPLEMENTED();
6728}
6729
6730void Context::getnUniformuivRobust(GLuint program,
6731 GLint location,
6732 GLsizei bufSize,
6733 GLsizei *length,
6734 GLuint *params)
6735{
6736 UNIMPLEMENTED();
6737}
6738
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006739GLboolean Context::isFenceNV(GLuint fence)
6740{
6741 FenceNV *fenceObject = getFenceNV(fence);
6742
6743 if (fenceObject == nullptr)
6744 {
6745 return GL_FALSE;
6746 }
6747
6748 // GL_NV_fence spec:
6749 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
6750 // existing fence.
6751 return fenceObject->isSet();
6752}
6753
6754void Context::readnPixels(GLint x,
6755 GLint y,
6756 GLsizei width,
6757 GLsizei height,
6758 GLenum format,
6759 GLenum type,
6760 GLsizei bufSize,
6761 void *data)
6762{
6763 return readPixels(x, y, width, height, format, type, data);
6764}
6765
Jamie Madill007530e2017-12-28 14:27:04 -05006766void Context::setFenceNV(GLuint fence, GLenum condition)
6767{
6768 ASSERT(condition == GL_ALL_COMPLETED_NV);
6769
6770 FenceNV *fenceObject = getFenceNV(fence);
6771 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04006772 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05006773}
6774
6775GLboolean Context::testFenceNV(GLuint fence)
6776{
6777 FenceNV *fenceObject = getFenceNV(fence);
6778
6779 ASSERT(fenceObject != nullptr);
6780 ASSERT(fenceObject->isSet() == GL_TRUE);
6781
6782 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04006783 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05006784 if (error.isError())
6785 {
6786 handleError(error);
6787 return GL_TRUE;
6788 }
6789
6790 return result;
6791}
6792
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006793void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006794{
6795 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07006796 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05006797 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05006798}
6799
Jamie Madillfa920eb2018-01-04 11:45:50 -05006800void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006801{
6802 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07006803 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05006804 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
6805}
6806
Jamie Madillfa920eb2018-01-04 11:45:50 -05006807void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
6808{
6809 UNIMPLEMENTED();
6810}
6811
Jamie Madill5b772312018-03-08 20:28:32 -05006812bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
6813{
6814 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
6815 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
6816 // to the fact that it is stored internally as a float, and so would require conversion
6817 // if returned from Context::getIntegerv. Since this conversion is already implemented
6818 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
6819 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
6820 // application.
6821 switch (pname)
6822 {
6823 case GL_COMPRESSED_TEXTURE_FORMATS:
6824 {
6825 *type = GL_INT;
6826 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
6827 return true;
6828 }
6829 case GL_SHADER_BINARY_FORMATS:
6830 {
6831 *type = GL_INT;
6832 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
6833 return true;
6834 }
6835
6836 case GL_MAX_VERTEX_ATTRIBS:
6837 case GL_MAX_VERTEX_UNIFORM_VECTORS:
6838 case GL_MAX_VARYING_VECTORS:
6839 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
6840 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
6841 case GL_MAX_TEXTURE_IMAGE_UNITS:
6842 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
6843 case GL_MAX_RENDERBUFFER_SIZE:
6844 case GL_NUM_SHADER_BINARY_FORMATS:
6845 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
6846 case GL_ARRAY_BUFFER_BINDING:
6847 case GL_FRAMEBUFFER_BINDING:
6848 case GL_RENDERBUFFER_BINDING:
6849 case GL_CURRENT_PROGRAM:
6850 case GL_PACK_ALIGNMENT:
6851 case GL_UNPACK_ALIGNMENT:
6852 case GL_GENERATE_MIPMAP_HINT:
6853 case GL_RED_BITS:
6854 case GL_GREEN_BITS:
6855 case GL_BLUE_BITS:
6856 case GL_ALPHA_BITS:
6857 case GL_DEPTH_BITS:
6858 case GL_STENCIL_BITS:
6859 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
6860 case GL_CULL_FACE_MODE:
6861 case GL_FRONT_FACE:
6862 case GL_ACTIVE_TEXTURE:
6863 case GL_STENCIL_FUNC:
6864 case GL_STENCIL_VALUE_MASK:
6865 case GL_STENCIL_REF:
6866 case GL_STENCIL_FAIL:
6867 case GL_STENCIL_PASS_DEPTH_FAIL:
6868 case GL_STENCIL_PASS_DEPTH_PASS:
6869 case GL_STENCIL_BACK_FUNC:
6870 case GL_STENCIL_BACK_VALUE_MASK:
6871 case GL_STENCIL_BACK_REF:
6872 case GL_STENCIL_BACK_FAIL:
6873 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
6874 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
6875 case GL_DEPTH_FUNC:
6876 case GL_BLEND_SRC_RGB:
6877 case GL_BLEND_SRC_ALPHA:
6878 case GL_BLEND_DST_RGB:
6879 case GL_BLEND_DST_ALPHA:
6880 case GL_BLEND_EQUATION_RGB:
6881 case GL_BLEND_EQUATION_ALPHA:
6882 case GL_STENCIL_WRITEMASK:
6883 case GL_STENCIL_BACK_WRITEMASK:
6884 case GL_STENCIL_CLEAR_VALUE:
6885 case GL_SUBPIXEL_BITS:
6886 case GL_MAX_TEXTURE_SIZE:
6887 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
6888 case GL_SAMPLE_BUFFERS:
6889 case GL_SAMPLES:
6890 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
6891 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
6892 case GL_TEXTURE_BINDING_2D:
6893 case GL_TEXTURE_BINDING_CUBE_MAP:
6894 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
6895 {
6896 *type = GL_INT;
6897 *numParams = 1;
6898 return true;
6899 }
6900 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
6901 {
6902 if (!getExtensions().packReverseRowOrder)
6903 {
6904 return false;
6905 }
6906 *type = GL_INT;
6907 *numParams = 1;
6908 return true;
6909 }
6910 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
6911 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
6912 {
6913 if (!getExtensions().textureRectangle)
6914 {
6915 return false;
6916 }
6917 *type = GL_INT;
6918 *numParams = 1;
6919 return true;
6920 }
6921 case GL_MAX_DRAW_BUFFERS_EXT:
6922 case GL_MAX_COLOR_ATTACHMENTS_EXT:
6923 {
6924 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
6925 {
6926 return false;
6927 }
6928 *type = GL_INT;
6929 *numParams = 1;
6930 return true;
6931 }
6932 case GL_MAX_VIEWPORT_DIMS:
6933 {
6934 *type = GL_INT;
6935 *numParams = 2;
6936 return true;
6937 }
6938 case GL_VIEWPORT:
6939 case GL_SCISSOR_BOX:
6940 {
6941 *type = GL_INT;
6942 *numParams = 4;
6943 return true;
6944 }
6945 case GL_SHADER_COMPILER:
6946 case GL_SAMPLE_COVERAGE_INVERT:
6947 case GL_DEPTH_WRITEMASK:
6948 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
6949 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
6950 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
6951 // bool-natural
6952 case GL_SAMPLE_COVERAGE:
6953 case GL_SCISSOR_TEST:
6954 case GL_STENCIL_TEST:
6955 case GL_DEPTH_TEST:
6956 case GL_BLEND:
6957 case GL_DITHER:
6958 case GL_CONTEXT_ROBUST_ACCESS_EXT:
6959 {
6960 *type = GL_BOOL;
6961 *numParams = 1;
6962 return true;
6963 }
6964 case GL_COLOR_WRITEMASK:
6965 {
6966 *type = GL_BOOL;
6967 *numParams = 4;
6968 return true;
6969 }
6970 case GL_POLYGON_OFFSET_FACTOR:
6971 case GL_POLYGON_OFFSET_UNITS:
6972 case GL_SAMPLE_COVERAGE_VALUE:
6973 case GL_DEPTH_CLEAR_VALUE:
6974 case GL_LINE_WIDTH:
6975 {
6976 *type = GL_FLOAT;
6977 *numParams = 1;
6978 return true;
6979 }
6980 case GL_ALIASED_LINE_WIDTH_RANGE:
6981 case GL_ALIASED_POINT_SIZE_RANGE:
6982 case GL_DEPTH_RANGE:
6983 {
6984 *type = GL_FLOAT;
6985 *numParams = 2;
6986 return true;
6987 }
6988 case GL_COLOR_CLEAR_VALUE:
6989 case GL_BLEND_COLOR:
6990 {
6991 *type = GL_FLOAT;
6992 *numParams = 4;
6993 return true;
6994 }
6995 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
6996 if (!getExtensions().textureFilterAnisotropic)
6997 {
6998 return false;
6999 }
7000 *type = GL_FLOAT;
7001 *numParams = 1;
7002 return true;
7003 case GL_TIMESTAMP_EXT:
7004 if (!getExtensions().disjointTimerQuery)
7005 {
7006 return false;
7007 }
7008 *type = GL_INT_64_ANGLEX;
7009 *numParams = 1;
7010 return true;
7011 case GL_GPU_DISJOINT_EXT:
7012 if (!getExtensions().disjointTimerQuery)
7013 {
7014 return false;
7015 }
7016 *type = GL_INT;
7017 *numParams = 1;
7018 return true;
7019 case GL_COVERAGE_MODULATION_CHROMIUM:
7020 if (!getExtensions().framebufferMixedSamples)
7021 {
7022 return false;
7023 }
7024 *type = GL_INT;
7025 *numParams = 1;
7026 return true;
7027 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7028 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7029 {
7030 return false;
7031 }
7032 *type = GL_INT;
7033 *numParams = 1;
7034 return true;
7035 }
7036
7037 if (getExtensions().debug)
7038 {
7039 switch (pname)
7040 {
7041 case GL_DEBUG_LOGGED_MESSAGES:
7042 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7043 case GL_DEBUG_GROUP_STACK_DEPTH:
7044 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7045 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7046 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7047 case GL_MAX_LABEL_LENGTH:
7048 *type = GL_INT;
7049 *numParams = 1;
7050 return true;
7051
7052 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7053 case GL_DEBUG_OUTPUT:
7054 *type = GL_BOOL;
7055 *numParams = 1;
7056 return true;
7057 }
7058 }
7059
7060 if (getExtensions().multisampleCompatibility)
7061 {
7062 switch (pname)
7063 {
7064 case GL_MULTISAMPLE_EXT:
7065 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7066 *type = GL_BOOL;
7067 *numParams = 1;
7068 return true;
7069 }
7070 }
7071
7072 if (getExtensions().pathRendering)
7073 {
7074 switch (pname)
7075 {
7076 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7077 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7078 *type = GL_FLOAT;
7079 *numParams = 16;
7080 return true;
7081 }
7082 }
7083
7084 if (getExtensions().bindGeneratesResource)
7085 {
7086 switch (pname)
7087 {
7088 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7089 *type = GL_BOOL;
7090 *numParams = 1;
7091 return true;
7092 }
7093 }
7094
7095 if (getExtensions().clientArrays)
7096 {
7097 switch (pname)
7098 {
7099 case GL_CLIENT_ARRAYS_ANGLE:
7100 *type = GL_BOOL;
7101 *numParams = 1;
7102 return true;
7103 }
7104 }
7105
7106 if (getExtensions().sRGBWriteControl)
7107 {
7108 switch (pname)
7109 {
7110 case GL_FRAMEBUFFER_SRGB_EXT:
7111 *type = GL_BOOL;
7112 *numParams = 1;
7113 return true;
7114 }
7115 }
7116
7117 if (getExtensions().robustResourceInitialization &&
7118 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7119 {
7120 *type = GL_BOOL;
7121 *numParams = 1;
7122 return true;
7123 }
7124
7125 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7126 {
7127 *type = GL_BOOL;
7128 *numParams = 1;
7129 return true;
7130 }
7131
jchen1082af6202018-06-22 10:59:52 +08007132 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7133 {
7134 *type = GL_INT;
7135 *numParams = 1;
7136 return true;
7137 }
7138
Jamie Madill5b772312018-03-08 20:28:32 -05007139 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7140 switch (pname)
7141 {
7142 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7143 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7144 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7145 {
7146 return false;
7147 }
7148 *type = GL_INT;
7149 *numParams = 1;
7150 return true;
7151
7152 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7153 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7154 {
7155 return false;
7156 }
7157 *type = GL_INT;
7158 *numParams = 1;
7159 return true;
7160
7161 case GL_PROGRAM_BINARY_FORMATS_OES:
7162 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7163 {
7164 return false;
7165 }
7166 *type = GL_INT;
7167 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7168 return true;
7169
7170 case GL_PACK_ROW_LENGTH:
7171 case GL_PACK_SKIP_ROWS:
7172 case GL_PACK_SKIP_PIXELS:
7173 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7174 {
7175 return false;
7176 }
7177 *type = GL_INT;
7178 *numParams = 1;
7179 return true;
7180 case GL_UNPACK_ROW_LENGTH:
7181 case GL_UNPACK_SKIP_ROWS:
7182 case GL_UNPACK_SKIP_PIXELS:
7183 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7184 {
7185 return false;
7186 }
7187 *type = GL_INT;
7188 *numParams = 1;
7189 return true;
7190 case GL_VERTEX_ARRAY_BINDING:
7191 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7192 {
7193 return false;
7194 }
7195 *type = GL_INT;
7196 *numParams = 1;
7197 return true;
7198 case GL_PIXEL_PACK_BUFFER_BINDING:
7199 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7200 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7201 {
7202 return false;
7203 }
7204 *type = GL_INT;
7205 *numParams = 1;
7206 return true;
7207 case GL_MAX_SAMPLES:
7208 {
7209 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7210 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7211 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7212 {
7213 return false;
7214 }
7215 *type = GL_INT;
7216 *numParams = 1;
7217 return true;
7218
7219 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7220 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7221 {
7222 return false;
7223 }
7224 *type = GL_INT;
7225 *numParams = 1;
7226 return true;
7227 }
7228 }
7229
7230 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7231 {
7232 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7233 {
7234 return false;
7235 }
7236 *type = GL_INT;
7237 *numParams = 1;
7238 return true;
7239 }
7240
7241 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7242 {
7243 *type = GL_INT;
7244 *numParams = 1;
7245 return true;
7246 }
7247
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007248 if (getClientVersion() < Version(2, 0))
7249 {
7250 switch (pname)
7251 {
7252 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007253 case GL_CLIENT_ACTIVE_TEXTURE:
7254 case GL_MATRIX_MODE:
7255 case GL_MAX_TEXTURE_UNITS:
7256 case GL_MAX_MODELVIEW_STACK_DEPTH:
7257 case GL_MAX_PROJECTION_STACK_DEPTH:
7258 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007259 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007260 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007261 case GL_VERTEX_ARRAY_STRIDE:
7262 case GL_NORMAL_ARRAY_STRIDE:
7263 case GL_COLOR_ARRAY_STRIDE:
7264 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7265 case GL_VERTEX_ARRAY_SIZE:
7266 case GL_COLOR_ARRAY_SIZE:
7267 case GL_TEXTURE_COORD_ARRAY_SIZE:
7268 case GL_VERTEX_ARRAY_TYPE:
7269 case GL_NORMAL_ARRAY_TYPE:
7270 case GL_COLOR_ARRAY_TYPE:
7271 case GL_TEXTURE_COORD_ARRAY_TYPE:
7272 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7273 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7274 case GL_COLOR_ARRAY_BUFFER_BINDING:
7275 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7276 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7277 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7278 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007279 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007280 case GL_MODELVIEW_STACK_DEPTH:
7281 case GL_PROJECTION_STACK_DEPTH:
7282 case GL_TEXTURE_STACK_DEPTH:
7283 case GL_LOGIC_OP_MODE:
7284 case GL_BLEND_SRC:
7285 case GL_BLEND_DST:
7286 case GL_PERSPECTIVE_CORRECTION_HINT:
7287 case GL_POINT_SMOOTH_HINT:
7288 case GL_LINE_SMOOTH_HINT:
7289 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007290 *type = GL_INT;
7291 *numParams = 1;
7292 return true;
7293 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007294 case GL_FOG_DENSITY:
7295 case GL_FOG_START:
7296 case GL_FOG_END:
7297 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007298 case GL_POINT_SIZE:
7299 case GL_POINT_SIZE_MIN:
7300 case GL_POINT_SIZE_MAX:
7301 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007302 *type = GL_FLOAT;
7303 *numParams = 1;
7304 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007305 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007306 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007307 *type = GL_FLOAT;
7308 *numParams = 2;
7309 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007310 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007311 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007312 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007313 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007314 *type = GL_FLOAT;
7315 *numParams = 4;
7316 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007317 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007318 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007319 *type = GL_FLOAT;
7320 *numParams = 3;
7321 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007322 case GL_MODELVIEW_MATRIX:
7323 case GL_PROJECTION_MATRIX:
7324 case GL_TEXTURE_MATRIX:
7325 *type = GL_FLOAT;
7326 *numParams = 16;
7327 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007328 case GL_LIGHT_MODEL_TWO_SIDE:
7329 *type = GL_BOOL;
7330 *numParams = 1;
7331 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007332 }
7333 }
7334
Jamie Madill5b772312018-03-08 20:28:32 -05007335 if (getClientVersion() < Version(3, 0))
7336 {
7337 return false;
7338 }
7339
7340 // Check for ES3.0+ parameter names
7341 switch (pname)
7342 {
7343 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7344 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7345 case GL_UNIFORM_BUFFER_BINDING:
7346 case GL_TRANSFORM_FEEDBACK_BINDING:
7347 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7348 case GL_COPY_READ_BUFFER_BINDING:
7349 case GL_COPY_WRITE_BUFFER_BINDING:
7350 case GL_SAMPLER_BINDING:
7351 case GL_READ_BUFFER:
7352 case GL_TEXTURE_BINDING_3D:
7353 case GL_TEXTURE_BINDING_2D_ARRAY:
7354 case GL_MAX_3D_TEXTURE_SIZE:
7355 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7356 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7357 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7358 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7359 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7360 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7361 case GL_MAX_VARYING_COMPONENTS:
7362 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7363 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7364 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7365 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7366 case GL_NUM_EXTENSIONS:
7367 case GL_MAJOR_VERSION:
7368 case GL_MINOR_VERSION:
7369 case GL_MAX_ELEMENTS_INDICES:
7370 case GL_MAX_ELEMENTS_VERTICES:
7371 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7372 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7373 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7374 case GL_UNPACK_IMAGE_HEIGHT:
7375 case GL_UNPACK_SKIP_IMAGES:
7376 {
7377 *type = GL_INT;
7378 *numParams = 1;
7379 return true;
7380 }
7381
7382 case GL_MAX_ELEMENT_INDEX:
7383 case GL_MAX_UNIFORM_BLOCK_SIZE:
7384 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7385 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7386 case GL_MAX_SERVER_WAIT_TIMEOUT:
7387 {
7388 *type = GL_INT_64_ANGLEX;
7389 *numParams = 1;
7390 return true;
7391 }
7392
7393 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7394 case GL_TRANSFORM_FEEDBACK_PAUSED:
7395 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7396 case GL_RASTERIZER_DISCARD:
7397 {
7398 *type = GL_BOOL;
7399 *numParams = 1;
7400 return true;
7401 }
7402
7403 case GL_MAX_TEXTURE_LOD_BIAS:
7404 {
7405 *type = GL_FLOAT;
7406 *numParams = 1;
7407 return true;
7408 }
7409 }
7410
7411 if (getExtensions().requestExtension)
7412 {
7413 switch (pname)
7414 {
7415 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7416 *type = GL_INT;
7417 *numParams = 1;
7418 return true;
7419 }
7420 }
7421
7422 if (getClientVersion() < Version(3, 1))
7423 {
7424 return false;
7425 }
7426
7427 switch (pname)
7428 {
7429 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7430 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7431 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7432 case GL_MAX_FRAMEBUFFER_WIDTH:
7433 case GL_MAX_FRAMEBUFFER_HEIGHT:
7434 case GL_MAX_FRAMEBUFFER_SAMPLES:
7435 case GL_MAX_SAMPLE_MASK_WORDS:
7436 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7437 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7438 case GL_MAX_INTEGER_SAMPLES:
7439 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7440 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7441 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7442 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7443 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7444 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7445 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7446 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7447 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7448 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7449 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7450 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7451 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7452 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7453 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7454 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7455 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7456 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7457 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7458 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7459 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7460 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7461 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7462 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7463 case GL_MAX_UNIFORM_LOCATIONS:
7464 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7465 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7466 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7467 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7468 case GL_MAX_IMAGE_UNITS:
7469 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7470 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7471 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7472 case GL_SHADER_STORAGE_BUFFER_BINDING:
7473 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7474 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
7475 *type = GL_INT;
7476 *numParams = 1;
7477 return true;
7478 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7479 *type = GL_INT_64_ANGLEX;
7480 *numParams = 1;
7481 return true;
7482 case GL_SAMPLE_MASK:
7483 *type = GL_BOOL;
7484 *numParams = 1;
7485 return true;
7486 }
7487
7488 if (getExtensions().geometryShader)
7489 {
7490 switch (pname)
7491 {
7492 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7493 case GL_LAYER_PROVOKING_VERTEX_EXT:
7494 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7495 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7496 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7497 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7498 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7499 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7500 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7501 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7502 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7503 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7504 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7505 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7506 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7507 *type = GL_INT;
7508 *numParams = 1;
7509 return true;
7510 }
7511 }
7512
7513 return false;
7514}
7515
7516bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7517{
7518 if (getClientVersion() < Version(3, 0))
7519 {
7520 return false;
7521 }
7522
7523 switch (target)
7524 {
7525 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7526 case GL_UNIFORM_BUFFER_BINDING:
7527 {
7528 *type = GL_INT;
7529 *numParams = 1;
7530 return true;
7531 }
7532 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7533 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7534 case GL_UNIFORM_BUFFER_START:
7535 case GL_UNIFORM_BUFFER_SIZE:
7536 {
7537 *type = GL_INT_64_ANGLEX;
7538 *numParams = 1;
7539 return true;
7540 }
7541 }
7542
7543 if (getClientVersion() < Version(3, 1))
7544 {
7545 return false;
7546 }
7547
7548 switch (target)
7549 {
7550 case GL_IMAGE_BINDING_LAYERED:
7551 {
7552 *type = GL_BOOL;
7553 *numParams = 1;
7554 return true;
7555 }
7556 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7557 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7558 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7559 case GL_SHADER_STORAGE_BUFFER_BINDING:
7560 case GL_VERTEX_BINDING_BUFFER:
7561 case GL_VERTEX_BINDING_DIVISOR:
7562 case GL_VERTEX_BINDING_OFFSET:
7563 case GL_VERTEX_BINDING_STRIDE:
7564 case GL_SAMPLE_MASK_VALUE:
7565 case GL_IMAGE_BINDING_NAME:
7566 case GL_IMAGE_BINDING_LEVEL:
7567 case GL_IMAGE_BINDING_LAYER:
7568 case GL_IMAGE_BINDING_ACCESS:
7569 case GL_IMAGE_BINDING_FORMAT:
7570 {
7571 *type = GL_INT;
7572 *numParams = 1;
7573 return true;
7574 }
7575 case GL_ATOMIC_COUNTER_BUFFER_START:
7576 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7577 case GL_SHADER_STORAGE_BUFFER_START:
7578 case GL_SHADER_STORAGE_BUFFER_SIZE:
7579 {
7580 *type = GL_INT_64_ANGLEX;
7581 *numParams = 1;
7582 return true;
7583 }
7584 }
7585
7586 return false;
7587}
7588
7589Program *Context::getProgram(GLuint handle) const
7590{
7591 return mState.mShaderPrograms->getProgram(handle);
7592}
7593
7594Shader *Context::getShader(GLuint handle) const
7595{
7596 return mState.mShaderPrograms->getShader(handle);
7597}
7598
7599bool Context::isTextureGenerated(GLuint texture) const
7600{
7601 return mState.mTextures->isHandleGenerated(texture);
7602}
7603
Jamie Madill5b772312018-03-08 20:28:32 -05007604bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7605{
7606 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7607}
7608
7609bool Context::isFramebufferGenerated(GLuint framebuffer) const
7610{
7611 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7612}
7613
7614bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7615{
7616 return mState.mPipelines->isHandleGenerated(pipeline);
7617}
7618
7619bool Context::usingDisplayTextureShareGroup() const
7620{
7621 return mDisplayTextureShareGroup;
7622}
7623
7624GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7625{
7626 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7627 internalformat == GL_DEPTH_STENCIL
7628 ? GL_DEPTH24_STENCIL8
7629 : internalformat;
7630}
7631
jchen1082af6202018-06-22 10:59:52 +08007632void Context::maxShaderCompilerThreads(GLuint count)
7633{
jchen107ae70d82018-07-06 13:47:01 +08007634 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08007635 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08007636 // A count of zero specifies a request for no parallel compiling or linking.
7637 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
7638 {
7639 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
7640 }
7641 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08007642}
7643
Jamie Madill2eb65032018-07-30 10:25:57 -04007644bool Context::isGLES1() const
7645{
7646 return mState.getClientVersion() < Version(2, 0);
7647}
7648
Jamie Madilla11819d2018-07-30 10:26:01 -04007649void Context::onSubjectStateChange(const Context *context,
7650 angle::SubjectIndex index,
7651 angle::SubjectMessage message)
7652{
Jamie Madilla11819d2018-07-30 10:26:01 -04007653 switch (index)
7654 {
7655 case kVertexArraySubjectIndex:
7656 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
Jamie Madillc43cdad2018-08-08 15:49:25 -04007657 mStateCache.onVertexArraySizeChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04007658 break;
7659
7660 case kReadFramebufferSubjectIndex:
7661 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
7662 break;
7663
7664 case kDrawFramebufferSubjectIndex:
7665 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
7666 break;
7667
7668 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04007669 if (index < kTextureMaxSubjectIndex)
7670 {
7671 mGLState.onActiveTextureStateChange(index);
7672 }
7673 else
7674 {
7675 ASSERT(index < kUniformBufferMaxSubjectIndex);
7676 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
7677 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007678 break;
7679 }
7680}
7681
Jamie Madill6b873dd2018-07-12 23:56:30 -04007682// ErrorSet implementation.
7683ErrorSet::ErrorSet(Context *context) : mContext(context)
7684{
7685}
7686
7687ErrorSet::~ErrorSet() = default;
7688
Jamie Madill306b6c12018-07-27 08:12:49 -04007689void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04007690{
7691 // This internal enum is used to filter internal errors that are already handled.
7692 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
7693 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
7694 {
7695 return;
7696 }
7697
7698 if (ANGLE_UNLIKELY(error.isError()))
7699 {
7700 GLenum code = error.getCode();
7701 mErrors.insert(code);
7702 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
7703 {
7704 mContext->markContextLost();
7705 }
7706
7707 ASSERT(!error.getMessage().empty());
7708 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
7709 error.getID(), GL_DEBUG_SEVERITY_HIGH,
7710 error.getMessage());
7711 }
7712}
7713
7714bool ErrorSet::empty() const
7715{
7716 return mErrors.empty();
7717}
7718
7719GLenum ErrorSet::popError()
7720{
7721 ASSERT(!empty());
7722 GLenum error = *mErrors.begin();
7723 mErrors.erase(mErrors.begin());
7724 return error;
7725}
Jamie Madilldc358af2018-07-31 11:22:13 -04007726
7727// StateCache implementation.
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007728StateCache::StateCache()
7729 : mCachedHasAnyEnabledClientAttrib(false),
7730 mCachedNonInstancedVertexElementLimit(0),
7731 mCachedInstancedVertexElementLimit(0)
Jamie Madilldc358af2018-07-31 11:22:13 -04007732{
7733}
7734
7735StateCache::~StateCache() = default;
7736
7737void StateCache::updateActiveAttribsMask(Context *context)
7738{
7739 bool isGLES1 = context->isGLES1();
7740 const State &glState = context->getGLState();
7741
7742 if (!isGLES1 && !glState.getProgram())
7743 {
7744 mCachedActiveBufferedAttribsMask = AttributesMask();
7745 mCachedActiveClientAttribsMask = AttributesMask();
7746 return;
7747 }
7748
7749 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
7750 : glState.getProgram()->getActiveAttribLocationsMask();
7751
7752 const VertexArray *vao = glState.getVertexArray();
7753 ASSERT(vao);
7754
7755 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
7756 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
7757
7758 activeAttribs &= enabledAttribs;
7759
7760 mCachedActiveClientAttribsMask = activeAttribs & clientAttribs;
7761 mCachedActiveBufferedAttribsMask = activeAttribs & ~clientAttribs;
7762 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
7763}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007764
7765void StateCache::updateVertexElementLimits(Context *context)
7766{
7767 const VertexArray *vao = context->getGLState().getVertexArray();
7768
7769 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
7770 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
7771
7772 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
7773 // If there are no buffered attributes then we should not limit the draw call count.
7774 if (!vao || !mCachedActiveBufferedAttribsMask.any())
7775 {
7776 return;
7777 }
7778
7779 const auto &vertexAttribs = vao->getVertexAttributes();
7780 const auto &vertexBindings = vao->getVertexBindings();
7781
7782 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
7783 {
7784 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
7785 ASSERT(attrib.enabled);
7786
7787 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
7788 ASSERT(context->isGLES1() ||
7789 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
7790
7791 GLint64 limit = attrib.getCachedElementLimit();
7792 if (binding.getDivisor() > 0)
7793 {
7794 mCachedInstancedVertexElementLimit =
7795 std::min(mCachedInstancedVertexElementLimit, limit);
7796 }
7797 else
7798 {
7799 mCachedNonInstancedVertexElementLimit =
7800 std::min(mCachedNonInstancedVertexElementLimit, limit);
7801 }
7802 }
7803}
Jamie Madillc43cdad2018-08-08 15:49:25 -04007804
7805void StateCache::onVertexArrayBindingChange(Context *context)
7806{
7807 updateActiveAttribsMask(context);
7808 updateVertexElementLimits(context);
7809}
7810
7811void StateCache::onProgramExecutableChange(Context *context)
7812{
7813 updateActiveAttribsMask(context);
7814 updateVertexElementLimits(context);
7815}
7816
7817void StateCache::onVertexArraySizeChange(Context *context)
7818{
7819 updateVertexElementLimits(context);
7820}
7821
7822void StateCache::onVertexArrayStateChange(Context *context)
7823{
7824 updateActiveAttribsMask(context);
7825 updateVertexElementLimits(context);
7826}
7827
7828void StateCache::onGLES1ClientStateChange(Context *context)
7829{
7830 updateActiveAttribsMask(context);
7831}
Jamie Madillc29968b2016-01-20 11:17:23 -05007832} // namespace gl