blob: 4cb2d41b1c8c349ca7a2d1a6249650dfafba3045 [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 {
414 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500415 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800416 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800417
Jiajia Qin6eafb042016-12-27 17:04:07 +0800418 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
419 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800420 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800421 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800422
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800423 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
424 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400425 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800426 }
Geoff Lang3b573612016-10-31 14:08:10 -0400427 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000428
Geoff Langb0f917f2017-12-05 13:41:54 -0500429 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400430 {
431 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500432 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800433 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400434 }
435
Geoff Langb0f917f2017-12-05 13:41:54 -0500436 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400437 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500438 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800439 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400440 }
441
Jamie Madill4928b7c2017-06-20 12:57:39 -0400442 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500443
Jamie Madill57a89722013-07-02 11:57:03 -0400444 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000445
Geoff Langeb66a6e2016-10-31 13:06:12 -0400446 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400447 {
448 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
449 // In the initial state, a default transform feedback object is bound and treated as
450 // a transform feedback object with a name of zero. That object is bound any time
451 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400452 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400453 }
Geoff Langc8058452014-02-03 12:04:11 -0500454
Corentin Wallez336129f2017-10-17 15:55:40 -0400455 for (auto type : angle::AllEnums<BufferBinding>())
456 {
457 bindBuffer(type, 0);
458 }
459
460 bindRenderbuffer(GL_RENDERBUFFER, 0);
461
462 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
463 {
464 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
465 }
466
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700467 // Initialize GLES1 renderer if appropriate.
468 if (getClientVersion() < Version(2, 0))
469 {
470 mGLES1Renderer.reset(new GLES1Renderer());
471 }
472
Jamie Madillad9f24e2016-02-12 09:27:24 -0500473 // Initialize dirty bit masks
Geoff Lang9bf86f02018-07-26 11:46:34 -0400474 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
475 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
476 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400477 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400478
479 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
480 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
481 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
482
Jamie Madillc67323a2017-11-02 23:11:41 -0400483 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500484 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500485 // No dirty objects.
486
487 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400488 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500489 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400490 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500491 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
492
493 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
494 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
495 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
496 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
497 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
498 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
499 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
500 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
501 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
502 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
503 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400504 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500505 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
506
507 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
508 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700509 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400510 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
511 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500512 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
513 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400514
Xinghua Cao10a4d432017-11-28 14:46:26 +0800515 // TODO(xinghua.cao@intel.com): add other dirty bits and dirty objects.
516 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
517 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
518 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
519 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
520 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800521 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800522 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400523 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800524
Jamie Madillb4927eb2018-07-16 11:39:46 -0400525 mImplementation->setErrorSet(&mErrors);
526
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400527 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000528}
529
Jamie Madill4928b7c2017-06-20 12:57:39 -0400530egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000531{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700532 if (mGLES1Renderer)
533 {
534 mGLES1Renderer->onDestroy(this, &mGLState);
535 }
536
Jamie Madille7b3fe22018-04-05 09:42:46 -0400537 // Delete the Surface first to trigger a finish() in Vulkan.
Jamie Madille7b3fe22018-04-05 09:42:46 -0400538 ANGLE_TRY(releaseSurface(display));
539
Corentin Wallez80b24112015-08-25 16:41:57 -0400540 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000541 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400542 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000543 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400544 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000545
Corentin Wallez80b24112015-08-25 16:41:57 -0400546 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000547 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400548 if (query.second != nullptr)
549 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400550 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400551 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000552 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400553 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000554
Corentin Wallez80b24112015-08-25 16:41:57 -0400555 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400556 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400557 if (vertexArray.second)
558 {
559 vertexArray.second->onDestroy(this);
560 }
Jamie Madill57a89722013-07-02 11:57:03 -0400561 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400562 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400563
Corentin Wallez80b24112015-08-25 16:41:57 -0400564 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500565 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500566 if (transformFeedback.second != nullptr)
567 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500568 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500569 }
Geoff Langc8058452014-02-03 12:04:11 -0500570 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400571 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500572
Jamie Madill5b772312018-03-08 20:28:32 -0500573 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400574 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800575 if (zeroTexture.get() != nullptr)
576 {
577 ANGLE_TRY(zeroTexture->onDestroy(this));
578 zeroTexture.set(this, nullptr);
579 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400580 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000581
Jamie Madill2f348d22017-06-05 10:50:59 -0400582 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500583
Jamie Madill4928b7c2017-06-20 12:57:39 -0400584 mGLState.reset(this);
585
Jamie Madill6c1f6712017-02-14 19:08:04 -0500586 mState.mBuffers->release(this);
587 mState.mShaderPrograms->release(this);
588 mState.mTextures->release(this);
589 mState.mRenderbuffers->release(this);
590 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400591 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500592 mState.mPaths->release(this);
593 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800594 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400595
jchen107ae70d82018-07-06 13:47:01 +0800596 mThreadPool.reset();
597
Jamie Madill76e471e2017-10-21 09:56:01 -0400598 mImplementation->onDestroy(this);
599
Jamie Madill4928b7c2017-06-20 12:57:39 -0400600 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000601}
602
Jamie Madill70ee0f62017-02-06 16:04:20 -0500603Context::~Context()
604{
605}
606
Geoff Lang75359662018-04-11 01:42:27 -0400607void Context::setLabel(EGLLabelKHR label)
608{
609 mLabel = label;
610}
611
612EGLLabelKHR Context::getLabel() const
613{
614 return mLabel;
615}
616
Jamie Madill4928b7c2017-06-20 12:57:39 -0400617egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000618{
Jamie Madill61e16b42017-06-19 11:13:23 -0400619 mCurrentDisplay = display;
620
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000621 if (!mHasBeenCurrent)
622 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400623 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000624 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500625 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400626 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000627
Corentin Wallezc295e512017-01-27 17:47:50 -0500628 int width = 0;
629 int height = 0;
630 if (surface != nullptr)
631 {
632 width = surface->getWidth();
633 height = surface->getHeight();
634 }
635
636 mGLState.setViewportParams(0, 0, width, height);
637 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000638
639 mHasBeenCurrent = true;
640 }
641
Jamie Madill1b94d432015-08-07 13:23:23 -0400642 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700643 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400644 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400645
Jamie Madill4928b7c2017-06-20 12:57:39 -0400646 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500647
648 Framebuffer *newDefault = nullptr;
649 if (surface != nullptr)
650 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400651 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500652 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400653 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500654 }
655 else
656 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400657 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500658 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000659
Corentin Wallez37c39792015-08-20 14:19:46 -0400660 // Update default framebuffer, the binding of the previous default
661 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400662 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400663 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700664 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400665 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400666 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400667 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700668 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400669 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400670 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400671 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400672 }
Ian Ewell292f0052016-02-04 10:37:32 -0500673
674 // Notify the renderer of a context switch
Luc Ferron5396f2a2018-07-12 08:24:23 -0400675 ANGLE_TRY(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400676 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000677}
678
Jamie Madill4928b7c2017-06-20 12:57:39 -0400679egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400680{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400681 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400682
Geoff Langbf7b95d2018-05-01 16:48:21 -0400683 // Remove the default framebuffer
684 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500685 {
686 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400687 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500688 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400689
690 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500691 {
692 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400693 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500694 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400695
696 if (defaultFramebuffer)
697 {
698 defaultFramebuffer->onDestroy(this);
699 delete defaultFramebuffer;
700 }
701
Corentin Wallezc295e512017-01-27 17:47:50 -0500702 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
703
704 if (mCurrentSurface)
705 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400706 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500707 mCurrentSurface = nullptr;
708 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400709
710 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400711}
712
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000713GLuint Context::createBuffer()
714{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500715 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000716}
717
718GLuint Context::createProgram()
719{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500720 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000721}
722
Jiawei Shao385b3e02018-03-21 09:43:28 +0800723GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000724{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500725 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000726}
727
728GLuint Context::createTexture()
729{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500730 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000731}
732
733GLuint Context::createRenderbuffer()
734{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500735 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000736}
737
Brandon Jones59770802018-04-02 13:18:42 -0700738GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300739{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500740 auto resultOrError = mState.mPaths->createPaths(mImplementation.get(), range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300741 if (resultOrError.isError())
742 {
743 handleError(resultOrError.getError());
744 return 0;
745 }
746 return resultOrError.getResult();
747}
748
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000749// Returns an unused framebuffer name
750GLuint Context::createFramebuffer()
751{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500752 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000753}
754
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500755void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000756{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500757 for (int i = 0; i < n; i++)
758 {
759 GLuint handle = mFenceNVHandleAllocator.allocate();
760 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
761 fences[i] = handle;
762 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000763}
764
Yunchao Hea336b902017-08-02 16:05:21 +0800765GLuint Context::createProgramPipeline()
766{
767 return mState.mPipelines->createProgramPipeline();
768}
769
Jiawei Shao385b3e02018-03-21 09:43:28 +0800770GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800771{
772 UNIMPLEMENTED();
773 return 0u;
774}
775
James Darpinian4d9d4832018-03-13 12:43:28 -0700776void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000777{
James Darpinian4d9d4832018-03-13 12:43:28 -0700778 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
779 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000780 {
781 detachBuffer(buffer);
782 }
Jamie Madill893ab082014-05-16 16:56:10 -0400783
James Darpinian4d9d4832018-03-13 12:43:28 -0700784 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000785}
786
787void Context::deleteShader(GLuint shader)
788{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500789 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000790}
791
792void Context::deleteProgram(GLuint program)
793{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500794 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000795}
796
797void Context::deleteTexture(GLuint texture)
798{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500799 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000800 {
801 detachTexture(texture);
802 }
803
Jamie Madill6c1f6712017-02-14 19:08:04 -0500804 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000805}
806
807void Context::deleteRenderbuffer(GLuint renderbuffer)
808{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500809 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000810 {
811 detachRenderbuffer(renderbuffer);
812 }
Jamie Madill893ab082014-05-16 16:56:10 -0400813
Jamie Madill6c1f6712017-02-14 19:08:04 -0500814 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000815}
816
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400817void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400818{
819 // The spec specifies the underlying Fence object is not deleted until all current
820 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
821 // and since our API is currently designed for being called from a single thread, we can delete
822 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400823 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400824}
825
Yunchao Hea336b902017-08-02 16:05:21 +0800826void Context::deleteProgramPipeline(GLuint pipeline)
827{
828 if (mState.mPipelines->getProgramPipeline(pipeline))
829 {
830 detachProgramPipeline(pipeline);
831 }
832
833 mState.mPipelines->deleteObject(this, pipeline);
834}
835
Sami Väisänene45e53b2016-05-25 10:36:04 +0300836void Context::deletePaths(GLuint first, GLsizei range)
837{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500838 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300839}
840
Brandon Jones59770802018-04-02 13:18:42 -0700841bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300842{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500843 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300844 if (pathObj == nullptr)
845 return false;
846
847 return pathObj->hasPathData();
848}
849
Brandon Jones59770802018-04-02 13:18:42 -0700850bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300851{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500852 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300853}
854
Brandon Jones59770802018-04-02 13:18:42 -0700855void Context::pathCommands(GLuint path,
856 GLsizei numCommands,
857 const GLubyte *commands,
858 GLsizei numCoords,
859 GLenum coordType,
860 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300861{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500862 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300863
864 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
865}
866
Jamie Madill007530e2017-12-28 14:27:04 -0500867void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300868{
Jamie Madill007530e2017-12-28 14:27:04 -0500869 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300870
871 switch (pname)
872 {
873 case GL_PATH_STROKE_WIDTH_CHROMIUM:
874 pathObj->setStrokeWidth(value);
875 break;
876 case GL_PATH_END_CAPS_CHROMIUM:
877 pathObj->setEndCaps(static_cast<GLenum>(value));
878 break;
879 case GL_PATH_JOIN_STYLE_CHROMIUM:
880 pathObj->setJoinStyle(static_cast<GLenum>(value));
881 break;
882 case GL_PATH_MITER_LIMIT_CHROMIUM:
883 pathObj->setMiterLimit(value);
884 break;
885 case GL_PATH_STROKE_BOUND_CHROMIUM:
886 pathObj->setStrokeBound(value);
887 break;
888 default:
889 UNREACHABLE();
890 break;
891 }
892}
893
Jamie Madill007530e2017-12-28 14:27:04 -0500894void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300895{
Jamie Madill007530e2017-12-28 14:27:04 -0500896 // TODO(jmadill): Should use proper clamping/casting.
897 pathParameterf(path, pname, static_cast<GLfloat>(value));
898}
899
900void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
901{
902 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300903
904 switch (pname)
905 {
906 case GL_PATH_STROKE_WIDTH_CHROMIUM:
907 *value = pathObj->getStrokeWidth();
908 break;
909 case GL_PATH_END_CAPS_CHROMIUM:
910 *value = static_cast<GLfloat>(pathObj->getEndCaps());
911 break;
912 case GL_PATH_JOIN_STYLE_CHROMIUM:
913 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
914 break;
915 case GL_PATH_MITER_LIMIT_CHROMIUM:
916 *value = pathObj->getMiterLimit();
917 break;
918 case GL_PATH_STROKE_BOUND_CHROMIUM:
919 *value = pathObj->getStrokeBound();
920 break;
921 default:
922 UNREACHABLE();
923 break;
924 }
925}
926
Jamie Madill007530e2017-12-28 14:27:04 -0500927void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
928{
929 GLfloat val = 0.0f;
930 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
931 if (value)
932 *value = static_cast<GLint>(val);
933}
934
Brandon Jones59770802018-04-02 13:18:42 -0700935void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300936{
937 mGLState.setPathStencilFunc(func, ref, mask);
938}
939
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000940void Context::deleteFramebuffer(GLuint framebuffer)
941{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500942 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000943 {
944 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000945 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500946
Jamie Madill6c1f6712017-02-14 19:08:04 -0500947 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000948}
949
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500950void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000951{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500952 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000953 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500954 GLuint fence = fences[i];
955
956 FenceNV *fenceObject = nullptr;
957 if (mFenceNVMap.erase(fence, &fenceObject))
958 {
959 mFenceNVHandleAllocator.release(fence);
960 delete fenceObject;
961 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000962 }
963}
964
Geoff Lang70d0f492015-12-10 17:45:46 -0500965Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000966{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500967 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000968}
969
Jamie Madill570f7c82014-07-03 10:38:54 -0400970Texture *Context::getTexture(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000971{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500972 return mState.mTextures->getTexture(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000973}
974
Geoff Lang70d0f492015-12-10 17:45:46 -0500975Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000976{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500977 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000978}
979
Jamie Madill70b5bb02017-08-28 13:32:37 -0400980Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400981{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400982 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400983}
984
Jamie Madill57a89722013-07-02 11:57:03 -0400985VertexArray *Context::getVertexArray(GLuint handle) const
986{
Jamie Madill96a483b2017-06-27 16:49:21 -0400987 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400988}
989
Jamie Madilldc356042013-07-19 16:36:57 -0400990Sampler *Context::getSampler(GLuint handle) const
991{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500992 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -0400993}
994
Geoff Langc8058452014-02-03 12:04:11 -0500995TransformFeedback *Context::getTransformFeedback(GLuint handle) const
996{
Jamie Madill96a483b2017-06-27 16:49:21 -0400997 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -0500998}
999
Yunchao Hea336b902017-08-02 16:05:21 +08001000ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
1001{
1002 return mState.mPipelines->getProgramPipeline(handle);
1003}
1004
Geoff Lang75359662018-04-11 01:42:27 -04001005gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001006{
1007 switch (identifier)
1008 {
1009 case GL_BUFFER:
1010 return getBuffer(name);
1011 case GL_SHADER:
1012 return getShader(name);
1013 case GL_PROGRAM:
1014 return getProgram(name);
1015 case GL_VERTEX_ARRAY:
1016 return getVertexArray(name);
1017 case GL_QUERY:
1018 return getQuery(name);
1019 case GL_TRANSFORM_FEEDBACK:
1020 return getTransformFeedback(name);
1021 case GL_SAMPLER:
1022 return getSampler(name);
1023 case GL_TEXTURE:
1024 return getTexture(name);
1025 case GL_RENDERBUFFER:
1026 return getRenderbuffer(name);
1027 case GL_FRAMEBUFFER:
1028 return getFramebuffer(name);
1029 default:
1030 UNREACHABLE();
1031 return nullptr;
1032 }
1033}
1034
Geoff Lang75359662018-04-11 01:42:27 -04001035gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001036{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001037 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001038}
1039
Martin Radev9d901792016-07-15 15:58:58 +03001040void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1041{
Geoff Lang75359662018-04-11 01:42:27 -04001042 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001043 ASSERT(object != nullptr);
1044
1045 std::string labelName = GetObjectLabelFromPointer(length, label);
1046 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001047
1048 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1049 // specified object is active until we do this.
1050 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001051}
1052
1053void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1054{
Geoff Lang75359662018-04-11 01:42:27 -04001055 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001056 ASSERT(object != nullptr);
1057
1058 std::string labelName = GetObjectLabelFromPointer(length, label);
1059 object->setLabel(labelName);
1060}
1061
1062void Context::getObjectLabel(GLenum identifier,
1063 GLuint name,
1064 GLsizei bufSize,
1065 GLsizei *length,
1066 GLchar *label) const
1067{
Geoff Lang75359662018-04-11 01:42:27 -04001068 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001069 ASSERT(object != nullptr);
1070
1071 const std::string &objectLabel = object->getLabel();
1072 GetObjectLabelBase(objectLabel, bufSize, length, label);
1073}
1074
1075void Context::getObjectPtrLabel(const void *ptr,
1076 GLsizei bufSize,
1077 GLsizei *length,
1078 GLchar *label) const
1079{
Geoff Lang75359662018-04-11 01:42:27 -04001080 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001081 ASSERT(object != nullptr);
1082
1083 const std::string &objectLabel = object->getLabel();
1084 GetObjectLabelBase(objectLabel, bufSize, length, label);
1085}
1086
Jamie Madilldc356042013-07-19 16:36:57 -04001087bool Context::isSampler(GLuint samplerName) const
1088{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001089 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001090}
1091
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001092void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001093{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001094 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001095
Jamie Madilldedd7b92014-11-05 16:30:36 -05001096 if (handle == 0)
1097 {
1098 texture = mZeroTextures[target].get();
1099 }
1100 else
1101 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001102 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001103 }
1104
1105 ASSERT(texture);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001106 mGLState.setSamplerTexture(this, target, texture);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001107}
1108
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001109void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001110{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001111 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1112 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001113 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001114 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001115}
1116
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001117void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001118{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001119 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1120 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001121 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001122 mDrawFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001123}
1124
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001125void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001126{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001127 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001128 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001129 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001130 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001131}
1132
Shao80957d92017-02-20 21:25:59 +08001133void Context::bindVertexBuffer(GLuint bindingIndex,
1134 GLuint bufferHandle,
1135 GLintptr offset,
1136 GLsizei stride)
1137{
1138 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001139 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001140 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001141}
1142
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001143void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001144{
Geoff Lang76b10c92014-09-05 16:28:14 -04001145 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001146 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001147 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001148 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001149}
1150
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001151void Context::bindImageTexture(GLuint unit,
1152 GLuint texture,
1153 GLint level,
1154 GLboolean layered,
1155 GLint layer,
1156 GLenum access,
1157 GLenum format)
1158{
1159 Texture *tex = mState.mTextures->getTexture(texture);
1160 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1161}
1162
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001163void Context::useProgram(GLuint program)
1164{
Jamie Madill6c1f6712017-02-14 19:08:04 -05001165 mGLState.setProgram(this, getProgram(program));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001166 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001167}
1168
Jiajia Qin5451d532017-11-16 17:16:34 +08001169void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1170{
1171 UNIMPLEMENTED();
1172}
1173
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001174void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001175{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001176 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001177 TransformFeedback *transformFeedback =
1178 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001179 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -05001180}
1181
Yunchao Hea336b902017-08-02 16:05:21 +08001182void Context::bindProgramPipeline(GLuint pipelineHandle)
1183{
1184 ProgramPipeline *pipeline =
1185 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1186 mGLState.setProgramPipelineBinding(this, pipeline);
1187}
1188
Corentin Wallezad3ae902018-03-09 13:40:42 -05001189void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001190{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001191 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001192 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001193
Geoff Lang5aad9672014-09-08 11:10:42 -04001194 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001195 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001196
1197 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001198 mGLState.setActiveQuery(this, target, queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001199}
1200
Corentin Wallezad3ae902018-03-09 13:40:42 -05001201void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001202{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001203 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001204 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001205
Jamie Madill5188a272018-07-25 10:53:56 -04001206 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001207
Geoff Lang5aad9672014-09-08 11:10:42 -04001208 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001209 mGLState.setActiveQuery(this, target, nullptr);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001210}
1211
Corentin Wallezad3ae902018-03-09 13:40:42 -05001212void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001213{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001214 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001215
1216 Query *queryObject = getQuery(id, true, target);
1217 ASSERT(queryObject);
1218
Jamie Madill5188a272018-07-25 10:53:56 -04001219 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001220}
1221
Corentin Wallezad3ae902018-03-09 13:40:42 -05001222void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001223{
1224 switch (pname)
1225 {
1226 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001227 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001228 break;
1229 case GL_QUERY_COUNTER_BITS_EXT:
1230 switch (target)
1231 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001232 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001233 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1234 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001235 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001236 params[0] = getExtensions().queryCounterBitsTimestamp;
1237 break;
1238 default:
1239 UNREACHABLE();
1240 params[0] = 0;
1241 break;
1242 }
1243 break;
1244 default:
1245 UNREACHABLE();
1246 return;
1247 }
1248}
1249
Corentin Wallezad3ae902018-03-09 13:40:42 -05001250void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001251 GLenum pname,
1252 GLsizei bufSize,
1253 GLsizei *length,
1254 GLint *params)
1255{
1256 getQueryiv(target, pname, params);
1257}
1258
Geoff Lang2186c382016-10-14 10:54:54 -04001259void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001260{
Jamie Madill5188a272018-07-25 10:53:56 -04001261 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001262}
1263
Brandon Jones59770802018-04-02 13:18:42 -07001264void Context::getQueryObjectivRobust(GLuint id,
1265 GLenum pname,
1266 GLsizei bufSize,
1267 GLsizei *length,
1268 GLint *params)
1269{
1270 getQueryObjectiv(id, pname, params);
1271}
1272
Geoff Lang2186c382016-10-14 10:54:54 -04001273void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001274{
Jamie Madill5188a272018-07-25 10:53:56 -04001275 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001276}
1277
Brandon Jones59770802018-04-02 13:18:42 -07001278void Context::getQueryObjectuivRobust(GLuint id,
1279 GLenum pname,
1280 GLsizei bufSize,
1281 GLsizei *length,
1282 GLuint *params)
1283{
1284 getQueryObjectuiv(id, pname, params);
1285}
1286
Geoff Lang2186c382016-10-14 10:54:54 -04001287void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001288{
Jamie Madill5188a272018-07-25 10:53:56 -04001289 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001290}
1291
Brandon Jones59770802018-04-02 13:18:42 -07001292void Context::getQueryObjecti64vRobust(GLuint id,
1293 GLenum pname,
1294 GLsizei bufSize,
1295 GLsizei *length,
1296 GLint64 *params)
1297{
1298 getQueryObjecti64v(id, pname, params);
1299}
1300
Geoff Lang2186c382016-10-14 10:54:54 -04001301void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001302{
Jamie Madill5188a272018-07-25 10:53:56 -04001303 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001304}
1305
Brandon Jones59770802018-04-02 13:18:42 -07001306void Context::getQueryObjectui64vRobust(GLuint id,
1307 GLenum pname,
1308 GLsizei bufSize,
1309 GLsizei *length,
1310 GLuint64 *params)
1311{
1312 getQueryObjectui64v(id, pname, params);
1313}
1314
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001315Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001316{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001317 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001318}
1319
Jamie Madill2f348d22017-06-05 10:50:59 -04001320FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001321{
Jamie Madill96a483b2017-06-27 16:49:21 -04001322 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001323}
1324
Corentin Wallezad3ae902018-03-09 13:40:42 -05001325Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001326{
Jamie Madill96a483b2017-06-27 16:49:21 -04001327 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001328 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001329 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001330 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001331
1332 Query *query = mQueryMap.query(handle);
1333 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001334 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001335 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001336 query = new Query(mImplementation->createQuery(type), handle);
1337 query->addRef();
1338 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001339 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001340 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001341}
1342
Geoff Lang70d0f492015-12-10 17:45:46 -05001343Query *Context::getQuery(GLuint handle) const
1344{
Jamie Madill96a483b2017-06-27 16:49:21 -04001345 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001346}
1347
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001348Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001349{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001350 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1351 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001352}
1353
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001354Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001355{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001356 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001357}
1358
Geoff Lang492a7e42014-11-05 13:27:06 -05001359Compiler *Context::getCompiler() const
1360{
Jamie Madill2f348d22017-06-05 10:50:59 -04001361 if (mCompiler.get() == nullptr)
1362 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001363 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001364 }
1365 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001366}
1367
Jamie Madillc1d770e2017-04-13 17:31:24 -04001368void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001369{
1370 switch (pname)
1371 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001372 case GL_SHADER_COMPILER:
1373 *params = GL_TRUE;
1374 break;
1375 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1376 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1377 break;
1378 default:
1379 mGLState.getBooleanv(pname, params);
1380 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001381 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001382}
1383
Jamie Madillc1d770e2017-04-13 17:31:24 -04001384void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001385{
Shannon Woods53a94a82014-06-24 15:20:36 -04001386 // Queries about context capabilities and maximums are answered by Context.
1387 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001388 switch (pname)
1389 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001390 case GL_ALIASED_LINE_WIDTH_RANGE:
1391 params[0] = mCaps.minAliasedLineWidth;
1392 params[1] = mCaps.maxAliasedLineWidth;
1393 break;
1394 case GL_ALIASED_POINT_SIZE_RANGE:
1395 params[0] = mCaps.minAliasedPointSize;
1396 params[1] = mCaps.maxAliasedPointSize;
1397 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001398 case GL_SMOOTH_POINT_SIZE_RANGE:
1399 params[0] = mCaps.minSmoothPointSize;
1400 params[1] = mCaps.maxSmoothPointSize;
1401 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001402 case GL_SMOOTH_LINE_WIDTH_RANGE:
1403 params[0] = mCaps.minSmoothLineWidth;
1404 params[1] = mCaps.maxSmoothLineWidth;
1405 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001406 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1407 ASSERT(mExtensions.textureFilterAnisotropic);
1408 *params = mExtensions.maxTextureAnisotropy;
1409 break;
1410 case GL_MAX_TEXTURE_LOD_BIAS:
1411 *params = mCaps.maxLODBias;
1412 break;
1413
1414 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1415 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1416 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001417 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1418 // GLES1 constants for modelview/projection matrix.
1419 if (getClientVersion() < Version(2, 0))
1420 {
1421 mGLState.getFloatv(pname, params);
1422 }
1423 else
1424 {
1425 ASSERT(mExtensions.pathRendering);
1426 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1427 memcpy(params, m, 16 * sizeof(GLfloat));
1428 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001429 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001430 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001431
Jamie Madill231c7f52017-04-26 13:45:37 -04001432 default:
1433 mGLState.getFloatv(pname, params);
1434 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001435 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001436}
1437
Jamie Madillc1d770e2017-04-13 17:31:24 -04001438void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001439{
Shannon Woods53a94a82014-06-24 15:20:36 -04001440 // Queries about context capabilities and maximums are answered by Context.
1441 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001442
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001443 switch (pname)
1444 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001445 case GL_MAX_VERTEX_ATTRIBS:
1446 *params = mCaps.maxVertexAttributes;
1447 break;
1448 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1449 *params = mCaps.maxVertexUniformVectors;
1450 break;
1451 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001452 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001453 break;
1454 case GL_MAX_VARYING_VECTORS:
1455 *params = mCaps.maxVaryingVectors;
1456 break;
1457 case GL_MAX_VARYING_COMPONENTS:
1458 *params = mCaps.maxVertexOutputComponents;
1459 break;
1460 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1461 *params = mCaps.maxCombinedTextureImageUnits;
1462 break;
1463 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001464 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001465 break;
1466 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001467 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001468 break;
1469 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1470 *params = mCaps.maxFragmentUniformVectors;
1471 break;
1472 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001473 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001474 break;
1475 case GL_MAX_RENDERBUFFER_SIZE:
1476 *params = mCaps.maxRenderbufferSize;
1477 break;
1478 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1479 *params = mCaps.maxColorAttachments;
1480 break;
1481 case GL_MAX_DRAW_BUFFERS_EXT:
1482 *params = mCaps.maxDrawBuffers;
1483 break;
1484 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1485 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1486 case GL_SUBPIXEL_BITS:
1487 *params = 4;
1488 break;
1489 case GL_MAX_TEXTURE_SIZE:
1490 *params = mCaps.max2DTextureSize;
1491 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001492 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1493 *params = mCaps.maxRectangleTextureSize;
1494 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001495 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1496 *params = mCaps.maxCubeMapTextureSize;
1497 break;
1498 case GL_MAX_3D_TEXTURE_SIZE:
1499 *params = mCaps.max3DTextureSize;
1500 break;
1501 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1502 *params = mCaps.maxArrayTextureLayers;
1503 break;
1504 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1505 *params = mCaps.uniformBufferOffsetAlignment;
1506 break;
1507 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1508 *params = mCaps.maxUniformBufferBindings;
1509 break;
1510 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001511 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001512 break;
1513 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001514 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001515 break;
1516 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1517 *params = mCaps.maxCombinedTextureImageUnits;
1518 break;
1519 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1520 *params = mCaps.maxVertexOutputComponents;
1521 break;
1522 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1523 *params = mCaps.maxFragmentInputComponents;
1524 break;
1525 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1526 *params = mCaps.minProgramTexelOffset;
1527 break;
1528 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1529 *params = mCaps.maxProgramTexelOffset;
1530 break;
1531 case GL_MAJOR_VERSION:
1532 *params = getClientVersion().major;
1533 break;
1534 case GL_MINOR_VERSION:
1535 *params = getClientVersion().minor;
1536 break;
1537 case GL_MAX_ELEMENTS_INDICES:
1538 *params = mCaps.maxElementsIndices;
1539 break;
1540 case GL_MAX_ELEMENTS_VERTICES:
1541 *params = mCaps.maxElementsVertices;
1542 break;
1543 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1544 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1545 break;
1546 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1547 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1548 break;
1549 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1550 *params = mCaps.maxTransformFeedbackSeparateComponents;
1551 break;
1552 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1553 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1554 break;
1555 case GL_MAX_SAMPLES_ANGLE:
1556 *params = mCaps.maxSamples;
1557 break;
1558 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001559 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001560 params[0] = mCaps.maxViewportWidth;
1561 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001562 }
1563 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001564 case GL_COMPRESSED_TEXTURE_FORMATS:
1565 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1566 params);
1567 break;
1568 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1569 *params = mResetStrategy;
1570 break;
1571 case GL_NUM_SHADER_BINARY_FORMATS:
1572 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1573 break;
1574 case GL_SHADER_BINARY_FORMATS:
1575 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1576 break;
1577 case GL_NUM_PROGRAM_BINARY_FORMATS:
1578 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1579 break;
1580 case GL_PROGRAM_BINARY_FORMATS:
1581 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1582 break;
1583 case GL_NUM_EXTENSIONS:
1584 *params = static_cast<GLint>(mExtensionStrings.size());
1585 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001586
Jamie Madill231c7f52017-04-26 13:45:37 -04001587 // GL_KHR_debug
1588 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1589 *params = mExtensions.maxDebugMessageLength;
1590 break;
1591 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1592 *params = mExtensions.maxDebugLoggedMessages;
1593 break;
1594 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1595 *params = mExtensions.maxDebugGroupStackDepth;
1596 break;
1597 case GL_MAX_LABEL_LENGTH:
1598 *params = mExtensions.maxLabelLength;
1599 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001600
Martin Radeve5285d22017-07-14 16:23:53 +03001601 // GL_ANGLE_multiview
1602 case GL_MAX_VIEWS_ANGLE:
1603 *params = mExtensions.maxViews;
1604 break;
1605
Jamie Madill231c7f52017-04-26 13:45:37 -04001606 // GL_EXT_disjoint_timer_query
1607 case GL_GPU_DISJOINT_EXT:
1608 *params = mImplementation->getGPUDisjoint();
1609 break;
1610 case GL_MAX_FRAMEBUFFER_WIDTH:
1611 *params = mCaps.maxFramebufferWidth;
1612 break;
1613 case GL_MAX_FRAMEBUFFER_HEIGHT:
1614 *params = mCaps.maxFramebufferHeight;
1615 break;
1616 case GL_MAX_FRAMEBUFFER_SAMPLES:
1617 *params = mCaps.maxFramebufferSamples;
1618 break;
1619 case GL_MAX_SAMPLE_MASK_WORDS:
1620 *params = mCaps.maxSampleMaskWords;
1621 break;
1622 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1623 *params = mCaps.maxColorTextureSamples;
1624 break;
1625 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1626 *params = mCaps.maxDepthTextureSamples;
1627 break;
1628 case GL_MAX_INTEGER_SAMPLES:
1629 *params = mCaps.maxIntegerSamples;
1630 break;
1631 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1632 *params = mCaps.maxVertexAttribRelativeOffset;
1633 break;
1634 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1635 *params = mCaps.maxVertexAttribBindings;
1636 break;
1637 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1638 *params = mCaps.maxVertexAttribStride;
1639 break;
1640 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001641 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001642 break;
1643 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001644 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001645 break;
1646 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001647 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001648 break;
1649 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001650 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001651 break;
1652 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001653 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001654 break;
1655 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001656 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001657 break;
1658 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001659 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001660 break;
1661 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001662 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001663 break;
1664 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1665 *params = mCaps.minProgramTextureGatherOffset;
1666 break;
1667 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1668 *params = mCaps.maxProgramTextureGatherOffset;
1669 break;
1670 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1671 *params = mCaps.maxComputeWorkGroupInvocations;
1672 break;
1673 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001674 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001675 break;
1676 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001677 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001678 break;
1679 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1680 *params = mCaps.maxComputeSharedMemorySize;
1681 break;
1682 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001683 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001684 break;
1685 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001686 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001687 break;
1688 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001689 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001690 break;
1691 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001692 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001693 break;
1694 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001695 *params =
1696 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001697 break;
1698 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001699 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001700 break;
1701 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1702 *params = mCaps.maxCombinedShaderOutputResources;
1703 break;
1704 case GL_MAX_UNIFORM_LOCATIONS:
1705 *params = mCaps.maxUniformLocations;
1706 break;
1707 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1708 *params = mCaps.maxAtomicCounterBufferBindings;
1709 break;
1710 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1711 *params = mCaps.maxAtomicCounterBufferSize;
1712 break;
1713 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1714 *params = mCaps.maxCombinedAtomicCounterBuffers;
1715 break;
1716 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1717 *params = mCaps.maxCombinedAtomicCounters;
1718 break;
1719 case GL_MAX_IMAGE_UNITS:
1720 *params = mCaps.maxImageUnits;
1721 break;
1722 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1723 *params = mCaps.maxCombinedImageUniforms;
1724 break;
1725 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1726 *params = mCaps.maxShaderStorageBufferBindings;
1727 break;
1728 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1729 *params = mCaps.maxCombinedShaderStorageBlocks;
1730 break;
1731 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1732 *params = mCaps.shaderStorageBufferOffsetAlignment;
1733 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001734
1735 // GL_EXT_geometry_shader
1736 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1737 *params = mCaps.maxFramebufferLayers;
1738 break;
1739 case GL_LAYER_PROVOKING_VERTEX_EXT:
1740 *params = mCaps.layerProvokingVertex;
1741 break;
1742 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001743 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001744 break;
1745 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001746 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001747 break;
1748 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001749 *params =
1750 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001751 break;
1752 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1753 *params = mCaps.maxGeometryInputComponents;
1754 break;
1755 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1756 *params = mCaps.maxGeometryOutputComponents;
1757 break;
1758 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1759 *params = mCaps.maxGeometryOutputVertices;
1760 break;
1761 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1762 *params = mCaps.maxGeometryTotalOutputComponents;
1763 break;
1764 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1765 *params = mCaps.maxGeometryShaderInvocations;
1766 break;
1767 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001768 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001769 break;
1770 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001771 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001772 break;
1773 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001774 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001775 break;
1776 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001777 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001778 break;
1779 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001780 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001781 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001782 // GLES1 emulation: Caps queries
1783 case GL_MAX_TEXTURE_UNITS:
1784 *params = mCaps.maxMultitextureUnits;
1785 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001786 case GL_MAX_MODELVIEW_STACK_DEPTH:
1787 *params = mCaps.maxModelviewMatrixStackDepth;
1788 break;
1789 case GL_MAX_PROJECTION_STACK_DEPTH:
1790 *params = mCaps.maxProjectionMatrixStackDepth;
1791 break;
1792 case GL_MAX_TEXTURE_STACK_DEPTH:
1793 *params = mCaps.maxTextureMatrixStackDepth;
1794 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001795 case GL_MAX_LIGHTS:
1796 *params = mCaps.maxLights;
1797 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001798 case GL_MAX_CLIP_PLANES:
1799 *params = mCaps.maxClipPlanes;
1800 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001801 // GLES1 emulation: Vertex attribute queries
1802 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1803 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1804 case GL_COLOR_ARRAY_BUFFER_BINDING:
1805 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1806 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1807 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1808 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1809 break;
1810 case GL_VERTEX_ARRAY_STRIDE:
1811 case GL_NORMAL_ARRAY_STRIDE:
1812 case GL_COLOR_ARRAY_STRIDE:
1813 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1814 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1815 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1816 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1817 break;
1818 case GL_VERTEX_ARRAY_SIZE:
1819 case GL_COLOR_ARRAY_SIZE:
1820 case GL_TEXTURE_COORD_ARRAY_SIZE:
1821 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1822 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1823 break;
1824 case GL_VERTEX_ARRAY_TYPE:
1825 case GL_COLOR_ARRAY_TYPE:
1826 case GL_NORMAL_ARRAY_TYPE:
1827 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1828 case GL_TEXTURE_COORD_ARRAY_TYPE:
1829 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1830 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1831 break;
1832
jchen1082af6202018-06-22 10:59:52 +08001833 // GL_KHR_parallel_shader_compile
1834 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1835 *params = mGLState.getMaxShaderCompilerThreads();
1836 break;
1837
Jamie Madill231c7f52017-04-26 13:45:37 -04001838 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001839 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001840 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001841 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001842}
1843
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001844void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001845{
Shannon Woods53a94a82014-06-24 15:20:36 -04001846 // Queries about context capabilities and maximums are answered by Context.
1847 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001848 switch (pname)
1849 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001850 case GL_MAX_ELEMENT_INDEX:
1851 *params = mCaps.maxElementIndex;
1852 break;
1853 case GL_MAX_UNIFORM_BLOCK_SIZE:
1854 *params = mCaps.maxUniformBlockSize;
1855 break;
1856 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001857 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001858 break;
1859 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001860 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001861 break;
1862 case GL_MAX_SERVER_WAIT_TIMEOUT:
1863 *params = mCaps.maxServerWaitTimeout;
1864 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001865
Jamie Madill231c7f52017-04-26 13:45:37 -04001866 // GL_EXT_disjoint_timer_query
1867 case GL_TIMESTAMP_EXT:
1868 *params = mImplementation->getTimestamp();
1869 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001870
Jamie Madill231c7f52017-04-26 13:45:37 -04001871 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1872 *params = mCaps.maxShaderStorageBlockSize;
1873 break;
1874 default:
1875 UNREACHABLE();
1876 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001877 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001878}
1879
Geoff Lang70d0f492015-12-10 17:45:46 -05001880void Context::getPointerv(GLenum pname, void **params) const
1881{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001882 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001883}
1884
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001885void Context::getPointervRobustANGLERobust(GLenum pname,
1886 GLsizei bufSize,
1887 GLsizei *length,
1888 void **params)
1889{
1890 UNIMPLEMENTED();
1891}
1892
Martin Radev66fb8202016-07-28 11:45:20 +03001893void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001894{
Shannon Woods53a94a82014-06-24 15:20:36 -04001895 // Queries about context capabilities and maximums are answered by Context.
1896 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001897
1898 GLenum nativeType;
1899 unsigned int numParams;
1900 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1901 ASSERT(queryStatus);
1902
1903 if (nativeType == GL_INT)
1904 {
1905 switch (target)
1906 {
1907 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1908 ASSERT(index < 3u);
1909 *data = mCaps.maxComputeWorkGroupCount[index];
1910 break;
1911 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1912 ASSERT(index < 3u);
1913 *data = mCaps.maxComputeWorkGroupSize[index];
1914 break;
1915 default:
1916 mGLState.getIntegeri_v(target, index, data);
1917 }
1918 }
1919 else
1920 {
1921 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1922 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001923}
1924
Brandon Jones59770802018-04-02 13:18:42 -07001925void Context::getIntegeri_vRobust(GLenum target,
1926 GLuint index,
1927 GLsizei bufSize,
1928 GLsizei *length,
1929 GLint *data)
1930{
1931 getIntegeri_v(target, index, data);
1932}
1933
Martin Radev66fb8202016-07-28 11:45:20 +03001934void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001935{
Shannon Woods53a94a82014-06-24 15:20:36 -04001936 // Queries about context capabilities and maximums are answered by Context.
1937 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001938
1939 GLenum nativeType;
1940 unsigned int numParams;
1941 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1942 ASSERT(queryStatus);
1943
1944 if (nativeType == GL_INT_64_ANGLEX)
1945 {
1946 mGLState.getInteger64i_v(target, index, data);
1947 }
1948 else
1949 {
1950 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1951 }
1952}
1953
Brandon Jones59770802018-04-02 13:18:42 -07001954void Context::getInteger64i_vRobust(GLenum target,
1955 GLuint index,
1956 GLsizei bufSize,
1957 GLsizei *length,
1958 GLint64 *data)
1959{
1960 getInteger64i_v(target, index, data);
1961}
1962
Martin Radev66fb8202016-07-28 11:45:20 +03001963void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1964{
1965 // Queries about context capabilities and maximums are answered by Context.
1966 // Queries about current GL state values are answered by State.
1967
1968 GLenum nativeType;
1969 unsigned int numParams;
1970 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1971 ASSERT(queryStatus);
1972
1973 if (nativeType == GL_BOOL)
1974 {
1975 mGLState.getBooleani_v(target, index, data);
1976 }
1977 else
1978 {
1979 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1980 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001981}
1982
Brandon Jones59770802018-04-02 13:18:42 -07001983void Context::getBooleani_vRobust(GLenum target,
1984 GLuint index,
1985 GLsizei bufSize,
1986 GLsizei *length,
1987 GLboolean *data)
1988{
1989 getBooleani_v(target, index, data);
1990}
1991
Corentin Wallez336129f2017-10-17 15:55:40 -04001992void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001993{
1994 Buffer *buffer = mGLState.getTargetBuffer(target);
1995 QueryBufferParameteriv(buffer, pname, params);
1996}
1997
Brandon Jones59770802018-04-02 13:18:42 -07001998void Context::getBufferParameterivRobust(BufferBinding target,
1999 GLenum pname,
2000 GLsizei bufSize,
2001 GLsizei *length,
2002 GLint *params)
2003{
2004 getBufferParameteriv(target, pname, params);
2005}
2006
He Yunchao010e4db2017-03-03 14:22:06 +08002007void Context::getFramebufferAttachmentParameteriv(GLenum target,
2008 GLenum attachment,
2009 GLenum pname,
2010 GLint *params)
2011{
2012 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002013 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002014}
2015
Brandon Jones59770802018-04-02 13:18:42 -07002016void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2017 GLenum attachment,
2018 GLenum pname,
2019 GLsizei bufSize,
2020 GLsizei *length,
2021 GLint *params)
2022{
2023 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2024}
2025
He Yunchao010e4db2017-03-03 14:22:06 +08002026void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2027{
2028 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2029 QueryRenderbufferiv(this, renderbuffer, pname, params);
2030}
2031
Brandon Jones59770802018-04-02 13:18:42 -07002032void Context::getRenderbufferParameterivRobust(GLenum target,
2033 GLenum pname,
2034 GLsizei bufSize,
2035 GLsizei *length,
2036 GLint *params)
2037{
2038 getRenderbufferParameteriv(target, pname, params);
2039}
2040
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002041void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002042{
2043 Texture *texture = getTargetTexture(target);
2044 QueryTexParameterfv(texture, pname, params);
2045}
2046
Brandon Jones59770802018-04-02 13:18:42 -07002047void Context::getTexParameterfvRobust(TextureType target,
2048 GLenum pname,
2049 GLsizei bufSize,
2050 GLsizei *length,
2051 GLfloat *params)
2052{
2053 getTexParameterfv(target, pname, params);
2054}
2055
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002056void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002057{
2058 Texture *texture = getTargetTexture(target);
2059 QueryTexParameteriv(texture, pname, params);
2060}
Jiajia Qin5451d532017-11-16 17:16:34 +08002061
Brandon Jones59770802018-04-02 13:18:42 -07002062void Context::getTexParameterivRobust(TextureType target,
2063 GLenum pname,
2064 GLsizei bufSize,
2065 GLsizei *length,
2066 GLint *params)
2067{
2068 getTexParameteriv(target, pname, params);
2069}
2070
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002071void Context::getTexParameterIivRobust(TextureType target,
2072 GLenum pname,
2073 GLsizei bufSize,
2074 GLsizei *length,
2075 GLint *params)
2076{
2077 UNIMPLEMENTED();
2078}
2079
2080void Context::getTexParameterIuivRobust(TextureType target,
2081 GLenum pname,
2082 GLsizei bufSize,
2083 GLsizei *length,
2084 GLuint *params)
2085{
2086 UNIMPLEMENTED();
2087}
2088
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002089void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002090{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002091 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002092 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002093}
2094
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002095void Context::getTexLevelParameterivRobust(TextureTarget target,
2096 GLint level,
2097 GLenum pname,
2098 GLsizei bufSize,
2099 GLsizei *length,
2100 GLint *params)
2101{
2102 UNIMPLEMENTED();
2103}
2104
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002105void Context::getTexLevelParameterfv(TextureTarget target,
2106 GLint level,
2107 GLenum pname,
2108 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002109{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002110 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002111 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002112}
2113
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002114void Context::getTexLevelParameterfvRobust(TextureTarget target,
2115 GLint level,
2116 GLenum pname,
2117 GLsizei bufSize,
2118 GLsizei *length,
2119 GLfloat *params)
2120{
2121 UNIMPLEMENTED();
2122}
2123
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002124void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002125{
2126 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002127 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002128 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002129}
2130
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002131void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002132{
2133 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002134 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002135 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002136}
2137
Brandon Jones59770802018-04-02 13:18:42 -07002138void Context::texParameterfvRobust(TextureType target,
2139 GLenum pname,
2140 GLsizei bufSize,
2141 const GLfloat *params)
2142{
2143 texParameterfv(target, pname, params);
2144}
2145
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002146void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002147{
2148 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002149 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002150 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002151}
2152
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002153void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002154{
2155 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002156 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002157 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002158}
2159
Brandon Jones59770802018-04-02 13:18:42 -07002160void Context::texParameterivRobust(TextureType target,
2161 GLenum pname,
2162 GLsizei bufSize,
2163 const GLint *params)
2164{
2165 texParameteriv(target, pname, params);
2166}
2167
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002168void Context::texParameterIivRobust(TextureType target,
2169 GLenum pname,
2170 GLsizei bufSize,
2171 const GLint *params)
2172{
2173 UNIMPLEMENTED();
2174}
2175
2176void Context::texParameterIuivRobust(TextureType target,
2177 GLenum pname,
2178 GLsizei bufSize,
2179 const GLuint *params)
2180{
2181 UNIMPLEMENTED();
2182}
2183
Jamie Madill493f9572018-05-24 19:52:15 -04002184void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002185{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002186 // No-op if count draws no primitives for given mode
2187 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002188 {
2189 return;
2190 }
2191
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002192 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002193 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002194 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002195}
2196
Jamie Madill493f9572018-05-24 19:52:15 -04002197void Context::drawArraysInstanced(PrimitiveMode mode,
2198 GLint first,
2199 GLsizei count,
2200 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002201{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002202 // No-op if count draws no primitives for given mode
2203 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002204 {
2205 return;
2206 }
2207
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002208 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002209 ANGLE_CONTEXT_TRY(
2210 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002211 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2212 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002213}
2214
Jamie Madill493f9572018-05-24 19:52:15 -04002215void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002216{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002217 // No-op if count draws no primitives for given mode
2218 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002219 {
2220 return;
2221 }
2222
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002223 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002224 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002225}
2226
Jamie Madill493f9572018-05-24 19:52:15 -04002227void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002228 GLsizei count,
2229 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002230 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002231 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002232{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002233 // No-op if count draws no primitives for given mode
2234 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002235 {
2236 return;
2237 }
2238
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002239 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002240 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002241 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002242}
2243
Jamie Madill493f9572018-05-24 19:52:15 -04002244void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002245 GLuint start,
2246 GLuint end,
2247 GLsizei count,
2248 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002249 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002250{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002251 // No-op if count draws no primitives for given mode
2252 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002253 {
2254 return;
2255 }
2256
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002257 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002258 ANGLE_CONTEXT_TRY(
2259 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002260}
2261
Jamie Madill493f9572018-05-24 19:52:15 -04002262void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002263{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002264 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002265 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002266}
2267
Jamie Madill493f9572018-05-24 19:52:15 -04002268void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002269{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002270 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002271 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002272}
2273
Jamie Madill675fe712016-12-19 13:07:54 -05002274void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002275{
Jamie Madillafa02a22017-11-23 12:57:38 -05002276 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002277}
2278
Jamie Madill675fe712016-12-19 13:07:54 -05002279void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002280{
Jamie Madillafa02a22017-11-23 12:57:38 -05002281 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002282}
2283
Austin Kinross6ee1e782015-05-29 17:05:37 -07002284void Context::insertEventMarker(GLsizei length, const char *marker)
2285{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002286 ASSERT(mImplementation);
2287 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002288}
2289
2290void Context::pushGroupMarker(GLsizei length, const char *marker)
2291{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002292 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002293
2294 if (marker == nullptr)
2295 {
2296 // From the EXT_debug_marker spec,
2297 // "If <marker> is null then an empty string is pushed on the stack."
2298 mImplementation->pushGroupMarker(length, "");
2299 }
2300 else
2301 {
2302 mImplementation->pushGroupMarker(length, marker);
2303 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002304}
2305
2306void Context::popGroupMarker()
2307{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002308 ASSERT(mImplementation);
2309 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002310}
2311
Geoff Langd8605522016-04-13 10:19:12 -04002312void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2313{
2314 Program *programObject = getProgram(program);
2315 ASSERT(programObject);
2316
2317 programObject->bindUniformLocation(location, name);
2318}
2319
Brandon Jones59770802018-04-02 13:18:42 -07002320void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002321{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002322 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002323}
2324
Brandon Jones59770802018-04-02 13:18:42 -07002325void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002326{
2327 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2328}
2329
Brandon Jones59770802018-04-02 13:18:42 -07002330void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002331{
2332 GLfloat I[16];
2333 angle::Matrix<GLfloat>::setToIdentity(I);
2334
2335 mGLState.loadPathRenderingMatrix(matrixMode, I);
2336}
2337
2338void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2339{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002340 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002341 if (!pathObj)
2342 return;
2343
Geoff Lang9bf86f02018-07-26 11:46:34 -04002344 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002345
2346 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2347}
2348
2349void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2350{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002351 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002352 if (!pathObj)
2353 return;
2354
Geoff Lang9bf86f02018-07-26 11:46:34 -04002355 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002356
2357 mImplementation->stencilStrokePath(pathObj, reference, mask);
2358}
2359
2360void Context::coverFillPath(GLuint path, GLenum coverMode)
2361{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002362 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002363 if (!pathObj)
2364 return;
2365
Geoff Lang9bf86f02018-07-26 11:46:34 -04002366 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002367
2368 mImplementation->coverFillPath(pathObj, coverMode);
2369}
2370
2371void Context::coverStrokePath(GLuint path, GLenum coverMode)
2372{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002373 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002374 if (!pathObj)
2375 return;
2376
Geoff Lang9bf86f02018-07-26 11:46:34 -04002377 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002378
2379 mImplementation->coverStrokePath(pathObj, coverMode);
2380}
2381
2382void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2383{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002384 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002385 if (!pathObj)
2386 return;
2387
Geoff Lang9bf86f02018-07-26 11:46:34 -04002388 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002389
2390 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2391}
2392
2393void Context::stencilThenCoverStrokePath(GLuint path,
2394 GLint reference,
2395 GLuint mask,
2396 GLenum coverMode)
2397{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002398 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002399 if (!pathObj)
2400 return;
2401
Geoff Lang9bf86f02018-07-26 11:46:34 -04002402 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002403
2404 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2405}
2406
Sami Väisänend59ca052016-06-21 16:10:00 +03002407void Context::coverFillPathInstanced(GLsizei numPaths,
2408 GLenum pathNameType,
2409 const void *paths,
2410 GLuint pathBase,
2411 GLenum coverMode,
2412 GLenum transformType,
2413 const GLfloat *transformValues)
2414{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002415 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002416
Geoff Lang9bf86f02018-07-26 11:46:34 -04002417 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002418
2419 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2420}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002421
Sami Väisänend59ca052016-06-21 16:10:00 +03002422void Context::coverStrokePathInstanced(GLsizei numPaths,
2423 GLenum pathNameType,
2424 const void *paths,
2425 GLuint pathBase,
2426 GLenum coverMode,
2427 GLenum transformType,
2428 const GLfloat *transformValues)
2429{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002430 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002431
2432 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002433 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002434
2435 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2436 transformValues);
2437}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002438
Sami Väisänend59ca052016-06-21 16:10:00 +03002439void Context::stencilFillPathInstanced(GLsizei numPaths,
2440 GLenum pathNameType,
2441 const void *paths,
2442 GLuint pathBase,
2443 GLenum fillMode,
2444 GLuint mask,
2445 GLenum transformType,
2446 const GLfloat *transformValues)
2447{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002448 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002449
2450 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002451 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002452
2453 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2454 transformValues);
2455}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002456
Sami Väisänend59ca052016-06-21 16:10:00 +03002457void Context::stencilStrokePathInstanced(GLsizei numPaths,
2458 GLenum pathNameType,
2459 const void *paths,
2460 GLuint pathBase,
2461 GLint reference,
2462 GLuint mask,
2463 GLenum transformType,
2464 const GLfloat *transformValues)
2465{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002466 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002467
Geoff Lang9bf86f02018-07-26 11:46:34 -04002468 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002469
2470 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2471 transformValues);
2472}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002473
Sami Väisänend59ca052016-06-21 16:10:00 +03002474void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2475 GLenum pathNameType,
2476 const void *paths,
2477 GLuint pathBase,
2478 GLenum fillMode,
2479 GLuint mask,
2480 GLenum coverMode,
2481 GLenum transformType,
2482 const GLfloat *transformValues)
2483{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002484 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002485
Geoff Lang9bf86f02018-07-26 11:46:34 -04002486 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002487
2488 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2489 transformType, transformValues);
2490}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002491
Sami Väisänend59ca052016-06-21 16:10:00 +03002492void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2493 GLenum pathNameType,
2494 const void *paths,
2495 GLuint pathBase,
2496 GLint reference,
2497 GLuint mask,
2498 GLenum coverMode,
2499 GLenum transformType,
2500 const GLfloat *transformValues)
2501{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002502 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002503
Geoff Lang9bf86f02018-07-26 11:46:34 -04002504 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002505
2506 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2507 transformType, transformValues);
2508}
2509
Sami Väisänen46eaa942016-06-29 10:26:37 +03002510void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2511{
2512 auto *programObject = getProgram(program);
2513
2514 programObject->bindFragmentInputLocation(location, name);
2515}
2516
2517void Context::programPathFragmentInputGen(GLuint program,
2518 GLint location,
2519 GLenum genMode,
2520 GLint components,
2521 const GLfloat *coeffs)
2522{
2523 auto *programObject = getProgram(program);
2524
jchen103fd614d2018-08-13 12:21:58 +08002525 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002526}
2527
jchen1015015f72017-03-16 13:54:21 +08002528GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2529{
jchen10fd7c3b52017-03-21 15:36:03 +08002530 const auto *programObject = getProgram(program);
jchen1015015f72017-03-16 13:54:21 +08002531 return QueryProgramResourceIndex(programObject, programInterface, name);
2532}
2533
jchen10fd7c3b52017-03-21 15:36:03 +08002534void Context::getProgramResourceName(GLuint program,
2535 GLenum programInterface,
2536 GLuint index,
2537 GLsizei bufSize,
2538 GLsizei *length,
2539 GLchar *name)
2540{
2541 const auto *programObject = getProgram(program);
2542 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2543}
2544
jchen10191381f2017-04-11 13:59:04 +08002545GLint Context::getProgramResourceLocation(GLuint program,
2546 GLenum programInterface,
2547 const GLchar *name)
2548{
2549 const auto *programObject = getProgram(program);
2550 return QueryProgramResourceLocation(programObject, programInterface, name);
2551}
2552
jchen10880683b2017-04-12 16:21:55 +08002553void Context::getProgramResourceiv(GLuint program,
2554 GLenum programInterface,
2555 GLuint index,
2556 GLsizei propCount,
2557 const GLenum *props,
2558 GLsizei bufSize,
2559 GLsizei *length,
2560 GLint *params)
2561{
2562 const auto *programObject = getProgram(program);
2563 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2564 length, params);
2565}
2566
jchen10d9cd7b72017-08-30 15:04:25 +08002567void Context::getProgramInterfaceiv(GLuint program,
2568 GLenum programInterface,
2569 GLenum pname,
2570 GLint *params)
2571{
2572 const auto *programObject = getProgram(program);
2573 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2574}
2575
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002576void Context::getProgramInterfaceivRobust(GLuint program,
2577 GLenum programInterface,
2578 GLenum pname,
2579 GLsizei bufSize,
2580 GLsizei *length,
2581 GLint *params)
2582{
2583 UNIMPLEMENTED();
2584}
2585
Jamie Madill306b6c12018-07-27 08:12:49 -04002586void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002587{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002588 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002589}
2590
2591// Get one of the recorded errors and clear its flag, if any.
2592// [OpenGL ES 2.0.24] section 2.5 page 13.
2593GLenum Context::getError()
2594{
Geoff Langda5777c2014-07-11 09:52:58 -04002595 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002596 {
Geoff Langda5777c2014-07-11 09:52:58 -04002597 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002598 }
Geoff Langda5777c2014-07-11 09:52:58 -04002599 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002600 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002601 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002602 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002603}
2604
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002605// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002606void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002607{
2608 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002609 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002610 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002611 mContextLostForced = true;
2612 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002613 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002614}
2615
Jamie Madill427064d2018-04-13 16:20:34 -04002616bool Context::isContextLost() const
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002617{
2618 return mContextLost;
2619}
2620
Jamie Madillfa920eb2018-01-04 11:45:50 -05002621GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002622{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002623 // Even if the application doesn't want to know about resets, we want to know
2624 // as it will allow us to skip all the calls.
2625 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002626 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002627 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002628 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002629 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002630 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002631
2632 // EXT_robustness, section 2.6: If the reset notification behavior is
2633 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2634 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2635 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002636 }
2637
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002638 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2639 // status should be returned at least once, and GL_NO_ERROR should be returned
2640 // once the device has finished resetting.
2641 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002642 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002643 ASSERT(mResetStatus == GL_NO_ERROR);
2644 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002645
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002646 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002647 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002648 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002649 }
2650 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002651 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002652 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002653 // If markContextLost was used to mark the context lost then
2654 // assume that is not recoverable, and continue to report the
2655 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002656 mResetStatus = mImplementation->getResetStatus();
2657 }
Jamie Madill893ab082014-05-16 16:56:10 -04002658
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002659 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002660}
2661
2662bool Context::isResetNotificationEnabled()
2663{
2664 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2665}
2666
Corentin Walleze3b10e82015-05-20 11:06:25 -04002667const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002668{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002669 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002670}
2671
2672EGLenum Context::getClientType() const
2673{
2674 return mClientType;
2675}
2676
2677EGLenum Context::getRenderBuffer() const
2678{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002679 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2680 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002681 {
2682 return EGL_NONE;
2683 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002684
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002685 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002686 ASSERT(backAttachment != nullptr);
2687 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002688}
2689
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002690VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002691{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002692 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002693 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2694 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002695 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002696 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2697 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002698
Jamie Madill96a483b2017-06-27 16:49:21 -04002699 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002700 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002701
2702 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002703}
2704
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002705TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002706{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002707 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002708 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2709 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002710 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002711 transformFeedback =
2712 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002713 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002714 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002715 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002716
2717 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002718}
2719
2720bool Context::isVertexArrayGenerated(GLuint vertexArray)
2721{
Jamie Madill96a483b2017-06-27 16:49:21 -04002722 ASSERT(mVertexArrayMap.contains(0));
2723 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002724}
2725
2726bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2727{
Jamie Madill96a483b2017-06-27 16:49:21 -04002728 ASSERT(mTransformFeedbackMap.contains(0));
2729 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002730}
2731
Shannon Woods53a94a82014-06-24 15:20:36 -04002732void Context::detachTexture(GLuint texture)
2733{
2734 // Simple pass-through to State's detachTexture method, as textures do not require
2735 // allocation map management either here or in the resource manager at detach time.
2736 // Zero textures are held by the Context, and we don't attempt to request them from
2737 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002738 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002739}
2740
James Darpinian4d9d4832018-03-13 12:43:28 -07002741void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002742{
Yuly Novikov5807a532015-12-03 13:01:22 -05002743 // Simple pass-through to State's detachBuffer method, since
2744 // only buffer attachments to container objects that are bound to the current context
2745 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002746
Yuly Novikov5807a532015-12-03 13:01:22 -05002747 // [OpenGL ES 3.2] section 5.1.2 page 45:
2748 // Attachments to unbound container objects, such as
2749 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2750 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002751 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002752}
2753
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002754void Context::detachFramebuffer(GLuint framebuffer)
2755{
Shannon Woods53a94a82014-06-24 15:20:36 -04002756 // Framebuffer detachment is handled by Context, because 0 is a valid
2757 // Framebuffer object, and a pointer to it must be passed from Context
2758 // to State at binding time.
2759
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002760 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002761 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2762 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2763 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002764
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002765 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002766 {
2767 bindReadFramebuffer(0);
2768 }
2769
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002770 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002771 {
2772 bindDrawFramebuffer(0);
2773 }
2774}
2775
2776void Context::detachRenderbuffer(GLuint renderbuffer)
2777{
Jamie Madilla02315b2017-02-23 14:14:47 -05002778 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002779}
2780
Jamie Madill57a89722013-07-02 11:57:03 -04002781void Context::detachVertexArray(GLuint vertexArray)
2782{
Jamie Madill77a72f62015-04-14 11:18:32 -04002783 // Vertex array detachment is handled by Context, because 0 is a valid
2784 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002785 // binding time.
2786
Jamie Madill57a89722013-07-02 11:57:03 -04002787 // [OpenGL ES 3.0.2] section 2.10 page 43:
2788 // If a vertex array object that is currently bound is deleted, the binding
2789 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002790 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002791 {
2792 bindVertexArray(0);
2793 }
2794}
2795
Geoff Langc8058452014-02-03 12:04:11 -05002796void Context::detachTransformFeedback(GLuint transformFeedback)
2797{
Corentin Walleza2257da2016-04-19 16:43:12 -04002798 // Transform feedback detachment is handled by Context, because 0 is a valid
2799 // transform feedback, and a pointer to it must be passed from Context to State at
2800 // binding time.
2801
2802 // The OpenGL specification doesn't mention what should happen when the currently bound
2803 // transform feedback object is deleted. Since it is a container object, we treat it like
2804 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002805 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002806 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002807 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002808 }
Geoff Langc8058452014-02-03 12:04:11 -05002809}
2810
Jamie Madilldc356042013-07-19 16:36:57 -04002811void Context::detachSampler(GLuint sampler)
2812{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002813 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002814}
2815
Yunchao Hea336b902017-08-02 16:05:21 +08002816void Context::detachProgramPipeline(GLuint pipeline)
2817{
2818 mGLState.detachProgramPipeline(this, pipeline);
2819}
2820
Jamie Madill3ef140a2017-08-26 23:11:21 -04002821void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002822{
Shaodde78e82017-05-22 14:13:27 +08002823 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002824 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002825}
2826
Jamie Madille29d1672013-07-19 16:36:57 -04002827void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2828{
Geoff Langc1984ed2016-10-07 12:41:00 -04002829 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002830 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002831 SetSamplerParameteri(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002832 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002833}
Jamie Madille29d1672013-07-19 16:36:57 -04002834
Geoff Langc1984ed2016-10-07 12:41:00 -04002835void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2836{
2837 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002838 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002839 SetSamplerParameteriv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002840 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002841}
2842
Brandon Jones59770802018-04-02 13:18:42 -07002843void Context::samplerParameterivRobust(GLuint sampler,
2844 GLenum pname,
2845 GLsizei bufSize,
2846 const GLint *param)
2847{
2848 samplerParameteriv(sampler, pname, param);
2849}
2850
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002851void Context::samplerParameterIivRobust(GLuint sampler,
2852 GLenum pname,
2853 GLsizei bufSize,
2854 const GLint *param)
2855{
2856 UNIMPLEMENTED();
2857}
2858
2859void Context::samplerParameterIuivRobust(GLuint sampler,
2860 GLenum pname,
2861 GLsizei bufSize,
2862 const GLuint *param)
2863{
2864 UNIMPLEMENTED();
2865}
2866
Jamie Madille29d1672013-07-19 16:36:57 -04002867void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2868{
Geoff Langc1984ed2016-10-07 12:41:00 -04002869 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002870 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002871 SetSamplerParameterf(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002872 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002873}
2874
Geoff Langc1984ed2016-10-07 12:41:00 -04002875void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002876{
Geoff Langc1984ed2016-10-07 12:41:00 -04002877 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002878 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002879 SetSamplerParameterfv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002880 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002881}
2882
Brandon Jones59770802018-04-02 13:18:42 -07002883void Context::samplerParameterfvRobust(GLuint sampler,
2884 GLenum pname,
2885 GLsizei bufSize,
2886 const GLfloat *param)
2887{
2888 samplerParameterfv(sampler, pname, param);
2889}
2890
Geoff Langc1984ed2016-10-07 12:41:00 -04002891void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002892{
Geoff Langc1984ed2016-10-07 12:41:00 -04002893 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002894 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002895 QuerySamplerParameteriv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002896 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002897}
Jamie Madill9675b802013-07-19 16:36:59 -04002898
Brandon Jones59770802018-04-02 13:18:42 -07002899void Context::getSamplerParameterivRobust(GLuint sampler,
2900 GLenum pname,
2901 GLsizei bufSize,
2902 GLsizei *length,
2903 GLint *params)
2904{
2905 getSamplerParameteriv(sampler, pname, params);
2906}
2907
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002908void Context::getSamplerParameterIivRobust(GLuint sampler,
2909 GLenum pname,
2910 GLsizei bufSize,
2911 GLsizei *length,
2912 GLint *params)
2913{
2914 UNIMPLEMENTED();
2915}
2916
2917void Context::getSamplerParameterIuivRobust(GLuint sampler,
2918 GLenum pname,
2919 GLsizei bufSize,
2920 GLsizei *length,
2921 GLuint *params)
2922{
2923 UNIMPLEMENTED();
2924}
2925
Geoff Langc1984ed2016-10-07 12:41:00 -04002926void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2927{
2928 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002929 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002930 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002931 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002932}
2933
Brandon Jones59770802018-04-02 13:18:42 -07002934void Context::getSamplerParameterfvRobust(GLuint sampler,
2935 GLenum pname,
2936 GLsizei bufSize,
2937 GLsizei *length,
2938 GLfloat *params)
2939{
2940 getSamplerParameterfv(sampler, pname, params);
2941}
2942
Olli Etuahof0fee072016-03-30 15:11:58 +03002943void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2944{
2945 gl::Program *programObject = getProgram(program);
Yunchao He61afff12017-03-14 15:34:03 +08002946 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002947}
2948
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002949void Context::initRendererString()
2950{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002951 std::ostringstream rendererString;
2952 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002953 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002954 rendererString << ")";
2955
Geoff Langcec35902014-04-16 10:52:36 -04002956 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002957}
2958
Geoff Langc339c4e2016-11-29 10:37:36 -05002959void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002960{
Geoff Langc339c4e2016-11-29 10:37:36 -05002961 const Version &clientVersion = getClientVersion();
2962
2963 std::ostringstream versionString;
2964 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2965 << ANGLE_VERSION_STRING << ")";
2966 mVersionString = MakeStaticString(versionString.str());
2967
2968 std::ostringstream shadingLanguageVersionString;
2969 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2970 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2971 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
2972 << ")";
2973 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002974}
2975
Geoff Langcec35902014-04-16 10:52:36 -04002976void Context::initExtensionStrings()
2977{
Geoff Langc339c4e2016-11-29 10:37:36 -05002978 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
2979 std::ostringstream combinedStringStream;
2980 std::copy(strings.begin(), strings.end(),
2981 std::ostream_iterator<const char *>(combinedStringStream, " "));
2982 return MakeStaticString(combinedStringStream.str());
2983 };
2984
2985 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002986 for (const auto &extensionString : mExtensions.getStrings())
2987 {
2988 mExtensionStrings.push_back(MakeStaticString(extensionString));
2989 }
Geoff Langc339c4e2016-11-29 10:37:36 -05002990 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002991
Geoff Langc339c4e2016-11-29 10:37:36 -05002992 mRequestableExtensionStrings.clear();
2993 for (const auto &extensionInfo : GetExtensionInfoMap())
2994 {
2995 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08002996 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05002997 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05002998 {
2999 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3000 }
3001 }
3002 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003003}
3004
Geoff Langc339c4e2016-11-29 10:37:36 -05003005const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003006{
Geoff Langc339c4e2016-11-29 10:37:36 -05003007 switch (name)
3008 {
3009 case GL_VENDOR:
3010 return reinterpret_cast<const GLubyte *>("Google Inc.");
3011
3012 case GL_RENDERER:
3013 return reinterpret_cast<const GLubyte *>(mRendererString);
3014
3015 case GL_VERSION:
3016 return reinterpret_cast<const GLubyte *>(mVersionString);
3017
3018 case GL_SHADING_LANGUAGE_VERSION:
3019 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3020
3021 case GL_EXTENSIONS:
3022 return reinterpret_cast<const GLubyte *>(mExtensionString);
3023
3024 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3025 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3026
3027 default:
3028 UNREACHABLE();
3029 return nullptr;
3030 }
Geoff Langcec35902014-04-16 10:52:36 -04003031}
3032
Geoff Langc339c4e2016-11-29 10:37:36 -05003033const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003034{
Geoff Langc339c4e2016-11-29 10:37:36 -05003035 switch (name)
3036 {
3037 case GL_EXTENSIONS:
3038 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3039
3040 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3041 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3042
3043 default:
3044 UNREACHABLE();
3045 return nullptr;
3046 }
Geoff Langcec35902014-04-16 10:52:36 -04003047}
3048
3049size_t Context::getExtensionStringCount() const
3050{
3051 return mExtensionStrings.size();
3052}
3053
Geoff Lang111a99e2017-10-17 10:58:41 -04003054bool Context::isExtensionRequestable(const char *name)
3055{
3056 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3057 auto extension = extensionInfos.find(name);
3058
Geoff Lang111a99e2017-10-17 10:58:41 -04003059 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003060 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003061}
3062
Geoff Langc339c4e2016-11-29 10:37:36 -05003063void Context::requestExtension(const char *name)
3064{
3065 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3066 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3067 const auto &extension = extensionInfos.at(name);
3068 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003069 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003070
3071 if (mExtensions.*(extension.ExtensionsMember))
3072 {
3073 // Extension already enabled
3074 return;
3075 }
3076
3077 mExtensions.*(extension.ExtensionsMember) = true;
3078 updateCaps();
3079 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003080
Jamie Madill2f348d22017-06-05 10:50:59 -04003081 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3082 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003083
Jamie Madill81c2e252017-09-09 23:32:46 -04003084 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3085 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003086 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003087 for (auto &zeroTexture : mZeroTextures)
3088 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003089 if (zeroTexture.get() != nullptr)
3090 {
3091 zeroTexture->signalDirty(this, InitState::Initialized);
3092 }
Geoff Lang9aded172017-04-05 11:07:56 -04003093 }
3094
Jamie Madillb983a4b2018-08-01 11:34:51 -04003095 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003096}
3097
3098size_t Context::getRequestableExtensionStringCount() const
3099{
3100 return mRequestableExtensionStrings.size();
3101}
3102
Jamie Madill493f9572018-05-24 19:52:15 -04003103void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003104{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003105 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003106 ASSERT(transformFeedback != nullptr);
3107 ASSERT(!transformFeedback->isPaused());
3108
Jamie Madill6c1f6712017-02-14 19:08:04 -05003109 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003110}
3111
3112bool Context::hasActiveTransformFeedback(GLuint program) const
3113{
3114 for (auto pair : mTransformFeedbackMap)
3115 {
3116 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3117 {
3118 return true;
3119 }
3120 }
3121 return false;
3122}
3123
Geoff Lang33f11fb2018-05-07 13:42:47 -04003124Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003125{
3126 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3127
jchen1082af6202018-06-22 10:59:52 +08003128 // Explicitly enable GL_KHR_parallel_shader_compile
3129 supportedExtensions.parallelShaderCompile = true;
3130
Geoff Langb0f917f2017-12-05 13:41:54 -05003131 if (getClientVersion() < ES_2_0)
3132 {
3133 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003134 supportedExtensions.pointSizeArray = true;
3135 supportedExtensions.textureCubeMap = true;
3136 supportedExtensions.pointSprite = true;
3137 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003138 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003139 }
3140
3141 if (getClientVersion() < ES_3_0)
3142 {
3143 // Disable ES3+ extensions
3144 supportedExtensions.colorBufferFloat = false;
3145 supportedExtensions.eglImageExternalEssl3 = false;
3146 supportedExtensions.textureNorm16 = false;
3147 supportedExtensions.multiview = false;
3148 supportedExtensions.maxViews = 1u;
3149 }
3150
3151 if (getClientVersion() < ES_3_1)
3152 {
3153 // Disable ES3.1+ extensions
3154 supportedExtensions.geometryShader = false;
3155 }
3156
3157 if (getClientVersion() > ES_2_0)
3158 {
3159 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3160 // supportedExtensions.sRGB = false;
3161 }
3162
3163 // Some extensions are always available because they are implemented in the GL layer.
3164 supportedExtensions.bindUniformLocation = true;
3165 supportedExtensions.vertexArrayObject = true;
3166 supportedExtensions.bindGeneratesResource = true;
3167 supportedExtensions.clientArrays = true;
3168 supportedExtensions.requestExtension = true;
3169
3170 // Enable the no error extension if the context was created with the flag.
3171 supportedExtensions.noError = mSkipValidation;
3172
3173 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003174 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003175
3176 // Explicitly enable GL_KHR_debug
3177 supportedExtensions.debug = true;
3178 supportedExtensions.maxDebugMessageLength = 1024;
3179 supportedExtensions.maxDebugLoggedMessages = 1024;
3180 supportedExtensions.maxDebugGroupStackDepth = 1024;
3181 supportedExtensions.maxLabelLength = 1024;
3182
3183 // Explicitly enable GL_ANGLE_robust_client_memory
3184 supportedExtensions.robustClientMemory = true;
3185
3186 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003187 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003188
3189 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3190 // supports it.
3191 supportedExtensions.robustBufferAccessBehavior =
3192 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3193
3194 // Enable the cache control query unconditionally.
3195 supportedExtensions.programCacheControl = true;
3196
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003197 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003198 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003199 {
3200 // GL_ANGLE_explicit_context_gles1
3201 supportedExtensions.explicitContextGles1 = true;
3202 // GL_ANGLE_explicit_context
3203 supportedExtensions.explicitContext = true;
3204 }
3205
Geoff Langb0f917f2017-12-05 13:41:54 -05003206 return supportedExtensions;
3207}
3208
Geoff Lang33f11fb2018-05-07 13:42:47 -04003209void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003210{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003211 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003212
Geoff Lang33f11fb2018-05-07 13:42:47 -04003213 mSupportedExtensions = generateSupportedExtensions();
3214 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003215
3216 mLimitations = mImplementation->getNativeLimitations();
3217
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003218 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3219 if (getClientVersion() < Version(2, 0))
3220 {
3221 mCaps.maxMultitextureUnits = 4;
3222 mCaps.maxClipPlanes = 6;
3223 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003224 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3225 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3226 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003227 mCaps.minSmoothPointSize = 1.0f;
3228 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003229 mCaps.minSmoothLineWidth = 1.0f;
3230 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003231 }
3232
Luc Ferronad2ae932018-06-11 15:31:17 -04003233 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003234 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003235
Luc Ferronad2ae932018-06-11 15:31:17 -04003236 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3237
Jamie Madill0f80ed82017-09-19 00:24:56 -04003238 if (getClientVersion() < ES_3_1)
3239 {
3240 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3241 }
3242 else
3243 {
3244 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3245 }
Geoff Lang301d1612014-07-09 10:34:37 -04003246
Jiawei Shao54aafe52018-04-27 14:54:57 +08003247 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3248 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003249 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3250
Jamie Madill0f80ed82017-09-19 00:24:56 -04003251 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3252 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3253
3254 // Limit textures as well, so we can use fast bitsets with texture bindings.
3255 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003256 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3257 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3258 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3259 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003260
Jiawei Shaodb342272017-09-27 10:21:45 +08003261 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3262
Geoff Langc287ea62016-09-16 14:46:51 -04003263 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003264 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003265 for (const auto &extensionInfo : GetExtensionInfoMap())
3266 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003267 // If the user has requested that extensions start disabled and they are requestable,
3268 // disable them.
3269 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003270 {
3271 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3272 }
3273 }
3274
3275 // Generate texture caps
3276 updateCaps();
3277}
3278
3279void Context::updateCaps()
3280{
Geoff Lang900013c2014-07-07 11:32:19 -04003281 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003282 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003283
Jamie Madill7b62cf92017-11-02 15:20:49 -04003284 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003285 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003286 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003287 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003288
Geoff Lang0d8b7242015-09-09 14:56:53 -04003289 // Update the format caps based on the client version and extensions.
3290 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3291 // ES3.
3292 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003293 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003294 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003295 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003296 formatCaps.textureAttachment =
3297 formatCaps.textureAttachment &&
3298 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3299 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3300 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003301
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003302 // OpenGL ES does not support multisampling with non-rendererable formats
3303 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003304 if (!formatCaps.renderbuffer ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003305 (getClientVersion() < ES_3_1 &&
3306 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003307 {
Geoff Langd87878e2014-09-19 15:42:59 -04003308 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003309 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003310 else
3311 {
3312 // We may have limited the max samples for some required renderbuffer formats due to
3313 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3314 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3315
3316 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3317 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3318 // exception of signed and unsigned integer formats."
3319 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3320 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3321 {
3322 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3323 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3324 }
3325
3326 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3327 if (getClientVersion() >= ES_3_1)
3328 {
3329 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3330 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3331 // the exception that the signed and unsigned integer formats are required only to
3332 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3333 // multisamples, which must be at least one."
3334 if (formatInfo.componentType == GL_INT ||
3335 formatInfo.componentType == GL_UNSIGNED_INT)
3336 {
3337 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3338 }
3339
3340 // GLES 3.1 section 19.3.1.
3341 if (formatCaps.texturable)
3342 {
3343 if (formatInfo.depthBits > 0)
3344 {
3345 mCaps.maxDepthTextureSamples =
3346 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3347 }
3348 else if (formatInfo.redBits > 0)
3349 {
3350 mCaps.maxColorTextureSamples =
3351 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3352 }
3353 }
3354 }
3355 }
Geoff Langd87878e2014-09-19 15:42:59 -04003356
3357 if (formatCaps.texturable && formatInfo.compressed)
3358 {
Geoff Langca271392017-04-05 12:30:00 -04003359 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003360 }
3361
Geoff Langca271392017-04-05 12:30:00 -04003362 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003363 }
Jamie Madill32447362017-06-28 14:53:52 -04003364
3365 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003366 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003367 {
3368 mMemoryProgramCache = nullptr;
3369 }
Corentin Walleze4477002017-12-01 14:39:58 -05003370
3371 // Compute which buffer types are allowed
3372 mValidBufferBindings.reset();
3373 mValidBufferBindings.set(BufferBinding::ElementArray);
3374 mValidBufferBindings.set(BufferBinding::Array);
3375
3376 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3377 {
3378 mValidBufferBindings.set(BufferBinding::PixelPack);
3379 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3380 }
3381
3382 if (getClientVersion() >= ES_3_0)
3383 {
3384 mValidBufferBindings.set(BufferBinding::CopyRead);
3385 mValidBufferBindings.set(BufferBinding::CopyWrite);
3386 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3387 mValidBufferBindings.set(BufferBinding::Uniform);
3388 }
3389
3390 if (getClientVersion() >= ES_3_1)
3391 {
3392 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3393 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3394 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3395 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3396 }
jchen107ae70d82018-07-06 13:47:01 +08003397
3398 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Geoff Lang493daf52014-07-03 13:38:44 -04003399}
3400
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003401void Context::initWorkarounds()
3402{
Jamie Madill761b02c2017-06-23 16:27:06 -04003403 // Apply back-end workarounds.
3404 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3405
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003406 // Lose the context upon out of memory error if the application is
3407 // expecting to watch for those events.
3408 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
3409}
3410
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003411// Return true if the draw is a no-op, else return false.
3412// A no-op draw occurs if the count of vertices is less than the minimum required to
3413// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3414bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3415{
3416 return count < kMinimumPrimitiveCounts[mode];
3417}
3418
3419bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3420{
3421 return (instanceCount == 0) || noopDraw(mode, count);
3422}
3423
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003424Error Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003425{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003426 if (mGLES1Renderer)
3427 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003428 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003429 }
3430
Geoff Lang9bf86f02018-07-26 11:46:34 -04003431 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003432
3433 if (isRobustResourceInitEnabled())
3434 {
3435 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3436 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3437 }
3438
Geoff Langa8cb2872018-03-09 16:09:40 -05003439 ANGLE_TRY(syncDirtyBits());
Geoff Langd4fff502017-09-22 11:28:28 -04003440 return NoError();
3441}
3442
3443Error Context::prepareForClear(GLbitfield mask)
3444{
Geoff Langa8cb2872018-03-09 16:09:40 -05003445 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003446 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003447 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003448 return NoError();
3449}
3450
3451Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
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()->ensureClearBufferAttachmentsInitialized(this, buffer,
3455 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003456 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003457 return NoError();
3458}
3459
Geoff Langa8cb2872018-03-09 16:09:40 -05003460Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003461{
Geoff Langa8cb2872018-03-09 16:09:40 -05003462 ANGLE_TRY(syncDirtyObjects(objectMask));
3463 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003464 return NoError();
3465}
3466
Geoff Langa8cb2872018-03-09 16:09:40 -05003467Error Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003468{
3469 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill189ad872018-07-09 13:32:37 -04003470 ANGLE_TRY(mImplementation->syncState(this, dirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003471 mGLState.clearDirtyBits();
3472 return NoError();
3473}
3474
Geoff Langa8cb2872018-03-09 16:09:40 -05003475Error Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003476{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003477 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill189ad872018-07-09 13:32:37 -04003478 ANGLE_TRY(mImplementation->syncState(this, dirtyBits));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003479 mGLState.clearDirtyBits(dirtyBits);
Jamie Madillbc918e72018-03-08 09:47:21 -05003480 return NoError();
Jamie Madill1b94d432015-08-07 13:23:23 -04003481}
Jamie Madillc29968b2016-01-20 11:17:23 -05003482
Geoff Langa8cb2872018-03-09 16:09:40 -05003483Error Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003484{
3485 return mGLState.syncDirtyObjects(this, objectMask);
3486}
3487
Jamie Madillc29968b2016-01-20 11:17:23 -05003488void Context::blitFramebuffer(GLint srcX0,
3489 GLint srcY0,
3490 GLint srcX1,
3491 GLint srcY1,
3492 GLint dstX0,
3493 GLint dstY0,
3494 GLint dstX1,
3495 GLint dstY1,
3496 GLbitfield mask,
3497 GLenum filter)
3498{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003499 if (mask == 0)
3500 {
3501 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3502 // buffers are copied.
3503 return;
3504 }
3505
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003506 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003507 ASSERT(drawFramebuffer);
3508
3509 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3510 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3511
Jamie Madillbc918e72018-03-08 09:47:21 -05003512 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003513
Jamie Madillc564c072017-06-01 12:45:42 -04003514 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003515}
Jamie Madillc29968b2016-01-20 11:17:23 -05003516
3517void Context::clear(GLbitfield mask)
3518{
Geoff Langd4fff502017-09-22 11:28:28 -04003519 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3520 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003521}
3522
3523void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3524{
Geoff Langd4fff502017-09-22 11:28:28 -04003525 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3526 ANGLE_CONTEXT_TRY(
3527 mGLState.getDrawFramebuffer()->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003528}
3529
3530void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3531{
Geoff Langd4fff502017-09-22 11:28:28 -04003532 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3533 ANGLE_CONTEXT_TRY(
3534 mGLState.getDrawFramebuffer()->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003535}
3536
3537void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3538{
Geoff Langd4fff502017-09-22 11:28:28 -04003539 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3540 ANGLE_CONTEXT_TRY(
3541 mGLState.getDrawFramebuffer()->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003542}
3543
3544void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3545{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003546 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003547 ASSERT(framebufferObject);
3548
3549 // If a buffer is not present, the clear has no effect
3550 if (framebufferObject->getDepthbuffer() == nullptr &&
3551 framebufferObject->getStencilbuffer() == nullptr)
3552 {
3553 return;
3554 }
3555
Geoff Langd4fff502017-09-22 11:28:28 -04003556 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3557 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003558}
3559
3560void Context::readPixels(GLint x,
3561 GLint y,
3562 GLsizei width,
3563 GLsizei height,
3564 GLenum format,
3565 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003566 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003567{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003568 if (width == 0 || height == 0)
3569 {
3570 return;
3571 }
3572
Jamie Madillbc918e72018-03-08 09:47:21 -05003573 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003574
Jamie Madillb6664922017-07-25 12:55:04 -04003575 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3576 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003577
3578 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003579 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003580}
3581
Brandon Jones59770802018-04-02 13:18:42 -07003582void Context::readPixelsRobust(GLint x,
3583 GLint y,
3584 GLsizei width,
3585 GLsizei height,
3586 GLenum format,
3587 GLenum type,
3588 GLsizei bufSize,
3589 GLsizei *length,
3590 GLsizei *columns,
3591 GLsizei *rows,
3592 void *pixels)
3593{
3594 readPixels(x, y, width, height, format, type, pixels);
3595}
3596
3597void Context::readnPixelsRobust(GLint x,
3598 GLint y,
3599 GLsizei width,
3600 GLsizei height,
3601 GLenum format,
3602 GLenum type,
3603 GLsizei bufSize,
3604 GLsizei *length,
3605 GLsizei *columns,
3606 GLsizei *rows,
3607 void *data)
3608{
3609 readPixels(x, y, width, height, format, type, data);
3610}
3611
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003612void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003613 GLint level,
3614 GLenum internalformat,
3615 GLint x,
3616 GLint y,
3617 GLsizei width,
3618 GLsizei height,
3619 GLint border)
3620{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003621 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003622 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003623
Jamie Madillc29968b2016-01-20 11:17:23 -05003624 Rectangle sourceArea(x, y, width, height);
3625
Jamie Madill05b35b22017-10-03 09:01:44 -04003626 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003627 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003628 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003629}
3630
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003631void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003632 GLint level,
3633 GLint xoffset,
3634 GLint yoffset,
3635 GLint x,
3636 GLint y,
3637 GLsizei width,
3638 GLsizei height)
3639{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003640 if (width == 0 || height == 0)
3641 {
3642 return;
3643 }
3644
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003645 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003646 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003647
Jamie Madillc29968b2016-01-20 11:17:23 -05003648 Offset destOffset(xoffset, yoffset, 0);
3649 Rectangle sourceArea(x, y, width, height);
3650
Jamie Madill05b35b22017-10-03 09:01:44 -04003651 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003652 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003653 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003654}
3655
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003656void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003657 GLint level,
3658 GLint xoffset,
3659 GLint yoffset,
3660 GLint zoffset,
3661 GLint x,
3662 GLint y,
3663 GLsizei width,
3664 GLsizei height)
3665{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003666 if (width == 0 || height == 0)
3667 {
3668 return;
3669 }
3670
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003671 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003672 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003673
Jamie Madillc29968b2016-01-20 11:17:23 -05003674 Offset destOffset(xoffset, yoffset, zoffset);
3675 Rectangle sourceArea(x, y, width, height);
3676
Jamie Madill05b35b22017-10-03 09:01:44 -04003677 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3678 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003679 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3680 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003681}
3682
3683void Context::framebufferTexture2D(GLenum target,
3684 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003685 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003686 GLuint texture,
3687 GLint level)
3688{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003689 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003690 ASSERT(framebuffer);
3691
3692 if (texture != 0)
3693 {
3694 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003695 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003696 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003697 }
3698 else
3699 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003700 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003701 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003702
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003703 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003704}
3705
3706void Context::framebufferRenderbuffer(GLenum target,
3707 GLenum attachment,
3708 GLenum renderbuffertarget,
3709 GLuint renderbuffer)
3710{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003711 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003712 ASSERT(framebuffer);
3713
3714 if (renderbuffer != 0)
3715 {
3716 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003717
Jamie Madillcc129372018-04-12 09:13:18 -04003718 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003719 renderbufferObject);
3720 }
3721 else
3722 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003723 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003724 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003725
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003726 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003727}
3728
3729void Context::framebufferTextureLayer(GLenum target,
3730 GLenum attachment,
3731 GLuint texture,
3732 GLint level,
3733 GLint layer)
3734{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003735 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003736 ASSERT(framebuffer);
3737
3738 if (texture != 0)
3739 {
3740 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003741 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003742 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003743 }
3744 else
3745 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003746 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003747 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003748
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003749 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003750}
3751
Brandon Jones59770802018-04-02 13:18:42 -07003752void Context::framebufferTextureMultiviewLayered(GLenum target,
3753 GLenum attachment,
3754 GLuint texture,
3755 GLint level,
3756 GLint baseViewIndex,
3757 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003758{
Martin Radev82ef7742017-08-08 17:44:58 +03003759 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3760 ASSERT(framebuffer);
3761
3762 if (texture != 0)
3763 {
3764 Texture *textureObj = getTexture(texture);
3765
Martin Radev18b75ba2017-08-15 15:50:40 +03003766 ImageIndex index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
Martin Radev82ef7742017-08-08 17:44:58 +03003767 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3768 numViews, baseViewIndex);
3769 }
3770 else
3771 {
3772 framebuffer->resetAttachment(this, attachment);
3773 }
3774
3775 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003776}
3777
Brandon Jones59770802018-04-02 13:18:42 -07003778void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3779 GLenum attachment,
3780 GLuint texture,
3781 GLint level,
3782 GLsizei numViews,
3783 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003784{
Martin Radev5dae57b2017-07-14 16:15:55 +03003785 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3786 ASSERT(framebuffer);
3787
3788 if (texture != 0)
3789 {
3790 Texture *textureObj = getTexture(texture);
3791
3792 ImageIndex index = ImageIndex::Make2D(level);
3793 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3794 textureObj, numViews, viewportOffsets);
3795 }
3796 else
3797 {
3798 framebuffer->resetAttachment(this, attachment);
3799 }
3800
3801 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003802}
3803
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003804void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3805{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003806 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3807 ASSERT(framebuffer);
3808
3809 if (texture != 0)
3810 {
3811 Texture *textureObj = getTexture(texture);
3812
3813 ImageIndex index = ImageIndex::MakeFromType(
3814 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3815 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3816 }
3817 else
3818 {
3819 framebuffer->resetAttachment(this, attachment);
3820 }
3821
3822 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003823}
3824
Jamie Madillc29968b2016-01-20 11:17:23 -05003825void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3826{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003827 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003828 ASSERT(framebuffer);
3829 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003830 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003831}
3832
3833void Context::readBuffer(GLenum mode)
3834{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003835 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003836 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003837 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003838}
3839
3840void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3841{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003842 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003843 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003844
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003845 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003846 ASSERT(framebuffer);
3847
3848 // The specification isn't clear what should be done when the framebuffer isn't complete.
3849 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003850 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003851}
3852
3853void Context::invalidateFramebuffer(GLenum target,
3854 GLsizei numAttachments,
3855 const GLenum *attachments)
3856{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003857 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003858 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003859
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003860 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003861 ASSERT(framebuffer);
3862
Jamie Madill427064d2018-04-13 16:20:34 -04003863 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003864 {
Jamie Madill437fa652016-05-03 15:13:24 -04003865 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003866 }
Jamie Madill437fa652016-05-03 15:13:24 -04003867
Jamie Madill4928b7c2017-06-20 12:57:39 -04003868 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003869}
3870
3871void Context::invalidateSubFramebuffer(GLenum target,
3872 GLsizei numAttachments,
3873 const GLenum *attachments,
3874 GLint x,
3875 GLint y,
3876 GLsizei width,
3877 GLsizei height)
3878{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003879 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003880 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003881
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003882 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003883 ASSERT(framebuffer);
3884
Jamie Madill427064d2018-04-13 16:20:34 -04003885 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003886 {
Jamie Madill437fa652016-05-03 15:13:24 -04003887 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003888 }
Jamie Madill437fa652016-05-03 15:13:24 -04003889
3890 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003891 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003892}
3893
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003894void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003895 GLint level,
3896 GLint internalformat,
3897 GLsizei width,
3898 GLsizei height,
3899 GLint border,
3900 GLenum format,
3901 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003902 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003903{
Jamie Madillbc918e72018-03-08 09:47:21 -05003904 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003905
3906 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003907 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003908 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07003909 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003910}
3911
Brandon Jones59770802018-04-02 13:18:42 -07003912void Context::texImage2DRobust(TextureTarget target,
3913 GLint level,
3914 GLint internalformat,
3915 GLsizei width,
3916 GLsizei height,
3917 GLint border,
3918 GLenum format,
3919 GLenum type,
3920 GLsizei bufSize,
3921 const void *pixels)
3922{
3923 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
3924}
3925
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003926void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003927 GLint level,
3928 GLint internalformat,
3929 GLsizei width,
3930 GLsizei height,
3931 GLsizei depth,
3932 GLint border,
3933 GLenum format,
3934 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003935 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003936{
Jamie Madillbc918e72018-03-08 09:47:21 -05003937 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003938
3939 Extents size(width, height, depth);
3940 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003941 handleError(texture->setImage(this, mGLState.getUnpackState(),
3942 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07003943 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003944}
3945
Brandon Jones59770802018-04-02 13:18:42 -07003946void Context::texImage3DRobust(TextureType target,
3947 GLint level,
3948 GLint internalformat,
3949 GLsizei width,
3950 GLsizei height,
3951 GLsizei depth,
3952 GLint border,
3953 GLenum format,
3954 GLenum type,
3955 GLsizei bufSize,
3956 const void *pixels)
3957{
3958 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
3959}
3960
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003961void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003962 GLint level,
3963 GLint xoffset,
3964 GLint yoffset,
3965 GLsizei width,
3966 GLsizei height,
3967 GLenum format,
3968 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003969 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003970{
3971 // Zero sized uploads are valid but no-ops
3972 if (width == 0 || height == 0)
3973 {
3974 return;
3975 }
3976
Jamie Madillbc918e72018-03-08 09:47:21 -05003977 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003978
3979 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003980 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003981 handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07003982 type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003983}
3984
Brandon Jones59770802018-04-02 13:18:42 -07003985void Context::texSubImage2DRobust(TextureTarget target,
3986 GLint level,
3987 GLint xoffset,
3988 GLint yoffset,
3989 GLsizei width,
3990 GLsizei height,
3991 GLenum format,
3992 GLenum type,
3993 GLsizei bufSize,
3994 const void *pixels)
3995{
3996 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
3997}
3998
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003999void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004000 GLint level,
4001 GLint xoffset,
4002 GLint yoffset,
4003 GLint zoffset,
4004 GLsizei width,
4005 GLsizei height,
4006 GLsizei depth,
4007 GLenum format,
4008 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004009 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004010{
4011 // Zero sized uploads are valid but no-ops
4012 if (width == 0 || height == 0 || depth == 0)
4013 {
4014 return;
4015 }
4016
Jamie Madillbc918e72018-03-08 09:47:21 -05004017 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004018
4019 Box area(xoffset, yoffset, zoffset, width, height, depth);
4020 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004021 handleError(texture->setSubImage(this, mGLState.getUnpackState(),
4022 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004023 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004024}
4025
Brandon Jones59770802018-04-02 13:18:42 -07004026void Context::texSubImage3DRobust(TextureType target,
4027 GLint level,
4028 GLint xoffset,
4029 GLint yoffset,
4030 GLint zoffset,
4031 GLsizei width,
4032 GLsizei height,
4033 GLsizei depth,
4034 GLenum format,
4035 GLenum type,
4036 GLsizei bufSize,
4037 const void *pixels)
4038{
4039 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4040 pixels);
4041}
4042
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004043void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004044 GLint level,
4045 GLenum internalformat,
4046 GLsizei width,
4047 GLsizei height,
4048 GLint border,
4049 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004050 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004051{
Jamie Madillbc918e72018-03-08 09:47:21 -05004052 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004053
4054 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004055 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004056 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4057 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004058 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004059}
4060
Brandon Jones59770802018-04-02 13:18:42 -07004061void Context::compressedTexImage2DRobust(TextureTarget target,
4062 GLint level,
4063 GLenum internalformat,
4064 GLsizei width,
4065 GLsizei height,
4066 GLint border,
4067 GLsizei imageSize,
4068 GLsizei dataSize,
4069 const GLvoid *data)
4070{
4071 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4072}
4073
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004074void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004075 GLint level,
4076 GLenum internalformat,
4077 GLsizei width,
4078 GLsizei height,
4079 GLsizei depth,
4080 GLint border,
4081 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004082 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004083{
Jamie Madillbc918e72018-03-08 09:47:21 -05004084 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004085
4086 Extents size(width, height, depth);
4087 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004088 handleError(texture->setCompressedImage(
4089 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004090 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004091}
4092
Brandon Jones59770802018-04-02 13:18:42 -07004093void Context::compressedTexImage3DRobust(TextureType target,
4094 GLint level,
4095 GLenum internalformat,
4096 GLsizei width,
4097 GLsizei height,
4098 GLsizei depth,
4099 GLint border,
4100 GLsizei imageSize,
4101 GLsizei dataSize,
4102 const GLvoid *data)
4103{
4104 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4105 data);
4106}
4107
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004108void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004109 GLint level,
4110 GLint xoffset,
4111 GLint yoffset,
4112 GLsizei width,
4113 GLsizei height,
4114 GLenum format,
4115 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004116 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004117{
Jamie Madillbc918e72018-03-08 09:47:21 -05004118 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004119
4120 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004121 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004122 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4123 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004124 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004125}
4126
Brandon Jones59770802018-04-02 13:18:42 -07004127void Context::compressedTexSubImage2DRobust(TextureTarget target,
4128 GLint level,
4129 GLint xoffset,
4130 GLint yoffset,
4131 GLsizei width,
4132 GLsizei height,
4133 GLenum format,
4134 GLsizei imageSize,
4135 GLsizei dataSize,
4136 const GLvoid *data)
4137{
4138 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4139 data);
4140}
4141
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004142void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004143 GLint level,
4144 GLint xoffset,
4145 GLint yoffset,
4146 GLint zoffset,
4147 GLsizei width,
4148 GLsizei height,
4149 GLsizei depth,
4150 GLenum format,
4151 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004152 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004153{
4154 // Zero sized uploads are valid but no-ops
4155 if (width == 0 || height == 0)
4156 {
4157 return;
4158 }
4159
Jamie Madillbc918e72018-03-08 09:47:21 -05004160 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004161
4162 Box area(xoffset, yoffset, zoffset, width, height, depth);
4163 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004164 handleError(texture->setCompressedSubImage(
4165 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004166 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004167}
4168
Brandon Jones59770802018-04-02 13:18:42 -07004169void Context::compressedTexSubImage3DRobust(TextureType target,
4170 GLint level,
4171 GLint xoffset,
4172 GLint yoffset,
4173 GLint zoffset,
4174 GLsizei width,
4175 GLsizei height,
4176 GLsizei depth,
4177 GLenum format,
4178 GLsizei imageSize,
4179 GLsizei dataSize,
4180 const GLvoid *data)
4181{
4182 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4183 imageSize, data);
4184}
4185
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004186void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004187{
4188 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004189 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004190}
4191
Jamie Madill007530e2017-12-28 14:27:04 -05004192void Context::copyTexture(GLuint sourceId,
4193 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004194 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004195 GLuint destId,
4196 GLint destLevel,
4197 GLint internalFormat,
4198 GLenum destType,
4199 GLboolean unpackFlipY,
4200 GLboolean unpackPremultiplyAlpha,
4201 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004202{
Jamie Madillbc918e72018-03-08 09:47:21 -05004203 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004204
4205 gl::Texture *sourceTexture = getTexture(sourceId);
4206 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004207 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4208 sourceLevel, ConvertToBool(unpackFlipY),
4209 ConvertToBool(unpackPremultiplyAlpha),
4210 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004211}
4212
Jamie Madill007530e2017-12-28 14:27:04 -05004213void Context::copySubTexture(GLuint sourceId,
4214 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004215 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004216 GLuint destId,
4217 GLint destLevel,
4218 GLint xoffset,
4219 GLint yoffset,
4220 GLint x,
4221 GLint y,
4222 GLsizei width,
4223 GLsizei height,
4224 GLboolean unpackFlipY,
4225 GLboolean unpackPremultiplyAlpha,
4226 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004227{
4228 // Zero sized copies are valid but no-ops
4229 if (width == 0 || height == 0)
4230 {
4231 return;
4232 }
4233
Jamie Madillbc918e72018-03-08 09:47:21 -05004234 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004235
4236 gl::Texture *sourceTexture = getTexture(sourceId);
4237 gl::Texture *destTexture = getTexture(destId);
4238 Offset offset(xoffset, yoffset, 0);
4239 Rectangle area(x, y, width, height);
Geoff Lang92019432017-11-20 13:09:34 -05004240 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, area,
4241 ConvertToBool(unpackFlipY),
4242 ConvertToBool(unpackPremultiplyAlpha),
4243 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004244}
4245
Jamie Madill007530e2017-12-28 14:27:04 -05004246void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004247{
Jamie Madillbc918e72018-03-08 09:47:21 -05004248 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004249
4250 gl::Texture *sourceTexture = getTexture(sourceId);
4251 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004252 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004253}
4254
Corentin Wallez336129f2017-10-17 15:55:40 -04004255void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004256{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004257 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004258 ASSERT(buffer);
4259
Geoff Lang496c02d2016-10-20 11:38:11 -07004260 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004261}
4262
Brandon Jones59770802018-04-02 13:18:42 -07004263void Context::getBufferPointervRobust(BufferBinding target,
4264 GLenum pname,
4265 GLsizei bufSize,
4266 GLsizei *length,
4267 void **params)
4268{
4269 getBufferPointerv(target, pname, params);
4270}
4271
Corentin Wallez336129f2017-10-17 15:55:40 -04004272void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004273{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004274 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004275 ASSERT(buffer);
4276
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004277 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004278 if (error.isError())
4279 {
Jamie Madill437fa652016-05-03 15:13:24 -04004280 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004281 return nullptr;
4282 }
4283
4284 return buffer->getMapPointer();
4285}
4286
Corentin Wallez336129f2017-10-17 15:55:40 -04004287GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004288{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004289 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004290 ASSERT(buffer);
4291
4292 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004293 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004294 if (error.isError())
4295 {
Jamie Madill437fa652016-05-03 15:13:24 -04004296 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004297 return GL_FALSE;
4298 }
4299
4300 return result;
4301}
4302
Corentin Wallez336129f2017-10-17 15:55:40 -04004303void *Context::mapBufferRange(BufferBinding target,
4304 GLintptr offset,
4305 GLsizeiptr length,
4306 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004307{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004308 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004309 ASSERT(buffer);
4310
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004311 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004312 if (error.isError())
4313 {
Jamie Madill437fa652016-05-03 15:13:24 -04004314 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004315 return nullptr;
4316 }
4317
4318 return buffer->getMapPointer();
4319}
4320
Corentin Wallez336129f2017-10-17 15:55:40 -04004321void Context::flushMappedBufferRange(BufferBinding /*target*/,
4322 GLintptr /*offset*/,
4323 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004324{
4325 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4326}
4327
Jamie Madillbc918e72018-03-08 09:47:21 -05004328Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004329{
Geoff Langa8cb2872018-03-09 16:09:40 -05004330 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004331}
4332
Jamie Madillbc918e72018-03-08 09:47:21 -05004333Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004334{
Geoff Langa8cb2872018-03-09 16:09:40 -05004335 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004336}
4337
Jamie Madillbc918e72018-03-08 09:47:21 -05004338Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004339{
Geoff Langa8cb2872018-03-09 16:09:40 -05004340 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004341}
4342
Geoff Lang9bf86f02018-07-26 11:46:34 -04004343Error Context::syncStateForPathOperation()
4344{
4345 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4346
4347 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4348 ANGLE_TRY(syncDirtyBits());
4349
4350 return NoError();
4351}
4352
Jiajia Qin5451d532017-11-16 17:16:34 +08004353void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4354{
4355 UNIMPLEMENTED();
4356}
4357
Jamie Madillc20ab272016-06-09 07:20:46 -07004358void Context::activeTexture(GLenum texture)
4359{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004360 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004361}
4362
Jamie Madill876429b2017-04-20 15:46:24 -04004363void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004364{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004365 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004366}
4367
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004368void Context::blendEquation(GLenum mode)
4369{
4370 mGLState.setBlendEquation(mode, mode);
4371}
4372
Jamie Madillc20ab272016-06-09 07:20:46 -07004373void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4374{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004375 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004376}
4377
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004378void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4379{
4380 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4381}
4382
Jamie Madillc20ab272016-06-09 07:20:46 -07004383void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4384{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004385 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004386}
4387
Jamie Madill876429b2017-04-20 15:46:24 -04004388void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004389{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004390 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004391}
4392
Jamie Madill876429b2017-04-20 15:46:24 -04004393void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004394{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004395 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07004396}
4397
4398void Context::clearStencil(GLint s)
4399{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004400 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004401}
4402
4403void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4404{
Geoff Lang92019432017-11-20 13:09:34 -05004405 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4406 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004407}
4408
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004409void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004410{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004411 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004412}
4413
4414void Context::depthFunc(GLenum func)
4415{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004416 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004417}
4418
4419void Context::depthMask(GLboolean flag)
4420{
Geoff Lang92019432017-11-20 13:09:34 -05004421 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004422}
4423
Jamie Madill876429b2017-04-20 15:46:24 -04004424void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004425{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004426 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07004427}
4428
4429void Context::disable(GLenum cap)
4430{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004431 mGLState.setEnableFeature(cap, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07004432}
4433
4434void Context::disableVertexAttribArray(GLuint index)
4435{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004436 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004437 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004438}
4439
4440void Context::enable(GLenum cap)
4441{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004442 mGLState.setEnableFeature(cap, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07004443}
4444
4445void Context::enableVertexAttribArray(GLuint index)
4446{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004447 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004448 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004449}
4450
4451void Context::frontFace(GLenum mode)
4452{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004453 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004454}
4455
4456void Context::hint(GLenum target, GLenum mode)
4457{
4458 switch (target)
4459 {
4460 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004461 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004462 break;
4463
4464 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004465 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004466 break;
4467
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004468 case GL_PERSPECTIVE_CORRECTION_HINT:
4469 case GL_POINT_SMOOTH_HINT:
4470 case GL_LINE_SMOOTH_HINT:
4471 case GL_FOG_HINT:
4472 mGLState.gles1().setHint(target, mode);
4473 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004474 default:
4475 UNREACHABLE();
4476 return;
4477 }
4478}
4479
4480void Context::lineWidth(GLfloat width)
4481{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004482 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004483}
4484
4485void Context::pixelStorei(GLenum pname, GLint param)
4486{
4487 switch (pname)
4488 {
4489 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004490 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004491 break;
4492
4493 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004494 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004495 break;
4496
4497 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004498 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004499 break;
4500
4501 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004502 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004503 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004504 break;
4505
4506 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004507 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004508 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004509 break;
4510
4511 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004512 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004513 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004514 break;
4515
4516 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004517 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004518 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004519 break;
4520
4521 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004522 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004523 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004524 break;
4525
4526 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004527 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004528 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004529 break;
4530
4531 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004532 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004533 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004534 break;
4535
4536 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004537 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004538 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004539 break;
4540
4541 default:
4542 UNREACHABLE();
4543 return;
4544 }
4545}
4546
4547void Context::polygonOffset(GLfloat factor, GLfloat units)
4548{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004549 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004550}
4551
Jamie Madill876429b2017-04-20 15:46:24 -04004552void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004553{
Geoff Lang92019432017-11-20 13:09:34 -05004554 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004555}
4556
Jiawei Shaodb342272017-09-27 10:21:45 +08004557void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4558{
4559 mGLState.setSampleMaskParams(maskNumber, mask);
4560}
4561
Jamie Madillc20ab272016-06-09 07:20:46 -07004562void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4563{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004564 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004565}
4566
4567void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4568{
4569 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4570 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004571 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004572 }
4573
4574 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4575 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004576 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004577 }
4578}
4579
4580void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4581{
4582 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4583 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004584 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004585 }
4586
4587 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4588 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004589 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004590 }
4591}
4592
4593void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4594{
4595 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4596 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004597 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004598 }
4599
4600 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4601 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004602 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004603 }
4604}
4605
4606void Context::vertexAttrib1f(GLuint index, GLfloat x)
4607{
4608 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004609 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004610}
4611
4612void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4613{
4614 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004615 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004616}
4617
4618void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4619{
4620 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004621 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004622}
4623
4624void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4625{
4626 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004627 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004628}
4629
4630void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4631{
4632 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004633 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004634}
4635
4636void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4637{
4638 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004639 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004640}
4641
4642void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4643{
4644 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004645 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004646}
4647
4648void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4649{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004650 mGLState.setVertexAttribf(index, values);
Jamie Madillc20ab272016-06-09 07:20:46 -07004651}
4652
4653void Context::vertexAttribPointer(GLuint index,
4654 GLint size,
4655 GLenum type,
4656 GLboolean normalized,
4657 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004658 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004659{
Corentin Wallez336129f2017-10-17 15:55:40 -04004660 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004661 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004662 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004663}
4664
Shao80957d92017-02-20 21:25:59 +08004665void Context::vertexAttribFormat(GLuint attribIndex,
4666 GLint size,
4667 GLenum type,
4668 GLboolean normalized,
4669 GLuint relativeOffset)
4670{
Geoff Lang92019432017-11-20 13:09:34 -05004671 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004672 relativeOffset);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004673 mStateCache.onVertexArraySizeChange(this);
Shao80957d92017-02-20 21:25:59 +08004674}
4675
4676void Context::vertexAttribIFormat(GLuint attribIndex,
4677 GLint size,
4678 GLenum type,
4679 GLuint relativeOffset)
4680{
4681 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004682 mStateCache.onVertexArraySizeChange(this);
Shao80957d92017-02-20 21:25:59 +08004683}
4684
4685void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4686{
Shaodde78e82017-05-22 14:13:27 +08004687 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004688 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004689}
4690
Jiajia Qin5451d532017-11-16 17:16:34 +08004691void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004692{
4693 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004694 mStateCache.onVertexArraySizeChange(this);
Shao80957d92017-02-20 21:25:59 +08004695}
4696
Jamie Madillc20ab272016-06-09 07:20:46 -07004697void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4698{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004699 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004700}
4701
4702void Context::vertexAttribIPointer(GLuint index,
4703 GLint size,
4704 GLenum type,
4705 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004706 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004707{
Corentin Wallez336129f2017-10-17 15:55:40 -04004708 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4709 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004710 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004711}
4712
4713void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4714{
4715 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004716 mGLState.setVertexAttribi(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004717}
4718
4719void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4720{
4721 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004722 mGLState.setVertexAttribu(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004723}
4724
4725void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4726{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004727 mGLState.setVertexAttribi(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07004728}
4729
4730void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4731{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004732 mGLState.setVertexAttribu(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07004733}
4734
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004735void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4736{
4737 const VertexAttribCurrentValueData &currentValues =
4738 getGLState().getVertexAttribCurrentValue(index);
4739 const VertexArray *vao = getGLState().getVertexArray();
4740 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4741 currentValues, pname, params);
4742}
4743
Brandon Jones59770802018-04-02 13:18:42 -07004744void Context::getVertexAttribivRobust(GLuint index,
4745 GLenum pname,
4746 GLsizei bufSize,
4747 GLsizei *length,
4748 GLint *params)
4749{
4750 getVertexAttribiv(index, pname, params);
4751}
4752
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004753void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4754{
4755 const VertexAttribCurrentValueData &currentValues =
4756 getGLState().getVertexAttribCurrentValue(index);
4757 const VertexArray *vao = getGLState().getVertexArray();
4758 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4759 currentValues, pname, params);
4760}
4761
Brandon Jones59770802018-04-02 13:18:42 -07004762void Context::getVertexAttribfvRobust(GLuint index,
4763 GLenum pname,
4764 GLsizei bufSize,
4765 GLsizei *length,
4766 GLfloat *params)
4767{
4768 getVertexAttribfv(index, pname, params);
4769}
4770
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004771void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4772{
4773 const VertexAttribCurrentValueData &currentValues =
4774 getGLState().getVertexAttribCurrentValue(index);
4775 const VertexArray *vao = getGLState().getVertexArray();
4776 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4777 currentValues, pname, params);
4778}
4779
Brandon Jones59770802018-04-02 13:18:42 -07004780void Context::getVertexAttribIivRobust(GLuint index,
4781 GLenum pname,
4782 GLsizei bufSize,
4783 GLsizei *length,
4784 GLint *params)
4785{
4786 getVertexAttribIiv(index, pname, params);
4787}
4788
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004789void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4790{
4791 const VertexAttribCurrentValueData &currentValues =
4792 getGLState().getVertexAttribCurrentValue(index);
4793 const VertexArray *vao = getGLState().getVertexArray();
4794 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4795 currentValues, pname, params);
4796}
4797
Brandon Jones59770802018-04-02 13:18:42 -07004798void Context::getVertexAttribIuivRobust(GLuint index,
4799 GLenum pname,
4800 GLsizei bufSize,
4801 GLsizei *length,
4802 GLuint *params)
4803{
4804 getVertexAttribIuiv(index, pname, params);
4805}
4806
Jamie Madill876429b2017-04-20 15:46:24 -04004807void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004808{
4809 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4810 QueryVertexAttribPointerv(attrib, pname, pointer);
4811}
4812
Brandon Jones59770802018-04-02 13:18:42 -07004813void Context::getVertexAttribPointervRobust(GLuint index,
4814 GLenum pname,
4815 GLsizei bufSize,
4816 GLsizei *length,
4817 void **pointer)
4818{
4819 getVertexAttribPointerv(index, pname, pointer);
4820}
4821
Jamie Madillc20ab272016-06-09 07:20:46 -07004822void Context::debugMessageControl(GLenum source,
4823 GLenum type,
4824 GLenum severity,
4825 GLsizei count,
4826 const GLuint *ids,
4827 GLboolean enabled)
4828{
4829 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004830 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05004831 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07004832}
4833
4834void Context::debugMessageInsert(GLenum source,
4835 GLenum type,
4836 GLuint id,
4837 GLenum severity,
4838 GLsizei length,
4839 const GLchar *buf)
4840{
4841 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004842 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07004843}
4844
4845void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
4846{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004847 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07004848}
4849
4850GLuint Context::getDebugMessageLog(GLuint count,
4851 GLsizei bufSize,
4852 GLenum *sources,
4853 GLenum *types,
4854 GLuint *ids,
4855 GLenum *severities,
4856 GLsizei *lengths,
4857 GLchar *messageLog)
4858{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004859 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
4860 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07004861}
4862
4863void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
4864{
4865 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004866 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05004867 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07004868}
4869
4870void Context::popDebugGroup()
4871{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004872 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05004873 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07004874}
4875
Corentin Wallez336129f2017-10-17 15:55:40 -04004876void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04004877{
4878 Buffer *buffer = mGLState.getTargetBuffer(target);
4879 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004880 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04004881}
4882
Corentin Wallez336129f2017-10-17 15:55:40 -04004883void Context::bufferSubData(BufferBinding target,
4884 GLintptr offset,
4885 GLsizeiptr size,
4886 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04004887{
4888 if (data == nullptr)
4889 {
4890 return;
4891 }
4892
4893 Buffer *buffer = mGLState.getTargetBuffer(target);
4894 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004895 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04004896}
4897
Jamie Madillef300b12016-10-07 15:12:09 -04004898void Context::attachShader(GLuint program, GLuint shader)
4899{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05004900 Program *programObject = mState.mShaderPrograms->getProgram(program);
4901 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04004902 ASSERT(programObject && shaderObject);
4903 programObject->attachShader(shaderObject);
4904}
4905
Kenneth Russellf2f6f652016-10-05 19:53:23 -07004906const Workarounds &Context::getWorkarounds() const
4907{
4908 return mWorkarounds;
4909}
4910
Corentin Wallez336129f2017-10-17 15:55:40 -04004911void Context::copyBufferSubData(BufferBinding readTarget,
4912 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04004913 GLintptr readOffset,
4914 GLintptr writeOffset,
4915 GLsizeiptr size)
4916{
4917 // if size is zero, the copy is a successful no-op
4918 if (size == 0)
4919 {
4920 return;
4921 }
4922
4923 // TODO(jmadill): cache these.
4924 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
4925 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
4926
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004927 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04004928}
4929
Jamie Madill01a80ee2016-11-07 12:06:18 -05004930void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
4931{
4932 Program *programObject = getProgram(program);
4933 // TODO(jmadill): Re-use this from the validation if possible.
4934 ASSERT(programObject);
4935 programObject->bindAttributeLocation(index, name);
4936}
4937
Corentin Wallez336129f2017-10-17 15:55:40 -04004938void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004939{
Corentin Wallez336129f2017-10-17 15:55:40 -04004940 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4941 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004942}
4943
Corentin Wallez336129f2017-10-17 15:55:40 -04004944void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08004945{
4946 bindBufferRange(target, index, buffer, 0, 0);
4947}
4948
Corentin Wallez336129f2017-10-17 15:55:40 -04004949void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08004950 GLuint index,
4951 GLuint buffer,
4952 GLintptr offset,
4953 GLsizeiptr size)
4954{
Jamie Madill6d32cef2018-08-14 02:34:28 -04004955 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4956 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
4957 if (target == BufferBinding::Uniform)
4958 {
4959 mUniformBufferObserverBindings[index].bind(object ? object->getImplementation() : nullptr);
4960 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08004961}
4962
Jamie Madill01a80ee2016-11-07 12:06:18 -05004963void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
4964{
4965 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4966 {
4967 bindReadFramebuffer(framebuffer);
4968 }
4969
4970 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4971 {
4972 bindDrawFramebuffer(framebuffer);
4973 }
4974}
4975
4976void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
4977{
4978 ASSERT(target == GL_RENDERBUFFER);
4979 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05004980 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004981 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004982}
4983
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004984void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08004985 GLsizei samples,
4986 GLenum internalformat,
4987 GLsizei width,
4988 GLsizei height,
4989 GLboolean fixedsamplelocations)
4990{
4991 Extents size(width, height, 1);
4992 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004993 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
4994 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08004995}
4996
4997void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
4998{
JiangYizhou5b03f472017-01-09 10:22:53 +08004999 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5000 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005001 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005002 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005003
5004 switch (pname)
5005 {
5006 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005007 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005008 break;
5009 default:
5010 UNREACHABLE();
5011 }
5012}
5013
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005014void Context::getMultisamplefvRobust(GLenum pname,
5015 GLuint index,
5016 GLsizei bufSize,
5017 GLsizei *length,
5018 GLfloat *val)
5019{
5020 UNIMPLEMENTED();
5021}
5022
Jamie Madille8fb6402017-02-14 17:56:40 -05005023void Context::renderbufferStorage(GLenum target,
5024 GLenum internalformat,
5025 GLsizei width,
5026 GLsizei height)
5027{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005028 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5029 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5030
Jamie Madille8fb6402017-02-14 17:56:40 -05005031 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005032 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005033}
5034
5035void Context::renderbufferStorageMultisample(GLenum target,
5036 GLsizei samples,
5037 GLenum internalformat,
5038 GLsizei width,
5039 GLsizei height)
5040{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005041 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5042 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005043
5044 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005045 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005046 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005047}
5048
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005049void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5050{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005051 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005052 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005053}
5054
JiangYizhoue18e6392017-02-20 10:32:23 +08005055void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5056{
5057 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5058 QueryFramebufferParameteriv(framebuffer, pname, params);
5059}
5060
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005061void Context::getFramebufferParameterivRobust(GLenum target,
5062 GLenum pname,
5063 GLsizei bufSize,
5064 GLsizei *length,
5065 GLint *params)
5066{
5067 UNIMPLEMENTED();
5068}
5069
Jiajia Qin5451d532017-11-16 17:16:34 +08005070void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005071{
5072 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005073 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005074}
5075
Jamie Madilldec86232018-07-11 09:01:18 -04005076bool Context::getScratchBuffer(size_t requstedSizeBytes,
5077 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005078{
Jamie Madilldec86232018-07-11 09:01:18 -04005079 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005080}
5081
Jamie Madilldec86232018-07-11 09:01:18 -04005082bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5083 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005084{
Jamie Madilldec86232018-07-11 09:01:18 -04005085 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005086}
5087
Xinghua Cao10a4d432017-11-28 14:46:26 +08005088Error Context::prepareForDispatch()
5089{
Geoff Langa8cb2872018-03-09 16:09:40 -05005090 ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005091
5092 if (isRobustResourceInitEnabled())
5093 {
5094 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5095 }
5096
5097 return NoError();
5098}
5099
Xinghua Cao2b396592017-03-29 15:36:04 +08005100void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5101{
5102 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5103 {
5104 return;
5105 }
5106
Xinghua Cao10a4d432017-11-28 14:46:26 +08005107 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005108 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005109}
5110
Jiajia Qin5451d532017-11-16 17:16:34 +08005111void Context::dispatchComputeIndirect(GLintptr indirect)
5112{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005113 ANGLE_CONTEXT_TRY(prepareForDispatch());
5114 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005115}
5116
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005117void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005118 GLsizei levels,
5119 GLenum internalFormat,
5120 GLsizei width,
5121 GLsizei height)
5122{
5123 Extents size(width, height, 1);
5124 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005125 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005126}
5127
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005128void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005129 GLsizei levels,
5130 GLenum internalFormat,
5131 GLsizei width,
5132 GLsizei height,
5133 GLsizei depth)
5134{
5135 Extents size(width, height, depth);
5136 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005137 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005138}
5139
Jiajia Qin5451d532017-11-16 17:16:34 +08005140void Context::memoryBarrier(GLbitfield barriers)
5141{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005142 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005143}
5144
5145void Context::memoryBarrierByRegion(GLbitfield barriers)
5146{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005147 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005148}
5149
Jamie Madillc1d770e2017-04-13 17:31:24 -04005150GLenum Context::checkFramebufferStatus(GLenum target)
5151{
5152 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5153 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005154 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005155}
5156
5157void Context::compileShader(GLuint shader)
5158{
5159 Shader *shaderObject = GetValidShader(this, shader);
5160 if (!shaderObject)
5161 {
5162 return;
5163 }
5164 shaderObject->compile(this);
5165}
5166
5167void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5168{
5169 for (int i = 0; i < n; i++)
5170 {
5171 deleteBuffer(buffers[i]);
5172 }
5173}
5174
5175void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5176{
5177 for (int i = 0; i < n; i++)
5178 {
5179 if (framebuffers[i] != 0)
5180 {
5181 deleteFramebuffer(framebuffers[i]);
5182 }
5183 }
5184}
5185
5186void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5187{
5188 for (int i = 0; i < n; i++)
5189 {
5190 deleteRenderbuffer(renderbuffers[i]);
5191 }
5192}
5193
5194void Context::deleteTextures(GLsizei n, const GLuint *textures)
5195{
5196 for (int i = 0; i < n; i++)
5197 {
5198 if (textures[i] != 0)
5199 {
5200 deleteTexture(textures[i]);
5201 }
5202 }
5203}
5204
5205void Context::detachShader(GLuint program, GLuint shader)
5206{
5207 Program *programObject = getProgram(program);
5208 ASSERT(programObject);
5209
5210 Shader *shaderObject = getShader(shader);
5211 ASSERT(shaderObject);
5212
5213 programObject->detachShader(this, shaderObject);
5214}
5215
5216void Context::genBuffers(GLsizei n, GLuint *buffers)
5217{
5218 for (int i = 0; i < n; i++)
5219 {
5220 buffers[i] = createBuffer();
5221 }
5222}
5223
5224void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5225{
5226 for (int i = 0; i < n; i++)
5227 {
5228 framebuffers[i] = createFramebuffer();
5229 }
5230}
5231
5232void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5233{
5234 for (int i = 0; i < n; i++)
5235 {
5236 renderbuffers[i] = createRenderbuffer();
5237 }
5238}
5239
5240void Context::genTextures(GLsizei n, GLuint *textures)
5241{
5242 for (int i = 0; i < n; i++)
5243 {
5244 textures[i] = createTexture();
5245 }
5246}
5247
5248void Context::getActiveAttrib(GLuint program,
5249 GLuint index,
5250 GLsizei bufsize,
5251 GLsizei *length,
5252 GLint *size,
5253 GLenum *type,
5254 GLchar *name)
5255{
5256 Program *programObject = getProgram(program);
5257 ASSERT(programObject);
5258 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5259}
5260
5261void Context::getActiveUniform(GLuint program,
5262 GLuint index,
5263 GLsizei bufsize,
5264 GLsizei *length,
5265 GLint *size,
5266 GLenum *type,
5267 GLchar *name)
5268{
5269 Program *programObject = getProgram(program);
5270 ASSERT(programObject);
5271 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5272}
5273
5274void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5275{
5276 Program *programObject = getProgram(program);
5277 ASSERT(programObject);
5278 programObject->getAttachedShaders(maxcount, count, shaders);
5279}
5280
5281GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5282{
5283 Program *programObject = getProgram(program);
5284 ASSERT(programObject);
5285 return programObject->getAttributeLocation(name);
5286}
5287
5288void Context::getBooleanv(GLenum pname, GLboolean *params)
5289{
5290 GLenum nativeType;
5291 unsigned int numParams = 0;
5292 getQueryParameterInfo(pname, &nativeType, &numParams);
5293
5294 if (nativeType == GL_BOOL)
5295 {
5296 getBooleanvImpl(pname, params);
5297 }
5298 else
5299 {
5300 CastStateValues(this, nativeType, pname, numParams, params);
5301 }
5302}
5303
Brandon Jones59770802018-04-02 13:18:42 -07005304void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5305{
5306 getBooleanv(pname, params);
5307}
5308
Jamie Madillc1d770e2017-04-13 17:31:24 -04005309void Context::getFloatv(GLenum pname, GLfloat *params)
5310{
5311 GLenum nativeType;
5312 unsigned int numParams = 0;
5313 getQueryParameterInfo(pname, &nativeType, &numParams);
5314
5315 if (nativeType == GL_FLOAT)
5316 {
5317 getFloatvImpl(pname, params);
5318 }
5319 else
5320 {
5321 CastStateValues(this, nativeType, pname, numParams, params);
5322 }
5323}
5324
Brandon Jones59770802018-04-02 13:18:42 -07005325void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5326{
5327 getFloatv(pname, params);
5328}
5329
Jamie Madillc1d770e2017-04-13 17:31:24 -04005330void Context::getIntegerv(GLenum pname, GLint *params)
5331{
5332 GLenum nativeType;
5333 unsigned int numParams = 0;
5334 getQueryParameterInfo(pname, &nativeType, &numParams);
5335
5336 if (nativeType == GL_INT)
5337 {
5338 getIntegervImpl(pname, params);
5339 }
5340 else
5341 {
5342 CastStateValues(this, nativeType, pname, numParams, params);
5343 }
5344}
5345
Brandon Jones59770802018-04-02 13:18:42 -07005346void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5347{
5348 getIntegerv(pname, data);
5349}
5350
Jamie Madillc1d770e2017-04-13 17:31:24 -04005351void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5352{
5353 Program *programObject = getProgram(program);
5354 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005355 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005356}
5357
Brandon Jones59770802018-04-02 13:18:42 -07005358void Context::getProgramivRobust(GLuint program,
5359 GLenum pname,
5360 GLsizei bufSize,
5361 GLsizei *length,
5362 GLint *params)
5363{
5364 getProgramiv(program, pname, params);
5365}
5366
Jiajia Qin5451d532017-11-16 17:16:34 +08005367void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5368{
5369 UNIMPLEMENTED();
5370}
5371
Jamie Madillbe849e42017-05-02 15:49:00 -04005372void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005373{
5374 Program *programObject = getProgram(program);
5375 ASSERT(programObject);
5376 programObject->getInfoLog(bufsize, length, infolog);
5377}
5378
Jiajia Qin5451d532017-11-16 17:16:34 +08005379void Context::getProgramPipelineInfoLog(GLuint pipeline,
5380 GLsizei bufSize,
5381 GLsizei *length,
5382 GLchar *infoLog)
5383{
5384 UNIMPLEMENTED();
5385}
5386
Jamie Madillc1d770e2017-04-13 17:31:24 -04005387void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5388{
5389 Shader *shaderObject = getShader(shader);
5390 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005391 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005392}
5393
Brandon Jones59770802018-04-02 13:18:42 -07005394void Context::getShaderivRobust(GLuint shader,
5395 GLenum pname,
5396 GLsizei bufSize,
5397 GLsizei *length,
5398 GLint *params)
5399{
5400 getShaderiv(shader, pname, params);
5401}
5402
Jamie Madillc1d770e2017-04-13 17:31:24 -04005403void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5404{
5405 Shader *shaderObject = getShader(shader);
5406 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005407 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005408}
5409
5410void Context::getShaderPrecisionFormat(GLenum shadertype,
5411 GLenum precisiontype,
5412 GLint *range,
5413 GLint *precision)
5414{
5415 // TODO(jmadill): Compute shaders.
5416
5417 switch (shadertype)
5418 {
5419 case GL_VERTEX_SHADER:
5420 switch (precisiontype)
5421 {
5422 case GL_LOW_FLOAT:
5423 mCaps.vertexLowpFloat.get(range, precision);
5424 break;
5425 case GL_MEDIUM_FLOAT:
5426 mCaps.vertexMediumpFloat.get(range, precision);
5427 break;
5428 case GL_HIGH_FLOAT:
5429 mCaps.vertexHighpFloat.get(range, precision);
5430 break;
5431
5432 case GL_LOW_INT:
5433 mCaps.vertexLowpInt.get(range, precision);
5434 break;
5435 case GL_MEDIUM_INT:
5436 mCaps.vertexMediumpInt.get(range, precision);
5437 break;
5438 case GL_HIGH_INT:
5439 mCaps.vertexHighpInt.get(range, precision);
5440 break;
5441
5442 default:
5443 UNREACHABLE();
5444 return;
5445 }
5446 break;
5447
5448 case GL_FRAGMENT_SHADER:
5449 switch (precisiontype)
5450 {
5451 case GL_LOW_FLOAT:
5452 mCaps.fragmentLowpFloat.get(range, precision);
5453 break;
5454 case GL_MEDIUM_FLOAT:
5455 mCaps.fragmentMediumpFloat.get(range, precision);
5456 break;
5457 case GL_HIGH_FLOAT:
5458 mCaps.fragmentHighpFloat.get(range, precision);
5459 break;
5460
5461 case GL_LOW_INT:
5462 mCaps.fragmentLowpInt.get(range, precision);
5463 break;
5464 case GL_MEDIUM_INT:
5465 mCaps.fragmentMediumpInt.get(range, precision);
5466 break;
5467 case GL_HIGH_INT:
5468 mCaps.fragmentHighpInt.get(range, precision);
5469 break;
5470
5471 default:
5472 UNREACHABLE();
5473 return;
5474 }
5475 break;
5476
5477 default:
5478 UNREACHABLE();
5479 return;
5480 }
5481}
5482
5483void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5484{
5485 Shader *shaderObject = getShader(shader);
5486 ASSERT(shaderObject);
5487 shaderObject->getSource(bufsize, length, source);
5488}
5489
5490void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5491{
5492 Program *programObject = getProgram(program);
5493 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005494 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005495}
5496
Brandon Jones59770802018-04-02 13:18:42 -07005497void Context::getUniformfvRobust(GLuint program,
5498 GLint location,
5499 GLsizei bufSize,
5500 GLsizei *length,
5501 GLfloat *params)
5502{
5503 getUniformfv(program, location, params);
5504}
5505
Jamie Madillc1d770e2017-04-13 17:31:24 -04005506void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5507{
5508 Program *programObject = getProgram(program);
5509 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005510 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005511}
5512
Brandon Jones59770802018-04-02 13:18:42 -07005513void Context::getUniformivRobust(GLuint program,
5514 GLint location,
5515 GLsizei bufSize,
5516 GLsizei *length,
5517 GLint *params)
5518{
5519 getUniformiv(program, location, params);
5520}
5521
Jamie Madillc1d770e2017-04-13 17:31:24 -04005522GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5523{
5524 Program *programObject = getProgram(program);
5525 ASSERT(programObject);
5526 return programObject->getUniformLocation(name);
5527}
5528
5529GLboolean Context::isBuffer(GLuint buffer)
5530{
5531 if (buffer == 0)
5532 {
5533 return GL_FALSE;
5534 }
5535
5536 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5537}
5538
5539GLboolean Context::isEnabled(GLenum cap)
5540{
5541 return mGLState.getEnableFeature(cap);
5542}
5543
5544GLboolean Context::isFramebuffer(GLuint framebuffer)
5545{
5546 if (framebuffer == 0)
5547 {
5548 return GL_FALSE;
5549 }
5550
5551 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5552}
5553
5554GLboolean Context::isProgram(GLuint program)
5555{
5556 if (program == 0)
5557 {
5558 return GL_FALSE;
5559 }
5560
5561 return (getProgram(program) ? GL_TRUE : GL_FALSE);
5562}
5563
5564GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5565{
5566 if (renderbuffer == 0)
5567 {
5568 return GL_FALSE;
5569 }
5570
5571 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5572}
5573
5574GLboolean Context::isShader(GLuint shader)
5575{
5576 if (shader == 0)
5577 {
5578 return GL_FALSE;
5579 }
5580
5581 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5582}
5583
5584GLboolean Context::isTexture(GLuint texture)
5585{
5586 if (texture == 0)
5587 {
5588 return GL_FALSE;
5589 }
5590
5591 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5592}
5593
5594void Context::linkProgram(GLuint program)
5595{
5596 Program *programObject = getProgram(program);
5597 ASSERT(programObject);
5598 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08005599
5600 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
5601 // don't need to worry that:
5602 // 1. Draw calls after link use the new executable code or the old one depending on the link
5603 // result.
5604 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
5605 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
5606 // ProgramD3D.
5607 if (programObject->isInUse())
5608 {
5609 // isLinked() which forces to resolve linking, will be called.
5610 mGLState.onProgramExecutableChange(programObject);
5611 mStateCache.onProgramExecutableChange(this);
5612 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005613}
5614
5615void Context::releaseShaderCompiler()
5616{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005617 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005618}
5619
5620void Context::shaderBinary(GLsizei n,
5621 const GLuint *shaders,
5622 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005623 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005624 GLsizei length)
5625{
5626 // No binary shader formats are supported.
5627 UNIMPLEMENTED();
5628}
5629
5630void Context::shaderSource(GLuint shader,
5631 GLsizei count,
5632 const GLchar *const *string,
5633 const GLint *length)
5634{
5635 Shader *shaderObject = getShader(shader);
5636 ASSERT(shaderObject);
5637 shaderObject->setSource(count, string, length);
5638}
5639
5640void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5641{
5642 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5643}
5644
5645void Context::stencilMask(GLuint mask)
5646{
5647 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5648}
5649
5650void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5651{
5652 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5653}
5654
5655void Context::uniform1f(GLint location, GLfloat x)
5656{
5657 Program *program = mGLState.getProgram();
5658 program->setUniform1fv(location, 1, &x);
5659}
5660
5661void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5662{
5663 Program *program = mGLState.getProgram();
5664 program->setUniform1fv(location, count, v);
5665}
5666
Jamie Madill7e4eff12018-08-08 15:49:26 -04005667void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005668{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005669 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04005670 {
5671 mGLState.setObjectDirty(GL_PROGRAM);
5672 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005673}
5674
Jamie Madill7e4eff12018-08-08 15:49:26 -04005675void Context::uniform1i(GLint location, GLint x)
5676{
5677 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
5678}
5679
Jamie Madillc1d770e2017-04-13 17:31:24 -04005680void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5681{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005682 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005683}
5684
5685void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5686{
5687 GLfloat xy[2] = {x, y};
5688 Program *program = mGLState.getProgram();
5689 program->setUniform2fv(location, 1, xy);
5690}
5691
5692void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5693{
5694 Program *program = mGLState.getProgram();
5695 program->setUniform2fv(location, count, v);
5696}
5697
5698void Context::uniform2i(GLint location, GLint x, GLint y)
5699{
5700 GLint xy[2] = {x, y};
5701 Program *program = mGLState.getProgram();
5702 program->setUniform2iv(location, 1, xy);
5703}
5704
5705void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
5706{
5707 Program *program = mGLState.getProgram();
5708 program->setUniform2iv(location, count, v);
5709}
5710
5711void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5712{
5713 GLfloat xyz[3] = {x, y, z};
5714 Program *program = mGLState.getProgram();
5715 program->setUniform3fv(location, 1, xyz);
5716}
5717
5718void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
5719{
5720 Program *program = mGLState.getProgram();
5721 program->setUniform3fv(location, count, v);
5722}
5723
5724void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
5725{
5726 GLint xyz[3] = {x, y, z};
5727 Program *program = mGLState.getProgram();
5728 program->setUniform3iv(location, 1, xyz);
5729}
5730
5731void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
5732{
5733 Program *program = mGLState.getProgram();
5734 program->setUniform3iv(location, count, v);
5735}
5736
5737void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5738{
5739 GLfloat xyzw[4] = {x, y, z, w};
5740 Program *program = mGLState.getProgram();
5741 program->setUniform4fv(location, 1, xyzw);
5742}
5743
5744void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
5745{
5746 Program *program = mGLState.getProgram();
5747 program->setUniform4fv(location, count, v);
5748}
5749
5750void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5751{
5752 GLint xyzw[4] = {x, y, z, w};
5753 Program *program = mGLState.getProgram();
5754 program->setUniform4iv(location, 1, xyzw);
5755}
5756
5757void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
5758{
5759 Program *program = mGLState.getProgram();
5760 program->setUniform4iv(location, count, v);
5761}
5762
5763void Context::uniformMatrix2fv(GLint location,
5764 GLsizei count,
5765 GLboolean transpose,
5766 const GLfloat *value)
5767{
5768 Program *program = mGLState.getProgram();
5769 program->setUniformMatrix2fv(location, count, transpose, value);
5770}
5771
5772void Context::uniformMatrix3fv(GLint location,
5773 GLsizei count,
5774 GLboolean transpose,
5775 const GLfloat *value)
5776{
5777 Program *program = mGLState.getProgram();
5778 program->setUniformMatrix3fv(location, count, transpose, value);
5779}
5780
5781void Context::uniformMatrix4fv(GLint location,
5782 GLsizei count,
5783 GLboolean transpose,
5784 const GLfloat *value)
5785{
5786 Program *program = mGLState.getProgram();
5787 program->setUniformMatrix4fv(location, count, transpose, value);
5788}
5789
5790void Context::validateProgram(GLuint program)
5791{
5792 Program *programObject = getProgram(program);
5793 ASSERT(programObject);
5794 programObject->validate(mCaps);
5795}
5796
Jiajia Qin5451d532017-11-16 17:16:34 +08005797void Context::validateProgramPipeline(GLuint pipeline)
5798{
5799 UNIMPLEMENTED();
5800}
5801
Jamie Madilld04908b2017-06-09 14:15:35 -04005802void Context::getProgramBinary(GLuint program,
5803 GLsizei bufSize,
5804 GLsizei *length,
5805 GLenum *binaryFormat,
5806 void *binary)
5807{
5808 Program *programObject = getProgram(program);
5809 ASSERT(programObject != nullptr);
5810
5811 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
5812}
5813
5814void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
5815{
5816 Program *programObject = getProgram(program);
5817 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04005818
Jamie Madilld04908b2017-06-09 14:15:35 -04005819 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madillc43cdad2018-08-08 15:49:25 -04005820 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04005821 if (programObject->isInUse())
5822 {
5823 mGLState.setObjectDirty(GL_PROGRAM);
5824 }
Jamie Madilld04908b2017-06-09 14:15:35 -04005825}
5826
Jamie Madillff325f12017-08-26 15:06:05 -04005827void Context::uniform1ui(GLint location, GLuint v0)
5828{
5829 Program *program = mGLState.getProgram();
5830 program->setUniform1uiv(location, 1, &v0);
5831}
5832
5833void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
5834{
5835 Program *program = mGLState.getProgram();
5836 const GLuint xy[] = {v0, v1};
5837 program->setUniform2uiv(location, 1, xy);
5838}
5839
5840void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
5841{
5842 Program *program = mGLState.getProgram();
5843 const GLuint xyz[] = {v0, v1, v2};
5844 program->setUniform3uiv(location, 1, xyz);
5845}
5846
5847void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
5848{
5849 Program *program = mGLState.getProgram();
5850 const GLuint xyzw[] = {v0, v1, v2, v3};
5851 program->setUniform4uiv(location, 1, xyzw);
5852}
5853
5854void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
5855{
5856 Program *program = mGLState.getProgram();
5857 program->setUniform1uiv(location, count, value);
5858}
5859void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
5860{
5861 Program *program = mGLState.getProgram();
5862 program->setUniform2uiv(location, count, value);
5863}
5864
5865void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
5866{
5867 Program *program = mGLState.getProgram();
5868 program->setUniform3uiv(location, count, value);
5869}
5870
5871void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
5872{
5873 Program *program = mGLState.getProgram();
5874 program->setUniform4uiv(location, count, value);
5875}
5876
Jamie Madillf0e04492017-08-26 15:28:42 -04005877void Context::genQueries(GLsizei n, GLuint *ids)
5878{
5879 for (GLsizei i = 0; i < n; i++)
5880 {
5881 GLuint handle = mQueryHandleAllocator.allocate();
5882 mQueryMap.assign(handle, nullptr);
5883 ids[i] = handle;
5884 }
5885}
5886
5887void Context::deleteQueries(GLsizei n, const GLuint *ids)
5888{
5889 for (int i = 0; i < n; i++)
5890 {
5891 GLuint query = ids[i];
5892
5893 Query *queryObject = nullptr;
5894 if (mQueryMap.erase(query, &queryObject))
5895 {
5896 mQueryHandleAllocator.release(query);
5897 if (queryObject)
5898 {
5899 queryObject->release(this);
5900 }
5901 }
5902 }
5903}
5904
5905GLboolean Context::isQuery(GLuint id)
5906{
Corentin Wallezad3ae902018-03-09 13:40:42 -05005907 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04005908}
5909
Jamie Madillc8c95812017-08-26 18:40:09 -04005910void Context::uniformMatrix2x3fv(GLint location,
5911 GLsizei count,
5912 GLboolean transpose,
5913 const GLfloat *value)
5914{
5915 Program *program = mGLState.getProgram();
5916 program->setUniformMatrix2x3fv(location, count, transpose, value);
5917}
5918
5919void Context::uniformMatrix3x2fv(GLint location,
5920 GLsizei count,
5921 GLboolean transpose,
5922 const GLfloat *value)
5923{
5924 Program *program = mGLState.getProgram();
5925 program->setUniformMatrix3x2fv(location, count, transpose, value);
5926}
5927
5928void Context::uniformMatrix2x4fv(GLint location,
5929 GLsizei count,
5930 GLboolean transpose,
5931 const GLfloat *value)
5932{
5933 Program *program = mGLState.getProgram();
5934 program->setUniformMatrix2x4fv(location, count, transpose, value);
5935}
5936
5937void Context::uniformMatrix4x2fv(GLint location,
5938 GLsizei count,
5939 GLboolean transpose,
5940 const GLfloat *value)
5941{
5942 Program *program = mGLState.getProgram();
5943 program->setUniformMatrix4x2fv(location, count, transpose, value);
5944}
5945
5946void Context::uniformMatrix3x4fv(GLint location,
5947 GLsizei count,
5948 GLboolean transpose,
5949 const GLfloat *value)
5950{
5951 Program *program = mGLState.getProgram();
5952 program->setUniformMatrix3x4fv(location, count, transpose, value);
5953}
5954
5955void Context::uniformMatrix4x3fv(GLint location,
5956 GLsizei count,
5957 GLboolean transpose,
5958 const GLfloat *value)
5959{
5960 Program *program = mGLState.getProgram();
5961 program->setUniformMatrix4x3fv(location, count, transpose, value);
5962}
5963
Jamie Madilld7576732017-08-26 18:49:50 -04005964void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
5965{
5966 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5967 {
5968 GLuint vertexArray = arrays[arrayIndex];
5969
5970 if (arrays[arrayIndex] != 0)
5971 {
5972 VertexArray *vertexArrayObject = nullptr;
5973 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
5974 {
5975 if (vertexArrayObject != nullptr)
5976 {
5977 detachVertexArray(vertexArray);
5978 vertexArrayObject->onDestroy(this);
5979 }
5980
5981 mVertexArrayHandleAllocator.release(vertexArray);
5982 }
5983 }
5984 }
5985}
5986
5987void Context::genVertexArrays(GLsizei n, GLuint *arrays)
5988{
5989 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5990 {
5991 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
5992 mVertexArrayMap.assign(vertexArray, nullptr);
5993 arrays[arrayIndex] = vertexArray;
5994 }
5995}
5996
5997bool Context::isVertexArray(GLuint array)
5998{
5999 if (array == 0)
6000 {
6001 return GL_FALSE;
6002 }
6003
6004 VertexArray *vao = getVertexArray(array);
6005 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6006}
6007
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006008void Context::endTransformFeedback()
6009{
6010 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6011 transformFeedback->end(this);
6012}
6013
6014void Context::transformFeedbackVaryings(GLuint program,
6015 GLsizei count,
6016 const GLchar *const *varyings,
6017 GLenum bufferMode)
6018{
6019 Program *programObject = getProgram(program);
6020 ASSERT(programObject);
6021 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6022}
6023
6024void Context::getTransformFeedbackVarying(GLuint program,
6025 GLuint index,
6026 GLsizei bufSize,
6027 GLsizei *length,
6028 GLsizei *size,
6029 GLenum *type,
6030 GLchar *name)
6031{
6032 Program *programObject = getProgram(program);
6033 ASSERT(programObject);
6034 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6035}
6036
6037void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6038{
6039 for (int i = 0; i < n; i++)
6040 {
6041 GLuint transformFeedback = ids[i];
6042 if (transformFeedback == 0)
6043 {
6044 continue;
6045 }
6046
6047 TransformFeedback *transformFeedbackObject = nullptr;
6048 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6049 {
6050 if (transformFeedbackObject != nullptr)
6051 {
6052 detachTransformFeedback(transformFeedback);
6053 transformFeedbackObject->release(this);
6054 }
6055
6056 mTransformFeedbackHandleAllocator.release(transformFeedback);
6057 }
6058 }
6059}
6060
6061void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6062{
6063 for (int i = 0; i < n; i++)
6064 {
6065 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6066 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6067 ids[i] = transformFeedback;
6068 }
6069}
6070
6071bool Context::isTransformFeedback(GLuint id)
6072{
6073 if (id == 0)
6074 {
6075 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6076 // returns FALSE
6077 return GL_FALSE;
6078 }
6079
6080 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6081 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6082}
6083
6084void Context::pauseTransformFeedback()
6085{
6086 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6087 transformFeedback->pause();
6088}
6089
6090void Context::resumeTransformFeedback()
6091{
6092 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6093 transformFeedback->resume();
6094}
6095
Jamie Madill12e957f2017-08-26 21:42:26 -04006096void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6097{
6098 const Program *programObject = getProgram(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006099 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006100}
6101
Brandon Jones59770802018-04-02 13:18:42 -07006102void Context::getUniformuivRobust(GLuint program,
6103 GLint location,
6104 GLsizei bufSize,
6105 GLsizei *length,
6106 GLuint *params)
6107{
6108 getUniformuiv(program, location, params);
6109}
6110
Jamie Madill12e957f2017-08-26 21:42:26 -04006111GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6112{
6113 const Program *programObject = getProgram(program);
6114 return programObject->getFragDataLocation(name);
6115}
6116
6117void Context::getUniformIndices(GLuint program,
6118 GLsizei uniformCount,
6119 const GLchar *const *uniformNames,
6120 GLuint *uniformIndices)
6121{
6122 const Program *programObject = getProgram(program);
6123 if (!programObject->isLinked())
6124 {
6125 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6126 {
6127 uniformIndices[uniformId] = GL_INVALID_INDEX;
6128 }
6129 }
6130 else
6131 {
6132 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6133 {
6134 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6135 }
6136 }
6137}
6138
6139void Context::getActiveUniformsiv(GLuint program,
6140 GLsizei uniformCount,
6141 const GLuint *uniformIndices,
6142 GLenum pname,
6143 GLint *params)
6144{
6145 const Program *programObject = getProgram(program);
6146 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6147 {
6148 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006149 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006150 }
6151}
6152
6153GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6154{
6155 const Program *programObject = getProgram(program);
6156 return programObject->getUniformBlockIndex(uniformBlockName);
6157}
6158
6159void Context::getActiveUniformBlockiv(GLuint program,
6160 GLuint uniformBlockIndex,
6161 GLenum pname,
6162 GLint *params)
6163{
6164 const Program *programObject = getProgram(program);
6165 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6166}
6167
Brandon Jones59770802018-04-02 13:18:42 -07006168void Context::getActiveUniformBlockivRobust(GLuint program,
6169 GLuint uniformBlockIndex,
6170 GLenum pname,
6171 GLsizei bufSize,
6172 GLsizei *length,
6173 GLint *params)
6174{
6175 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6176}
6177
Jamie Madill12e957f2017-08-26 21:42:26 -04006178void Context::getActiveUniformBlockName(GLuint program,
6179 GLuint uniformBlockIndex,
6180 GLsizei bufSize,
6181 GLsizei *length,
6182 GLchar *uniformBlockName)
6183{
6184 const Program *programObject = getProgram(program);
6185 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6186}
6187
6188void Context::uniformBlockBinding(GLuint program,
6189 GLuint uniformBlockIndex,
6190 GLuint uniformBlockBinding)
6191{
6192 Program *programObject = getProgram(program);
6193 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006194
6195 if (programObject->isInUse())
6196 {
6197 mGLState.setObjectDirty(GL_PROGRAM);
6198 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006199}
6200
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006201GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6202{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006203 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6204 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006205
Jamie Madill70b5bb02017-08-28 13:32:37 -04006206 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006207 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006208 if (error.isError())
6209 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006210 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006211 handleError(error);
6212 return nullptr;
6213 }
6214
Jamie Madill70b5bb02017-08-28 13:32:37 -04006215 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006216}
6217
6218GLboolean Context::isSync(GLsync sync)
6219{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006220 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006221}
6222
6223GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6224{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006225 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006226
6227 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006228 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006229 return result;
6230}
6231
6232void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6233{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006234 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006235 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006236}
6237
6238void Context::getInteger64v(GLenum pname, GLint64 *params)
6239{
6240 GLenum nativeType = GL_NONE;
6241 unsigned int numParams = 0;
6242 getQueryParameterInfo(pname, &nativeType, &numParams);
6243
6244 if (nativeType == GL_INT_64_ANGLEX)
6245 {
6246 getInteger64vImpl(pname, params);
6247 }
6248 else
6249 {
6250 CastStateValues(this, nativeType, pname, numParams, params);
6251 }
6252}
6253
Brandon Jones59770802018-04-02 13:18:42 -07006254void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6255{
6256 getInteger64v(pname, data);
6257}
6258
Corentin Wallez336129f2017-10-17 15:55:40 -04006259void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006260{
6261 Buffer *buffer = mGLState.getTargetBuffer(target);
6262 QueryBufferParameteri64v(buffer, pname, params);
6263}
6264
Brandon Jones59770802018-04-02 13:18:42 -07006265void Context::getBufferParameteri64vRobust(BufferBinding target,
6266 GLenum pname,
6267 GLsizei bufSize,
6268 GLsizei *length,
6269 GLint64 *params)
6270{
6271 getBufferParameteri64v(target, pname, params);
6272}
6273
Jamie Madill3ef140a2017-08-26 23:11:21 -04006274void Context::genSamplers(GLsizei count, GLuint *samplers)
6275{
6276 for (int i = 0; i < count; i++)
6277 {
6278 samplers[i] = mState.mSamplers->createSampler();
6279 }
6280}
6281
6282void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6283{
6284 for (int i = 0; i < count; i++)
6285 {
6286 GLuint sampler = samplers[i];
6287
6288 if (mState.mSamplers->getSampler(sampler))
6289 {
6290 detachSampler(sampler);
6291 }
6292
6293 mState.mSamplers->deleteObject(this, sampler);
6294 }
6295}
6296
6297void Context::getInternalformativ(GLenum target,
6298 GLenum internalformat,
6299 GLenum pname,
6300 GLsizei bufSize,
6301 GLint *params)
6302{
6303 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6304 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6305}
6306
Brandon Jones59770802018-04-02 13:18:42 -07006307void Context::getInternalformativRobust(GLenum target,
6308 GLenum internalformat,
6309 GLenum pname,
6310 GLsizei bufSize,
6311 GLsizei *length,
6312 GLint *params)
6313{
6314 getInternalformativ(target, internalformat, pname, bufSize, params);
6315}
6316
Jiajia Qin5451d532017-11-16 17:16:34 +08006317void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6318{
6319 programUniform1iv(program, location, 1, &v0);
6320}
6321
6322void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6323{
6324 GLint xy[2] = {v0, v1};
6325 programUniform2iv(program, location, 1, xy);
6326}
6327
6328void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6329{
6330 GLint xyz[3] = {v0, v1, v2};
6331 programUniform3iv(program, location, 1, xyz);
6332}
6333
6334void Context::programUniform4i(GLuint program,
6335 GLint location,
6336 GLint v0,
6337 GLint v1,
6338 GLint v2,
6339 GLint v3)
6340{
6341 GLint xyzw[4] = {v0, v1, v2, v3};
6342 programUniform4iv(program, location, 1, xyzw);
6343}
6344
6345void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6346{
6347 programUniform1uiv(program, location, 1, &v0);
6348}
6349
6350void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6351{
6352 GLuint xy[2] = {v0, v1};
6353 programUniform2uiv(program, location, 1, xy);
6354}
6355
6356void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6357{
6358 GLuint xyz[3] = {v0, v1, v2};
6359 programUniform3uiv(program, location, 1, xyz);
6360}
6361
6362void Context::programUniform4ui(GLuint program,
6363 GLint location,
6364 GLuint v0,
6365 GLuint v1,
6366 GLuint v2,
6367 GLuint v3)
6368{
6369 GLuint xyzw[4] = {v0, v1, v2, v3};
6370 programUniform4uiv(program, location, 1, xyzw);
6371}
6372
6373void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6374{
6375 programUniform1fv(program, location, 1, &v0);
6376}
6377
6378void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6379{
6380 GLfloat xy[2] = {v0, v1};
6381 programUniform2fv(program, location, 1, xy);
6382}
6383
6384void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6385{
6386 GLfloat xyz[3] = {v0, v1, v2};
6387 programUniform3fv(program, location, 1, xyz);
6388}
6389
6390void Context::programUniform4f(GLuint program,
6391 GLint location,
6392 GLfloat v0,
6393 GLfloat v1,
6394 GLfloat v2,
6395 GLfloat v3)
6396{
6397 GLfloat xyzw[4] = {v0, v1, v2, v3};
6398 programUniform4fv(program, location, 1, xyzw);
6399}
6400
Jamie Madill81c2e252017-09-09 23:32:46 -04006401void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6402{
6403 Program *programObject = getProgram(program);
6404 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006405 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006406}
6407
Jiajia Qin5451d532017-11-16 17:16:34 +08006408void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6409{
6410 Program *programObject = getProgram(program);
6411 ASSERT(programObject);
6412 programObject->setUniform2iv(location, count, value);
6413}
6414
6415void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6416{
6417 Program *programObject = getProgram(program);
6418 ASSERT(programObject);
6419 programObject->setUniform3iv(location, count, value);
6420}
6421
6422void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6423{
6424 Program *programObject = getProgram(program);
6425 ASSERT(programObject);
6426 programObject->setUniform4iv(location, count, value);
6427}
6428
6429void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6430{
6431 Program *programObject = getProgram(program);
6432 ASSERT(programObject);
6433 programObject->setUniform1uiv(location, count, value);
6434}
6435
6436void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6437{
6438 Program *programObject = getProgram(program);
6439 ASSERT(programObject);
6440 programObject->setUniform2uiv(location, count, value);
6441}
6442
6443void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6444{
6445 Program *programObject = getProgram(program);
6446 ASSERT(programObject);
6447 programObject->setUniform3uiv(location, count, value);
6448}
6449
6450void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6451{
6452 Program *programObject = getProgram(program);
6453 ASSERT(programObject);
6454 programObject->setUniform4uiv(location, count, value);
6455}
6456
6457void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6458{
6459 Program *programObject = getProgram(program);
6460 ASSERT(programObject);
6461 programObject->setUniform1fv(location, count, value);
6462}
6463
6464void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6465{
6466 Program *programObject = getProgram(program);
6467 ASSERT(programObject);
6468 programObject->setUniform2fv(location, count, value);
6469}
6470
6471void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6472{
6473 Program *programObject = getProgram(program);
6474 ASSERT(programObject);
6475 programObject->setUniform3fv(location, count, value);
6476}
6477
6478void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6479{
6480 Program *programObject = getProgram(program);
6481 ASSERT(programObject);
6482 programObject->setUniform4fv(location, count, value);
6483}
6484
6485void Context::programUniformMatrix2fv(GLuint program,
6486 GLint location,
6487 GLsizei count,
6488 GLboolean transpose,
6489 const GLfloat *value)
6490{
6491 Program *programObject = getProgram(program);
6492 ASSERT(programObject);
6493 programObject->setUniformMatrix2fv(location, count, transpose, value);
6494}
6495
6496void Context::programUniformMatrix3fv(GLuint program,
6497 GLint location,
6498 GLsizei count,
6499 GLboolean transpose,
6500 const GLfloat *value)
6501{
6502 Program *programObject = getProgram(program);
6503 ASSERT(programObject);
6504 programObject->setUniformMatrix3fv(location, count, transpose, value);
6505}
6506
6507void Context::programUniformMatrix4fv(GLuint program,
6508 GLint location,
6509 GLsizei count,
6510 GLboolean transpose,
6511 const GLfloat *value)
6512{
6513 Program *programObject = getProgram(program);
6514 ASSERT(programObject);
6515 programObject->setUniformMatrix4fv(location, count, transpose, value);
6516}
6517
6518void Context::programUniformMatrix2x3fv(GLuint program,
6519 GLint location,
6520 GLsizei count,
6521 GLboolean transpose,
6522 const GLfloat *value)
6523{
6524 Program *programObject = getProgram(program);
6525 ASSERT(programObject);
6526 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6527}
6528
6529void Context::programUniformMatrix3x2fv(GLuint program,
6530 GLint location,
6531 GLsizei count,
6532 GLboolean transpose,
6533 const GLfloat *value)
6534{
6535 Program *programObject = getProgram(program);
6536 ASSERT(programObject);
6537 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6538}
6539
6540void Context::programUniformMatrix2x4fv(GLuint program,
6541 GLint location,
6542 GLsizei count,
6543 GLboolean transpose,
6544 const GLfloat *value)
6545{
6546 Program *programObject = getProgram(program);
6547 ASSERT(programObject);
6548 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6549}
6550
6551void Context::programUniformMatrix4x2fv(GLuint program,
6552 GLint location,
6553 GLsizei count,
6554 GLboolean transpose,
6555 const GLfloat *value)
6556{
6557 Program *programObject = getProgram(program);
6558 ASSERT(programObject);
6559 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6560}
6561
6562void Context::programUniformMatrix3x4fv(GLuint program,
6563 GLint location,
6564 GLsizei count,
6565 GLboolean transpose,
6566 const GLfloat *value)
6567{
6568 Program *programObject = getProgram(program);
6569 ASSERT(programObject);
6570 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6571}
6572
6573void Context::programUniformMatrix4x3fv(GLuint program,
6574 GLint location,
6575 GLsizei count,
6576 GLboolean transpose,
6577 const GLfloat *value)
6578{
6579 Program *programObject = getProgram(program);
6580 ASSERT(programObject);
6581 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6582}
6583
Jamie Madill81c2e252017-09-09 23:32:46 -04006584void Context::onTextureChange(const Texture *texture)
6585{
6586 // Conservatively assume all textures are dirty.
6587 // TODO(jmadill): More fine-grained update.
6588 mGLState.setObjectDirty(GL_TEXTURE);
6589}
6590
James Darpiniane8a93c62018-01-04 18:02:24 -08006591bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6592{
6593 return mGLState.isCurrentTransformFeedback(tf);
6594}
James Darpiniane8a93c62018-01-04 18:02:24 -08006595
Yunchao Hea336b902017-08-02 16:05:21 +08006596void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6597{
6598 for (int i = 0; i < count; i++)
6599 {
6600 pipelines[i] = createProgramPipeline();
6601 }
6602}
6603
6604void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6605{
6606 for (int i = 0; i < count; i++)
6607 {
6608 if (pipelines[i] != 0)
6609 {
6610 deleteProgramPipeline(pipelines[i]);
6611 }
6612 }
6613}
6614
6615GLboolean Context::isProgramPipeline(GLuint pipeline)
6616{
6617 if (pipeline == 0)
6618 {
6619 return GL_FALSE;
6620 }
6621
6622 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6623}
6624
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006625void Context::finishFenceNV(GLuint fence)
6626{
6627 FenceNV *fenceObject = getFenceNV(fence);
6628
6629 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04006630 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006631}
6632
6633void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6634{
6635 FenceNV *fenceObject = getFenceNV(fence);
6636
6637 ASSERT(fenceObject && fenceObject->isSet());
6638
6639 switch (pname)
6640 {
6641 case GL_FENCE_STATUS_NV:
6642 {
6643 // GL_NV_fence spec:
6644 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6645 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6646 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6647 GLboolean status = GL_TRUE;
6648 if (fenceObject->getStatus() != GL_TRUE)
6649 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006650 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006651 }
6652 *params = status;
6653 break;
6654 }
6655
6656 case GL_FENCE_CONDITION_NV:
6657 {
6658 *params = static_cast<GLint>(fenceObject->getCondition());
6659 break;
6660 }
6661
6662 default:
6663 UNREACHABLE();
6664 }
6665}
6666
6667void Context::getTranslatedShaderSource(GLuint shader,
6668 GLsizei bufsize,
6669 GLsizei *length,
6670 GLchar *source)
6671{
6672 Shader *shaderObject = getShader(shader);
6673 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08006674 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006675}
6676
6677void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6678{
6679 Program *programObject = getProgram(program);
6680 ASSERT(programObject);
6681
6682 programObject->getUniformfv(this, location, params);
6683}
6684
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006685void Context::getnUniformfvRobust(GLuint program,
6686 GLint location,
6687 GLsizei bufSize,
6688 GLsizei *length,
6689 GLfloat *params)
6690{
6691 UNIMPLEMENTED();
6692}
6693
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006694void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
6695{
6696 Program *programObject = getProgram(program);
6697 ASSERT(programObject);
6698
6699 programObject->getUniformiv(this, location, params);
6700}
6701
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006702void Context::getnUniformivRobust(GLuint program,
6703 GLint location,
6704 GLsizei bufSize,
6705 GLsizei *length,
6706 GLint *params)
6707{
6708 UNIMPLEMENTED();
6709}
6710
6711void Context::getnUniformuivRobust(GLuint program,
6712 GLint location,
6713 GLsizei bufSize,
6714 GLsizei *length,
6715 GLuint *params)
6716{
6717 UNIMPLEMENTED();
6718}
6719
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006720GLboolean Context::isFenceNV(GLuint fence)
6721{
6722 FenceNV *fenceObject = getFenceNV(fence);
6723
6724 if (fenceObject == nullptr)
6725 {
6726 return GL_FALSE;
6727 }
6728
6729 // GL_NV_fence spec:
6730 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
6731 // existing fence.
6732 return fenceObject->isSet();
6733}
6734
6735void Context::readnPixels(GLint x,
6736 GLint y,
6737 GLsizei width,
6738 GLsizei height,
6739 GLenum format,
6740 GLenum type,
6741 GLsizei bufSize,
6742 void *data)
6743{
6744 return readPixels(x, y, width, height, format, type, data);
6745}
6746
Jamie Madill007530e2017-12-28 14:27:04 -05006747void Context::setFenceNV(GLuint fence, GLenum condition)
6748{
6749 ASSERT(condition == GL_ALL_COMPLETED_NV);
6750
6751 FenceNV *fenceObject = getFenceNV(fence);
6752 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04006753 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05006754}
6755
6756GLboolean Context::testFenceNV(GLuint fence)
6757{
6758 FenceNV *fenceObject = getFenceNV(fence);
6759
6760 ASSERT(fenceObject != nullptr);
6761 ASSERT(fenceObject->isSet() == GL_TRUE);
6762
6763 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04006764 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05006765 if (error.isError())
6766 {
6767 handleError(error);
6768 return GL_TRUE;
6769 }
6770
6771 return result;
6772}
6773
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006774void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006775{
6776 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07006777 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05006778 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05006779}
6780
Jamie Madillfa920eb2018-01-04 11:45:50 -05006781void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006782{
6783 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07006784 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05006785 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
6786}
6787
Jamie Madillfa920eb2018-01-04 11:45:50 -05006788void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
6789{
6790 UNIMPLEMENTED();
6791}
6792
Jamie Madill5b772312018-03-08 20:28:32 -05006793bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
6794{
6795 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
6796 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
6797 // to the fact that it is stored internally as a float, and so would require conversion
6798 // if returned from Context::getIntegerv. Since this conversion is already implemented
6799 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
6800 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
6801 // application.
6802 switch (pname)
6803 {
6804 case GL_COMPRESSED_TEXTURE_FORMATS:
6805 {
6806 *type = GL_INT;
6807 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
6808 return true;
6809 }
6810 case GL_SHADER_BINARY_FORMATS:
6811 {
6812 *type = GL_INT;
6813 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
6814 return true;
6815 }
6816
6817 case GL_MAX_VERTEX_ATTRIBS:
6818 case GL_MAX_VERTEX_UNIFORM_VECTORS:
6819 case GL_MAX_VARYING_VECTORS:
6820 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
6821 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
6822 case GL_MAX_TEXTURE_IMAGE_UNITS:
6823 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
6824 case GL_MAX_RENDERBUFFER_SIZE:
6825 case GL_NUM_SHADER_BINARY_FORMATS:
6826 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
6827 case GL_ARRAY_BUFFER_BINDING:
6828 case GL_FRAMEBUFFER_BINDING:
6829 case GL_RENDERBUFFER_BINDING:
6830 case GL_CURRENT_PROGRAM:
6831 case GL_PACK_ALIGNMENT:
6832 case GL_UNPACK_ALIGNMENT:
6833 case GL_GENERATE_MIPMAP_HINT:
6834 case GL_RED_BITS:
6835 case GL_GREEN_BITS:
6836 case GL_BLUE_BITS:
6837 case GL_ALPHA_BITS:
6838 case GL_DEPTH_BITS:
6839 case GL_STENCIL_BITS:
6840 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
6841 case GL_CULL_FACE_MODE:
6842 case GL_FRONT_FACE:
6843 case GL_ACTIVE_TEXTURE:
6844 case GL_STENCIL_FUNC:
6845 case GL_STENCIL_VALUE_MASK:
6846 case GL_STENCIL_REF:
6847 case GL_STENCIL_FAIL:
6848 case GL_STENCIL_PASS_DEPTH_FAIL:
6849 case GL_STENCIL_PASS_DEPTH_PASS:
6850 case GL_STENCIL_BACK_FUNC:
6851 case GL_STENCIL_BACK_VALUE_MASK:
6852 case GL_STENCIL_BACK_REF:
6853 case GL_STENCIL_BACK_FAIL:
6854 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
6855 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
6856 case GL_DEPTH_FUNC:
6857 case GL_BLEND_SRC_RGB:
6858 case GL_BLEND_SRC_ALPHA:
6859 case GL_BLEND_DST_RGB:
6860 case GL_BLEND_DST_ALPHA:
6861 case GL_BLEND_EQUATION_RGB:
6862 case GL_BLEND_EQUATION_ALPHA:
6863 case GL_STENCIL_WRITEMASK:
6864 case GL_STENCIL_BACK_WRITEMASK:
6865 case GL_STENCIL_CLEAR_VALUE:
6866 case GL_SUBPIXEL_BITS:
6867 case GL_MAX_TEXTURE_SIZE:
6868 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
6869 case GL_SAMPLE_BUFFERS:
6870 case GL_SAMPLES:
6871 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
6872 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
6873 case GL_TEXTURE_BINDING_2D:
6874 case GL_TEXTURE_BINDING_CUBE_MAP:
6875 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
6876 {
6877 *type = GL_INT;
6878 *numParams = 1;
6879 return true;
6880 }
6881 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
6882 {
6883 if (!getExtensions().packReverseRowOrder)
6884 {
6885 return false;
6886 }
6887 *type = GL_INT;
6888 *numParams = 1;
6889 return true;
6890 }
6891 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
6892 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
6893 {
6894 if (!getExtensions().textureRectangle)
6895 {
6896 return false;
6897 }
6898 *type = GL_INT;
6899 *numParams = 1;
6900 return true;
6901 }
6902 case GL_MAX_DRAW_BUFFERS_EXT:
6903 case GL_MAX_COLOR_ATTACHMENTS_EXT:
6904 {
6905 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
6906 {
6907 return false;
6908 }
6909 *type = GL_INT;
6910 *numParams = 1;
6911 return true;
6912 }
6913 case GL_MAX_VIEWPORT_DIMS:
6914 {
6915 *type = GL_INT;
6916 *numParams = 2;
6917 return true;
6918 }
6919 case GL_VIEWPORT:
6920 case GL_SCISSOR_BOX:
6921 {
6922 *type = GL_INT;
6923 *numParams = 4;
6924 return true;
6925 }
6926 case GL_SHADER_COMPILER:
6927 case GL_SAMPLE_COVERAGE_INVERT:
6928 case GL_DEPTH_WRITEMASK:
6929 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
6930 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
6931 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
6932 // bool-natural
6933 case GL_SAMPLE_COVERAGE:
6934 case GL_SCISSOR_TEST:
6935 case GL_STENCIL_TEST:
6936 case GL_DEPTH_TEST:
6937 case GL_BLEND:
6938 case GL_DITHER:
6939 case GL_CONTEXT_ROBUST_ACCESS_EXT:
6940 {
6941 *type = GL_BOOL;
6942 *numParams = 1;
6943 return true;
6944 }
6945 case GL_COLOR_WRITEMASK:
6946 {
6947 *type = GL_BOOL;
6948 *numParams = 4;
6949 return true;
6950 }
6951 case GL_POLYGON_OFFSET_FACTOR:
6952 case GL_POLYGON_OFFSET_UNITS:
6953 case GL_SAMPLE_COVERAGE_VALUE:
6954 case GL_DEPTH_CLEAR_VALUE:
6955 case GL_LINE_WIDTH:
6956 {
6957 *type = GL_FLOAT;
6958 *numParams = 1;
6959 return true;
6960 }
6961 case GL_ALIASED_LINE_WIDTH_RANGE:
6962 case GL_ALIASED_POINT_SIZE_RANGE:
6963 case GL_DEPTH_RANGE:
6964 {
6965 *type = GL_FLOAT;
6966 *numParams = 2;
6967 return true;
6968 }
6969 case GL_COLOR_CLEAR_VALUE:
6970 case GL_BLEND_COLOR:
6971 {
6972 *type = GL_FLOAT;
6973 *numParams = 4;
6974 return true;
6975 }
6976 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
6977 if (!getExtensions().textureFilterAnisotropic)
6978 {
6979 return false;
6980 }
6981 *type = GL_FLOAT;
6982 *numParams = 1;
6983 return true;
6984 case GL_TIMESTAMP_EXT:
6985 if (!getExtensions().disjointTimerQuery)
6986 {
6987 return false;
6988 }
6989 *type = GL_INT_64_ANGLEX;
6990 *numParams = 1;
6991 return true;
6992 case GL_GPU_DISJOINT_EXT:
6993 if (!getExtensions().disjointTimerQuery)
6994 {
6995 return false;
6996 }
6997 *type = GL_INT;
6998 *numParams = 1;
6999 return true;
7000 case GL_COVERAGE_MODULATION_CHROMIUM:
7001 if (!getExtensions().framebufferMixedSamples)
7002 {
7003 return false;
7004 }
7005 *type = GL_INT;
7006 *numParams = 1;
7007 return true;
7008 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7009 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7010 {
7011 return false;
7012 }
7013 *type = GL_INT;
7014 *numParams = 1;
7015 return true;
7016 }
7017
7018 if (getExtensions().debug)
7019 {
7020 switch (pname)
7021 {
7022 case GL_DEBUG_LOGGED_MESSAGES:
7023 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7024 case GL_DEBUG_GROUP_STACK_DEPTH:
7025 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7026 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7027 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7028 case GL_MAX_LABEL_LENGTH:
7029 *type = GL_INT;
7030 *numParams = 1;
7031 return true;
7032
7033 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7034 case GL_DEBUG_OUTPUT:
7035 *type = GL_BOOL;
7036 *numParams = 1;
7037 return true;
7038 }
7039 }
7040
7041 if (getExtensions().multisampleCompatibility)
7042 {
7043 switch (pname)
7044 {
7045 case GL_MULTISAMPLE_EXT:
7046 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7047 *type = GL_BOOL;
7048 *numParams = 1;
7049 return true;
7050 }
7051 }
7052
7053 if (getExtensions().pathRendering)
7054 {
7055 switch (pname)
7056 {
7057 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7058 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7059 *type = GL_FLOAT;
7060 *numParams = 16;
7061 return true;
7062 }
7063 }
7064
7065 if (getExtensions().bindGeneratesResource)
7066 {
7067 switch (pname)
7068 {
7069 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7070 *type = GL_BOOL;
7071 *numParams = 1;
7072 return true;
7073 }
7074 }
7075
7076 if (getExtensions().clientArrays)
7077 {
7078 switch (pname)
7079 {
7080 case GL_CLIENT_ARRAYS_ANGLE:
7081 *type = GL_BOOL;
7082 *numParams = 1;
7083 return true;
7084 }
7085 }
7086
7087 if (getExtensions().sRGBWriteControl)
7088 {
7089 switch (pname)
7090 {
7091 case GL_FRAMEBUFFER_SRGB_EXT:
7092 *type = GL_BOOL;
7093 *numParams = 1;
7094 return true;
7095 }
7096 }
7097
7098 if (getExtensions().robustResourceInitialization &&
7099 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7100 {
7101 *type = GL_BOOL;
7102 *numParams = 1;
7103 return true;
7104 }
7105
7106 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7107 {
7108 *type = GL_BOOL;
7109 *numParams = 1;
7110 return true;
7111 }
7112
jchen1082af6202018-06-22 10:59:52 +08007113 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7114 {
7115 *type = GL_INT;
7116 *numParams = 1;
7117 return true;
7118 }
7119
Jamie Madill5b772312018-03-08 20:28:32 -05007120 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7121 switch (pname)
7122 {
7123 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7124 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7125 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7126 {
7127 return false;
7128 }
7129 *type = GL_INT;
7130 *numParams = 1;
7131 return true;
7132
7133 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7134 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7135 {
7136 return false;
7137 }
7138 *type = GL_INT;
7139 *numParams = 1;
7140 return true;
7141
7142 case GL_PROGRAM_BINARY_FORMATS_OES:
7143 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7144 {
7145 return false;
7146 }
7147 *type = GL_INT;
7148 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7149 return true;
7150
7151 case GL_PACK_ROW_LENGTH:
7152 case GL_PACK_SKIP_ROWS:
7153 case GL_PACK_SKIP_PIXELS:
7154 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7155 {
7156 return false;
7157 }
7158 *type = GL_INT;
7159 *numParams = 1;
7160 return true;
7161 case GL_UNPACK_ROW_LENGTH:
7162 case GL_UNPACK_SKIP_ROWS:
7163 case GL_UNPACK_SKIP_PIXELS:
7164 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7165 {
7166 return false;
7167 }
7168 *type = GL_INT;
7169 *numParams = 1;
7170 return true;
7171 case GL_VERTEX_ARRAY_BINDING:
7172 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7173 {
7174 return false;
7175 }
7176 *type = GL_INT;
7177 *numParams = 1;
7178 return true;
7179 case GL_PIXEL_PACK_BUFFER_BINDING:
7180 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7181 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7182 {
7183 return false;
7184 }
7185 *type = GL_INT;
7186 *numParams = 1;
7187 return true;
7188 case GL_MAX_SAMPLES:
7189 {
7190 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7191 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7192 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7193 {
7194 return false;
7195 }
7196 *type = GL_INT;
7197 *numParams = 1;
7198 return true;
7199
7200 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7201 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7202 {
7203 return false;
7204 }
7205 *type = GL_INT;
7206 *numParams = 1;
7207 return true;
7208 }
7209 }
7210
7211 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7212 {
7213 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7214 {
7215 return false;
7216 }
7217 *type = GL_INT;
7218 *numParams = 1;
7219 return true;
7220 }
7221
7222 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7223 {
7224 *type = GL_INT;
7225 *numParams = 1;
7226 return true;
7227 }
7228
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007229 if (getClientVersion() < Version(2, 0))
7230 {
7231 switch (pname)
7232 {
7233 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007234 case GL_CLIENT_ACTIVE_TEXTURE:
7235 case GL_MATRIX_MODE:
7236 case GL_MAX_TEXTURE_UNITS:
7237 case GL_MAX_MODELVIEW_STACK_DEPTH:
7238 case GL_MAX_PROJECTION_STACK_DEPTH:
7239 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007240 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007241 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007242 case GL_VERTEX_ARRAY_STRIDE:
7243 case GL_NORMAL_ARRAY_STRIDE:
7244 case GL_COLOR_ARRAY_STRIDE:
7245 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7246 case GL_VERTEX_ARRAY_SIZE:
7247 case GL_COLOR_ARRAY_SIZE:
7248 case GL_TEXTURE_COORD_ARRAY_SIZE:
7249 case GL_VERTEX_ARRAY_TYPE:
7250 case GL_NORMAL_ARRAY_TYPE:
7251 case GL_COLOR_ARRAY_TYPE:
7252 case GL_TEXTURE_COORD_ARRAY_TYPE:
7253 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7254 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7255 case GL_COLOR_ARRAY_BUFFER_BINDING:
7256 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7257 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7258 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7259 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007260 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007261 case GL_MODELVIEW_STACK_DEPTH:
7262 case GL_PROJECTION_STACK_DEPTH:
7263 case GL_TEXTURE_STACK_DEPTH:
7264 case GL_LOGIC_OP_MODE:
7265 case GL_BLEND_SRC:
7266 case GL_BLEND_DST:
7267 case GL_PERSPECTIVE_CORRECTION_HINT:
7268 case GL_POINT_SMOOTH_HINT:
7269 case GL_LINE_SMOOTH_HINT:
7270 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007271 *type = GL_INT;
7272 *numParams = 1;
7273 return true;
7274 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007275 case GL_FOG_DENSITY:
7276 case GL_FOG_START:
7277 case GL_FOG_END:
7278 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007279 case GL_POINT_SIZE:
7280 case GL_POINT_SIZE_MIN:
7281 case GL_POINT_SIZE_MAX:
7282 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007283 *type = GL_FLOAT;
7284 *numParams = 1;
7285 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007286 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007287 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007288 *type = GL_FLOAT;
7289 *numParams = 2;
7290 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007291 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007292 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007293 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007294 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007295 *type = GL_FLOAT;
7296 *numParams = 4;
7297 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007298 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007299 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007300 *type = GL_FLOAT;
7301 *numParams = 3;
7302 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007303 case GL_MODELVIEW_MATRIX:
7304 case GL_PROJECTION_MATRIX:
7305 case GL_TEXTURE_MATRIX:
7306 *type = GL_FLOAT;
7307 *numParams = 16;
7308 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007309 case GL_LIGHT_MODEL_TWO_SIDE:
7310 *type = GL_BOOL;
7311 *numParams = 1;
7312 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007313 }
7314 }
7315
Jamie Madill5b772312018-03-08 20:28:32 -05007316 if (getClientVersion() < Version(3, 0))
7317 {
7318 return false;
7319 }
7320
7321 // Check for ES3.0+ parameter names
7322 switch (pname)
7323 {
7324 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7325 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7326 case GL_UNIFORM_BUFFER_BINDING:
7327 case GL_TRANSFORM_FEEDBACK_BINDING:
7328 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7329 case GL_COPY_READ_BUFFER_BINDING:
7330 case GL_COPY_WRITE_BUFFER_BINDING:
7331 case GL_SAMPLER_BINDING:
7332 case GL_READ_BUFFER:
7333 case GL_TEXTURE_BINDING_3D:
7334 case GL_TEXTURE_BINDING_2D_ARRAY:
7335 case GL_MAX_3D_TEXTURE_SIZE:
7336 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7337 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7338 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7339 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7340 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7341 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7342 case GL_MAX_VARYING_COMPONENTS:
7343 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7344 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7345 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7346 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7347 case GL_NUM_EXTENSIONS:
7348 case GL_MAJOR_VERSION:
7349 case GL_MINOR_VERSION:
7350 case GL_MAX_ELEMENTS_INDICES:
7351 case GL_MAX_ELEMENTS_VERTICES:
7352 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7353 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7354 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7355 case GL_UNPACK_IMAGE_HEIGHT:
7356 case GL_UNPACK_SKIP_IMAGES:
7357 {
7358 *type = GL_INT;
7359 *numParams = 1;
7360 return true;
7361 }
7362
7363 case GL_MAX_ELEMENT_INDEX:
7364 case GL_MAX_UNIFORM_BLOCK_SIZE:
7365 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7366 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7367 case GL_MAX_SERVER_WAIT_TIMEOUT:
7368 {
7369 *type = GL_INT_64_ANGLEX;
7370 *numParams = 1;
7371 return true;
7372 }
7373
7374 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7375 case GL_TRANSFORM_FEEDBACK_PAUSED:
7376 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7377 case GL_RASTERIZER_DISCARD:
7378 {
7379 *type = GL_BOOL;
7380 *numParams = 1;
7381 return true;
7382 }
7383
7384 case GL_MAX_TEXTURE_LOD_BIAS:
7385 {
7386 *type = GL_FLOAT;
7387 *numParams = 1;
7388 return true;
7389 }
7390 }
7391
7392 if (getExtensions().requestExtension)
7393 {
7394 switch (pname)
7395 {
7396 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7397 *type = GL_INT;
7398 *numParams = 1;
7399 return true;
7400 }
7401 }
7402
7403 if (getClientVersion() < Version(3, 1))
7404 {
7405 return false;
7406 }
7407
7408 switch (pname)
7409 {
7410 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7411 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7412 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7413 case GL_MAX_FRAMEBUFFER_WIDTH:
7414 case GL_MAX_FRAMEBUFFER_HEIGHT:
7415 case GL_MAX_FRAMEBUFFER_SAMPLES:
7416 case GL_MAX_SAMPLE_MASK_WORDS:
7417 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7418 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7419 case GL_MAX_INTEGER_SAMPLES:
7420 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7421 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7422 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7423 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7424 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7425 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7426 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7427 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7428 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7429 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7430 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7431 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7432 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7433 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7434 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7435 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7436 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7437 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7438 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7439 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7440 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7441 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7442 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7443 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7444 case GL_MAX_UNIFORM_LOCATIONS:
7445 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7446 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7447 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7448 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7449 case GL_MAX_IMAGE_UNITS:
7450 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7451 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7452 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7453 case GL_SHADER_STORAGE_BUFFER_BINDING:
7454 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7455 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
7456 *type = GL_INT;
7457 *numParams = 1;
7458 return true;
7459 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7460 *type = GL_INT_64_ANGLEX;
7461 *numParams = 1;
7462 return true;
7463 case GL_SAMPLE_MASK:
7464 *type = GL_BOOL;
7465 *numParams = 1;
7466 return true;
7467 }
7468
7469 if (getExtensions().geometryShader)
7470 {
7471 switch (pname)
7472 {
7473 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7474 case GL_LAYER_PROVOKING_VERTEX_EXT:
7475 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7476 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7477 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7478 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7479 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7480 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7481 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7482 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7483 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7484 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7485 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7486 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7487 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7488 *type = GL_INT;
7489 *numParams = 1;
7490 return true;
7491 }
7492 }
7493
7494 return false;
7495}
7496
7497bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7498{
7499 if (getClientVersion() < Version(3, 0))
7500 {
7501 return false;
7502 }
7503
7504 switch (target)
7505 {
7506 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7507 case GL_UNIFORM_BUFFER_BINDING:
7508 {
7509 *type = GL_INT;
7510 *numParams = 1;
7511 return true;
7512 }
7513 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7514 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7515 case GL_UNIFORM_BUFFER_START:
7516 case GL_UNIFORM_BUFFER_SIZE:
7517 {
7518 *type = GL_INT_64_ANGLEX;
7519 *numParams = 1;
7520 return true;
7521 }
7522 }
7523
7524 if (getClientVersion() < Version(3, 1))
7525 {
7526 return false;
7527 }
7528
7529 switch (target)
7530 {
7531 case GL_IMAGE_BINDING_LAYERED:
7532 {
7533 *type = GL_BOOL;
7534 *numParams = 1;
7535 return true;
7536 }
7537 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7538 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7539 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7540 case GL_SHADER_STORAGE_BUFFER_BINDING:
7541 case GL_VERTEX_BINDING_BUFFER:
7542 case GL_VERTEX_BINDING_DIVISOR:
7543 case GL_VERTEX_BINDING_OFFSET:
7544 case GL_VERTEX_BINDING_STRIDE:
7545 case GL_SAMPLE_MASK_VALUE:
7546 case GL_IMAGE_BINDING_NAME:
7547 case GL_IMAGE_BINDING_LEVEL:
7548 case GL_IMAGE_BINDING_LAYER:
7549 case GL_IMAGE_BINDING_ACCESS:
7550 case GL_IMAGE_BINDING_FORMAT:
7551 {
7552 *type = GL_INT;
7553 *numParams = 1;
7554 return true;
7555 }
7556 case GL_ATOMIC_COUNTER_BUFFER_START:
7557 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7558 case GL_SHADER_STORAGE_BUFFER_START:
7559 case GL_SHADER_STORAGE_BUFFER_SIZE:
7560 {
7561 *type = GL_INT_64_ANGLEX;
7562 *numParams = 1;
7563 return true;
7564 }
7565 }
7566
7567 return false;
7568}
7569
7570Program *Context::getProgram(GLuint handle) const
7571{
7572 return mState.mShaderPrograms->getProgram(handle);
7573}
7574
7575Shader *Context::getShader(GLuint handle) const
7576{
7577 return mState.mShaderPrograms->getShader(handle);
7578}
7579
7580bool Context::isTextureGenerated(GLuint texture) const
7581{
7582 return mState.mTextures->isHandleGenerated(texture);
7583}
7584
7585bool Context::isBufferGenerated(GLuint buffer) const
7586{
7587 return mState.mBuffers->isHandleGenerated(buffer);
7588}
7589
7590bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7591{
7592 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7593}
7594
7595bool Context::isFramebufferGenerated(GLuint framebuffer) const
7596{
7597 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7598}
7599
7600bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7601{
7602 return mState.mPipelines->isHandleGenerated(pipeline);
7603}
7604
7605bool Context::usingDisplayTextureShareGroup() const
7606{
7607 return mDisplayTextureShareGroup;
7608}
7609
7610GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7611{
7612 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7613 internalformat == GL_DEPTH_STENCIL
7614 ? GL_DEPTH24_STENCIL8
7615 : internalformat;
7616}
7617
jchen1082af6202018-06-22 10:59:52 +08007618void Context::maxShaderCompilerThreads(GLuint count)
7619{
jchen107ae70d82018-07-06 13:47:01 +08007620 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08007621 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08007622 // A count of zero specifies a request for no parallel compiling or linking.
7623 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
7624 {
7625 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
7626 }
7627 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08007628}
7629
Jamie Madill2eb65032018-07-30 10:25:57 -04007630bool Context::isGLES1() const
7631{
7632 return mState.getClientVersion() < Version(2, 0);
7633}
7634
Jamie Madilla11819d2018-07-30 10:26:01 -04007635void Context::onSubjectStateChange(const Context *context,
7636 angle::SubjectIndex index,
7637 angle::SubjectMessage message)
7638{
Jamie Madilla11819d2018-07-30 10:26:01 -04007639 switch (index)
7640 {
7641 case kVertexArraySubjectIndex:
7642 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
Jamie Madillc43cdad2018-08-08 15:49:25 -04007643 mStateCache.onVertexArraySizeChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04007644 break;
7645
7646 case kReadFramebufferSubjectIndex:
7647 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
7648 break;
7649
7650 case kDrawFramebufferSubjectIndex:
7651 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
7652 break;
7653
7654 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04007655 if (index < kTextureMaxSubjectIndex)
7656 {
7657 mGLState.onActiveTextureStateChange(index);
7658 }
7659 else
7660 {
7661 ASSERT(index < kUniformBufferMaxSubjectIndex);
7662 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
7663 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007664 break;
7665 }
7666}
7667
Jamie Madill6b873dd2018-07-12 23:56:30 -04007668// ErrorSet implementation.
7669ErrorSet::ErrorSet(Context *context) : mContext(context)
7670{
7671}
7672
7673ErrorSet::~ErrorSet() = default;
7674
Jamie Madill306b6c12018-07-27 08:12:49 -04007675void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04007676{
7677 // This internal enum is used to filter internal errors that are already handled.
7678 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
7679 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
7680 {
7681 return;
7682 }
7683
7684 if (ANGLE_UNLIKELY(error.isError()))
7685 {
7686 GLenum code = error.getCode();
7687 mErrors.insert(code);
7688 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
7689 {
7690 mContext->markContextLost();
7691 }
7692
7693 ASSERT(!error.getMessage().empty());
7694 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
7695 error.getID(), GL_DEBUG_SEVERITY_HIGH,
7696 error.getMessage());
7697 }
7698}
7699
7700bool ErrorSet::empty() const
7701{
7702 return mErrors.empty();
7703}
7704
7705GLenum ErrorSet::popError()
7706{
7707 ASSERT(!empty());
7708 GLenum error = *mErrors.begin();
7709 mErrors.erase(mErrors.begin());
7710 return error;
7711}
Jamie Madilldc358af2018-07-31 11:22:13 -04007712
7713// StateCache implementation.
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007714StateCache::StateCache()
7715 : mCachedHasAnyEnabledClientAttrib(false),
7716 mCachedNonInstancedVertexElementLimit(0),
7717 mCachedInstancedVertexElementLimit(0)
Jamie Madilldc358af2018-07-31 11:22:13 -04007718{
7719}
7720
7721StateCache::~StateCache() = default;
7722
7723void StateCache::updateActiveAttribsMask(Context *context)
7724{
7725 bool isGLES1 = context->isGLES1();
7726 const State &glState = context->getGLState();
7727
7728 if (!isGLES1 && !glState.getProgram())
7729 {
7730 mCachedActiveBufferedAttribsMask = AttributesMask();
7731 mCachedActiveClientAttribsMask = AttributesMask();
7732 return;
7733 }
7734
7735 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
7736 : glState.getProgram()->getActiveAttribLocationsMask();
7737
7738 const VertexArray *vao = glState.getVertexArray();
7739 ASSERT(vao);
7740
7741 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
7742 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
7743
7744 activeAttribs &= enabledAttribs;
7745
7746 mCachedActiveClientAttribsMask = activeAttribs & clientAttribs;
7747 mCachedActiveBufferedAttribsMask = activeAttribs & ~clientAttribs;
7748 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
7749}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007750
7751void StateCache::updateVertexElementLimits(Context *context)
7752{
7753 const VertexArray *vao = context->getGLState().getVertexArray();
7754
7755 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
7756 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
7757
7758 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
7759 // If there are no buffered attributes then we should not limit the draw call count.
7760 if (!vao || !mCachedActiveBufferedAttribsMask.any())
7761 {
7762 return;
7763 }
7764
7765 const auto &vertexAttribs = vao->getVertexAttributes();
7766 const auto &vertexBindings = vao->getVertexBindings();
7767
7768 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
7769 {
7770 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
7771 ASSERT(attrib.enabled);
7772
7773 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
7774 ASSERT(context->isGLES1() ||
7775 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
7776
7777 GLint64 limit = attrib.getCachedElementLimit();
7778 if (binding.getDivisor() > 0)
7779 {
7780 mCachedInstancedVertexElementLimit =
7781 std::min(mCachedInstancedVertexElementLimit, limit);
7782 }
7783 else
7784 {
7785 mCachedNonInstancedVertexElementLimit =
7786 std::min(mCachedNonInstancedVertexElementLimit, limit);
7787 }
7788 }
7789}
Jamie Madillc43cdad2018-08-08 15:49:25 -04007790
7791void StateCache::onVertexArrayBindingChange(Context *context)
7792{
7793 updateActiveAttribsMask(context);
7794 updateVertexElementLimits(context);
7795}
7796
7797void StateCache::onProgramExecutableChange(Context *context)
7798{
7799 updateActiveAttribsMask(context);
7800 updateVertexElementLimits(context);
7801}
7802
7803void StateCache::onVertexArraySizeChange(Context *context)
7804{
7805 updateVertexElementLimits(context);
7806}
7807
7808void StateCache::onVertexArrayStateChange(Context *context)
7809{
7810 updateActiveAttribsMask(context);
7811 updateVertexElementLimits(context);
7812}
7813
7814void StateCache::onGLES1ClientStateChange(Context *context)
7815{
7816 updateActiveAttribsMask(context);
7817}
Jamie Madillc29968b2016-01-20 11:17:23 -05007818} // namespace gl