blob: 48ae14444ab016215fc2cb877a53ad4b3f91e7e0 [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
Olli Etuaho89664842018-08-24 14:45:36 +03004997void Context::texStorage3DMultisample(TextureType target,
4998 GLsizei samples,
4999 GLenum internalformat,
5000 GLsizei width,
5001 GLsizei height,
5002 GLsizei depth,
5003 GLboolean fixedsamplelocations)
5004{
5005 UNIMPLEMENTED();
5006}
5007
JiangYizhoubddc46b2016-12-09 09:50:51 +08005008void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5009{
JiangYizhou5b03f472017-01-09 10:22:53 +08005010 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5011 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005012 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005013 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005014
5015 switch (pname)
5016 {
5017 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005018 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005019 break;
5020 default:
5021 UNREACHABLE();
5022 }
5023}
5024
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005025void Context::getMultisamplefvRobust(GLenum pname,
5026 GLuint index,
5027 GLsizei bufSize,
5028 GLsizei *length,
5029 GLfloat *val)
5030{
5031 UNIMPLEMENTED();
5032}
5033
Jamie Madille8fb6402017-02-14 17:56:40 -05005034void Context::renderbufferStorage(GLenum target,
5035 GLenum internalformat,
5036 GLsizei width,
5037 GLsizei height)
5038{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005039 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5040 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5041
Jamie Madille8fb6402017-02-14 17:56:40 -05005042 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005043 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005044}
5045
5046void Context::renderbufferStorageMultisample(GLenum target,
5047 GLsizei samples,
5048 GLenum internalformat,
5049 GLsizei width,
5050 GLsizei height)
5051{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005052 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5053 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005054
5055 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005056 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005057 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005058}
5059
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005060void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5061{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005062 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005063 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005064}
5065
JiangYizhoue18e6392017-02-20 10:32:23 +08005066void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5067{
5068 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5069 QueryFramebufferParameteriv(framebuffer, pname, params);
5070}
5071
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005072void Context::getFramebufferParameterivRobust(GLenum target,
5073 GLenum pname,
5074 GLsizei bufSize,
5075 GLsizei *length,
5076 GLint *params)
5077{
5078 UNIMPLEMENTED();
5079}
5080
Jiajia Qin5451d532017-11-16 17:16:34 +08005081void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005082{
5083 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005084 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005085}
5086
Jamie Madilldec86232018-07-11 09:01:18 -04005087bool Context::getScratchBuffer(size_t requstedSizeBytes,
5088 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005089{
Jamie Madilldec86232018-07-11 09:01:18 -04005090 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005091}
5092
Jamie Madilldec86232018-07-11 09:01:18 -04005093bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5094 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005095{
Jamie Madilldec86232018-07-11 09:01:18 -04005096 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005097}
5098
Xinghua Cao10a4d432017-11-28 14:46:26 +08005099Error Context::prepareForDispatch()
5100{
Geoff Langa8cb2872018-03-09 16:09:40 -05005101 ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005102
5103 if (isRobustResourceInitEnabled())
5104 {
5105 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5106 }
5107
5108 return NoError();
5109}
5110
Xinghua Cao2b396592017-03-29 15:36:04 +08005111void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5112{
5113 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5114 {
5115 return;
5116 }
5117
Xinghua Cao10a4d432017-11-28 14:46:26 +08005118 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005119 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005120}
5121
Jiajia Qin5451d532017-11-16 17:16:34 +08005122void Context::dispatchComputeIndirect(GLintptr indirect)
5123{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005124 ANGLE_CONTEXT_TRY(prepareForDispatch());
5125 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005126}
5127
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005128void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005129 GLsizei levels,
5130 GLenum internalFormat,
5131 GLsizei width,
5132 GLsizei height)
5133{
5134 Extents size(width, height, 1);
5135 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005136 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005137}
5138
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005139void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005140 GLsizei levels,
5141 GLenum internalFormat,
5142 GLsizei width,
5143 GLsizei height,
5144 GLsizei depth)
5145{
5146 Extents size(width, height, depth);
5147 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005148 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005149}
5150
Jiajia Qin5451d532017-11-16 17:16:34 +08005151void Context::memoryBarrier(GLbitfield barriers)
5152{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005153 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005154}
5155
5156void Context::memoryBarrierByRegion(GLbitfield barriers)
5157{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005158 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005159}
5160
Jamie Madillc1d770e2017-04-13 17:31:24 -04005161GLenum Context::checkFramebufferStatus(GLenum target)
5162{
5163 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5164 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005165 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005166}
5167
5168void Context::compileShader(GLuint shader)
5169{
5170 Shader *shaderObject = GetValidShader(this, shader);
5171 if (!shaderObject)
5172 {
5173 return;
5174 }
5175 shaderObject->compile(this);
5176}
5177
5178void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5179{
5180 for (int i = 0; i < n; i++)
5181 {
5182 deleteBuffer(buffers[i]);
5183 }
5184}
5185
5186void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5187{
5188 for (int i = 0; i < n; i++)
5189 {
5190 if (framebuffers[i] != 0)
5191 {
5192 deleteFramebuffer(framebuffers[i]);
5193 }
5194 }
5195}
5196
5197void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5198{
5199 for (int i = 0; i < n; i++)
5200 {
5201 deleteRenderbuffer(renderbuffers[i]);
5202 }
5203}
5204
5205void Context::deleteTextures(GLsizei n, const GLuint *textures)
5206{
5207 for (int i = 0; i < n; i++)
5208 {
5209 if (textures[i] != 0)
5210 {
5211 deleteTexture(textures[i]);
5212 }
5213 }
5214}
5215
5216void Context::detachShader(GLuint program, GLuint shader)
5217{
5218 Program *programObject = getProgram(program);
5219 ASSERT(programObject);
5220
5221 Shader *shaderObject = getShader(shader);
5222 ASSERT(shaderObject);
5223
5224 programObject->detachShader(this, shaderObject);
5225}
5226
5227void Context::genBuffers(GLsizei n, GLuint *buffers)
5228{
5229 for (int i = 0; i < n; i++)
5230 {
5231 buffers[i] = createBuffer();
5232 }
5233}
5234
5235void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5236{
5237 for (int i = 0; i < n; i++)
5238 {
5239 framebuffers[i] = createFramebuffer();
5240 }
5241}
5242
5243void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5244{
5245 for (int i = 0; i < n; i++)
5246 {
5247 renderbuffers[i] = createRenderbuffer();
5248 }
5249}
5250
5251void Context::genTextures(GLsizei n, GLuint *textures)
5252{
5253 for (int i = 0; i < n; i++)
5254 {
5255 textures[i] = createTexture();
5256 }
5257}
5258
5259void Context::getActiveAttrib(GLuint program,
5260 GLuint index,
5261 GLsizei bufsize,
5262 GLsizei *length,
5263 GLint *size,
5264 GLenum *type,
5265 GLchar *name)
5266{
5267 Program *programObject = getProgram(program);
5268 ASSERT(programObject);
5269 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5270}
5271
5272void Context::getActiveUniform(GLuint program,
5273 GLuint index,
5274 GLsizei bufsize,
5275 GLsizei *length,
5276 GLint *size,
5277 GLenum *type,
5278 GLchar *name)
5279{
5280 Program *programObject = getProgram(program);
5281 ASSERT(programObject);
5282 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5283}
5284
5285void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5286{
5287 Program *programObject = getProgram(program);
5288 ASSERT(programObject);
5289 programObject->getAttachedShaders(maxcount, count, shaders);
5290}
5291
5292GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5293{
5294 Program *programObject = getProgram(program);
5295 ASSERT(programObject);
5296 return programObject->getAttributeLocation(name);
5297}
5298
5299void Context::getBooleanv(GLenum pname, GLboolean *params)
5300{
5301 GLenum nativeType;
5302 unsigned int numParams = 0;
5303 getQueryParameterInfo(pname, &nativeType, &numParams);
5304
5305 if (nativeType == GL_BOOL)
5306 {
5307 getBooleanvImpl(pname, params);
5308 }
5309 else
5310 {
5311 CastStateValues(this, nativeType, pname, numParams, params);
5312 }
5313}
5314
Brandon Jones59770802018-04-02 13:18:42 -07005315void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5316{
5317 getBooleanv(pname, params);
5318}
5319
Jamie Madillc1d770e2017-04-13 17:31:24 -04005320void Context::getFloatv(GLenum pname, GLfloat *params)
5321{
5322 GLenum nativeType;
5323 unsigned int numParams = 0;
5324 getQueryParameterInfo(pname, &nativeType, &numParams);
5325
5326 if (nativeType == GL_FLOAT)
5327 {
5328 getFloatvImpl(pname, params);
5329 }
5330 else
5331 {
5332 CastStateValues(this, nativeType, pname, numParams, params);
5333 }
5334}
5335
Brandon Jones59770802018-04-02 13:18:42 -07005336void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5337{
5338 getFloatv(pname, params);
5339}
5340
Jamie Madillc1d770e2017-04-13 17:31:24 -04005341void Context::getIntegerv(GLenum pname, GLint *params)
5342{
5343 GLenum nativeType;
5344 unsigned int numParams = 0;
5345 getQueryParameterInfo(pname, &nativeType, &numParams);
5346
5347 if (nativeType == GL_INT)
5348 {
5349 getIntegervImpl(pname, params);
5350 }
5351 else
5352 {
5353 CastStateValues(this, nativeType, pname, numParams, params);
5354 }
5355}
5356
Brandon Jones59770802018-04-02 13:18:42 -07005357void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5358{
5359 getIntegerv(pname, data);
5360}
5361
Jamie Madillc1d770e2017-04-13 17:31:24 -04005362void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5363{
5364 Program *programObject = getProgram(program);
5365 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005366 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005367}
5368
Brandon Jones59770802018-04-02 13:18:42 -07005369void Context::getProgramivRobust(GLuint program,
5370 GLenum pname,
5371 GLsizei bufSize,
5372 GLsizei *length,
5373 GLint *params)
5374{
5375 getProgramiv(program, pname, params);
5376}
5377
Jiajia Qin5451d532017-11-16 17:16:34 +08005378void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5379{
5380 UNIMPLEMENTED();
5381}
5382
Jamie Madillbe849e42017-05-02 15:49:00 -04005383void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005384{
5385 Program *programObject = getProgram(program);
5386 ASSERT(programObject);
5387 programObject->getInfoLog(bufsize, length, infolog);
5388}
5389
Jiajia Qin5451d532017-11-16 17:16:34 +08005390void Context::getProgramPipelineInfoLog(GLuint pipeline,
5391 GLsizei bufSize,
5392 GLsizei *length,
5393 GLchar *infoLog)
5394{
5395 UNIMPLEMENTED();
5396}
5397
Jamie Madillc1d770e2017-04-13 17:31:24 -04005398void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5399{
5400 Shader *shaderObject = getShader(shader);
5401 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005402 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005403}
5404
Brandon Jones59770802018-04-02 13:18:42 -07005405void Context::getShaderivRobust(GLuint shader,
5406 GLenum pname,
5407 GLsizei bufSize,
5408 GLsizei *length,
5409 GLint *params)
5410{
5411 getShaderiv(shader, pname, params);
5412}
5413
Jamie Madillc1d770e2017-04-13 17:31:24 -04005414void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5415{
5416 Shader *shaderObject = getShader(shader);
5417 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005418 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005419}
5420
5421void Context::getShaderPrecisionFormat(GLenum shadertype,
5422 GLenum precisiontype,
5423 GLint *range,
5424 GLint *precision)
5425{
5426 // TODO(jmadill): Compute shaders.
5427
5428 switch (shadertype)
5429 {
5430 case GL_VERTEX_SHADER:
5431 switch (precisiontype)
5432 {
5433 case GL_LOW_FLOAT:
5434 mCaps.vertexLowpFloat.get(range, precision);
5435 break;
5436 case GL_MEDIUM_FLOAT:
5437 mCaps.vertexMediumpFloat.get(range, precision);
5438 break;
5439 case GL_HIGH_FLOAT:
5440 mCaps.vertexHighpFloat.get(range, precision);
5441 break;
5442
5443 case GL_LOW_INT:
5444 mCaps.vertexLowpInt.get(range, precision);
5445 break;
5446 case GL_MEDIUM_INT:
5447 mCaps.vertexMediumpInt.get(range, precision);
5448 break;
5449 case GL_HIGH_INT:
5450 mCaps.vertexHighpInt.get(range, precision);
5451 break;
5452
5453 default:
5454 UNREACHABLE();
5455 return;
5456 }
5457 break;
5458
5459 case GL_FRAGMENT_SHADER:
5460 switch (precisiontype)
5461 {
5462 case GL_LOW_FLOAT:
5463 mCaps.fragmentLowpFloat.get(range, precision);
5464 break;
5465 case GL_MEDIUM_FLOAT:
5466 mCaps.fragmentMediumpFloat.get(range, precision);
5467 break;
5468 case GL_HIGH_FLOAT:
5469 mCaps.fragmentHighpFloat.get(range, precision);
5470 break;
5471
5472 case GL_LOW_INT:
5473 mCaps.fragmentLowpInt.get(range, precision);
5474 break;
5475 case GL_MEDIUM_INT:
5476 mCaps.fragmentMediumpInt.get(range, precision);
5477 break;
5478 case GL_HIGH_INT:
5479 mCaps.fragmentHighpInt.get(range, precision);
5480 break;
5481
5482 default:
5483 UNREACHABLE();
5484 return;
5485 }
5486 break;
5487
5488 default:
5489 UNREACHABLE();
5490 return;
5491 }
5492}
5493
5494void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5495{
5496 Shader *shaderObject = getShader(shader);
5497 ASSERT(shaderObject);
5498 shaderObject->getSource(bufsize, length, source);
5499}
5500
5501void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5502{
5503 Program *programObject = getProgram(program);
5504 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005505 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005506}
5507
Brandon Jones59770802018-04-02 13:18:42 -07005508void Context::getUniformfvRobust(GLuint program,
5509 GLint location,
5510 GLsizei bufSize,
5511 GLsizei *length,
5512 GLfloat *params)
5513{
5514 getUniformfv(program, location, params);
5515}
5516
Jamie Madillc1d770e2017-04-13 17:31:24 -04005517void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5518{
5519 Program *programObject = getProgram(program);
5520 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005521 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005522}
5523
Brandon Jones59770802018-04-02 13:18:42 -07005524void Context::getUniformivRobust(GLuint program,
5525 GLint location,
5526 GLsizei bufSize,
5527 GLsizei *length,
5528 GLint *params)
5529{
5530 getUniformiv(program, location, params);
5531}
5532
Jamie Madillc1d770e2017-04-13 17:31:24 -04005533GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5534{
5535 Program *programObject = getProgram(program);
5536 ASSERT(programObject);
5537 return programObject->getUniformLocation(name);
5538}
5539
5540GLboolean Context::isBuffer(GLuint buffer)
5541{
5542 if (buffer == 0)
5543 {
5544 return GL_FALSE;
5545 }
5546
5547 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5548}
5549
5550GLboolean Context::isEnabled(GLenum cap)
5551{
5552 return mGLState.getEnableFeature(cap);
5553}
5554
5555GLboolean Context::isFramebuffer(GLuint framebuffer)
5556{
5557 if (framebuffer == 0)
5558 {
5559 return GL_FALSE;
5560 }
5561
5562 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5563}
5564
5565GLboolean Context::isProgram(GLuint program)
5566{
5567 if (program == 0)
5568 {
5569 return GL_FALSE;
5570 }
5571
5572 return (getProgram(program) ? GL_TRUE : GL_FALSE);
5573}
5574
5575GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5576{
5577 if (renderbuffer == 0)
5578 {
5579 return GL_FALSE;
5580 }
5581
5582 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5583}
5584
5585GLboolean Context::isShader(GLuint shader)
5586{
5587 if (shader == 0)
5588 {
5589 return GL_FALSE;
5590 }
5591
5592 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5593}
5594
5595GLboolean Context::isTexture(GLuint texture)
5596{
5597 if (texture == 0)
5598 {
5599 return GL_FALSE;
5600 }
5601
5602 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5603}
5604
5605void Context::linkProgram(GLuint program)
5606{
5607 Program *programObject = getProgram(program);
5608 ASSERT(programObject);
5609 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08005610
5611 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
5612 // don't need to worry that:
5613 // 1. Draw calls after link use the new executable code or the old one depending on the link
5614 // result.
5615 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
5616 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
5617 // ProgramD3D.
5618 if (programObject->isInUse())
5619 {
5620 // isLinked() which forces to resolve linking, will be called.
5621 mGLState.onProgramExecutableChange(programObject);
5622 mStateCache.onProgramExecutableChange(this);
5623 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005624}
5625
5626void Context::releaseShaderCompiler()
5627{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005628 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005629}
5630
5631void Context::shaderBinary(GLsizei n,
5632 const GLuint *shaders,
5633 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005634 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005635 GLsizei length)
5636{
5637 // No binary shader formats are supported.
5638 UNIMPLEMENTED();
5639}
5640
5641void Context::shaderSource(GLuint shader,
5642 GLsizei count,
5643 const GLchar *const *string,
5644 const GLint *length)
5645{
5646 Shader *shaderObject = getShader(shader);
5647 ASSERT(shaderObject);
5648 shaderObject->setSource(count, string, length);
5649}
5650
5651void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5652{
5653 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5654}
5655
5656void Context::stencilMask(GLuint mask)
5657{
5658 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5659}
5660
5661void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5662{
5663 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5664}
5665
5666void Context::uniform1f(GLint location, GLfloat x)
5667{
5668 Program *program = mGLState.getProgram();
5669 program->setUniform1fv(location, 1, &x);
5670}
5671
5672void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5673{
5674 Program *program = mGLState.getProgram();
5675 program->setUniform1fv(location, count, v);
5676}
5677
Jamie Madill7e4eff12018-08-08 15:49:26 -04005678void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005679{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005680 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04005681 {
5682 mGLState.setObjectDirty(GL_PROGRAM);
5683 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005684}
5685
Jamie Madill7e4eff12018-08-08 15:49:26 -04005686void Context::uniform1i(GLint location, GLint x)
5687{
5688 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
5689}
5690
Jamie Madillc1d770e2017-04-13 17:31:24 -04005691void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5692{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005693 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005694}
5695
5696void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5697{
5698 GLfloat xy[2] = {x, y};
5699 Program *program = mGLState.getProgram();
5700 program->setUniform2fv(location, 1, xy);
5701}
5702
5703void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5704{
5705 Program *program = mGLState.getProgram();
5706 program->setUniform2fv(location, count, v);
5707}
5708
5709void Context::uniform2i(GLint location, GLint x, GLint y)
5710{
5711 GLint xy[2] = {x, y};
5712 Program *program = mGLState.getProgram();
5713 program->setUniform2iv(location, 1, xy);
5714}
5715
5716void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
5717{
5718 Program *program = mGLState.getProgram();
5719 program->setUniform2iv(location, count, v);
5720}
5721
5722void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5723{
5724 GLfloat xyz[3] = {x, y, z};
5725 Program *program = mGLState.getProgram();
5726 program->setUniform3fv(location, 1, xyz);
5727}
5728
5729void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
5730{
5731 Program *program = mGLState.getProgram();
5732 program->setUniform3fv(location, count, v);
5733}
5734
5735void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
5736{
5737 GLint xyz[3] = {x, y, z};
5738 Program *program = mGLState.getProgram();
5739 program->setUniform3iv(location, 1, xyz);
5740}
5741
5742void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
5743{
5744 Program *program = mGLState.getProgram();
5745 program->setUniform3iv(location, count, v);
5746}
5747
5748void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5749{
5750 GLfloat xyzw[4] = {x, y, z, w};
5751 Program *program = mGLState.getProgram();
5752 program->setUniform4fv(location, 1, xyzw);
5753}
5754
5755void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
5756{
5757 Program *program = mGLState.getProgram();
5758 program->setUniform4fv(location, count, v);
5759}
5760
5761void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5762{
5763 GLint xyzw[4] = {x, y, z, w};
5764 Program *program = mGLState.getProgram();
5765 program->setUniform4iv(location, 1, xyzw);
5766}
5767
5768void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
5769{
5770 Program *program = mGLState.getProgram();
5771 program->setUniform4iv(location, count, v);
5772}
5773
5774void Context::uniformMatrix2fv(GLint location,
5775 GLsizei count,
5776 GLboolean transpose,
5777 const GLfloat *value)
5778{
5779 Program *program = mGLState.getProgram();
5780 program->setUniformMatrix2fv(location, count, transpose, value);
5781}
5782
5783void Context::uniformMatrix3fv(GLint location,
5784 GLsizei count,
5785 GLboolean transpose,
5786 const GLfloat *value)
5787{
5788 Program *program = mGLState.getProgram();
5789 program->setUniformMatrix3fv(location, count, transpose, value);
5790}
5791
5792void Context::uniformMatrix4fv(GLint location,
5793 GLsizei count,
5794 GLboolean transpose,
5795 const GLfloat *value)
5796{
5797 Program *program = mGLState.getProgram();
5798 program->setUniformMatrix4fv(location, count, transpose, value);
5799}
5800
5801void Context::validateProgram(GLuint program)
5802{
5803 Program *programObject = getProgram(program);
5804 ASSERT(programObject);
5805 programObject->validate(mCaps);
5806}
5807
Jiajia Qin5451d532017-11-16 17:16:34 +08005808void Context::validateProgramPipeline(GLuint pipeline)
5809{
5810 UNIMPLEMENTED();
5811}
5812
Jamie Madilld04908b2017-06-09 14:15:35 -04005813void Context::getProgramBinary(GLuint program,
5814 GLsizei bufSize,
5815 GLsizei *length,
5816 GLenum *binaryFormat,
5817 void *binary)
5818{
5819 Program *programObject = getProgram(program);
5820 ASSERT(programObject != nullptr);
5821
5822 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
5823}
5824
5825void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
5826{
5827 Program *programObject = getProgram(program);
5828 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04005829
Jamie Madilld04908b2017-06-09 14:15:35 -04005830 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madillc43cdad2018-08-08 15:49:25 -04005831 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04005832 if (programObject->isInUse())
5833 {
5834 mGLState.setObjectDirty(GL_PROGRAM);
5835 }
Jamie Madilld04908b2017-06-09 14:15:35 -04005836}
5837
Jamie Madillff325f12017-08-26 15:06:05 -04005838void Context::uniform1ui(GLint location, GLuint v0)
5839{
5840 Program *program = mGLState.getProgram();
5841 program->setUniform1uiv(location, 1, &v0);
5842}
5843
5844void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
5845{
5846 Program *program = mGLState.getProgram();
5847 const GLuint xy[] = {v0, v1};
5848 program->setUniform2uiv(location, 1, xy);
5849}
5850
5851void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
5852{
5853 Program *program = mGLState.getProgram();
5854 const GLuint xyz[] = {v0, v1, v2};
5855 program->setUniform3uiv(location, 1, xyz);
5856}
5857
5858void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
5859{
5860 Program *program = mGLState.getProgram();
5861 const GLuint xyzw[] = {v0, v1, v2, v3};
5862 program->setUniform4uiv(location, 1, xyzw);
5863}
5864
5865void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
5866{
5867 Program *program = mGLState.getProgram();
5868 program->setUniform1uiv(location, count, value);
5869}
5870void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
5871{
5872 Program *program = mGLState.getProgram();
5873 program->setUniform2uiv(location, count, value);
5874}
5875
5876void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
5877{
5878 Program *program = mGLState.getProgram();
5879 program->setUniform3uiv(location, count, value);
5880}
5881
5882void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
5883{
5884 Program *program = mGLState.getProgram();
5885 program->setUniform4uiv(location, count, value);
5886}
5887
Jamie Madillf0e04492017-08-26 15:28:42 -04005888void Context::genQueries(GLsizei n, GLuint *ids)
5889{
5890 for (GLsizei i = 0; i < n; i++)
5891 {
5892 GLuint handle = mQueryHandleAllocator.allocate();
5893 mQueryMap.assign(handle, nullptr);
5894 ids[i] = handle;
5895 }
5896}
5897
5898void Context::deleteQueries(GLsizei n, const GLuint *ids)
5899{
5900 for (int i = 0; i < n; i++)
5901 {
5902 GLuint query = ids[i];
5903
5904 Query *queryObject = nullptr;
5905 if (mQueryMap.erase(query, &queryObject))
5906 {
5907 mQueryHandleAllocator.release(query);
5908 if (queryObject)
5909 {
5910 queryObject->release(this);
5911 }
5912 }
5913 }
5914}
5915
5916GLboolean Context::isQuery(GLuint id)
5917{
Corentin Wallezad3ae902018-03-09 13:40:42 -05005918 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04005919}
5920
Jamie Madillc8c95812017-08-26 18:40:09 -04005921void Context::uniformMatrix2x3fv(GLint location,
5922 GLsizei count,
5923 GLboolean transpose,
5924 const GLfloat *value)
5925{
5926 Program *program = mGLState.getProgram();
5927 program->setUniformMatrix2x3fv(location, count, transpose, value);
5928}
5929
5930void Context::uniformMatrix3x2fv(GLint location,
5931 GLsizei count,
5932 GLboolean transpose,
5933 const GLfloat *value)
5934{
5935 Program *program = mGLState.getProgram();
5936 program->setUniformMatrix3x2fv(location, count, transpose, value);
5937}
5938
5939void Context::uniformMatrix2x4fv(GLint location,
5940 GLsizei count,
5941 GLboolean transpose,
5942 const GLfloat *value)
5943{
5944 Program *program = mGLState.getProgram();
5945 program->setUniformMatrix2x4fv(location, count, transpose, value);
5946}
5947
5948void Context::uniformMatrix4x2fv(GLint location,
5949 GLsizei count,
5950 GLboolean transpose,
5951 const GLfloat *value)
5952{
5953 Program *program = mGLState.getProgram();
5954 program->setUniformMatrix4x2fv(location, count, transpose, value);
5955}
5956
5957void Context::uniformMatrix3x4fv(GLint location,
5958 GLsizei count,
5959 GLboolean transpose,
5960 const GLfloat *value)
5961{
5962 Program *program = mGLState.getProgram();
5963 program->setUniformMatrix3x4fv(location, count, transpose, value);
5964}
5965
5966void Context::uniformMatrix4x3fv(GLint location,
5967 GLsizei count,
5968 GLboolean transpose,
5969 const GLfloat *value)
5970{
5971 Program *program = mGLState.getProgram();
5972 program->setUniformMatrix4x3fv(location, count, transpose, value);
5973}
5974
Jamie Madilld7576732017-08-26 18:49:50 -04005975void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
5976{
5977 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5978 {
5979 GLuint vertexArray = arrays[arrayIndex];
5980
5981 if (arrays[arrayIndex] != 0)
5982 {
5983 VertexArray *vertexArrayObject = nullptr;
5984 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
5985 {
5986 if (vertexArrayObject != nullptr)
5987 {
5988 detachVertexArray(vertexArray);
5989 vertexArrayObject->onDestroy(this);
5990 }
5991
5992 mVertexArrayHandleAllocator.release(vertexArray);
5993 }
5994 }
5995 }
5996}
5997
5998void Context::genVertexArrays(GLsizei n, GLuint *arrays)
5999{
6000 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6001 {
6002 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6003 mVertexArrayMap.assign(vertexArray, nullptr);
6004 arrays[arrayIndex] = vertexArray;
6005 }
6006}
6007
6008bool Context::isVertexArray(GLuint array)
6009{
6010 if (array == 0)
6011 {
6012 return GL_FALSE;
6013 }
6014
6015 VertexArray *vao = getVertexArray(array);
6016 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6017}
6018
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006019void Context::endTransformFeedback()
6020{
6021 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6022 transformFeedback->end(this);
6023}
6024
6025void Context::transformFeedbackVaryings(GLuint program,
6026 GLsizei count,
6027 const GLchar *const *varyings,
6028 GLenum bufferMode)
6029{
6030 Program *programObject = getProgram(program);
6031 ASSERT(programObject);
6032 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6033}
6034
6035void Context::getTransformFeedbackVarying(GLuint program,
6036 GLuint index,
6037 GLsizei bufSize,
6038 GLsizei *length,
6039 GLsizei *size,
6040 GLenum *type,
6041 GLchar *name)
6042{
6043 Program *programObject = getProgram(program);
6044 ASSERT(programObject);
6045 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6046}
6047
6048void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6049{
6050 for (int i = 0; i < n; i++)
6051 {
6052 GLuint transformFeedback = ids[i];
6053 if (transformFeedback == 0)
6054 {
6055 continue;
6056 }
6057
6058 TransformFeedback *transformFeedbackObject = nullptr;
6059 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6060 {
6061 if (transformFeedbackObject != nullptr)
6062 {
6063 detachTransformFeedback(transformFeedback);
6064 transformFeedbackObject->release(this);
6065 }
6066
6067 mTransformFeedbackHandleAllocator.release(transformFeedback);
6068 }
6069 }
6070}
6071
6072void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6073{
6074 for (int i = 0; i < n; i++)
6075 {
6076 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6077 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6078 ids[i] = transformFeedback;
6079 }
6080}
6081
6082bool Context::isTransformFeedback(GLuint id)
6083{
6084 if (id == 0)
6085 {
6086 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6087 // returns FALSE
6088 return GL_FALSE;
6089 }
6090
6091 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6092 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6093}
6094
6095void Context::pauseTransformFeedback()
6096{
6097 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6098 transformFeedback->pause();
6099}
6100
6101void Context::resumeTransformFeedback()
6102{
6103 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6104 transformFeedback->resume();
6105}
6106
Jamie Madill12e957f2017-08-26 21:42:26 -04006107void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6108{
6109 const Program *programObject = getProgram(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006110 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006111}
6112
Brandon Jones59770802018-04-02 13:18:42 -07006113void Context::getUniformuivRobust(GLuint program,
6114 GLint location,
6115 GLsizei bufSize,
6116 GLsizei *length,
6117 GLuint *params)
6118{
6119 getUniformuiv(program, location, params);
6120}
6121
Jamie Madill12e957f2017-08-26 21:42:26 -04006122GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6123{
6124 const Program *programObject = getProgram(program);
6125 return programObject->getFragDataLocation(name);
6126}
6127
6128void Context::getUniformIndices(GLuint program,
6129 GLsizei uniformCount,
6130 const GLchar *const *uniformNames,
6131 GLuint *uniformIndices)
6132{
6133 const Program *programObject = getProgram(program);
6134 if (!programObject->isLinked())
6135 {
6136 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6137 {
6138 uniformIndices[uniformId] = GL_INVALID_INDEX;
6139 }
6140 }
6141 else
6142 {
6143 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6144 {
6145 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6146 }
6147 }
6148}
6149
6150void Context::getActiveUniformsiv(GLuint program,
6151 GLsizei uniformCount,
6152 const GLuint *uniformIndices,
6153 GLenum pname,
6154 GLint *params)
6155{
6156 const Program *programObject = getProgram(program);
6157 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6158 {
6159 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006160 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006161 }
6162}
6163
6164GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6165{
6166 const Program *programObject = getProgram(program);
6167 return programObject->getUniformBlockIndex(uniformBlockName);
6168}
6169
6170void Context::getActiveUniformBlockiv(GLuint program,
6171 GLuint uniformBlockIndex,
6172 GLenum pname,
6173 GLint *params)
6174{
6175 const Program *programObject = getProgram(program);
6176 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6177}
6178
Brandon Jones59770802018-04-02 13:18:42 -07006179void Context::getActiveUniformBlockivRobust(GLuint program,
6180 GLuint uniformBlockIndex,
6181 GLenum pname,
6182 GLsizei bufSize,
6183 GLsizei *length,
6184 GLint *params)
6185{
6186 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6187}
6188
Jamie Madill12e957f2017-08-26 21:42:26 -04006189void Context::getActiveUniformBlockName(GLuint program,
6190 GLuint uniformBlockIndex,
6191 GLsizei bufSize,
6192 GLsizei *length,
6193 GLchar *uniformBlockName)
6194{
6195 const Program *programObject = getProgram(program);
6196 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6197}
6198
6199void Context::uniformBlockBinding(GLuint program,
6200 GLuint uniformBlockIndex,
6201 GLuint uniformBlockBinding)
6202{
6203 Program *programObject = getProgram(program);
6204 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006205
6206 if (programObject->isInUse())
6207 {
6208 mGLState.setObjectDirty(GL_PROGRAM);
6209 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006210}
6211
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006212GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6213{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006214 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6215 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006216
Jamie Madill70b5bb02017-08-28 13:32:37 -04006217 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006218 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006219 if (error.isError())
6220 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006221 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006222 handleError(error);
6223 return nullptr;
6224 }
6225
Jamie Madill70b5bb02017-08-28 13:32:37 -04006226 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006227}
6228
6229GLboolean Context::isSync(GLsync sync)
6230{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006231 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006232}
6233
6234GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6235{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006236 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006237
6238 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006239 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006240 return result;
6241}
6242
6243void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6244{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006245 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006246 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006247}
6248
6249void Context::getInteger64v(GLenum pname, GLint64 *params)
6250{
6251 GLenum nativeType = GL_NONE;
6252 unsigned int numParams = 0;
6253 getQueryParameterInfo(pname, &nativeType, &numParams);
6254
6255 if (nativeType == GL_INT_64_ANGLEX)
6256 {
6257 getInteger64vImpl(pname, params);
6258 }
6259 else
6260 {
6261 CastStateValues(this, nativeType, pname, numParams, params);
6262 }
6263}
6264
Brandon Jones59770802018-04-02 13:18:42 -07006265void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6266{
6267 getInteger64v(pname, data);
6268}
6269
Corentin Wallez336129f2017-10-17 15:55:40 -04006270void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006271{
6272 Buffer *buffer = mGLState.getTargetBuffer(target);
6273 QueryBufferParameteri64v(buffer, pname, params);
6274}
6275
Brandon Jones59770802018-04-02 13:18:42 -07006276void Context::getBufferParameteri64vRobust(BufferBinding target,
6277 GLenum pname,
6278 GLsizei bufSize,
6279 GLsizei *length,
6280 GLint64 *params)
6281{
6282 getBufferParameteri64v(target, pname, params);
6283}
6284
Jamie Madill3ef140a2017-08-26 23:11:21 -04006285void Context::genSamplers(GLsizei count, GLuint *samplers)
6286{
6287 for (int i = 0; i < count; i++)
6288 {
6289 samplers[i] = mState.mSamplers->createSampler();
6290 }
6291}
6292
6293void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6294{
6295 for (int i = 0; i < count; i++)
6296 {
6297 GLuint sampler = samplers[i];
6298
6299 if (mState.mSamplers->getSampler(sampler))
6300 {
6301 detachSampler(sampler);
6302 }
6303
6304 mState.mSamplers->deleteObject(this, sampler);
6305 }
6306}
6307
6308void Context::getInternalformativ(GLenum target,
6309 GLenum internalformat,
6310 GLenum pname,
6311 GLsizei bufSize,
6312 GLint *params)
6313{
6314 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6315 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6316}
6317
Brandon Jones59770802018-04-02 13:18:42 -07006318void Context::getInternalformativRobust(GLenum target,
6319 GLenum internalformat,
6320 GLenum pname,
6321 GLsizei bufSize,
6322 GLsizei *length,
6323 GLint *params)
6324{
6325 getInternalformativ(target, internalformat, pname, bufSize, params);
6326}
6327
Jiajia Qin5451d532017-11-16 17:16:34 +08006328void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6329{
6330 programUniform1iv(program, location, 1, &v0);
6331}
6332
6333void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6334{
6335 GLint xy[2] = {v0, v1};
6336 programUniform2iv(program, location, 1, xy);
6337}
6338
6339void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6340{
6341 GLint xyz[3] = {v0, v1, v2};
6342 programUniform3iv(program, location, 1, xyz);
6343}
6344
6345void Context::programUniform4i(GLuint program,
6346 GLint location,
6347 GLint v0,
6348 GLint v1,
6349 GLint v2,
6350 GLint v3)
6351{
6352 GLint xyzw[4] = {v0, v1, v2, v3};
6353 programUniform4iv(program, location, 1, xyzw);
6354}
6355
6356void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6357{
6358 programUniform1uiv(program, location, 1, &v0);
6359}
6360
6361void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6362{
6363 GLuint xy[2] = {v0, v1};
6364 programUniform2uiv(program, location, 1, xy);
6365}
6366
6367void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6368{
6369 GLuint xyz[3] = {v0, v1, v2};
6370 programUniform3uiv(program, location, 1, xyz);
6371}
6372
6373void Context::programUniform4ui(GLuint program,
6374 GLint location,
6375 GLuint v0,
6376 GLuint v1,
6377 GLuint v2,
6378 GLuint v3)
6379{
6380 GLuint xyzw[4] = {v0, v1, v2, v3};
6381 programUniform4uiv(program, location, 1, xyzw);
6382}
6383
6384void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6385{
6386 programUniform1fv(program, location, 1, &v0);
6387}
6388
6389void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6390{
6391 GLfloat xy[2] = {v0, v1};
6392 programUniform2fv(program, location, 1, xy);
6393}
6394
6395void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6396{
6397 GLfloat xyz[3] = {v0, v1, v2};
6398 programUniform3fv(program, location, 1, xyz);
6399}
6400
6401void Context::programUniform4f(GLuint program,
6402 GLint location,
6403 GLfloat v0,
6404 GLfloat v1,
6405 GLfloat v2,
6406 GLfloat v3)
6407{
6408 GLfloat xyzw[4] = {v0, v1, v2, v3};
6409 programUniform4fv(program, location, 1, xyzw);
6410}
6411
Jamie Madill81c2e252017-09-09 23:32:46 -04006412void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6413{
6414 Program *programObject = getProgram(program);
6415 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006416 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006417}
6418
Jiajia Qin5451d532017-11-16 17:16:34 +08006419void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6420{
6421 Program *programObject = getProgram(program);
6422 ASSERT(programObject);
6423 programObject->setUniform2iv(location, count, value);
6424}
6425
6426void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6427{
6428 Program *programObject = getProgram(program);
6429 ASSERT(programObject);
6430 programObject->setUniform3iv(location, count, value);
6431}
6432
6433void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6434{
6435 Program *programObject = getProgram(program);
6436 ASSERT(programObject);
6437 programObject->setUniform4iv(location, count, value);
6438}
6439
6440void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6441{
6442 Program *programObject = getProgram(program);
6443 ASSERT(programObject);
6444 programObject->setUniform1uiv(location, count, value);
6445}
6446
6447void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6448{
6449 Program *programObject = getProgram(program);
6450 ASSERT(programObject);
6451 programObject->setUniform2uiv(location, count, value);
6452}
6453
6454void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6455{
6456 Program *programObject = getProgram(program);
6457 ASSERT(programObject);
6458 programObject->setUniform3uiv(location, count, value);
6459}
6460
6461void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6462{
6463 Program *programObject = getProgram(program);
6464 ASSERT(programObject);
6465 programObject->setUniform4uiv(location, count, value);
6466}
6467
6468void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6469{
6470 Program *programObject = getProgram(program);
6471 ASSERT(programObject);
6472 programObject->setUniform1fv(location, count, value);
6473}
6474
6475void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6476{
6477 Program *programObject = getProgram(program);
6478 ASSERT(programObject);
6479 programObject->setUniform2fv(location, count, value);
6480}
6481
6482void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6483{
6484 Program *programObject = getProgram(program);
6485 ASSERT(programObject);
6486 programObject->setUniform3fv(location, count, value);
6487}
6488
6489void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6490{
6491 Program *programObject = getProgram(program);
6492 ASSERT(programObject);
6493 programObject->setUniform4fv(location, count, value);
6494}
6495
6496void Context::programUniformMatrix2fv(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->setUniformMatrix2fv(location, count, transpose, value);
6505}
6506
6507void Context::programUniformMatrix3fv(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->setUniformMatrix3fv(location, count, transpose, value);
6516}
6517
6518void Context::programUniformMatrix4fv(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->setUniformMatrix4fv(location, count, transpose, value);
6527}
6528
6529void Context::programUniformMatrix2x3fv(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->setUniformMatrix2x3fv(location, count, transpose, value);
6538}
6539
6540void Context::programUniformMatrix3x2fv(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->setUniformMatrix3x2fv(location, count, transpose, value);
6549}
6550
6551void Context::programUniformMatrix2x4fv(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->setUniformMatrix2x4fv(location, count, transpose, value);
6560}
6561
6562void Context::programUniformMatrix4x2fv(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->setUniformMatrix4x2fv(location, count, transpose, value);
6571}
6572
6573void Context::programUniformMatrix3x4fv(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->setUniformMatrix3x4fv(location, count, transpose, value);
6582}
6583
6584void Context::programUniformMatrix4x3fv(GLuint program,
6585 GLint location,
6586 GLsizei count,
6587 GLboolean transpose,
6588 const GLfloat *value)
6589{
6590 Program *programObject = getProgram(program);
6591 ASSERT(programObject);
6592 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6593}
6594
Jamie Madill81c2e252017-09-09 23:32:46 -04006595void Context::onTextureChange(const Texture *texture)
6596{
6597 // Conservatively assume all textures are dirty.
6598 // TODO(jmadill): More fine-grained update.
6599 mGLState.setObjectDirty(GL_TEXTURE);
6600}
6601
James Darpiniane8a93c62018-01-04 18:02:24 -08006602bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6603{
6604 return mGLState.isCurrentTransformFeedback(tf);
6605}
James Darpiniane8a93c62018-01-04 18:02:24 -08006606
Yunchao Hea336b902017-08-02 16:05:21 +08006607void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6608{
6609 for (int i = 0; i < count; i++)
6610 {
6611 pipelines[i] = createProgramPipeline();
6612 }
6613}
6614
6615void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6616{
6617 for (int i = 0; i < count; i++)
6618 {
6619 if (pipelines[i] != 0)
6620 {
6621 deleteProgramPipeline(pipelines[i]);
6622 }
6623 }
6624}
6625
6626GLboolean Context::isProgramPipeline(GLuint pipeline)
6627{
6628 if (pipeline == 0)
6629 {
6630 return GL_FALSE;
6631 }
6632
6633 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6634}
6635
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006636void Context::finishFenceNV(GLuint fence)
6637{
6638 FenceNV *fenceObject = getFenceNV(fence);
6639
6640 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04006641 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006642}
6643
6644void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6645{
6646 FenceNV *fenceObject = getFenceNV(fence);
6647
6648 ASSERT(fenceObject && fenceObject->isSet());
6649
6650 switch (pname)
6651 {
6652 case GL_FENCE_STATUS_NV:
6653 {
6654 // GL_NV_fence spec:
6655 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6656 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6657 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6658 GLboolean status = GL_TRUE;
6659 if (fenceObject->getStatus() != GL_TRUE)
6660 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006661 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006662 }
6663 *params = status;
6664 break;
6665 }
6666
6667 case GL_FENCE_CONDITION_NV:
6668 {
6669 *params = static_cast<GLint>(fenceObject->getCondition());
6670 break;
6671 }
6672
6673 default:
6674 UNREACHABLE();
6675 }
6676}
6677
6678void Context::getTranslatedShaderSource(GLuint shader,
6679 GLsizei bufsize,
6680 GLsizei *length,
6681 GLchar *source)
6682{
6683 Shader *shaderObject = getShader(shader);
6684 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08006685 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006686}
6687
6688void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6689{
6690 Program *programObject = getProgram(program);
6691 ASSERT(programObject);
6692
6693 programObject->getUniformfv(this, location, params);
6694}
6695
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006696void Context::getnUniformfvRobust(GLuint program,
6697 GLint location,
6698 GLsizei bufSize,
6699 GLsizei *length,
6700 GLfloat *params)
6701{
6702 UNIMPLEMENTED();
6703}
6704
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006705void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
6706{
6707 Program *programObject = getProgram(program);
6708 ASSERT(programObject);
6709
6710 programObject->getUniformiv(this, location, params);
6711}
6712
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006713void Context::getnUniformivRobust(GLuint program,
6714 GLint location,
6715 GLsizei bufSize,
6716 GLsizei *length,
6717 GLint *params)
6718{
6719 UNIMPLEMENTED();
6720}
6721
6722void Context::getnUniformuivRobust(GLuint program,
6723 GLint location,
6724 GLsizei bufSize,
6725 GLsizei *length,
6726 GLuint *params)
6727{
6728 UNIMPLEMENTED();
6729}
6730
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006731GLboolean Context::isFenceNV(GLuint fence)
6732{
6733 FenceNV *fenceObject = getFenceNV(fence);
6734
6735 if (fenceObject == nullptr)
6736 {
6737 return GL_FALSE;
6738 }
6739
6740 // GL_NV_fence spec:
6741 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
6742 // existing fence.
6743 return fenceObject->isSet();
6744}
6745
6746void Context::readnPixels(GLint x,
6747 GLint y,
6748 GLsizei width,
6749 GLsizei height,
6750 GLenum format,
6751 GLenum type,
6752 GLsizei bufSize,
6753 void *data)
6754{
6755 return readPixels(x, y, width, height, format, type, data);
6756}
6757
Jamie Madill007530e2017-12-28 14:27:04 -05006758void Context::setFenceNV(GLuint fence, GLenum condition)
6759{
6760 ASSERT(condition == GL_ALL_COMPLETED_NV);
6761
6762 FenceNV *fenceObject = getFenceNV(fence);
6763 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04006764 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05006765}
6766
6767GLboolean Context::testFenceNV(GLuint fence)
6768{
6769 FenceNV *fenceObject = getFenceNV(fence);
6770
6771 ASSERT(fenceObject != nullptr);
6772 ASSERT(fenceObject->isSet() == GL_TRUE);
6773
6774 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04006775 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05006776 if (error.isError())
6777 {
6778 handleError(error);
6779 return GL_TRUE;
6780 }
6781
6782 return result;
6783}
6784
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006785void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006786{
6787 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07006788 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05006789 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05006790}
6791
Jamie Madillfa920eb2018-01-04 11:45:50 -05006792void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006793{
6794 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07006795 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05006796 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
6797}
6798
Jamie Madillfa920eb2018-01-04 11:45:50 -05006799void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
6800{
6801 UNIMPLEMENTED();
6802}
6803
Jamie Madill5b772312018-03-08 20:28:32 -05006804bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
6805{
6806 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
6807 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
6808 // to the fact that it is stored internally as a float, and so would require conversion
6809 // if returned from Context::getIntegerv. Since this conversion is already implemented
6810 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
6811 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
6812 // application.
6813 switch (pname)
6814 {
6815 case GL_COMPRESSED_TEXTURE_FORMATS:
6816 {
6817 *type = GL_INT;
6818 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
6819 return true;
6820 }
6821 case GL_SHADER_BINARY_FORMATS:
6822 {
6823 *type = GL_INT;
6824 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
6825 return true;
6826 }
6827
6828 case GL_MAX_VERTEX_ATTRIBS:
6829 case GL_MAX_VERTEX_UNIFORM_VECTORS:
6830 case GL_MAX_VARYING_VECTORS:
6831 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
6832 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
6833 case GL_MAX_TEXTURE_IMAGE_UNITS:
6834 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
6835 case GL_MAX_RENDERBUFFER_SIZE:
6836 case GL_NUM_SHADER_BINARY_FORMATS:
6837 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
6838 case GL_ARRAY_BUFFER_BINDING:
6839 case GL_FRAMEBUFFER_BINDING:
6840 case GL_RENDERBUFFER_BINDING:
6841 case GL_CURRENT_PROGRAM:
6842 case GL_PACK_ALIGNMENT:
6843 case GL_UNPACK_ALIGNMENT:
6844 case GL_GENERATE_MIPMAP_HINT:
6845 case GL_RED_BITS:
6846 case GL_GREEN_BITS:
6847 case GL_BLUE_BITS:
6848 case GL_ALPHA_BITS:
6849 case GL_DEPTH_BITS:
6850 case GL_STENCIL_BITS:
6851 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
6852 case GL_CULL_FACE_MODE:
6853 case GL_FRONT_FACE:
6854 case GL_ACTIVE_TEXTURE:
6855 case GL_STENCIL_FUNC:
6856 case GL_STENCIL_VALUE_MASK:
6857 case GL_STENCIL_REF:
6858 case GL_STENCIL_FAIL:
6859 case GL_STENCIL_PASS_DEPTH_FAIL:
6860 case GL_STENCIL_PASS_DEPTH_PASS:
6861 case GL_STENCIL_BACK_FUNC:
6862 case GL_STENCIL_BACK_VALUE_MASK:
6863 case GL_STENCIL_BACK_REF:
6864 case GL_STENCIL_BACK_FAIL:
6865 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
6866 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
6867 case GL_DEPTH_FUNC:
6868 case GL_BLEND_SRC_RGB:
6869 case GL_BLEND_SRC_ALPHA:
6870 case GL_BLEND_DST_RGB:
6871 case GL_BLEND_DST_ALPHA:
6872 case GL_BLEND_EQUATION_RGB:
6873 case GL_BLEND_EQUATION_ALPHA:
6874 case GL_STENCIL_WRITEMASK:
6875 case GL_STENCIL_BACK_WRITEMASK:
6876 case GL_STENCIL_CLEAR_VALUE:
6877 case GL_SUBPIXEL_BITS:
6878 case GL_MAX_TEXTURE_SIZE:
6879 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
6880 case GL_SAMPLE_BUFFERS:
6881 case GL_SAMPLES:
6882 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
6883 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
6884 case GL_TEXTURE_BINDING_2D:
6885 case GL_TEXTURE_BINDING_CUBE_MAP:
6886 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
6887 {
6888 *type = GL_INT;
6889 *numParams = 1;
6890 return true;
6891 }
6892 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
6893 {
6894 if (!getExtensions().packReverseRowOrder)
6895 {
6896 return false;
6897 }
6898 *type = GL_INT;
6899 *numParams = 1;
6900 return true;
6901 }
6902 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
6903 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
6904 {
6905 if (!getExtensions().textureRectangle)
6906 {
6907 return false;
6908 }
6909 *type = GL_INT;
6910 *numParams = 1;
6911 return true;
6912 }
6913 case GL_MAX_DRAW_BUFFERS_EXT:
6914 case GL_MAX_COLOR_ATTACHMENTS_EXT:
6915 {
6916 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
6917 {
6918 return false;
6919 }
6920 *type = GL_INT;
6921 *numParams = 1;
6922 return true;
6923 }
6924 case GL_MAX_VIEWPORT_DIMS:
6925 {
6926 *type = GL_INT;
6927 *numParams = 2;
6928 return true;
6929 }
6930 case GL_VIEWPORT:
6931 case GL_SCISSOR_BOX:
6932 {
6933 *type = GL_INT;
6934 *numParams = 4;
6935 return true;
6936 }
6937 case GL_SHADER_COMPILER:
6938 case GL_SAMPLE_COVERAGE_INVERT:
6939 case GL_DEPTH_WRITEMASK:
6940 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
6941 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
6942 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
6943 // bool-natural
6944 case GL_SAMPLE_COVERAGE:
6945 case GL_SCISSOR_TEST:
6946 case GL_STENCIL_TEST:
6947 case GL_DEPTH_TEST:
6948 case GL_BLEND:
6949 case GL_DITHER:
6950 case GL_CONTEXT_ROBUST_ACCESS_EXT:
6951 {
6952 *type = GL_BOOL;
6953 *numParams = 1;
6954 return true;
6955 }
6956 case GL_COLOR_WRITEMASK:
6957 {
6958 *type = GL_BOOL;
6959 *numParams = 4;
6960 return true;
6961 }
6962 case GL_POLYGON_OFFSET_FACTOR:
6963 case GL_POLYGON_OFFSET_UNITS:
6964 case GL_SAMPLE_COVERAGE_VALUE:
6965 case GL_DEPTH_CLEAR_VALUE:
6966 case GL_LINE_WIDTH:
6967 {
6968 *type = GL_FLOAT;
6969 *numParams = 1;
6970 return true;
6971 }
6972 case GL_ALIASED_LINE_WIDTH_RANGE:
6973 case GL_ALIASED_POINT_SIZE_RANGE:
6974 case GL_DEPTH_RANGE:
6975 {
6976 *type = GL_FLOAT;
6977 *numParams = 2;
6978 return true;
6979 }
6980 case GL_COLOR_CLEAR_VALUE:
6981 case GL_BLEND_COLOR:
6982 {
6983 *type = GL_FLOAT;
6984 *numParams = 4;
6985 return true;
6986 }
6987 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
6988 if (!getExtensions().textureFilterAnisotropic)
6989 {
6990 return false;
6991 }
6992 *type = GL_FLOAT;
6993 *numParams = 1;
6994 return true;
6995 case GL_TIMESTAMP_EXT:
6996 if (!getExtensions().disjointTimerQuery)
6997 {
6998 return false;
6999 }
7000 *type = GL_INT_64_ANGLEX;
7001 *numParams = 1;
7002 return true;
7003 case GL_GPU_DISJOINT_EXT:
7004 if (!getExtensions().disjointTimerQuery)
7005 {
7006 return false;
7007 }
7008 *type = GL_INT;
7009 *numParams = 1;
7010 return true;
7011 case GL_COVERAGE_MODULATION_CHROMIUM:
7012 if (!getExtensions().framebufferMixedSamples)
7013 {
7014 return false;
7015 }
7016 *type = GL_INT;
7017 *numParams = 1;
7018 return true;
7019 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7020 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7021 {
7022 return false;
7023 }
7024 *type = GL_INT;
7025 *numParams = 1;
7026 return true;
7027 }
7028
7029 if (getExtensions().debug)
7030 {
7031 switch (pname)
7032 {
7033 case GL_DEBUG_LOGGED_MESSAGES:
7034 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7035 case GL_DEBUG_GROUP_STACK_DEPTH:
7036 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7037 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7038 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7039 case GL_MAX_LABEL_LENGTH:
7040 *type = GL_INT;
7041 *numParams = 1;
7042 return true;
7043
7044 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7045 case GL_DEBUG_OUTPUT:
7046 *type = GL_BOOL;
7047 *numParams = 1;
7048 return true;
7049 }
7050 }
7051
7052 if (getExtensions().multisampleCompatibility)
7053 {
7054 switch (pname)
7055 {
7056 case GL_MULTISAMPLE_EXT:
7057 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7058 *type = GL_BOOL;
7059 *numParams = 1;
7060 return true;
7061 }
7062 }
7063
7064 if (getExtensions().pathRendering)
7065 {
7066 switch (pname)
7067 {
7068 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7069 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7070 *type = GL_FLOAT;
7071 *numParams = 16;
7072 return true;
7073 }
7074 }
7075
7076 if (getExtensions().bindGeneratesResource)
7077 {
7078 switch (pname)
7079 {
7080 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7081 *type = GL_BOOL;
7082 *numParams = 1;
7083 return true;
7084 }
7085 }
7086
7087 if (getExtensions().clientArrays)
7088 {
7089 switch (pname)
7090 {
7091 case GL_CLIENT_ARRAYS_ANGLE:
7092 *type = GL_BOOL;
7093 *numParams = 1;
7094 return true;
7095 }
7096 }
7097
7098 if (getExtensions().sRGBWriteControl)
7099 {
7100 switch (pname)
7101 {
7102 case GL_FRAMEBUFFER_SRGB_EXT:
7103 *type = GL_BOOL;
7104 *numParams = 1;
7105 return true;
7106 }
7107 }
7108
7109 if (getExtensions().robustResourceInitialization &&
7110 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7111 {
7112 *type = GL_BOOL;
7113 *numParams = 1;
7114 return true;
7115 }
7116
7117 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7118 {
7119 *type = GL_BOOL;
7120 *numParams = 1;
7121 return true;
7122 }
7123
jchen1082af6202018-06-22 10:59:52 +08007124 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7125 {
7126 *type = GL_INT;
7127 *numParams = 1;
7128 return true;
7129 }
7130
Jamie Madill5b772312018-03-08 20:28:32 -05007131 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7132 switch (pname)
7133 {
7134 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7135 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7136 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7137 {
7138 return false;
7139 }
7140 *type = GL_INT;
7141 *numParams = 1;
7142 return true;
7143
7144 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7145 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7146 {
7147 return false;
7148 }
7149 *type = GL_INT;
7150 *numParams = 1;
7151 return true;
7152
7153 case GL_PROGRAM_BINARY_FORMATS_OES:
7154 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7155 {
7156 return false;
7157 }
7158 *type = GL_INT;
7159 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7160 return true;
7161
7162 case GL_PACK_ROW_LENGTH:
7163 case GL_PACK_SKIP_ROWS:
7164 case GL_PACK_SKIP_PIXELS:
7165 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7166 {
7167 return false;
7168 }
7169 *type = GL_INT;
7170 *numParams = 1;
7171 return true;
7172 case GL_UNPACK_ROW_LENGTH:
7173 case GL_UNPACK_SKIP_ROWS:
7174 case GL_UNPACK_SKIP_PIXELS:
7175 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7176 {
7177 return false;
7178 }
7179 *type = GL_INT;
7180 *numParams = 1;
7181 return true;
7182 case GL_VERTEX_ARRAY_BINDING:
7183 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7184 {
7185 return false;
7186 }
7187 *type = GL_INT;
7188 *numParams = 1;
7189 return true;
7190 case GL_PIXEL_PACK_BUFFER_BINDING:
7191 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7192 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7193 {
7194 return false;
7195 }
7196 *type = GL_INT;
7197 *numParams = 1;
7198 return true;
7199 case GL_MAX_SAMPLES:
7200 {
7201 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7202 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7203 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7204 {
7205 return false;
7206 }
7207 *type = GL_INT;
7208 *numParams = 1;
7209 return true;
7210
7211 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7212 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7213 {
7214 return false;
7215 }
7216 *type = GL_INT;
7217 *numParams = 1;
7218 return true;
7219 }
7220 }
7221
7222 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7223 {
7224 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7225 {
7226 return false;
7227 }
7228 *type = GL_INT;
7229 *numParams = 1;
7230 return true;
7231 }
7232
7233 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7234 {
7235 *type = GL_INT;
7236 *numParams = 1;
7237 return true;
7238 }
7239
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007240 if (getClientVersion() < Version(2, 0))
7241 {
7242 switch (pname)
7243 {
7244 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007245 case GL_CLIENT_ACTIVE_TEXTURE:
7246 case GL_MATRIX_MODE:
7247 case GL_MAX_TEXTURE_UNITS:
7248 case GL_MAX_MODELVIEW_STACK_DEPTH:
7249 case GL_MAX_PROJECTION_STACK_DEPTH:
7250 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007251 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007252 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007253 case GL_VERTEX_ARRAY_STRIDE:
7254 case GL_NORMAL_ARRAY_STRIDE:
7255 case GL_COLOR_ARRAY_STRIDE:
7256 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7257 case GL_VERTEX_ARRAY_SIZE:
7258 case GL_COLOR_ARRAY_SIZE:
7259 case GL_TEXTURE_COORD_ARRAY_SIZE:
7260 case GL_VERTEX_ARRAY_TYPE:
7261 case GL_NORMAL_ARRAY_TYPE:
7262 case GL_COLOR_ARRAY_TYPE:
7263 case GL_TEXTURE_COORD_ARRAY_TYPE:
7264 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7265 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7266 case GL_COLOR_ARRAY_BUFFER_BINDING:
7267 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7268 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7269 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7270 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007271 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007272 case GL_MODELVIEW_STACK_DEPTH:
7273 case GL_PROJECTION_STACK_DEPTH:
7274 case GL_TEXTURE_STACK_DEPTH:
7275 case GL_LOGIC_OP_MODE:
7276 case GL_BLEND_SRC:
7277 case GL_BLEND_DST:
7278 case GL_PERSPECTIVE_CORRECTION_HINT:
7279 case GL_POINT_SMOOTH_HINT:
7280 case GL_LINE_SMOOTH_HINT:
7281 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007282 *type = GL_INT;
7283 *numParams = 1;
7284 return true;
7285 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007286 case GL_FOG_DENSITY:
7287 case GL_FOG_START:
7288 case GL_FOG_END:
7289 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007290 case GL_POINT_SIZE:
7291 case GL_POINT_SIZE_MIN:
7292 case GL_POINT_SIZE_MAX:
7293 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007294 *type = GL_FLOAT;
7295 *numParams = 1;
7296 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007297 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007298 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007299 *type = GL_FLOAT;
7300 *numParams = 2;
7301 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007302 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007303 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007304 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007305 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007306 *type = GL_FLOAT;
7307 *numParams = 4;
7308 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007309 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007310 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007311 *type = GL_FLOAT;
7312 *numParams = 3;
7313 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007314 case GL_MODELVIEW_MATRIX:
7315 case GL_PROJECTION_MATRIX:
7316 case GL_TEXTURE_MATRIX:
7317 *type = GL_FLOAT;
7318 *numParams = 16;
7319 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007320 case GL_LIGHT_MODEL_TWO_SIDE:
7321 *type = GL_BOOL;
7322 *numParams = 1;
7323 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007324 }
7325 }
7326
Jamie Madill5b772312018-03-08 20:28:32 -05007327 if (getClientVersion() < Version(3, 0))
7328 {
7329 return false;
7330 }
7331
7332 // Check for ES3.0+ parameter names
7333 switch (pname)
7334 {
7335 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7336 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7337 case GL_UNIFORM_BUFFER_BINDING:
7338 case GL_TRANSFORM_FEEDBACK_BINDING:
7339 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7340 case GL_COPY_READ_BUFFER_BINDING:
7341 case GL_COPY_WRITE_BUFFER_BINDING:
7342 case GL_SAMPLER_BINDING:
7343 case GL_READ_BUFFER:
7344 case GL_TEXTURE_BINDING_3D:
7345 case GL_TEXTURE_BINDING_2D_ARRAY:
7346 case GL_MAX_3D_TEXTURE_SIZE:
7347 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7348 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7349 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7350 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7351 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7352 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7353 case GL_MAX_VARYING_COMPONENTS:
7354 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7355 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7356 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7357 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7358 case GL_NUM_EXTENSIONS:
7359 case GL_MAJOR_VERSION:
7360 case GL_MINOR_VERSION:
7361 case GL_MAX_ELEMENTS_INDICES:
7362 case GL_MAX_ELEMENTS_VERTICES:
7363 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7364 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7365 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7366 case GL_UNPACK_IMAGE_HEIGHT:
7367 case GL_UNPACK_SKIP_IMAGES:
7368 {
7369 *type = GL_INT;
7370 *numParams = 1;
7371 return true;
7372 }
7373
7374 case GL_MAX_ELEMENT_INDEX:
7375 case GL_MAX_UNIFORM_BLOCK_SIZE:
7376 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7377 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7378 case GL_MAX_SERVER_WAIT_TIMEOUT:
7379 {
7380 *type = GL_INT_64_ANGLEX;
7381 *numParams = 1;
7382 return true;
7383 }
7384
7385 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7386 case GL_TRANSFORM_FEEDBACK_PAUSED:
7387 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7388 case GL_RASTERIZER_DISCARD:
7389 {
7390 *type = GL_BOOL;
7391 *numParams = 1;
7392 return true;
7393 }
7394
7395 case GL_MAX_TEXTURE_LOD_BIAS:
7396 {
7397 *type = GL_FLOAT;
7398 *numParams = 1;
7399 return true;
7400 }
7401 }
7402
7403 if (getExtensions().requestExtension)
7404 {
7405 switch (pname)
7406 {
7407 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7408 *type = GL_INT;
7409 *numParams = 1;
7410 return true;
7411 }
7412 }
7413
7414 if (getClientVersion() < Version(3, 1))
7415 {
7416 return false;
7417 }
7418
7419 switch (pname)
7420 {
7421 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7422 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7423 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7424 case GL_MAX_FRAMEBUFFER_WIDTH:
7425 case GL_MAX_FRAMEBUFFER_HEIGHT:
7426 case GL_MAX_FRAMEBUFFER_SAMPLES:
7427 case GL_MAX_SAMPLE_MASK_WORDS:
7428 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7429 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7430 case GL_MAX_INTEGER_SAMPLES:
7431 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7432 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7433 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7434 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7435 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7436 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7437 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7438 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7439 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7440 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7441 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7442 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7443 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7444 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7445 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7446 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7447 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7448 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7449 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7450 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7451 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7452 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7453 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7454 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7455 case GL_MAX_UNIFORM_LOCATIONS:
7456 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7457 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7458 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7459 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7460 case GL_MAX_IMAGE_UNITS:
7461 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7462 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7463 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7464 case GL_SHADER_STORAGE_BUFFER_BINDING:
7465 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7466 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
7467 *type = GL_INT;
7468 *numParams = 1;
7469 return true;
7470 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7471 *type = GL_INT_64_ANGLEX;
7472 *numParams = 1;
7473 return true;
7474 case GL_SAMPLE_MASK:
7475 *type = GL_BOOL;
7476 *numParams = 1;
7477 return true;
7478 }
7479
7480 if (getExtensions().geometryShader)
7481 {
7482 switch (pname)
7483 {
7484 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7485 case GL_LAYER_PROVOKING_VERTEX_EXT:
7486 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7487 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7488 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7489 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7490 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7491 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7492 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7493 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7494 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7495 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7496 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7497 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7498 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7499 *type = GL_INT;
7500 *numParams = 1;
7501 return true;
7502 }
7503 }
7504
7505 return false;
7506}
7507
7508bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7509{
7510 if (getClientVersion() < Version(3, 0))
7511 {
7512 return false;
7513 }
7514
7515 switch (target)
7516 {
7517 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7518 case GL_UNIFORM_BUFFER_BINDING:
7519 {
7520 *type = GL_INT;
7521 *numParams = 1;
7522 return true;
7523 }
7524 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7525 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7526 case GL_UNIFORM_BUFFER_START:
7527 case GL_UNIFORM_BUFFER_SIZE:
7528 {
7529 *type = GL_INT_64_ANGLEX;
7530 *numParams = 1;
7531 return true;
7532 }
7533 }
7534
7535 if (getClientVersion() < Version(3, 1))
7536 {
7537 return false;
7538 }
7539
7540 switch (target)
7541 {
7542 case GL_IMAGE_BINDING_LAYERED:
7543 {
7544 *type = GL_BOOL;
7545 *numParams = 1;
7546 return true;
7547 }
7548 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7549 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7550 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7551 case GL_SHADER_STORAGE_BUFFER_BINDING:
7552 case GL_VERTEX_BINDING_BUFFER:
7553 case GL_VERTEX_BINDING_DIVISOR:
7554 case GL_VERTEX_BINDING_OFFSET:
7555 case GL_VERTEX_BINDING_STRIDE:
7556 case GL_SAMPLE_MASK_VALUE:
7557 case GL_IMAGE_BINDING_NAME:
7558 case GL_IMAGE_BINDING_LEVEL:
7559 case GL_IMAGE_BINDING_LAYER:
7560 case GL_IMAGE_BINDING_ACCESS:
7561 case GL_IMAGE_BINDING_FORMAT:
7562 {
7563 *type = GL_INT;
7564 *numParams = 1;
7565 return true;
7566 }
7567 case GL_ATOMIC_COUNTER_BUFFER_START:
7568 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7569 case GL_SHADER_STORAGE_BUFFER_START:
7570 case GL_SHADER_STORAGE_BUFFER_SIZE:
7571 {
7572 *type = GL_INT_64_ANGLEX;
7573 *numParams = 1;
7574 return true;
7575 }
7576 }
7577
7578 return false;
7579}
7580
7581Program *Context::getProgram(GLuint handle) const
7582{
7583 return mState.mShaderPrograms->getProgram(handle);
7584}
7585
7586Shader *Context::getShader(GLuint handle) const
7587{
7588 return mState.mShaderPrograms->getShader(handle);
7589}
7590
7591bool Context::isTextureGenerated(GLuint texture) const
7592{
7593 return mState.mTextures->isHandleGenerated(texture);
7594}
7595
7596bool Context::isBufferGenerated(GLuint buffer) const
7597{
7598 return mState.mBuffers->isHandleGenerated(buffer);
7599}
7600
7601bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7602{
7603 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7604}
7605
7606bool Context::isFramebufferGenerated(GLuint framebuffer) const
7607{
7608 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7609}
7610
7611bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7612{
7613 return mState.mPipelines->isHandleGenerated(pipeline);
7614}
7615
7616bool Context::usingDisplayTextureShareGroup() const
7617{
7618 return mDisplayTextureShareGroup;
7619}
7620
7621GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7622{
7623 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7624 internalformat == GL_DEPTH_STENCIL
7625 ? GL_DEPTH24_STENCIL8
7626 : internalformat;
7627}
7628
jchen1082af6202018-06-22 10:59:52 +08007629void Context::maxShaderCompilerThreads(GLuint count)
7630{
jchen107ae70d82018-07-06 13:47:01 +08007631 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08007632 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08007633 // A count of zero specifies a request for no parallel compiling or linking.
7634 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
7635 {
7636 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
7637 }
7638 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08007639}
7640
Jamie Madill2eb65032018-07-30 10:25:57 -04007641bool Context::isGLES1() const
7642{
7643 return mState.getClientVersion() < Version(2, 0);
7644}
7645
Jamie Madilla11819d2018-07-30 10:26:01 -04007646void Context::onSubjectStateChange(const Context *context,
7647 angle::SubjectIndex index,
7648 angle::SubjectMessage message)
7649{
Jamie Madilla11819d2018-07-30 10:26:01 -04007650 switch (index)
7651 {
7652 case kVertexArraySubjectIndex:
7653 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
Jamie Madillc43cdad2018-08-08 15:49:25 -04007654 mStateCache.onVertexArraySizeChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04007655 break;
7656
7657 case kReadFramebufferSubjectIndex:
7658 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
7659 break;
7660
7661 case kDrawFramebufferSubjectIndex:
7662 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
7663 break;
7664
7665 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04007666 if (index < kTextureMaxSubjectIndex)
7667 {
7668 mGLState.onActiveTextureStateChange(index);
7669 }
7670 else
7671 {
7672 ASSERT(index < kUniformBufferMaxSubjectIndex);
7673 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
7674 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007675 break;
7676 }
7677}
7678
Jamie Madill6b873dd2018-07-12 23:56:30 -04007679// ErrorSet implementation.
7680ErrorSet::ErrorSet(Context *context) : mContext(context)
7681{
7682}
7683
7684ErrorSet::~ErrorSet() = default;
7685
Jamie Madill306b6c12018-07-27 08:12:49 -04007686void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04007687{
7688 // This internal enum is used to filter internal errors that are already handled.
7689 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
7690 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
7691 {
7692 return;
7693 }
7694
7695 if (ANGLE_UNLIKELY(error.isError()))
7696 {
7697 GLenum code = error.getCode();
7698 mErrors.insert(code);
7699 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
7700 {
7701 mContext->markContextLost();
7702 }
7703
7704 ASSERT(!error.getMessage().empty());
7705 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
7706 error.getID(), GL_DEBUG_SEVERITY_HIGH,
7707 error.getMessage());
7708 }
7709}
7710
7711bool ErrorSet::empty() const
7712{
7713 return mErrors.empty();
7714}
7715
7716GLenum ErrorSet::popError()
7717{
7718 ASSERT(!empty());
7719 GLenum error = *mErrors.begin();
7720 mErrors.erase(mErrors.begin());
7721 return error;
7722}
Jamie Madilldc358af2018-07-31 11:22:13 -04007723
7724// StateCache implementation.
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007725StateCache::StateCache()
7726 : mCachedHasAnyEnabledClientAttrib(false),
7727 mCachedNonInstancedVertexElementLimit(0),
7728 mCachedInstancedVertexElementLimit(0)
Jamie Madilldc358af2018-07-31 11:22:13 -04007729{
7730}
7731
7732StateCache::~StateCache() = default;
7733
7734void StateCache::updateActiveAttribsMask(Context *context)
7735{
7736 bool isGLES1 = context->isGLES1();
7737 const State &glState = context->getGLState();
7738
7739 if (!isGLES1 && !glState.getProgram())
7740 {
7741 mCachedActiveBufferedAttribsMask = AttributesMask();
7742 mCachedActiveClientAttribsMask = AttributesMask();
7743 return;
7744 }
7745
7746 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
7747 : glState.getProgram()->getActiveAttribLocationsMask();
7748
7749 const VertexArray *vao = glState.getVertexArray();
7750 ASSERT(vao);
7751
7752 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
7753 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
7754
7755 activeAttribs &= enabledAttribs;
7756
7757 mCachedActiveClientAttribsMask = activeAttribs & clientAttribs;
7758 mCachedActiveBufferedAttribsMask = activeAttribs & ~clientAttribs;
7759 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
7760}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007761
7762void StateCache::updateVertexElementLimits(Context *context)
7763{
7764 const VertexArray *vao = context->getGLState().getVertexArray();
7765
7766 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
7767 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
7768
7769 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
7770 // If there are no buffered attributes then we should not limit the draw call count.
7771 if (!vao || !mCachedActiveBufferedAttribsMask.any())
7772 {
7773 return;
7774 }
7775
7776 const auto &vertexAttribs = vao->getVertexAttributes();
7777 const auto &vertexBindings = vao->getVertexBindings();
7778
7779 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
7780 {
7781 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
7782 ASSERT(attrib.enabled);
7783
7784 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
7785 ASSERT(context->isGLES1() ||
7786 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
7787
7788 GLint64 limit = attrib.getCachedElementLimit();
7789 if (binding.getDivisor() > 0)
7790 {
7791 mCachedInstancedVertexElementLimit =
7792 std::min(mCachedInstancedVertexElementLimit, limit);
7793 }
7794 else
7795 {
7796 mCachedNonInstancedVertexElementLimit =
7797 std::min(mCachedNonInstancedVertexElementLimit, limit);
7798 }
7799 }
7800}
Jamie Madillc43cdad2018-08-08 15:49:25 -04007801
7802void StateCache::onVertexArrayBindingChange(Context *context)
7803{
7804 updateActiveAttribsMask(context);
7805 updateVertexElementLimits(context);
7806}
7807
7808void StateCache::onProgramExecutableChange(Context *context)
7809{
7810 updateActiveAttribsMask(context);
7811 updateVertexElementLimits(context);
7812}
7813
7814void StateCache::onVertexArraySizeChange(Context *context)
7815{
7816 updateVertexElementLimits(context);
7817}
7818
7819void StateCache::onVertexArrayStateChange(Context *context)
7820{
7821 updateActiveAttribsMask(context);
7822 updateVertexElementLimits(context);
7823}
7824
7825void StateCache::onGLES1ClientStateChange(Context *context)
7826{
7827 updateActiveAttribsMask(context);
7828}
Jamie Madillc29968b2016-01-20 11:17:23 -05007829} // namespace gl