blob: 09591ca228f67a96a909716690c49c6a44158fbc [file] [log] [blame]
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001//
Geoff Langeeba6e12014-02-03 13:12:30 -05002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Context.cpp: Implements the gl::Context class, managing all GL state and performing
8// rendering operations. It is the GLES2 specific implementation of EGLContext.
9
Geoff Lang2b5420c2014-11-19 14:20:15 -050010#include "libANGLE/Context.h"
apatrick@chromium.org144f2802012-07-12 01:42:34 +000011
Jamie Madill231c7f52017-04-26 13:45:37 -040012#include <string.h>
Jamie Madillb9293972015-02-19 11:07:54 -050013#include <iterator>
14#include <sstream>
Sami Väisänend59ca052016-06-21 16:10:00 +030015#include <vector>
Jamie Madillb9293972015-02-19 11:07:54 -050016
Tobin Ehlisd7890bc2018-06-29 11:57:22 -060017#include "common/PackedEnums.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030018#include "common/matrix_utils.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040019#include "common/platform.h"
Jamie Madillb9293972015-02-19 11:07:54 -050020#include "common/utilities.h"
Geoff Langc339c4e2016-11-29 10:37:36 -050021#include "common/version.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050022#include "libANGLE/Buffer.h"
Jamie Madillb9293972015-02-19 11:07:54 -050023#include "libANGLE/Compiler.h"
Jamie Madill948bbe52017-06-01 13:10:42 -040024#include "libANGLE/Display.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050025#include "libANGLE/Fence.h"
26#include "libANGLE/Framebuffer.h"
27#include "libANGLE/FramebufferAttachment.h"
Lingfeng Yang461b09a2018-04-23 09:02:09 -070028#include "libANGLE/GLES1Renderer.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030029#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050030#include "libANGLE/Program.h"
Yunchao Hea336b902017-08-02 16:05:21 +080031#include "libANGLE/ProgramPipeline.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050032#include "libANGLE/Query.h"
Jamie Madillb9293972015-02-19 11:07:54 -050033#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050034#include "libANGLE/ResourceManager.h"
35#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050036#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050037#include "libANGLE/Texture.h"
38#include "libANGLE/TransformFeedback.h"
39#include "libANGLE/VertexArray.h"
Kenneth Russellf2f6f652016-10-05 19:53:23 -070040#include "libANGLE/Workarounds.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040041#include "libANGLE/formatutils.h"
Martin Radev66fb8202016-07-28 11:45:20 +030042#include "libANGLE/queryconversions.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040043#include "libANGLE/queryutils.h"
Jamie Madill6d32cef2018-08-14 02:34:28 -040044#include "libANGLE/renderer/BufferImpl.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040045#include "libANGLE/renderer/ContextImpl.h"
46#include "libANGLE/renderer/EGLImplFactory.h"
Jamie Madill7b62cf92017-11-02 15:20:49 -040047#include "libANGLE/renderer/Format.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040048#include "libANGLE/validationES.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000049
Geoff Langf6db0982015-08-25 13:04:00 -040050namespace
51{
52
Jamie Madillb6664922017-07-25 12:55:04 -040053#define ANGLE_HANDLE_ERR(X) \
54 handleError(X); \
55 return;
56#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
57
Ian Ewell3ffd78b2016-01-22 16:09:42 -050058template <typename T>
Geoff Lang4ddf5af2016-12-01 14:30:44 -050059std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030060 GLsizei numPaths,
61 const void *paths,
62 GLuint pathBase)
63{
64 std::vector<gl::Path *> ret;
65 ret.reserve(numPaths);
66
67 const auto *nameArray = static_cast<const T *>(paths);
68
69 for (GLsizei i = 0; i < numPaths; ++i)
70 {
71 const GLuint pathName = nameArray[i] + pathBase;
72
73 ret.push_back(resourceManager.getPath(pathName));
74 }
75
76 return ret;
77}
78
Geoff Lang4ddf5af2016-12-01 14:30:44 -050079std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030080 GLsizei numPaths,
81 GLenum pathNameType,
82 const void *paths,
83 GLuint pathBase)
84{
85 switch (pathNameType)
86 {
87 case GL_UNSIGNED_BYTE:
88 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
89
90 case GL_BYTE:
91 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
92
93 case GL_UNSIGNED_SHORT:
94 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
95
96 case GL_SHORT:
97 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
98
99 case GL_UNSIGNED_INT:
100 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
101
102 case GL_INT:
103 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
104 }
105
106 UNREACHABLE();
107 return std::vector<gl::Path *>();
108}
109
110template <typename T>
Jamie Madill5188a272018-07-25 10:53:56 -0400111gl::Error GetQueryObjectParameter(const gl::Context *context,
112 gl::Query *query,
113 GLenum pname,
114 T *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500115{
Geoff Lang2186c382016-10-14 10:54:54 -0400116 ASSERT(query != nullptr);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500117
118 switch (pname)
119 {
120 case GL_QUERY_RESULT_EXT:
Jamie Madill5188a272018-07-25 10:53:56 -0400121 return query->getResult(context, params);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500122 case GL_QUERY_RESULT_AVAILABLE_EXT:
123 {
124 bool available;
Jamie Madill5188a272018-07-25 10:53:56 -0400125 gl::Error error = query->isResultAvailable(context, &available);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500126 if (!error.isError())
127 {
jchen10a99ed552017-09-22 08:10:32 +0800128 *params = gl::CastFromStateValue<T>(pname, static_cast<GLuint>(available));
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500129 }
130 return error;
131 }
132 default:
133 UNREACHABLE();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500134 return gl::InternalError() << "Unreachable Error";
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500135 }
136}
137
Jamie Madill09463932018-04-04 05:26:59 -0400138void MarkTransformFeedbackBufferUsage(const gl::Context *context,
139 gl::TransformFeedback *transformFeedback,
James Darpinian30b604d2018-03-12 17:26:57 -0700140 GLsizei count,
141 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -0400142{
Geoff Lang1a683462015-09-29 15:09:59 -0400143 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400144 {
Jamie Madill09463932018-04-04 05:26:59 -0400145 transformFeedback->onVerticesDrawn(context, count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -0400146 }
147}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500148
149// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300150EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500151{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400152 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500153}
154
Martin Radev1be913c2016-07-11 17:59:16 +0300155EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
156{
157 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
158}
159
Geoff Langeb66a6e2016-10-31 13:06:12 -0400160gl::Version GetClientVersion(const egl::AttributeMap &attribs)
161{
162 return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
163}
164
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500165GLenum GetResetStrategy(const egl::AttributeMap &attribs)
166{
Lingfeng Yangb27b03a2018-02-19 13:38:48 -0800167 EGLAttrib attrib =
168 attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500169 switch (attrib)
170 {
171 case EGL_NO_RESET_NOTIFICATION:
172 return GL_NO_RESET_NOTIFICATION_EXT;
173 case EGL_LOSE_CONTEXT_ON_RESET:
174 return GL_LOSE_CONTEXT_ON_RESET_EXT;
175 default:
176 UNREACHABLE();
177 return GL_NONE;
178 }
179}
180
181bool GetRobustAccess(const egl::AttributeMap &attribs)
182{
Geoff Lang077f20a2016-11-01 10:08:02 -0400183 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
184 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
185 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500186}
187
188bool GetDebug(const egl::AttributeMap &attribs)
189{
Geoff Lang077f20a2016-11-01 10:08:02 -0400190 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
191 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500192}
193
194bool GetNoError(const egl::AttributeMap &attribs)
195{
196 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
197}
198
Geoff Langc287ea62016-09-16 14:46:51 -0400199bool GetWebGLContext(const egl::AttributeMap &attribs)
200{
Jamie Madill4230d482018-09-14 10:14:45 -0400201 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
Geoff Langc287ea62016-09-16 14:46:51 -0400202}
203
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400204bool GetExtensionsEnabled(const egl::AttributeMap &attribs, bool webGLContext)
205{
206 // If the context is WebGL, extensions are disabled by default
207 EGLAttrib defaultValue = webGLContext ? EGL_FALSE : EGL_TRUE;
208 return (attribs.get(EGL_EXTENSIONS_ENABLED_ANGLE, defaultValue) == EGL_TRUE);
209}
210
Geoff Langf41a7152016-09-19 15:11:17 -0400211bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
212{
Jamie Madill4230d482018-09-14 10:14:45 -0400213 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
Geoff Langf41a7152016-09-19 15:11:17 -0400214}
215
Geoff Langfeb8c682017-02-13 16:07:35 -0500216bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
217{
218 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
219}
220
Geoff Langb433e872017-10-05 14:01:47 -0400221bool GetRobustResourceInit(const egl::AttributeMap &attribs)
222{
223 return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
224}
225
Martin Radev9d901792016-07-15 15:58:58 +0300226std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
227{
228 std::string labelName;
229 if (label != nullptr)
230 {
231 size_t labelLength = length < 0 ? strlen(label) : length;
232 labelName = std::string(label, labelLength);
233 }
234 return labelName;
235}
236
237void GetObjectLabelBase(const std::string &objectLabel,
238 GLsizei bufSize,
239 GLsizei *length,
240 GLchar *label)
241{
242 size_t writeLength = objectLabel.length();
243 if (label != nullptr && bufSize > 0)
244 {
245 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
246 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
247 label[writeLength] = '\0';
248 }
249
250 if (length != nullptr)
251 {
252 *length = static_cast<GLsizei>(writeLength);
253 }
254}
255
Jamie Madill0f80ed82017-09-19 00:24:56 -0400256template <typename CapT, typename MaxT>
257void LimitCap(CapT *cap, MaxT maximum)
258{
259 *cap = std::min(*cap, static_cast<CapT>(maximum));
260}
261
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600262constexpr angle::PackedEnumMap<gl::PrimitiveMode, GLsizei> kMinimumPrimitiveCounts = {{
Jamie Madill526a6f62018-09-12 11:03:05 -0400263 1, /* Points */
264 2, /* Lines */
265 2, /* LineLoop */
266 2, /* LineStrip */
267 3, /* Triangles */
268 3, /* TriangleStrip */
269 3, /* TriangleFan */
270 2, /* LinesAdjacency */
271 2, /* LineStripAdjacency */
272 3, /* TrianglesAdjacency */
273 3, /* TriangleStripAdjacency */
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600274}};
275// Indices above are code-gen'd so make sure they don't change
276// if any of these static asserts are hit, must update kMinimumPrimitiveCounts abouve
277static_assert(static_cast<gl::PrimitiveMode>(0) == gl::PrimitiveMode::Points,
278 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
279static_assert(static_cast<gl::PrimitiveMode>(1) == gl::PrimitiveMode::Lines,
280 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
281static_assert(static_cast<gl::PrimitiveMode>(2) == gl::PrimitiveMode::LineLoop,
282 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
283static_assert(static_cast<gl::PrimitiveMode>(3) == gl::PrimitiveMode::LineStrip,
284 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
285static_assert(static_cast<gl::PrimitiveMode>(4) == gl::PrimitiveMode::Triangles,
286 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
287static_assert(static_cast<gl::PrimitiveMode>(5) == gl::PrimitiveMode::TriangleStrip,
288 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
289static_assert(static_cast<gl::PrimitiveMode>(6) == gl::PrimitiveMode::TriangleFan,
290 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
291static_assert(static_cast<gl::PrimitiveMode>(7) == gl::PrimitiveMode::LinesAdjacency,
292 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
293static_assert(static_cast<gl::PrimitiveMode>(8) == gl::PrimitiveMode::LineStripAdjacency,
294 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
295static_assert(static_cast<gl::PrimitiveMode>(9) == gl::PrimitiveMode::TrianglesAdjacency,
296 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
297static_assert(static_cast<gl::PrimitiveMode>(10) == gl::PrimitiveMode::TriangleStripAdjacency,
298 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
299static_assert(static_cast<gl::PrimitiveMode>(11) == gl::PrimitiveMode::EnumCount,
300 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
301
Jamie Madill6d32cef2018-08-14 02:34:28 -0400302enum SubjectIndexes : angle::SubjectIndex
303{
304 kTexture0SubjectIndex = 0,
305 kTextureMaxSubjectIndex = kTexture0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
306 kUniformBuffer0SubjectIndex = kTextureMaxSubjectIndex,
307 kUniformBufferMaxSubjectIndex =
308 kUniformBuffer0SubjectIndex + gl::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS,
Jamie Madille25b8002018-09-20 13:39:49 -0400309 kSampler0SubjectIndex = kUniformBufferMaxSubjectIndex,
310 kSamplerMaxSubjectIndex = kSampler0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
311 kVertexArraySubjectIndex = kSamplerMaxSubjectIndex,
Jamie Madill6d32cef2018-08-14 02:34:28 -0400312 kReadFramebufferSubjectIndex,
313 kDrawFramebufferSubjectIndex
314};
Geoff Langf6db0982015-08-25 13:04:00 -0400315} // anonymous namespace
316
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000317namespace gl
318{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000319
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400320Context::Context(rx::EGLImplFactory *implFactory,
321 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400322 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500323 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400324 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500325 const egl::AttributeMap &attribs,
Brandon Jones2b0cdcc2018-05-02 08:02:50 -0700326 const egl::DisplayExtensions &displayExtensions,
327 const egl::ClientExtensions &clientExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500328 : mState(reinterpret_cast<ContextID>(this),
329 shareContext ? &shareContext->mState : nullptr,
330 shareTextures,
331 GetClientVersion(attribs),
332 &mGLState,
333 mCaps,
334 mTextureCaps,
335 mExtensions,
336 mLimitations),
337 mSkipValidation(GetNoError(attribs)),
338 mDisplayTextureShareGroup(shareTextures != nullptr),
339 mSavedArgsType(nullptr),
Geoff Lang3cacf692018-06-20 16:49:57 -0400340 mImplementation(implFactory->createContext(mState, config, shareContext, attribs)),
Geoff Lang75359662018-04-11 01:42:27 -0400341 mLabel(nullptr),
Jamie Madill2f348d22017-06-05 10:50:59 -0400342 mCompiler(),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400343 mGLState(GetDebug(attribs),
344 GetBindGeneratesResource(attribs),
345 GetClientArraysEnabled(attribs),
346 GetRobustResourceInit(attribs),
347 memoryProgramCache != nullptr),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400348 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500349 mClientType(EGL_OPENGL_ES_API),
Jamie Madill6b873dd2018-07-12 23:56:30 -0400350 mErrors(this),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500351 mHasBeenCurrent(false),
352 mContextLost(false),
353 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700354 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500355 mResetStrategy(GetResetStrategy(attribs)),
356 mRobustAccess(GetRobustAccess(attribs)),
Geoff Lang33f11fb2018-05-07 13:42:47 -0400357 mSurfacelessSupported(displayExtensions.surfacelessContext),
358 mExplicitContextAvailable(clientExtensions.explicitContext),
Jamie Madill61e16b42017-06-19 11:13:23 -0400359 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
360 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madille14951e2017-03-09 18:55:16 -0500361 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400362 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400363 mMemoryProgramCache(memoryProgramCache),
Jamie Madill16e28fd2018-09-12 11:03:05 -0400364 mStateCache(this),
Jamie Madilla11819d2018-07-30 10:26:01 -0400365 mVertexArrayObserverBinding(this, kVertexArraySubjectIndex),
366 mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex),
367 mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400368 mScratchBuffer(1000u),
jchen107ae70d82018-07-06 13:47:01 +0800369 mZeroFilledBuffer(1000u),
370 mThreadPool(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000371{
Jamie Madill5b772312018-03-08 20:28:32 -0500372 // Needed to solve a Clang warning of unused variables.
Jamie Madillc6dbc252018-04-30 19:07:56 -0400373 ANGLE_UNUSED_VARIABLE(mSavedArgsType);
374 ANGLE_UNUSED_VARIABLE(mParamsBuffer);
Jamie Madill6d32cef2018-08-14 02:34:28 -0400375
376 for (angle::SubjectIndex uboIndex = kUniformBuffer0SubjectIndex;
377 uboIndex < kUniformBufferMaxSubjectIndex; ++uboIndex)
378 {
379 mUniformBufferObserverBindings.emplace_back(this, uboIndex);
380 }
Jamie Madille25b8002018-09-20 13:39:49 -0400381
382 for (angle::SubjectIndex samplerIndex = kSampler0SubjectIndex;
383 samplerIndex < kSamplerMaxSubjectIndex; ++samplerIndex)
384 {
385 mSamplerObserverBindings.emplace_back(this, samplerIndex);
386 }
Geoff Lang33f11fb2018-05-07 13:42:47 -0400387}
Jamie Madill5b772312018-03-08 20:28:32 -0500388
Geoff Lang33f11fb2018-05-07 13:42:47 -0400389void Context::initialize()
390{
391 mImplementation->setMemoryProgramCache(mMemoryProgramCache);
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400392
Geoff Lang33f11fb2018-05-07 13:42:47 -0400393 initCaps();
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700394 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400395
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400396 mGLState.initialize(this);
Régis Fénéon83107972015-02-05 12:57:44 +0100397
Shannon Woods53a94a82014-06-24 15:20:36 -0400398 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400399
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000400 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400401 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000402 // and cube map texture state vectors respectively associated with them.
403 // In order that access to these initial textures not be lost, they are treated as texture
404 // objects all of whose names are 0.
405
Corentin Wallez99d492c2018-02-27 15:17:10 -0500406 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800407 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500408
Corentin Wallez99d492c2018-02-27 15:17:10 -0500409 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800410 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400411
Geoff Langeb66a6e2016-10-31 13:06:12 -0400412 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400413 {
414 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500415 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800416 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400417
Corentin Wallez99d492c2018-02-27 15:17:10 -0500418 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800419 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400420 }
Geoff Lang3b573612016-10-31 14:08:10 -0400421 if (getClientVersion() >= Version(3, 1))
422 {
Olli Etuahod310a432018-08-24 15:40:23 +0300423 // TODO(http://anglebug.com/2775): These could also be enabled via extension
Geoff Lang3b573612016-10-31 14:08:10 -0400424 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500425 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800426 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Olli Etuahod310a432018-08-24 15:40:23 +0300427 Texture *zeroTexture2DMultisampleArray =
428 new Texture(mImplementation.get(), 0, TextureType::_2DMultisampleArray);
429 mZeroTextures[TextureType::_2DMultisampleArray].set(this, zeroTexture2DMultisampleArray);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800430
Jiajia Qin6eafb042016-12-27 17:04:07 +0800431 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
432 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800433 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800434 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800435
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800436 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
437 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400438 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800439 }
Geoff Lang3b573612016-10-31 14:08:10 -0400440 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000441
Geoff Langb0f917f2017-12-05 13:41:54 -0500442 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400443 {
444 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500445 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800446 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400447 }
448
Geoff Langb0f917f2017-12-05 13:41:54 -0500449 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400450 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500451 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800452 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400453 }
454
Jamie Madill4928b7c2017-06-20 12:57:39 -0400455 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500456
Jamie Madill57a89722013-07-02 11:57:03 -0400457 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000458
Geoff Langeb66a6e2016-10-31 13:06:12 -0400459 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400460 {
461 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
462 // In the initial state, a default transform feedback object is bound and treated as
463 // a transform feedback object with a name of zero. That object is bound any time
464 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400465 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400466 }
Geoff Langc8058452014-02-03 12:04:11 -0500467
Corentin Wallez336129f2017-10-17 15:55:40 -0400468 for (auto type : angle::AllEnums<BufferBinding>())
469 {
470 bindBuffer(type, 0);
471 }
472
473 bindRenderbuffer(GL_RENDERBUFFER, 0);
474
475 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
476 {
477 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
478 }
479
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700480 // Initialize GLES1 renderer if appropriate.
481 if (getClientVersion() < Version(2, 0))
482 {
483 mGLES1Renderer.reset(new GLES1Renderer());
484 }
485
Jamie Madillad9f24e2016-02-12 09:27:24 -0500486 // Initialize dirty bit masks
Geoff Lang9bf86f02018-07-26 11:46:34 -0400487 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
488 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
489 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400490 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400491 mDrawDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400492
493 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
494 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
495 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madille25b8002018-09-20 13:39:49 -0400496 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400497
Jamie Madillc67323a2017-11-02 23:11:41 -0400498 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500499 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500500 // No dirty objects.
501
502 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400503 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500504 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400505 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500506 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
507
508 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
509 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
510 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
511 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
512 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
513 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
514 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
515 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
516 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
517 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
518 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400519 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500520 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
521
522 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
523 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700524 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400525 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
526 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500527 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
528 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400529
Xinghua Cao10a4d432017-11-28 14:46:26 +0800530 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
jchen1099118c12018-09-10 16:28:51 +0800531 mComputeDirtyBits.set(State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
532 mComputeDirtyBits.set(State::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800533 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
534 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
535 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
536 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
jchen1099118c12018-09-10 16:28:51 +0800537 mComputeDirtyBits.set(State::DIRTY_BIT_IMAGE_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800538 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800539 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400540 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400541 mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800542
Jamie Madillb4927eb2018-07-16 11:39:46 -0400543 mImplementation->setErrorSet(&mErrors);
544
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400545 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000546}
547
Jamie Madill4928b7c2017-06-20 12:57:39 -0400548egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000549{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700550 if (mGLES1Renderer)
551 {
552 mGLES1Renderer->onDestroy(this, &mGLState);
553 }
554
Jamie Madille7b3fe22018-04-05 09:42:46 -0400555 // Delete the Surface first to trigger a finish() in Vulkan.
Jamie Madille7b3fe22018-04-05 09:42:46 -0400556 ANGLE_TRY(releaseSurface(display));
557
Corentin Wallez80b24112015-08-25 16:41:57 -0400558 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000559 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400560 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000561 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400562 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000563
Corentin Wallez80b24112015-08-25 16:41:57 -0400564 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000565 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400566 if (query.second != nullptr)
567 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400568 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400569 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000570 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400571 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000572
Corentin Wallez80b24112015-08-25 16:41:57 -0400573 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400574 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400575 if (vertexArray.second)
576 {
577 vertexArray.second->onDestroy(this);
578 }
Jamie Madill57a89722013-07-02 11:57:03 -0400579 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400580 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400581
Corentin Wallez80b24112015-08-25 16:41:57 -0400582 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500583 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500584 if (transformFeedback.second != nullptr)
585 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500586 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500587 }
Geoff Langc8058452014-02-03 12:04:11 -0500588 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400589 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500590
Jamie Madill5b772312018-03-08 20:28:32 -0500591 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400592 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800593 if (zeroTexture.get() != nullptr)
594 {
595 ANGLE_TRY(zeroTexture->onDestroy(this));
596 zeroTexture.set(this, nullptr);
597 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400598 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000599
Jamie Madill2f348d22017-06-05 10:50:59 -0400600 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500601
Jamie Madill4928b7c2017-06-20 12:57:39 -0400602 mGLState.reset(this);
603
Jamie Madill6c1f6712017-02-14 19:08:04 -0500604 mState.mBuffers->release(this);
605 mState.mShaderPrograms->release(this);
606 mState.mTextures->release(this);
607 mState.mRenderbuffers->release(this);
608 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400609 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500610 mState.mPaths->release(this);
611 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800612 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400613
jchen107ae70d82018-07-06 13:47:01 +0800614 mThreadPool.reset();
615
Jamie Madill76e471e2017-10-21 09:56:01 -0400616 mImplementation->onDestroy(this);
617
Jamie Madill4928b7c2017-06-20 12:57:39 -0400618 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000619}
620
Jamie Madill70ee0f62017-02-06 16:04:20 -0500621Context::~Context()
622{
623}
624
Geoff Lang75359662018-04-11 01:42:27 -0400625void Context::setLabel(EGLLabelKHR label)
626{
627 mLabel = label;
628}
629
630EGLLabelKHR Context::getLabel() const
631{
632 return mLabel;
633}
634
Jamie Madill4928b7c2017-06-20 12:57:39 -0400635egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000636{
Jamie Madill61e16b42017-06-19 11:13:23 -0400637 mCurrentDisplay = display;
638
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000639 if (!mHasBeenCurrent)
640 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400641 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000642 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500643 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400644 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000645
Corentin Wallezc295e512017-01-27 17:47:50 -0500646 int width = 0;
647 int height = 0;
648 if (surface != nullptr)
649 {
650 width = surface->getWidth();
651 height = surface->getHeight();
652 }
653
654 mGLState.setViewportParams(0, 0, width, height);
655 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000656
657 mHasBeenCurrent = true;
658 }
659
Jamie Madill1b94d432015-08-07 13:23:23 -0400660 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700661 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400662 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400663
Jamie Madill4928b7c2017-06-20 12:57:39 -0400664 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500665
666 Framebuffer *newDefault = nullptr;
667 if (surface != nullptr)
668 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400669 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500670 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400671 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500672 }
673 else
674 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400675 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500676 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000677
Corentin Wallez37c39792015-08-20 14:19:46 -0400678 // Update default framebuffer, the binding of the previous default
679 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400680 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400681 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700682 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400683 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400684 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400685 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700686 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400687 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400688 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400689 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400690 }
Ian Ewell292f0052016-02-04 10:37:32 -0500691
692 // Notify the renderer of a context switch
Luc Ferron5396f2a2018-07-12 08:24:23 -0400693 ANGLE_TRY(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400694 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000695}
696
Jamie Madill4928b7c2017-06-20 12:57:39 -0400697egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400698{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400699 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400700
Geoff Langbf7b95d2018-05-01 16:48:21 -0400701 // Remove the default framebuffer
702 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500703 {
704 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400705 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500706 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400707
708 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500709 {
710 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400711 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500712 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400713
714 if (defaultFramebuffer)
715 {
716 defaultFramebuffer->onDestroy(this);
717 delete defaultFramebuffer;
718 }
719
Corentin Wallezc295e512017-01-27 17:47:50 -0500720 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
721
722 if (mCurrentSurface)
723 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400724 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500725 mCurrentSurface = nullptr;
726 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400727
728 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400729}
730
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000731GLuint Context::createBuffer()
732{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500733 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000734}
735
736GLuint Context::createProgram()
737{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500738 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000739}
740
Jiawei Shao385b3e02018-03-21 09:43:28 +0800741GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000742{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500743 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000744}
745
746GLuint Context::createTexture()
747{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500748 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000749}
750
751GLuint Context::createRenderbuffer()
752{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500753 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000754}
755
Jamie Madill13951342018-09-30 15:24:28 -0400756void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
757{
758 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(mImplementation.get(), range, createdOut));
759}
760
Brandon Jones59770802018-04-02 13:18:42 -0700761GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300762{
Jamie Madill13951342018-09-30 15:24:28 -0400763 GLuint created = 0;
764 tryGenPaths(range, &created);
765 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300766}
767
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000768// Returns an unused framebuffer name
769GLuint Context::createFramebuffer()
770{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500771 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000772}
773
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500774void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000775{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500776 for (int i = 0; i < n; i++)
777 {
778 GLuint handle = mFenceNVHandleAllocator.allocate();
779 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
780 fences[i] = handle;
781 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000782}
783
Yunchao Hea336b902017-08-02 16:05:21 +0800784GLuint Context::createProgramPipeline()
785{
786 return mState.mPipelines->createProgramPipeline();
787}
788
Jiawei Shao385b3e02018-03-21 09:43:28 +0800789GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800790{
791 UNIMPLEMENTED();
792 return 0u;
793}
794
James Darpinian4d9d4832018-03-13 12:43:28 -0700795void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000796{
James Darpinian4d9d4832018-03-13 12:43:28 -0700797 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
798 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000799 {
800 detachBuffer(buffer);
801 }
Jamie Madill893ab082014-05-16 16:56:10 -0400802
James Darpinian4d9d4832018-03-13 12:43:28 -0700803 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000804}
805
806void Context::deleteShader(GLuint shader)
807{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500808 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000809}
810
811void Context::deleteProgram(GLuint program)
812{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500813 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000814}
815
816void Context::deleteTexture(GLuint texture)
817{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500818 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000819 {
820 detachTexture(texture);
821 }
822
Jamie Madill6c1f6712017-02-14 19:08:04 -0500823 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000824}
825
826void Context::deleteRenderbuffer(GLuint renderbuffer)
827{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500828 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000829 {
830 detachRenderbuffer(renderbuffer);
831 }
Jamie Madill893ab082014-05-16 16:56:10 -0400832
Jamie Madill6c1f6712017-02-14 19:08:04 -0500833 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000834}
835
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400836void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400837{
838 // The spec specifies the underlying Fence object is not deleted until all current
839 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
840 // and since our API is currently designed for being called from a single thread, we can delete
841 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400842 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400843}
844
Yunchao Hea336b902017-08-02 16:05:21 +0800845void Context::deleteProgramPipeline(GLuint pipeline)
846{
847 if (mState.mPipelines->getProgramPipeline(pipeline))
848 {
849 detachProgramPipeline(pipeline);
850 }
851
852 mState.mPipelines->deleteObject(this, pipeline);
853}
854
Sami Väisänene45e53b2016-05-25 10:36:04 +0300855void Context::deletePaths(GLuint first, GLsizei range)
856{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500857 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300858}
859
Brandon Jones59770802018-04-02 13:18:42 -0700860bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300861{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500862 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300863 if (pathObj == nullptr)
864 return false;
865
866 return pathObj->hasPathData();
867}
868
Brandon Jones59770802018-04-02 13:18:42 -0700869bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300870{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500871 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300872}
873
Brandon Jones59770802018-04-02 13:18:42 -0700874void Context::pathCommands(GLuint path,
875 GLsizei numCommands,
876 const GLubyte *commands,
877 GLsizei numCoords,
878 GLenum coordType,
879 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300880{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500881 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300882
883 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
884}
885
Jamie Madill007530e2017-12-28 14:27:04 -0500886void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300887{
Jamie Madill007530e2017-12-28 14:27:04 -0500888 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300889
890 switch (pname)
891 {
892 case GL_PATH_STROKE_WIDTH_CHROMIUM:
893 pathObj->setStrokeWidth(value);
894 break;
895 case GL_PATH_END_CAPS_CHROMIUM:
896 pathObj->setEndCaps(static_cast<GLenum>(value));
897 break;
898 case GL_PATH_JOIN_STYLE_CHROMIUM:
899 pathObj->setJoinStyle(static_cast<GLenum>(value));
900 break;
901 case GL_PATH_MITER_LIMIT_CHROMIUM:
902 pathObj->setMiterLimit(value);
903 break;
904 case GL_PATH_STROKE_BOUND_CHROMIUM:
905 pathObj->setStrokeBound(value);
906 break;
907 default:
908 UNREACHABLE();
909 break;
910 }
911}
912
Jamie Madill007530e2017-12-28 14:27:04 -0500913void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300914{
Jamie Madill007530e2017-12-28 14:27:04 -0500915 // TODO(jmadill): Should use proper clamping/casting.
916 pathParameterf(path, pname, static_cast<GLfloat>(value));
917}
918
919void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
920{
921 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300922
923 switch (pname)
924 {
925 case GL_PATH_STROKE_WIDTH_CHROMIUM:
926 *value = pathObj->getStrokeWidth();
927 break;
928 case GL_PATH_END_CAPS_CHROMIUM:
929 *value = static_cast<GLfloat>(pathObj->getEndCaps());
930 break;
931 case GL_PATH_JOIN_STYLE_CHROMIUM:
932 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
933 break;
934 case GL_PATH_MITER_LIMIT_CHROMIUM:
935 *value = pathObj->getMiterLimit();
936 break;
937 case GL_PATH_STROKE_BOUND_CHROMIUM:
938 *value = pathObj->getStrokeBound();
939 break;
940 default:
941 UNREACHABLE();
942 break;
943 }
944}
945
Jamie Madill007530e2017-12-28 14:27:04 -0500946void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
947{
948 GLfloat val = 0.0f;
949 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
950 if (value)
951 *value = static_cast<GLint>(val);
952}
953
Brandon Jones59770802018-04-02 13:18:42 -0700954void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300955{
956 mGLState.setPathStencilFunc(func, ref, mask);
957}
958
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000959void Context::deleteFramebuffer(GLuint framebuffer)
960{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500961 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000962 {
963 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000964 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500965
Jamie Madill6c1f6712017-02-14 19:08:04 -0500966 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000967}
968
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500969void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000970{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500971 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000972 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500973 GLuint fence = fences[i];
974
975 FenceNV *fenceObject = nullptr;
976 if (mFenceNVMap.erase(fence, &fenceObject))
977 {
978 mFenceNVHandleAllocator.release(fence);
979 delete fenceObject;
980 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000981 }
982}
983
Geoff Lang70d0f492015-12-10 17:45:46 -0500984Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000985{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500986 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000987}
988
Geoff Lang70d0f492015-12-10 17:45:46 -0500989Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000990{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500991 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000992}
993
Jamie Madill70b5bb02017-08-28 13:32:37 -0400994Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400995{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400996 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400997}
998
Jamie Madill57a89722013-07-02 11:57:03 -0400999VertexArray *Context::getVertexArray(GLuint handle) const
1000{
Jamie Madill96a483b2017-06-27 16:49:21 -04001001 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -04001002}
1003
Jamie Madilldc356042013-07-19 16:36:57 -04001004Sampler *Context::getSampler(GLuint handle) const
1005{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001006 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -04001007}
1008
Geoff Langc8058452014-02-03 12:04:11 -05001009TransformFeedback *Context::getTransformFeedback(GLuint handle) const
1010{
Jamie Madill96a483b2017-06-27 16:49:21 -04001011 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -05001012}
1013
Yunchao Hea336b902017-08-02 16:05:21 +08001014ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
1015{
1016 return mState.mPipelines->getProgramPipeline(handle);
1017}
1018
Geoff Lang75359662018-04-11 01:42:27 -04001019gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001020{
1021 switch (identifier)
1022 {
1023 case GL_BUFFER:
1024 return getBuffer(name);
1025 case GL_SHADER:
1026 return getShader(name);
1027 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04001028 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -05001029 case GL_VERTEX_ARRAY:
1030 return getVertexArray(name);
1031 case GL_QUERY:
1032 return getQuery(name);
1033 case GL_TRANSFORM_FEEDBACK:
1034 return getTransformFeedback(name);
1035 case GL_SAMPLER:
1036 return getSampler(name);
1037 case GL_TEXTURE:
1038 return getTexture(name);
1039 case GL_RENDERBUFFER:
1040 return getRenderbuffer(name);
1041 case GL_FRAMEBUFFER:
1042 return getFramebuffer(name);
1043 default:
1044 UNREACHABLE();
1045 return nullptr;
1046 }
1047}
1048
Geoff Lang75359662018-04-11 01:42:27 -04001049gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001050{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001051 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001052}
1053
Martin Radev9d901792016-07-15 15:58:58 +03001054void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1055{
Geoff Lang75359662018-04-11 01:42:27 -04001056 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001057 ASSERT(object != nullptr);
1058
1059 std::string labelName = GetObjectLabelFromPointer(length, label);
1060 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001061
1062 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1063 // specified object is active until we do this.
1064 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001065}
1066
1067void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1068{
Geoff Lang75359662018-04-11 01:42:27 -04001069 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001070 ASSERT(object != nullptr);
1071
1072 std::string labelName = GetObjectLabelFromPointer(length, label);
1073 object->setLabel(labelName);
1074}
1075
1076void Context::getObjectLabel(GLenum identifier,
1077 GLuint name,
1078 GLsizei bufSize,
1079 GLsizei *length,
1080 GLchar *label) const
1081{
Geoff Lang75359662018-04-11 01:42:27 -04001082 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001083 ASSERT(object != nullptr);
1084
1085 const std::string &objectLabel = object->getLabel();
1086 GetObjectLabelBase(objectLabel, bufSize, length, label);
1087}
1088
1089void Context::getObjectPtrLabel(const void *ptr,
1090 GLsizei bufSize,
1091 GLsizei *length,
1092 GLchar *label) const
1093{
Geoff Lang75359662018-04-11 01:42:27 -04001094 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001095 ASSERT(object != nullptr);
1096
1097 const std::string &objectLabel = object->getLabel();
1098 GetObjectLabelBase(objectLabel, bufSize, length, label);
1099}
1100
Jamie Madilldc356042013-07-19 16:36:57 -04001101bool Context::isSampler(GLuint samplerName) const
1102{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001103 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001104}
1105
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001106void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001107{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001108 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001109
Jamie Madilldedd7b92014-11-05 16:30:36 -05001110 if (handle == 0)
1111 {
1112 texture = mZeroTextures[target].get();
1113 }
1114 else
1115 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001116 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001117 }
1118
1119 ASSERT(texture);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001120 mGLState.setSamplerTexture(this, target, texture);
Jamie Madilld84b6732018-09-06 15:54:35 -04001121 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001122}
1123
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001124void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001125{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001126 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1127 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001128 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001129 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001130}
1131
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001132void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001133{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001134 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1135 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001136 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001137 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001138 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001139}
1140
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001141void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001142{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001143 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001144 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001145 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001146 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001147}
1148
Shao80957d92017-02-20 21:25:59 +08001149void Context::bindVertexBuffer(GLuint bindingIndex,
1150 GLuint bufferHandle,
1151 GLintptr offset,
1152 GLsizei stride)
1153{
1154 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001155 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001156 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001157}
1158
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001159void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001160{
Geoff Lang76b10c92014-09-05 16:28:14 -04001161 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001162 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001163 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001164 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001165 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001166}
1167
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001168void Context::bindImageTexture(GLuint unit,
1169 GLuint texture,
1170 GLint level,
1171 GLboolean layered,
1172 GLint layer,
1173 GLenum access,
1174 GLenum format)
1175{
1176 Texture *tex = mState.mTextures->getTexture(texture);
1177 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1178}
1179
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001180void Context::useProgram(GLuint program)
1181{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04001182 mGLState.setProgram(this, getProgramResolveLink(program));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001183 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001184}
1185
Jiajia Qin5451d532017-11-16 17:16:34 +08001186void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1187{
1188 UNIMPLEMENTED();
1189}
1190
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001191void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001192{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001193 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001194 TransformFeedback *transformFeedback =
1195 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001196 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Jamie Madilld84b6732018-09-06 15:54:35 -04001197 mStateCache.onTransformFeedbackChange(this);
Geoff Langc8058452014-02-03 12:04:11 -05001198}
1199
Yunchao Hea336b902017-08-02 16:05:21 +08001200void Context::bindProgramPipeline(GLuint pipelineHandle)
1201{
1202 ProgramPipeline *pipeline =
1203 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1204 mGLState.setProgramPipelineBinding(this, pipeline);
1205}
1206
Corentin Wallezad3ae902018-03-09 13:40:42 -05001207void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001208{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001209 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001210 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001211
Geoff Lang5aad9672014-09-08 11:10:42 -04001212 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001213 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001214
1215 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001216 mGLState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001217 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001218}
1219
Corentin Wallezad3ae902018-03-09 13:40:42 -05001220void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001221{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001222 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001223 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001224
Jamie Madill5188a272018-07-25 10:53:56 -04001225 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001226
Geoff Lang5aad9672014-09-08 11:10:42 -04001227 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001228 mGLState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001229 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001230}
1231
Corentin Wallezad3ae902018-03-09 13:40:42 -05001232void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001233{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001234 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001235
1236 Query *queryObject = getQuery(id, true, target);
1237 ASSERT(queryObject);
1238
Jamie Madill5188a272018-07-25 10:53:56 -04001239 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001240}
1241
Corentin Wallezad3ae902018-03-09 13:40:42 -05001242void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001243{
1244 switch (pname)
1245 {
1246 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001247 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001248 break;
1249 case GL_QUERY_COUNTER_BITS_EXT:
1250 switch (target)
1251 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001252 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001253 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1254 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001255 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001256 params[0] = getExtensions().queryCounterBitsTimestamp;
1257 break;
1258 default:
1259 UNREACHABLE();
1260 params[0] = 0;
1261 break;
1262 }
1263 break;
1264 default:
1265 UNREACHABLE();
1266 return;
1267 }
1268}
1269
Corentin Wallezad3ae902018-03-09 13:40:42 -05001270void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001271 GLenum pname,
1272 GLsizei bufSize,
1273 GLsizei *length,
1274 GLint *params)
1275{
1276 getQueryiv(target, pname, params);
1277}
1278
Geoff Lang2186c382016-10-14 10:54:54 -04001279void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001280{
Jamie Madill5188a272018-07-25 10:53:56 -04001281 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001282}
1283
Brandon Jones59770802018-04-02 13:18:42 -07001284void Context::getQueryObjectivRobust(GLuint id,
1285 GLenum pname,
1286 GLsizei bufSize,
1287 GLsizei *length,
1288 GLint *params)
1289{
1290 getQueryObjectiv(id, pname, params);
1291}
1292
Geoff Lang2186c382016-10-14 10:54:54 -04001293void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001294{
Jamie Madill5188a272018-07-25 10:53:56 -04001295 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001296}
1297
Brandon Jones59770802018-04-02 13:18:42 -07001298void Context::getQueryObjectuivRobust(GLuint id,
1299 GLenum pname,
1300 GLsizei bufSize,
1301 GLsizei *length,
1302 GLuint *params)
1303{
1304 getQueryObjectuiv(id, pname, params);
1305}
1306
Geoff Lang2186c382016-10-14 10:54:54 -04001307void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001308{
Jamie Madill5188a272018-07-25 10:53:56 -04001309 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001310}
1311
Brandon Jones59770802018-04-02 13:18:42 -07001312void Context::getQueryObjecti64vRobust(GLuint id,
1313 GLenum pname,
1314 GLsizei bufSize,
1315 GLsizei *length,
1316 GLint64 *params)
1317{
1318 getQueryObjecti64v(id, pname, params);
1319}
1320
Geoff Lang2186c382016-10-14 10:54:54 -04001321void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001322{
Jamie Madill5188a272018-07-25 10:53:56 -04001323 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001324}
1325
Brandon Jones59770802018-04-02 13:18:42 -07001326void Context::getQueryObjectui64vRobust(GLuint id,
1327 GLenum pname,
1328 GLsizei bufSize,
1329 GLsizei *length,
1330 GLuint64 *params)
1331{
1332 getQueryObjectui64v(id, pname, params);
1333}
1334
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001335Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001336{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001337 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001338}
1339
Jamie Madill2f348d22017-06-05 10:50:59 -04001340FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001341{
Jamie Madill96a483b2017-06-27 16:49:21 -04001342 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001343}
1344
Corentin Wallezad3ae902018-03-09 13:40:42 -05001345Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001346{
Jamie Madill96a483b2017-06-27 16:49:21 -04001347 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001348 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001349 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001350 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001351
1352 Query *query = mQueryMap.query(handle);
1353 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001354 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001355 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001356 query = new Query(mImplementation->createQuery(type), handle);
1357 query->addRef();
1358 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001359 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001360 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001361}
1362
Geoff Lang70d0f492015-12-10 17:45:46 -05001363Query *Context::getQuery(GLuint handle) const
1364{
Jamie Madill96a483b2017-06-27 16:49:21 -04001365 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001366}
1367
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001368Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001369{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001370 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1371 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001372}
1373
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001374Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001375{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001376 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001377}
1378
Geoff Lang492a7e42014-11-05 13:27:06 -05001379Compiler *Context::getCompiler() const
1380{
Jamie Madill2f348d22017-06-05 10:50:59 -04001381 if (mCompiler.get() == nullptr)
1382 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001383 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001384 }
1385 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001386}
1387
Jamie Madillc1d770e2017-04-13 17:31:24 -04001388void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001389{
1390 switch (pname)
1391 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001392 case GL_SHADER_COMPILER:
1393 *params = GL_TRUE;
1394 break;
1395 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1396 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1397 break;
1398 default:
1399 mGLState.getBooleanv(pname, params);
1400 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001401 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001402}
1403
Jamie Madillc1d770e2017-04-13 17:31:24 -04001404void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001405{
Shannon Woods53a94a82014-06-24 15:20:36 -04001406 // Queries about context capabilities and maximums are answered by Context.
1407 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001408 switch (pname)
1409 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001410 case GL_ALIASED_LINE_WIDTH_RANGE:
1411 params[0] = mCaps.minAliasedLineWidth;
1412 params[1] = mCaps.maxAliasedLineWidth;
1413 break;
1414 case GL_ALIASED_POINT_SIZE_RANGE:
1415 params[0] = mCaps.minAliasedPointSize;
1416 params[1] = mCaps.maxAliasedPointSize;
1417 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001418 case GL_SMOOTH_POINT_SIZE_RANGE:
1419 params[0] = mCaps.minSmoothPointSize;
1420 params[1] = mCaps.maxSmoothPointSize;
1421 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001422 case GL_SMOOTH_LINE_WIDTH_RANGE:
1423 params[0] = mCaps.minSmoothLineWidth;
1424 params[1] = mCaps.maxSmoothLineWidth;
1425 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001426 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1427 ASSERT(mExtensions.textureFilterAnisotropic);
1428 *params = mExtensions.maxTextureAnisotropy;
1429 break;
1430 case GL_MAX_TEXTURE_LOD_BIAS:
1431 *params = mCaps.maxLODBias;
1432 break;
1433
1434 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1435 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1436 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001437 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1438 // GLES1 constants for modelview/projection matrix.
1439 if (getClientVersion() < Version(2, 0))
1440 {
1441 mGLState.getFloatv(pname, params);
1442 }
1443 else
1444 {
1445 ASSERT(mExtensions.pathRendering);
1446 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1447 memcpy(params, m, 16 * sizeof(GLfloat));
1448 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001449 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001450 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001451
Jamie Madill231c7f52017-04-26 13:45:37 -04001452 default:
1453 mGLState.getFloatv(pname, params);
1454 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001455 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001456}
1457
Jamie Madillc1d770e2017-04-13 17:31:24 -04001458void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001459{
Shannon Woods53a94a82014-06-24 15:20:36 -04001460 // Queries about context capabilities and maximums are answered by Context.
1461 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001462
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001463 switch (pname)
1464 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001465 case GL_MAX_VERTEX_ATTRIBS:
1466 *params = mCaps.maxVertexAttributes;
1467 break;
1468 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1469 *params = mCaps.maxVertexUniformVectors;
1470 break;
1471 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001472 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001473 break;
1474 case GL_MAX_VARYING_VECTORS:
1475 *params = mCaps.maxVaryingVectors;
1476 break;
1477 case GL_MAX_VARYING_COMPONENTS:
1478 *params = mCaps.maxVertexOutputComponents;
1479 break;
1480 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1481 *params = mCaps.maxCombinedTextureImageUnits;
1482 break;
1483 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001484 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001485 break;
1486 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001487 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001488 break;
1489 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1490 *params = mCaps.maxFragmentUniformVectors;
1491 break;
1492 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001493 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001494 break;
1495 case GL_MAX_RENDERBUFFER_SIZE:
1496 *params = mCaps.maxRenderbufferSize;
1497 break;
1498 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1499 *params = mCaps.maxColorAttachments;
1500 break;
1501 case GL_MAX_DRAW_BUFFERS_EXT:
1502 *params = mCaps.maxDrawBuffers;
1503 break;
1504 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1505 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1506 case GL_SUBPIXEL_BITS:
1507 *params = 4;
1508 break;
1509 case GL_MAX_TEXTURE_SIZE:
1510 *params = mCaps.max2DTextureSize;
1511 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001512 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1513 *params = mCaps.maxRectangleTextureSize;
1514 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001515 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1516 *params = mCaps.maxCubeMapTextureSize;
1517 break;
1518 case GL_MAX_3D_TEXTURE_SIZE:
1519 *params = mCaps.max3DTextureSize;
1520 break;
1521 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1522 *params = mCaps.maxArrayTextureLayers;
1523 break;
1524 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1525 *params = mCaps.uniformBufferOffsetAlignment;
1526 break;
1527 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1528 *params = mCaps.maxUniformBufferBindings;
1529 break;
1530 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001531 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001532 break;
1533 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001534 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001535 break;
1536 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1537 *params = mCaps.maxCombinedTextureImageUnits;
1538 break;
1539 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1540 *params = mCaps.maxVertexOutputComponents;
1541 break;
1542 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1543 *params = mCaps.maxFragmentInputComponents;
1544 break;
1545 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1546 *params = mCaps.minProgramTexelOffset;
1547 break;
1548 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1549 *params = mCaps.maxProgramTexelOffset;
1550 break;
1551 case GL_MAJOR_VERSION:
1552 *params = getClientVersion().major;
1553 break;
1554 case GL_MINOR_VERSION:
1555 *params = getClientVersion().minor;
1556 break;
1557 case GL_MAX_ELEMENTS_INDICES:
1558 *params = mCaps.maxElementsIndices;
1559 break;
1560 case GL_MAX_ELEMENTS_VERTICES:
1561 *params = mCaps.maxElementsVertices;
1562 break;
1563 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1564 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1565 break;
1566 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1567 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1568 break;
1569 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1570 *params = mCaps.maxTransformFeedbackSeparateComponents;
1571 break;
1572 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1573 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1574 break;
1575 case GL_MAX_SAMPLES_ANGLE:
1576 *params = mCaps.maxSamples;
1577 break;
1578 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001579 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001580 params[0] = mCaps.maxViewportWidth;
1581 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001582 }
1583 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001584 case GL_COMPRESSED_TEXTURE_FORMATS:
1585 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1586 params);
1587 break;
1588 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1589 *params = mResetStrategy;
1590 break;
1591 case GL_NUM_SHADER_BINARY_FORMATS:
1592 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1593 break;
1594 case GL_SHADER_BINARY_FORMATS:
1595 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1596 break;
1597 case GL_NUM_PROGRAM_BINARY_FORMATS:
1598 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1599 break;
1600 case GL_PROGRAM_BINARY_FORMATS:
1601 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1602 break;
1603 case GL_NUM_EXTENSIONS:
1604 *params = static_cast<GLint>(mExtensionStrings.size());
1605 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001606
Geoff Lang38f24ee2018-10-01 13:04:59 -04001607 // GL_ANGLE_request_extension
1608 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1609 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1610 break;
1611
Jamie Madill231c7f52017-04-26 13:45:37 -04001612 // GL_KHR_debug
1613 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1614 *params = mExtensions.maxDebugMessageLength;
1615 break;
1616 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1617 *params = mExtensions.maxDebugLoggedMessages;
1618 break;
1619 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1620 *params = mExtensions.maxDebugGroupStackDepth;
1621 break;
1622 case GL_MAX_LABEL_LENGTH:
1623 *params = mExtensions.maxLabelLength;
1624 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001625
Martin Radeve5285d22017-07-14 16:23:53 +03001626 // GL_ANGLE_multiview
1627 case GL_MAX_VIEWS_ANGLE:
1628 *params = mExtensions.maxViews;
1629 break;
1630
Jamie Madill231c7f52017-04-26 13:45:37 -04001631 // GL_EXT_disjoint_timer_query
1632 case GL_GPU_DISJOINT_EXT:
1633 *params = mImplementation->getGPUDisjoint();
1634 break;
1635 case GL_MAX_FRAMEBUFFER_WIDTH:
1636 *params = mCaps.maxFramebufferWidth;
1637 break;
1638 case GL_MAX_FRAMEBUFFER_HEIGHT:
1639 *params = mCaps.maxFramebufferHeight;
1640 break;
1641 case GL_MAX_FRAMEBUFFER_SAMPLES:
1642 *params = mCaps.maxFramebufferSamples;
1643 break;
1644 case GL_MAX_SAMPLE_MASK_WORDS:
1645 *params = mCaps.maxSampleMaskWords;
1646 break;
1647 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1648 *params = mCaps.maxColorTextureSamples;
1649 break;
1650 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1651 *params = mCaps.maxDepthTextureSamples;
1652 break;
1653 case GL_MAX_INTEGER_SAMPLES:
1654 *params = mCaps.maxIntegerSamples;
1655 break;
1656 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1657 *params = mCaps.maxVertexAttribRelativeOffset;
1658 break;
1659 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1660 *params = mCaps.maxVertexAttribBindings;
1661 break;
1662 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1663 *params = mCaps.maxVertexAttribStride;
1664 break;
1665 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001666 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001667 break;
1668 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001669 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001670 break;
1671 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001672 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001673 break;
1674 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001675 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001676 break;
1677 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001678 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001679 break;
1680 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001681 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001682 break;
1683 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001684 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001685 break;
1686 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001687 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001688 break;
1689 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1690 *params = mCaps.minProgramTextureGatherOffset;
1691 break;
1692 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1693 *params = mCaps.maxProgramTextureGatherOffset;
1694 break;
1695 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1696 *params = mCaps.maxComputeWorkGroupInvocations;
1697 break;
1698 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001699 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001700 break;
1701 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001702 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001703 break;
1704 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1705 *params = mCaps.maxComputeSharedMemorySize;
1706 break;
1707 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001708 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001709 break;
1710 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001711 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001712 break;
1713 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001714 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001715 break;
1716 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001717 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001718 break;
1719 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001720 *params =
1721 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001722 break;
1723 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001724 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001725 break;
1726 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1727 *params = mCaps.maxCombinedShaderOutputResources;
1728 break;
1729 case GL_MAX_UNIFORM_LOCATIONS:
1730 *params = mCaps.maxUniformLocations;
1731 break;
1732 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1733 *params = mCaps.maxAtomicCounterBufferBindings;
1734 break;
1735 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1736 *params = mCaps.maxAtomicCounterBufferSize;
1737 break;
1738 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1739 *params = mCaps.maxCombinedAtomicCounterBuffers;
1740 break;
1741 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1742 *params = mCaps.maxCombinedAtomicCounters;
1743 break;
1744 case GL_MAX_IMAGE_UNITS:
1745 *params = mCaps.maxImageUnits;
1746 break;
1747 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1748 *params = mCaps.maxCombinedImageUniforms;
1749 break;
1750 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1751 *params = mCaps.maxShaderStorageBufferBindings;
1752 break;
1753 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1754 *params = mCaps.maxCombinedShaderStorageBlocks;
1755 break;
1756 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1757 *params = mCaps.shaderStorageBufferOffsetAlignment;
1758 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001759
1760 // GL_EXT_geometry_shader
1761 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1762 *params = mCaps.maxFramebufferLayers;
1763 break;
1764 case GL_LAYER_PROVOKING_VERTEX_EXT:
1765 *params = mCaps.layerProvokingVertex;
1766 break;
1767 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001768 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001769 break;
1770 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001771 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001772 break;
1773 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001774 *params =
1775 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001776 break;
1777 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1778 *params = mCaps.maxGeometryInputComponents;
1779 break;
1780 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1781 *params = mCaps.maxGeometryOutputComponents;
1782 break;
1783 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1784 *params = mCaps.maxGeometryOutputVertices;
1785 break;
1786 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1787 *params = mCaps.maxGeometryTotalOutputComponents;
1788 break;
1789 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1790 *params = mCaps.maxGeometryShaderInvocations;
1791 break;
1792 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001793 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001794 break;
1795 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001796 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001797 break;
1798 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001799 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001800 break;
1801 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001802 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001803 break;
1804 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001805 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001806 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001807 // GLES1 emulation: Caps queries
1808 case GL_MAX_TEXTURE_UNITS:
1809 *params = mCaps.maxMultitextureUnits;
1810 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001811 case GL_MAX_MODELVIEW_STACK_DEPTH:
1812 *params = mCaps.maxModelviewMatrixStackDepth;
1813 break;
1814 case GL_MAX_PROJECTION_STACK_DEPTH:
1815 *params = mCaps.maxProjectionMatrixStackDepth;
1816 break;
1817 case GL_MAX_TEXTURE_STACK_DEPTH:
1818 *params = mCaps.maxTextureMatrixStackDepth;
1819 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001820 case GL_MAX_LIGHTS:
1821 *params = mCaps.maxLights;
1822 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001823 case GL_MAX_CLIP_PLANES:
1824 *params = mCaps.maxClipPlanes;
1825 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001826 // GLES1 emulation: Vertex attribute queries
1827 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1828 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1829 case GL_COLOR_ARRAY_BUFFER_BINDING:
1830 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1831 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1832 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1833 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1834 break;
1835 case GL_VERTEX_ARRAY_STRIDE:
1836 case GL_NORMAL_ARRAY_STRIDE:
1837 case GL_COLOR_ARRAY_STRIDE:
1838 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1839 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1840 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1841 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1842 break;
1843 case GL_VERTEX_ARRAY_SIZE:
1844 case GL_COLOR_ARRAY_SIZE:
1845 case GL_TEXTURE_COORD_ARRAY_SIZE:
1846 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1847 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1848 break;
1849 case GL_VERTEX_ARRAY_TYPE:
1850 case GL_COLOR_ARRAY_TYPE:
1851 case GL_NORMAL_ARRAY_TYPE:
1852 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1853 case GL_TEXTURE_COORD_ARRAY_TYPE:
1854 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1855 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1856 break;
1857
jchen1082af6202018-06-22 10:59:52 +08001858 // GL_KHR_parallel_shader_compile
1859 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1860 *params = mGLState.getMaxShaderCompilerThreads();
1861 break;
1862
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001863 // GL_EXT_blend_func_extended
1864 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
1865 *params = mExtensions.maxDualSourceDrawBuffers;
1866 break;
1867
Jamie Madill231c7f52017-04-26 13:45:37 -04001868 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001869 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001870 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001871 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001872}
1873
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001874void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001875{
Shannon Woods53a94a82014-06-24 15:20:36 -04001876 // Queries about context capabilities and maximums are answered by Context.
1877 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001878 switch (pname)
1879 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001880 case GL_MAX_ELEMENT_INDEX:
1881 *params = mCaps.maxElementIndex;
1882 break;
1883 case GL_MAX_UNIFORM_BLOCK_SIZE:
1884 *params = mCaps.maxUniformBlockSize;
1885 break;
1886 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001887 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001888 break;
1889 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001890 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001891 break;
1892 case GL_MAX_SERVER_WAIT_TIMEOUT:
1893 *params = mCaps.maxServerWaitTimeout;
1894 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001895
Jamie Madill231c7f52017-04-26 13:45:37 -04001896 // GL_EXT_disjoint_timer_query
1897 case GL_TIMESTAMP_EXT:
1898 *params = mImplementation->getTimestamp();
1899 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001900
Jamie Madill231c7f52017-04-26 13:45:37 -04001901 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1902 *params = mCaps.maxShaderStorageBlockSize;
1903 break;
1904 default:
1905 UNREACHABLE();
1906 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001907 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001908}
1909
Geoff Lang70d0f492015-12-10 17:45:46 -05001910void Context::getPointerv(GLenum pname, void **params) const
1911{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001912 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001913}
1914
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001915void Context::getPointervRobustANGLERobust(GLenum pname,
1916 GLsizei bufSize,
1917 GLsizei *length,
1918 void **params)
1919{
1920 UNIMPLEMENTED();
1921}
1922
Martin Radev66fb8202016-07-28 11:45:20 +03001923void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001924{
Shannon Woods53a94a82014-06-24 15:20:36 -04001925 // Queries about context capabilities and maximums are answered by Context.
1926 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001927
1928 GLenum nativeType;
1929 unsigned int numParams;
1930 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1931 ASSERT(queryStatus);
1932
1933 if (nativeType == GL_INT)
1934 {
1935 switch (target)
1936 {
1937 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1938 ASSERT(index < 3u);
1939 *data = mCaps.maxComputeWorkGroupCount[index];
1940 break;
1941 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1942 ASSERT(index < 3u);
1943 *data = mCaps.maxComputeWorkGroupSize[index];
1944 break;
1945 default:
1946 mGLState.getIntegeri_v(target, index, data);
1947 }
1948 }
1949 else
1950 {
1951 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1952 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001953}
1954
Brandon Jones59770802018-04-02 13:18:42 -07001955void Context::getIntegeri_vRobust(GLenum target,
1956 GLuint index,
1957 GLsizei bufSize,
1958 GLsizei *length,
1959 GLint *data)
1960{
1961 getIntegeri_v(target, index, data);
1962}
1963
Martin Radev66fb8202016-07-28 11:45:20 +03001964void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001965{
Shannon Woods53a94a82014-06-24 15:20:36 -04001966 // Queries about context capabilities and maximums are answered by Context.
1967 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001968
1969 GLenum nativeType;
1970 unsigned int numParams;
1971 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1972 ASSERT(queryStatus);
1973
1974 if (nativeType == GL_INT_64_ANGLEX)
1975 {
1976 mGLState.getInteger64i_v(target, index, data);
1977 }
1978 else
1979 {
1980 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1981 }
1982}
1983
Brandon Jones59770802018-04-02 13:18:42 -07001984void Context::getInteger64i_vRobust(GLenum target,
1985 GLuint index,
1986 GLsizei bufSize,
1987 GLsizei *length,
1988 GLint64 *data)
1989{
1990 getInteger64i_v(target, index, data);
1991}
1992
Martin Radev66fb8202016-07-28 11:45:20 +03001993void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1994{
1995 // Queries about context capabilities and maximums are answered by Context.
1996 // Queries about current GL state values are answered by State.
1997
1998 GLenum nativeType;
1999 unsigned int numParams;
2000 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
2001 ASSERT(queryStatus);
2002
2003 if (nativeType == GL_BOOL)
2004 {
2005 mGLState.getBooleani_v(target, index, data);
2006 }
2007 else
2008 {
2009 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
2010 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04002011}
2012
Brandon Jones59770802018-04-02 13:18:42 -07002013void Context::getBooleani_vRobust(GLenum target,
2014 GLuint index,
2015 GLsizei bufSize,
2016 GLsizei *length,
2017 GLboolean *data)
2018{
2019 getBooleani_v(target, index, data);
2020}
2021
Corentin Wallez336129f2017-10-17 15:55:40 -04002022void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002023{
2024 Buffer *buffer = mGLState.getTargetBuffer(target);
2025 QueryBufferParameteriv(buffer, pname, params);
2026}
2027
Brandon Jones59770802018-04-02 13:18:42 -07002028void Context::getBufferParameterivRobust(BufferBinding target,
2029 GLenum pname,
2030 GLsizei bufSize,
2031 GLsizei *length,
2032 GLint *params)
2033{
2034 getBufferParameteriv(target, pname, params);
2035}
2036
He Yunchao010e4db2017-03-03 14:22:06 +08002037void Context::getFramebufferAttachmentParameteriv(GLenum target,
2038 GLenum attachment,
2039 GLenum pname,
2040 GLint *params)
2041{
2042 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002043 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002044}
2045
Brandon Jones59770802018-04-02 13:18:42 -07002046void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2047 GLenum attachment,
2048 GLenum pname,
2049 GLsizei bufSize,
2050 GLsizei *length,
2051 GLint *params)
2052{
2053 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2054}
2055
He Yunchao010e4db2017-03-03 14:22:06 +08002056void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2057{
2058 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2059 QueryRenderbufferiv(this, renderbuffer, pname, params);
2060}
2061
Brandon Jones59770802018-04-02 13:18:42 -07002062void Context::getRenderbufferParameterivRobust(GLenum target,
2063 GLenum pname,
2064 GLsizei bufSize,
2065 GLsizei *length,
2066 GLint *params)
2067{
2068 getRenderbufferParameteriv(target, pname, params);
2069}
2070
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002071void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002072{
2073 Texture *texture = getTargetTexture(target);
2074 QueryTexParameterfv(texture, pname, params);
2075}
2076
Brandon Jones59770802018-04-02 13:18:42 -07002077void Context::getTexParameterfvRobust(TextureType target,
2078 GLenum pname,
2079 GLsizei bufSize,
2080 GLsizei *length,
2081 GLfloat *params)
2082{
2083 getTexParameterfv(target, pname, params);
2084}
2085
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002086void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002087{
2088 Texture *texture = getTargetTexture(target);
2089 QueryTexParameteriv(texture, pname, params);
2090}
Jiajia Qin5451d532017-11-16 17:16:34 +08002091
Brandon Jones59770802018-04-02 13:18:42 -07002092void Context::getTexParameterivRobust(TextureType target,
2093 GLenum pname,
2094 GLsizei bufSize,
2095 GLsizei *length,
2096 GLint *params)
2097{
2098 getTexParameteriv(target, pname, params);
2099}
2100
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002101void Context::getTexParameterIivRobust(TextureType target,
2102 GLenum pname,
2103 GLsizei bufSize,
2104 GLsizei *length,
2105 GLint *params)
2106{
2107 UNIMPLEMENTED();
2108}
2109
2110void Context::getTexParameterIuivRobust(TextureType target,
2111 GLenum pname,
2112 GLsizei bufSize,
2113 GLsizei *length,
2114 GLuint *params)
2115{
2116 UNIMPLEMENTED();
2117}
2118
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002119void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002120{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002121 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002122 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002123}
2124
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002125void Context::getTexLevelParameterivRobust(TextureTarget target,
2126 GLint level,
2127 GLenum pname,
2128 GLsizei bufSize,
2129 GLsizei *length,
2130 GLint *params)
2131{
2132 UNIMPLEMENTED();
2133}
2134
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002135void Context::getTexLevelParameterfv(TextureTarget target,
2136 GLint level,
2137 GLenum pname,
2138 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002139{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002140 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002141 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002142}
2143
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002144void Context::getTexLevelParameterfvRobust(TextureTarget target,
2145 GLint level,
2146 GLenum pname,
2147 GLsizei bufSize,
2148 GLsizei *length,
2149 GLfloat *params)
2150{
2151 UNIMPLEMENTED();
2152}
2153
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002154void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002155{
2156 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002157 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002158 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002159}
2160
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002161void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002162{
2163 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002164 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002165 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002166}
2167
Brandon Jones59770802018-04-02 13:18:42 -07002168void Context::texParameterfvRobust(TextureType target,
2169 GLenum pname,
2170 GLsizei bufSize,
2171 const GLfloat *params)
2172{
2173 texParameterfv(target, pname, params);
2174}
2175
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002176void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002177{
2178 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002179 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002180 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002181}
2182
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002183void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002184{
2185 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002186 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002187 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002188}
2189
Brandon Jones59770802018-04-02 13:18:42 -07002190void Context::texParameterivRobust(TextureType target,
2191 GLenum pname,
2192 GLsizei bufSize,
2193 const GLint *params)
2194{
2195 texParameteriv(target, pname, params);
2196}
2197
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002198void Context::texParameterIivRobust(TextureType target,
2199 GLenum pname,
2200 GLsizei bufSize,
2201 const GLint *params)
2202{
2203 UNIMPLEMENTED();
2204}
2205
2206void Context::texParameterIuivRobust(TextureType target,
2207 GLenum pname,
2208 GLsizei bufSize,
2209 const GLuint *params)
2210{
2211 UNIMPLEMENTED();
2212}
2213
Jamie Madill493f9572018-05-24 19:52:15 -04002214void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002215{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002216 // No-op if count draws no primitives for given mode
2217 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002218 {
2219 return;
2220 }
2221
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002222 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002223 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002224 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002225}
2226
Jamie Madill493f9572018-05-24 19:52:15 -04002227void Context::drawArraysInstanced(PrimitiveMode mode,
2228 GLint first,
2229 GLsizei count,
2230 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002231{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002232 // No-op if count draws no primitives for given mode
2233 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002234 {
2235 return;
2236 }
2237
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002238 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002239 ANGLE_CONTEXT_TRY(
2240 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002241 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2242 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002243}
2244
Jamie Madill493f9572018-05-24 19:52:15 -04002245void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002246{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002247 // No-op if count draws no primitives for given mode
2248 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002249 {
2250 return;
2251 }
2252
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002253 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002254 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002255}
2256
Jamie Madill493f9572018-05-24 19:52:15 -04002257void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002258 GLsizei count,
2259 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002260 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002261 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002262{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002263 // No-op if count draws no primitives for given mode
2264 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002265 {
2266 return;
2267 }
2268
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002269 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002270 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002271 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002272}
2273
Jamie Madill493f9572018-05-24 19:52:15 -04002274void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002275 GLuint start,
2276 GLuint end,
2277 GLsizei count,
2278 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002279 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002280{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002281 // No-op if count draws no primitives for given mode
2282 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002283 {
2284 return;
2285 }
2286
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002287 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002288 ANGLE_CONTEXT_TRY(
2289 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002290}
2291
Jamie Madill493f9572018-05-24 19:52:15 -04002292void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002293{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002294 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002295 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002296}
2297
Jamie Madill493f9572018-05-24 19:52:15 -04002298void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002299{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002300 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002301 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002302}
2303
Jamie Madill675fe712016-12-19 13:07:54 -05002304void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002305{
Jamie Madillafa02a22017-11-23 12:57:38 -05002306 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002307}
2308
Jamie Madill675fe712016-12-19 13:07:54 -05002309void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002310{
Jamie Madillafa02a22017-11-23 12:57:38 -05002311 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002312}
2313
Austin Kinross6ee1e782015-05-29 17:05:37 -07002314void Context::insertEventMarker(GLsizei length, const char *marker)
2315{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002316 ASSERT(mImplementation);
2317 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002318}
2319
2320void Context::pushGroupMarker(GLsizei length, const char *marker)
2321{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002322 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002323
2324 if (marker == nullptr)
2325 {
2326 // From the EXT_debug_marker spec,
2327 // "If <marker> is null then an empty string is pushed on the stack."
2328 mImplementation->pushGroupMarker(length, "");
2329 }
2330 else
2331 {
2332 mImplementation->pushGroupMarker(length, marker);
2333 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002334}
2335
2336void Context::popGroupMarker()
2337{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002338 ASSERT(mImplementation);
2339 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002340}
2341
Geoff Langd8605522016-04-13 10:19:12 -04002342void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2343{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002344 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002345 ASSERT(programObject);
2346
2347 programObject->bindUniformLocation(location, name);
2348}
2349
Brandon Jones59770802018-04-02 13:18:42 -07002350void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002351{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002352 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002353}
2354
Brandon Jones59770802018-04-02 13:18:42 -07002355void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002356{
2357 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2358}
2359
Brandon Jones59770802018-04-02 13:18:42 -07002360void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002361{
2362 GLfloat I[16];
2363 angle::Matrix<GLfloat>::setToIdentity(I);
2364
2365 mGLState.loadPathRenderingMatrix(matrixMode, I);
2366}
2367
2368void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2369{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002370 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002371 if (!pathObj)
2372 return;
2373
Geoff Lang9bf86f02018-07-26 11:46:34 -04002374 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002375
2376 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2377}
2378
2379void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2380{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002381 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002382 if (!pathObj)
2383 return;
2384
Geoff Lang9bf86f02018-07-26 11:46:34 -04002385 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002386
2387 mImplementation->stencilStrokePath(pathObj, reference, mask);
2388}
2389
2390void Context::coverFillPath(GLuint path, GLenum coverMode)
2391{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002392 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002393 if (!pathObj)
2394 return;
2395
Geoff Lang9bf86f02018-07-26 11:46:34 -04002396 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002397
2398 mImplementation->coverFillPath(pathObj, coverMode);
2399}
2400
2401void Context::coverStrokePath(GLuint path, GLenum coverMode)
2402{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002403 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002404 if (!pathObj)
2405 return;
2406
Geoff Lang9bf86f02018-07-26 11:46:34 -04002407 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002408
2409 mImplementation->coverStrokePath(pathObj, coverMode);
2410}
2411
2412void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2413{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002414 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002415 if (!pathObj)
2416 return;
2417
Geoff Lang9bf86f02018-07-26 11:46:34 -04002418 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002419
2420 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2421}
2422
2423void Context::stencilThenCoverStrokePath(GLuint path,
2424 GLint reference,
2425 GLuint mask,
2426 GLenum coverMode)
2427{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002428 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002429 if (!pathObj)
2430 return;
2431
Geoff Lang9bf86f02018-07-26 11:46:34 -04002432 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002433
2434 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2435}
2436
Sami Väisänend59ca052016-06-21 16:10:00 +03002437void Context::coverFillPathInstanced(GLsizei numPaths,
2438 GLenum pathNameType,
2439 const void *paths,
2440 GLuint pathBase,
2441 GLenum coverMode,
2442 GLenum transformType,
2443 const GLfloat *transformValues)
2444{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002445 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002446
Geoff Lang9bf86f02018-07-26 11:46:34 -04002447 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002448
2449 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2450}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002451
Sami Väisänend59ca052016-06-21 16:10:00 +03002452void Context::coverStrokePathInstanced(GLsizei numPaths,
2453 GLenum pathNameType,
2454 const void *paths,
2455 GLuint pathBase,
2456 GLenum coverMode,
2457 GLenum transformType,
2458 const GLfloat *transformValues)
2459{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002460 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002461
2462 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002463 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002464
2465 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2466 transformValues);
2467}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002468
Sami Väisänend59ca052016-06-21 16:10:00 +03002469void Context::stencilFillPathInstanced(GLsizei numPaths,
2470 GLenum pathNameType,
2471 const void *paths,
2472 GLuint pathBase,
2473 GLenum fillMode,
2474 GLuint mask,
2475 GLenum transformType,
2476 const GLfloat *transformValues)
2477{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002478 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002479
2480 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002481 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002482
2483 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2484 transformValues);
2485}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002486
Sami Väisänend59ca052016-06-21 16:10:00 +03002487void Context::stencilStrokePathInstanced(GLsizei numPaths,
2488 GLenum pathNameType,
2489 const void *paths,
2490 GLuint pathBase,
2491 GLint reference,
2492 GLuint mask,
2493 GLenum transformType,
2494 const GLfloat *transformValues)
2495{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002496 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002497
Geoff Lang9bf86f02018-07-26 11:46:34 -04002498 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002499
2500 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2501 transformValues);
2502}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002503
Sami Väisänend59ca052016-06-21 16:10:00 +03002504void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2505 GLenum pathNameType,
2506 const void *paths,
2507 GLuint pathBase,
2508 GLenum fillMode,
2509 GLuint mask,
2510 GLenum coverMode,
2511 GLenum transformType,
2512 const GLfloat *transformValues)
2513{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002514 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002515
Geoff Lang9bf86f02018-07-26 11:46:34 -04002516 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002517
2518 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2519 transformType, transformValues);
2520}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002521
Sami Väisänend59ca052016-06-21 16:10:00 +03002522void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2523 GLenum pathNameType,
2524 const void *paths,
2525 GLuint pathBase,
2526 GLint reference,
2527 GLuint mask,
2528 GLenum coverMode,
2529 GLenum transformType,
2530 const GLfloat *transformValues)
2531{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002532 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002533
Geoff Lang9bf86f02018-07-26 11:46:34 -04002534 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002535
2536 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2537 transformType, transformValues);
2538}
2539
Sami Väisänen46eaa942016-06-29 10:26:37 +03002540void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2541{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002542 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002543
2544 programObject->bindFragmentInputLocation(location, name);
2545}
2546
2547void Context::programPathFragmentInputGen(GLuint program,
2548 GLint location,
2549 GLenum genMode,
2550 GLint components,
2551 const GLfloat *coeffs)
2552{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002553 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002554
jchen103fd614d2018-08-13 12:21:58 +08002555 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002556}
2557
jchen1015015f72017-03-16 13:54:21 +08002558GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2559{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002560 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002561 return QueryProgramResourceIndex(programObject, programInterface, name);
2562}
2563
jchen10fd7c3b52017-03-21 15:36:03 +08002564void Context::getProgramResourceName(GLuint program,
2565 GLenum programInterface,
2566 GLuint index,
2567 GLsizei bufSize,
2568 GLsizei *length,
2569 GLchar *name)
2570{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002571 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002572 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2573}
2574
jchen10191381f2017-04-11 13:59:04 +08002575GLint Context::getProgramResourceLocation(GLuint program,
2576 GLenum programInterface,
2577 const GLchar *name)
2578{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002579 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002580 return QueryProgramResourceLocation(programObject, programInterface, name);
2581}
2582
jchen10880683b2017-04-12 16:21:55 +08002583void Context::getProgramResourceiv(GLuint program,
2584 GLenum programInterface,
2585 GLuint index,
2586 GLsizei propCount,
2587 const GLenum *props,
2588 GLsizei bufSize,
2589 GLsizei *length,
2590 GLint *params)
2591{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002592 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002593 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2594 length, params);
2595}
2596
jchen10d9cd7b72017-08-30 15:04:25 +08002597void Context::getProgramInterfaceiv(GLuint program,
2598 GLenum programInterface,
2599 GLenum pname,
2600 GLint *params)
2601{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002602 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002603 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2604}
2605
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002606void Context::getProgramInterfaceivRobust(GLuint program,
2607 GLenum programInterface,
2608 GLenum pname,
2609 GLsizei bufSize,
2610 GLsizei *length,
2611 GLint *params)
2612{
2613 UNIMPLEMENTED();
2614}
2615
Jamie Madill306b6c12018-07-27 08:12:49 -04002616void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002617{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002618 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002619}
2620
2621// Get one of the recorded errors and clear its flag, if any.
2622// [OpenGL ES 2.0.24] section 2.5 page 13.
2623GLenum Context::getError()
2624{
Geoff Langda5777c2014-07-11 09:52:58 -04002625 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002626 {
Geoff Langda5777c2014-07-11 09:52:58 -04002627 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002628 }
Geoff Langda5777c2014-07-11 09:52:58 -04002629 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002630 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002631 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002632 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002633}
2634
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002635// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002636void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002637{
2638 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002639 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002640 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002641 mContextLostForced = true;
2642 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002643 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002644}
2645
Jamie Madillfa920eb2018-01-04 11:45:50 -05002646GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002647{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002648 // Even if the application doesn't want to know about resets, we want to know
2649 // as it will allow us to skip all the calls.
2650 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002651 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002652 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002653 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002654 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002655 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002656
2657 // EXT_robustness, section 2.6: If the reset notification behavior is
2658 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2659 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2660 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002661 }
2662
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002663 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2664 // status should be returned at least once, and GL_NO_ERROR should be returned
2665 // once the device has finished resetting.
2666 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002667 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002668 ASSERT(mResetStatus == GL_NO_ERROR);
2669 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002670
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002671 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002672 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002673 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002674 }
2675 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002676 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002677 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002678 // If markContextLost was used to mark the context lost then
2679 // assume that is not recoverable, and continue to report the
2680 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002681 mResetStatus = mImplementation->getResetStatus();
2682 }
Jamie Madill893ab082014-05-16 16:56:10 -04002683
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002684 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002685}
2686
2687bool Context::isResetNotificationEnabled()
2688{
2689 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2690}
2691
Corentin Walleze3b10e82015-05-20 11:06:25 -04002692const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002693{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002694 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002695}
2696
2697EGLenum Context::getClientType() const
2698{
2699 return mClientType;
2700}
2701
2702EGLenum Context::getRenderBuffer() const
2703{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002704 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2705 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002706 {
2707 return EGL_NONE;
2708 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002709
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002710 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002711 ASSERT(backAttachment != nullptr);
2712 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002713}
2714
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002715VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002716{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002717 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002718 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2719 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002720 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002721 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2722 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002723
Jamie Madill96a483b2017-06-27 16:49:21 -04002724 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002725 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002726
2727 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002728}
2729
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002730TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002731{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002732 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002733 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2734 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002735 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002736 transformFeedback =
2737 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002738 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002739 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002740 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002741
2742 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002743}
2744
2745bool Context::isVertexArrayGenerated(GLuint vertexArray)
2746{
Jamie Madill96a483b2017-06-27 16:49:21 -04002747 ASSERT(mVertexArrayMap.contains(0));
2748 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002749}
2750
2751bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2752{
Jamie Madill96a483b2017-06-27 16:49:21 -04002753 ASSERT(mTransformFeedbackMap.contains(0));
2754 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002755}
2756
Shannon Woods53a94a82014-06-24 15:20:36 -04002757void Context::detachTexture(GLuint texture)
2758{
2759 // Simple pass-through to State's detachTexture method, as textures do not require
2760 // allocation map management either here or in the resource manager at detach time.
2761 // Zero textures are held by the Context, and we don't attempt to request them from
2762 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002763 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002764}
2765
James Darpinian4d9d4832018-03-13 12:43:28 -07002766void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002767{
Yuly Novikov5807a532015-12-03 13:01:22 -05002768 // Simple pass-through to State's detachBuffer method, since
2769 // only buffer attachments to container objects that are bound to the current context
2770 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002771
Yuly Novikov5807a532015-12-03 13:01:22 -05002772 // [OpenGL ES 3.2] section 5.1.2 page 45:
2773 // Attachments to unbound container objects, such as
2774 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2775 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002776 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002777}
2778
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002779void Context::detachFramebuffer(GLuint framebuffer)
2780{
Shannon Woods53a94a82014-06-24 15:20:36 -04002781 // Framebuffer detachment is handled by Context, because 0 is a valid
2782 // Framebuffer object, and a pointer to it must be passed from Context
2783 // to State at binding time.
2784
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002785 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002786 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2787 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2788 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002789
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002790 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002791 {
2792 bindReadFramebuffer(0);
2793 }
2794
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002795 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002796 {
2797 bindDrawFramebuffer(0);
2798 }
2799}
2800
2801void Context::detachRenderbuffer(GLuint renderbuffer)
2802{
Jamie Madilla02315b2017-02-23 14:14:47 -05002803 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002804}
2805
Jamie Madill57a89722013-07-02 11:57:03 -04002806void Context::detachVertexArray(GLuint vertexArray)
2807{
Jamie Madill77a72f62015-04-14 11:18:32 -04002808 // Vertex array detachment is handled by Context, because 0 is a valid
2809 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002810 // binding time.
2811
Jamie Madill57a89722013-07-02 11:57:03 -04002812 // [OpenGL ES 3.0.2] section 2.10 page 43:
2813 // If a vertex array object that is currently bound is deleted, the binding
2814 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002815 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002816 {
2817 bindVertexArray(0);
2818 }
2819}
2820
Geoff Langc8058452014-02-03 12:04:11 -05002821void Context::detachTransformFeedback(GLuint transformFeedback)
2822{
Corentin Walleza2257da2016-04-19 16:43:12 -04002823 // Transform feedback detachment is handled by Context, because 0 is a valid
2824 // transform feedback, and a pointer to it must be passed from Context to State at
2825 // binding time.
2826
2827 // The OpenGL specification doesn't mention what should happen when the currently bound
2828 // transform feedback object is deleted. Since it is a container object, we treat it like
2829 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002830 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002831 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002832 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002833 }
Geoff Langc8058452014-02-03 12:04:11 -05002834}
2835
Jamie Madilldc356042013-07-19 16:36:57 -04002836void Context::detachSampler(GLuint sampler)
2837{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002838 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002839}
2840
Yunchao Hea336b902017-08-02 16:05:21 +08002841void Context::detachProgramPipeline(GLuint pipeline)
2842{
2843 mGLState.detachProgramPipeline(this, pipeline);
2844}
2845
Jamie Madill3ef140a2017-08-26 23:11:21 -04002846void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002847{
Shaodde78e82017-05-22 14:13:27 +08002848 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002849 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002850}
2851
Jamie Madille29d1672013-07-19 16:36:57 -04002852void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2853{
Geoff Langc1984ed2016-10-07 12:41:00 -04002854 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002855 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002856 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002857}
Jamie Madille29d1672013-07-19 16:36:57 -04002858
Geoff Langc1984ed2016-10-07 12:41:00 -04002859void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2860{
2861 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002862 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002863 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002864}
2865
Brandon Jones59770802018-04-02 13:18:42 -07002866void Context::samplerParameterivRobust(GLuint sampler,
2867 GLenum pname,
2868 GLsizei bufSize,
2869 const GLint *param)
2870{
2871 samplerParameteriv(sampler, pname, param);
2872}
2873
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002874void Context::samplerParameterIivRobust(GLuint sampler,
2875 GLenum pname,
2876 GLsizei bufSize,
2877 const GLint *param)
2878{
2879 UNIMPLEMENTED();
2880}
2881
2882void Context::samplerParameterIuivRobust(GLuint sampler,
2883 GLenum pname,
2884 GLsizei bufSize,
2885 const GLuint *param)
2886{
2887 UNIMPLEMENTED();
2888}
2889
Jamie Madille29d1672013-07-19 16:36:57 -04002890void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2891{
Geoff Langc1984ed2016-10-07 12:41:00 -04002892 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002893 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002894 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002895}
2896
Geoff Langc1984ed2016-10-07 12:41:00 -04002897void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002898{
Geoff Langc1984ed2016-10-07 12:41:00 -04002899 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002900 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002901 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002902}
2903
Brandon Jones59770802018-04-02 13:18:42 -07002904void Context::samplerParameterfvRobust(GLuint sampler,
2905 GLenum pname,
2906 GLsizei bufSize,
2907 const GLfloat *param)
2908{
2909 samplerParameterfv(sampler, pname, param);
2910}
2911
Geoff Langc1984ed2016-10-07 12:41:00 -04002912void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002913{
Geoff Langc1984ed2016-10-07 12:41:00 -04002914 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002915 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002916 QuerySamplerParameteriv(samplerObject, pname, params);
2917}
Jamie Madill9675b802013-07-19 16:36:59 -04002918
Brandon Jones59770802018-04-02 13:18:42 -07002919void Context::getSamplerParameterivRobust(GLuint sampler,
2920 GLenum pname,
2921 GLsizei bufSize,
2922 GLsizei *length,
2923 GLint *params)
2924{
2925 getSamplerParameteriv(sampler, pname, params);
2926}
2927
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002928void Context::getSamplerParameterIivRobust(GLuint sampler,
2929 GLenum pname,
2930 GLsizei bufSize,
2931 GLsizei *length,
2932 GLint *params)
2933{
2934 UNIMPLEMENTED();
2935}
2936
2937void Context::getSamplerParameterIuivRobust(GLuint sampler,
2938 GLenum pname,
2939 GLsizei bufSize,
2940 GLsizei *length,
2941 GLuint *params)
2942{
2943 UNIMPLEMENTED();
2944}
2945
Geoff Langc1984ed2016-10-07 12:41:00 -04002946void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2947{
2948 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002949 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002950 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04002951}
2952
Brandon Jones59770802018-04-02 13:18:42 -07002953void Context::getSamplerParameterfvRobust(GLuint sampler,
2954 GLenum pname,
2955 GLsizei bufSize,
2956 GLsizei *length,
2957 GLfloat *params)
2958{
2959 getSamplerParameterfv(sampler, pname, params);
2960}
2961
Olli Etuahof0fee072016-03-30 15:11:58 +03002962void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2963{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002964 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08002965 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002966}
2967
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002968void Context::initRendererString()
2969{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002970 std::ostringstream rendererString;
2971 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002972 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002973 rendererString << ")";
2974
Geoff Langcec35902014-04-16 10:52:36 -04002975 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002976}
2977
Geoff Langc339c4e2016-11-29 10:37:36 -05002978void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002979{
Geoff Langc339c4e2016-11-29 10:37:36 -05002980 const Version &clientVersion = getClientVersion();
2981
2982 std::ostringstream versionString;
2983 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2984 << ANGLE_VERSION_STRING << ")";
2985 mVersionString = MakeStaticString(versionString.str());
2986
2987 std::ostringstream shadingLanguageVersionString;
2988 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2989 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2990 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
2991 << ")";
2992 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002993}
2994
Geoff Langcec35902014-04-16 10:52:36 -04002995void Context::initExtensionStrings()
2996{
Geoff Langc339c4e2016-11-29 10:37:36 -05002997 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
2998 std::ostringstream combinedStringStream;
2999 std::copy(strings.begin(), strings.end(),
3000 std::ostream_iterator<const char *>(combinedStringStream, " "));
3001 return MakeStaticString(combinedStringStream.str());
3002 };
3003
3004 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003005 for (const auto &extensionString : mExtensions.getStrings())
3006 {
3007 mExtensionStrings.push_back(MakeStaticString(extensionString));
3008 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003009 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003010
Geoff Langc339c4e2016-11-29 10:37:36 -05003011 mRequestableExtensionStrings.clear();
3012 for (const auto &extensionInfo : GetExtensionInfoMap())
3013 {
3014 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003015 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003016 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003017 {
3018 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3019 }
3020 }
3021 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003022}
3023
Geoff Langc339c4e2016-11-29 10:37:36 -05003024const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003025{
Geoff Langc339c4e2016-11-29 10:37:36 -05003026 switch (name)
3027 {
3028 case GL_VENDOR:
3029 return reinterpret_cast<const GLubyte *>("Google Inc.");
3030
3031 case GL_RENDERER:
3032 return reinterpret_cast<const GLubyte *>(mRendererString);
3033
3034 case GL_VERSION:
3035 return reinterpret_cast<const GLubyte *>(mVersionString);
3036
3037 case GL_SHADING_LANGUAGE_VERSION:
3038 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3039
3040 case GL_EXTENSIONS:
3041 return reinterpret_cast<const GLubyte *>(mExtensionString);
3042
3043 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3044 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3045
3046 default:
3047 UNREACHABLE();
3048 return nullptr;
3049 }
Geoff Langcec35902014-04-16 10:52:36 -04003050}
3051
Geoff Langc339c4e2016-11-29 10:37:36 -05003052const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003053{
Geoff Langc339c4e2016-11-29 10:37:36 -05003054 switch (name)
3055 {
3056 case GL_EXTENSIONS:
3057 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3058
3059 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3060 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3061
3062 default:
3063 UNREACHABLE();
3064 return nullptr;
3065 }
Geoff Langcec35902014-04-16 10:52:36 -04003066}
3067
3068size_t Context::getExtensionStringCount() const
3069{
3070 return mExtensionStrings.size();
3071}
3072
Geoff Lang111a99e2017-10-17 10:58:41 -04003073bool Context::isExtensionRequestable(const char *name)
3074{
3075 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3076 auto extension = extensionInfos.find(name);
3077
Geoff Lang111a99e2017-10-17 10:58:41 -04003078 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003079 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003080}
3081
Geoff Langc339c4e2016-11-29 10:37:36 -05003082void Context::requestExtension(const char *name)
3083{
3084 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3085 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3086 const auto &extension = extensionInfos.at(name);
3087 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003088 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003089
3090 if (mExtensions.*(extension.ExtensionsMember))
3091 {
3092 // Extension already enabled
3093 return;
3094 }
3095
3096 mExtensions.*(extension.ExtensionsMember) = true;
3097 updateCaps();
3098 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003099
Jamie Madill2f348d22017-06-05 10:50:59 -04003100 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3101 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003102
Jamie Madill81c2e252017-09-09 23:32:46 -04003103 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3104 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003105 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003106 for (auto &zeroTexture : mZeroTextures)
3107 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003108 if (zeroTexture.get() != nullptr)
3109 {
3110 zeroTexture->signalDirty(this, InitState::Initialized);
3111 }
Geoff Lang9aded172017-04-05 11:07:56 -04003112 }
3113
Jamie Madillb983a4b2018-08-01 11:34:51 -04003114 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003115}
3116
3117size_t Context::getRequestableExtensionStringCount() const
3118{
3119 return mRequestableExtensionStrings.size();
3120}
3121
Jamie Madill493f9572018-05-24 19:52:15 -04003122void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003123{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003124 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003125 ASSERT(transformFeedback != nullptr);
3126 ASSERT(!transformFeedback->isPaused());
3127
Jamie Madill6c1f6712017-02-14 19:08:04 -05003128 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003129 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003130}
3131
3132bool Context::hasActiveTransformFeedback(GLuint program) const
3133{
3134 for (auto pair : mTransformFeedbackMap)
3135 {
3136 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3137 {
3138 return true;
3139 }
3140 }
3141 return false;
3142}
3143
Geoff Lang33f11fb2018-05-07 13:42:47 -04003144Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003145{
3146 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3147
jchen1082af6202018-06-22 10:59:52 +08003148 // Explicitly enable GL_KHR_parallel_shader_compile
3149 supportedExtensions.parallelShaderCompile = true;
3150
Geoff Langb0f917f2017-12-05 13:41:54 -05003151 if (getClientVersion() < ES_2_0)
3152 {
3153 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003154 supportedExtensions.pointSizeArray = true;
3155 supportedExtensions.textureCubeMap = true;
3156 supportedExtensions.pointSprite = true;
3157 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003158 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003159 }
3160
3161 if (getClientVersion() < ES_3_0)
3162 {
3163 // Disable ES3+ extensions
3164 supportedExtensions.colorBufferFloat = false;
3165 supportedExtensions.eglImageExternalEssl3 = false;
3166 supportedExtensions.textureNorm16 = false;
3167 supportedExtensions.multiview = false;
3168 supportedExtensions.maxViews = 1u;
3169 }
3170
3171 if (getClientVersion() < ES_3_1)
3172 {
3173 // Disable ES3.1+ extensions
3174 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003175
3176 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3177 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003178 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003179 }
3180
3181 if (getClientVersion() > ES_2_0)
3182 {
3183 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3184 // supportedExtensions.sRGB = false;
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03003185
3186 // EXT_blend_func_extended is only implemented against GLES2 now
3187 // TODO(http://anglebug.com/1085): remove this limitation once GLES3 binding API for the
3188 // outputs is in place.
3189 supportedExtensions.blendFuncExtended = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003190 }
3191
3192 // Some extensions are always available because they are implemented in the GL layer.
3193 supportedExtensions.bindUniformLocation = true;
3194 supportedExtensions.vertexArrayObject = true;
3195 supportedExtensions.bindGeneratesResource = true;
3196 supportedExtensions.clientArrays = true;
3197 supportedExtensions.requestExtension = true;
3198
3199 // Enable the no error extension if the context was created with the flag.
3200 supportedExtensions.noError = mSkipValidation;
3201
3202 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003203 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003204
3205 // Explicitly enable GL_KHR_debug
3206 supportedExtensions.debug = true;
3207 supportedExtensions.maxDebugMessageLength = 1024;
3208 supportedExtensions.maxDebugLoggedMessages = 1024;
3209 supportedExtensions.maxDebugGroupStackDepth = 1024;
3210 supportedExtensions.maxLabelLength = 1024;
3211
3212 // Explicitly enable GL_ANGLE_robust_client_memory
3213 supportedExtensions.robustClientMemory = true;
3214
3215 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003216 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003217
3218 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3219 // supports it.
3220 supportedExtensions.robustBufferAccessBehavior =
3221 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3222
3223 // Enable the cache control query unconditionally.
3224 supportedExtensions.programCacheControl = true;
3225
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003226 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003227 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003228 {
3229 // GL_ANGLE_explicit_context_gles1
3230 supportedExtensions.explicitContextGles1 = true;
3231 // GL_ANGLE_explicit_context
3232 supportedExtensions.explicitContext = true;
3233 }
3234
Geoff Langb0f917f2017-12-05 13:41:54 -05003235 return supportedExtensions;
3236}
3237
Geoff Lang33f11fb2018-05-07 13:42:47 -04003238void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003239{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003240 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003241
Geoff Lang33f11fb2018-05-07 13:42:47 -04003242 mSupportedExtensions = generateSupportedExtensions();
3243 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003244
3245 mLimitations = mImplementation->getNativeLimitations();
3246
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003247 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3248 if (getClientVersion() < Version(2, 0))
3249 {
3250 mCaps.maxMultitextureUnits = 4;
3251 mCaps.maxClipPlanes = 6;
3252 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003253 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3254 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3255 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003256 mCaps.minSmoothPointSize = 1.0f;
3257 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003258 mCaps.minSmoothLineWidth = 1.0f;
3259 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003260 }
3261
Luc Ferronad2ae932018-06-11 15:31:17 -04003262 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003263 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003264
Luc Ferronad2ae932018-06-11 15:31:17 -04003265 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3266
Jamie Madill0f80ed82017-09-19 00:24:56 -04003267 if (getClientVersion() < ES_3_1)
3268 {
3269 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3270 }
3271 else
3272 {
3273 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3274 }
Geoff Lang301d1612014-07-09 10:34:37 -04003275
Jiawei Shao54aafe52018-04-27 14:54:57 +08003276 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3277 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003278 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3279
Jamie Madill0f80ed82017-09-19 00:24:56 -04003280 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3281 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3282
3283 // Limit textures as well, so we can use fast bitsets with texture bindings.
3284 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003285 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3286 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3287 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3288 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003289
Jiawei Shaodb342272017-09-27 10:21:45 +08003290 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3291
Geoff Langc287ea62016-09-16 14:46:51 -04003292 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003293 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003294 for (const auto &extensionInfo : GetExtensionInfoMap())
3295 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003296 // If the user has requested that extensions start disabled and they are requestable,
3297 // disable them.
3298 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003299 {
3300 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3301 }
3302 }
3303
3304 // Generate texture caps
3305 updateCaps();
3306}
3307
3308void Context::updateCaps()
3309{
Geoff Lang900013c2014-07-07 11:32:19 -04003310 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003311 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003312
Jamie Madill7b62cf92017-11-02 15:20:49 -04003313 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003314 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003315 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003316 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003317
Geoff Lang0d8b7242015-09-09 14:56:53 -04003318 // Update the format caps based on the client version and extensions.
3319 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3320 // ES3.
3321 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003322 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003323 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003324 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003325 formatCaps.textureAttachment =
3326 formatCaps.textureAttachment &&
3327 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3328 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3329 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003330
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003331 // OpenGL ES does not support multisampling with non-rendererable formats
3332 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003333 if (!formatCaps.renderbuffer ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003334 (getClientVersion() < ES_3_1 &&
3335 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003336 {
Geoff Langd87878e2014-09-19 15:42:59 -04003337 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003338 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003339 else
3340 {
3341 // We may have limited the max samples for some required renderbuffer formats due to
3342 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3343 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3344
3345 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3346 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3347 // exception of signed and unsigned integer formats."
3348 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3349 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3350 {
3351 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3352 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3353 }
3354
3355 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3356 if (getClientVersion() >= ES_3_1)
3357 {
3358 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3359 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3360 // the exception that the signed and unsigned integer formats are required only to
3361 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3362 // multisamples, which must be at least one."
3363 if (formatInfo.componentType == GL_INT ||
3364 formatInfo.componentType == GL_UNSIGNED_INT)
3365 {
3366 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3367 }
3368
3369 // GLES 3.1 section 19.3.1.
3370 if (formatCaps.texturable)
3371 {
3372 if (formatInfo.depthBits > 0)
3373 {
3374 mCaps.maxDepthTextureSamples =
3375 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3376 }
3377 else if (formatInfo.redBits > 0)
3378 {
3379 mCaps.maxColorTextureSamples =
3380 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3381 }
3382 }
3383 }
3384 }
Geoff Langd87878e2014-09-19 15:42:59 -04003385
3386 if (formatCaps.texturable && formatInfo.compressed)
3387 {
Geoff Langca271392017-04-05 12:30:00 -04003388 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003389 }
3390
Geoff Langca271392017-04-05 12:30:00 -04003391 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003392 }
Jamie Madill32447362017-06-28 14:53:52 -04003393
3394 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003395 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003396 {
3397 mMemoryProgramCache = nullptr;
3398 }
Corentin Walleze4477002017-12-01 14:39:58 -05003399
3400 // Compute which buffer types are allowed
3401 mValidBufferBindings.reset();
3402 mValidBufferBindings.set(BufferBinding::ElementArray);
3403 mValidBufferBindings.set(BufferBinding::Array);
3404
3405 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3406 {
3407 mValidBufferBindings.set(BufferBinding::PixelPack);
3408 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3409 }
3410
3411 if (getClientVersion() >= ES_3_0)
3412 {
3413 mValidBufferBindings.set(BufferBinding::CopyRead);
3414 mValidBufferBindings.set(BufferBinding::CopyWrite);
3415 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3416 mValidBufferBindings.set(BufferBinding::Uniform);
3417 }
3418
3419 if (getClientVersion() >= ES_3_1)
3420 {
3421 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3422 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3423 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3424 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3425 }
jchen107ae70d82018-07-06 13:47:01 +08003426
3427 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Geoff Lang493daf52014-07-03 13:38:44 -04003428}
3429
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003430void Context::initWorkarounds()
3431{
Jamie Madill761b02c2017-06-23 16:27:06 -04003432 // Apply back-end workarounds.
3433 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3434
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003435 // Lose the context upon out of memory error if the application is
3436 // expecting to watch for those events.
3437 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
3438}
3439
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003440// Return true if the draw is a no-op, else return false.
3441// A no-op draw occurs if the count of vertices is less than the minimum required to
3442// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3443bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3444{
3445 return count < kMinimumPrimitiveCounts[mode];
3446}
3447
3448bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3449{
3450 return (instanceCount == 0) || noopDraw(mode, count);
3451}
3452
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003453Error Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003454{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003455 if (mGLES1Renderer)
3456 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003457 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003458 }
3459
Geoff Lang9bf86f02018-07-26 11:46:34 -04003460 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003461
3462 if (isRobustResourceInitEnabled())
3463 {
3464 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3465 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3466 }
3467
Geoff Langa8cb2872018-03-09 16:09:40 -05003468 ANGLE_TRY(syncDirtyBits());
Geoff Langd4fff502017-09-22 11:28:28 -04003469 return NoError();
3470}
3471
3472Error Context::prepareForClear(GLbitfield mask)
3473{
Geoff Langa8cb2872018-03-09 16:09:40 -05003474 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003475 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003476 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003477 return NoError();
3478}
3479
3480Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3481{
Geoff Langa8cb2872018-03-09 16:09:40 -05003482 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003483 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3484 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003485 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003486 return NoError();
3487}
3488
Geoff Langa8cb2872018-03-09 16:09:40 -05003489Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003490{
Geoff Langa8cb2872018-03-09 16:09:40 -05003491 ANGLE_TRY(syncDirtyObjects(objectMask));
3492 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003493 return NoError();
3494}
3495
Geoff Langa8cb2872018-03-09 16:09:40 -05003496Error Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003497{
3498 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill189ad872018-07-09 13:32:37 -04003499 ANGLE_TRY(mImplementation->syncState(this, dirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003500 mGLState.clearDirtyBits();
3501 return NoError();
3502}
3503
Geoff Langa8cb2872018-03-09 16:09:40 -05003504Error Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003505{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003506 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill189ad872018-07-09 13:32:37 -04003507 ANGLE_TRY(mImplementation->syncState(this, dirtyBits));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003508 mGLState.clearDirtyBits(dirtyBits);
Jamie Madillbc918e72018-03-08 09:47:21 -05003509 return NoError();
Jamie Madill1b94d432015-08-07 13:23:23 -04003510}
Jamie Madillc29968b2016-01-20 11:17:23 -05003511
Geoff Langa8cb2872018-03-09 16:09:40 -05003512Error Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003513{
3514 return mGLState.syncDirtyObjects(this, objectMask);
3515}
3516
Jamie Madillc29968b2016-01-20 11:17:23 -05003517void Context::blitFramebuffer(GLint srcX0,
3518 GLint srcY0,
3519 GLint srcX1,
3520 GLint srcY1,
3521 GLint dstX0,
3522 GLint dstY0,
3523 GLint dstX1,
3524 GLint dstY1,
3525 GLbitfield mask,
3526 GLenum filter)
3527{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003528 if (mask == 0)
3529 {
3530 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3531 // buffers are copied.
3532 return;
3533 }
3534
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003535 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003536 ASSERT(drawFramebuffer);
3537
3538 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3539 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3540
Jamie Madillbc918e72018-03-08 09:47:21 -05003541 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003542
Jamie Madillc564c072017-06-01 12:45:42 -04003543 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003544}
Jamie Madillc29968b2016-01-20 11:17:23 -05003545
3546void Context::clear(GLbitfield mask)
3547{
Geoff Langd4fff502017-09-22 11:28:28 -04003548 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3549 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003550}
3551
3552void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3553{
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003554 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3555 // that the backend doesn't need to take this case into account.
Olli Etuahodbce1f82018-09-19 15:32:17 +03003556 if (buffer == GL_DEPTH && !getGLState().getDrawFramebuffer()->getDepthbuffer())
3557 {
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003558 return;
3559 }
3560 if (buffer == GL_COLOR && !getGLState().getDrawFramebuffer()->getColorbuffer(drawbuffer))
3561 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003562 return;
3563 }
Geoff Langd4fff502017-09-22 11:28:28 -04003564 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3565 ANGLE_CONTEXT_TRY(
3566 mGLState.getDrawFramebuffer()->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003567}
3568
3569void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3570{
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003571 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3572 // that the backend doesn't need to take this case into account.
3573 if (buffer == GL_COLOR && !getGLState().getDrawFramebuffer()->getColorbuffer(drawbuffer))
3574 {
3575 return;
3576 }
Geoff Langd4fff502017-09-22 11:28:28 -04003577 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3578 ANGLE_CONTEXT_TRY(
3579 mGLState.getDrawFramebuffer()->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003580}
3581
3582void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3583{
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003584 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3585 // that the backend doesn't need to take this case into account.
Olli Etuahodbce1f82018-09-19 15:32:17 +03003586 if (buffer == GL_STENCIL && !getGLState().getDrawFramebuffer()->getStencilbuffer())
3587 {
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003588 return;
3589 }
3590 if (buffer == GL_COLOR && !getGLState().getDrawFramebuffer()->getColorbuffer(drawbuffer))
3591 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003592 return;
3593 }
Geoff Langd4fff502017-09-22 11:28:28 -04003594 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3595 ANGLE_CONTEXT_TRY(
3596 mGLState.getDrawFramebuffer()->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003597}
3598
3599void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3600{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003601 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003602 ASSERT(framebufferObject);
3603
3604 // If a buffer is not present, the clear has no effect
3605 if (framebufferObject->getDepthbuffer() == nullptr &&
3606 framebufferObject->getStencilbuffer() == nullptr)
3607 {
3608 return;
3609 }
3610
Geoff Langd4fff502017-09-22 11:28:28 -04003611 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3612 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003613}
3614
3615void Context::readPixels(GLint x,
3616 GLint y,
3617 GLsizei width,
3618 GLsizei height,
3619 GLenum format,
3620 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003621 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003622{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003623 if (width == 0 || height == 0)
3624 {
3625 return;
3626 }
3627
Jamie Madillbc918e72018-03-08 09:47:21 -05003628 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003629
Jamie Madillb6664922017-07-25 12:55:04 -04003630 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3631 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003632
3633 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003634 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003635}
3636
Brandon Jones59770802018-04-02 13:18:42 -07003637void Context::readPixelsRobust(GLint x,
3638 GLint y,
3639 GLsizei width,
3640 GLsizei height,
3641 GLenum format,
3642 GLenum type,
3643 GLsizei bufSize,
3644 GLsizei *length,
3645 GLsizei *columns,
3646 GLsizei *rows,
3647 void *pixels)
3648{
3649 readPixels(x, y, width, height, format, type, pixels);
3650}
3651
3652void Context::readnPixelsRobust(GLint x,
3653 GLint y,
3654 GLsizei width,
3655 GLsizei height,
3656 GLenum format,
3657 GLenum type,
3658 GLsizei bufSize,
3659 GLsizei *length,
3660 GLsizei *columns,
3661 GLsizei *rows,
3662 void *data)
3663{
3664 readPixels(x, y, width, height, format, type, data);
3665}
3666
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003667void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003668 GLint level,
3669 GLenum internalformat,
3670 GLint x,
3671 GLint y,
3672 GLsizei width,
3673 GLsizei height,
3674 GLint border)
3675{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003676 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003677 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003678
Jamie Madillc29968b2016-01-20 11:17:23 -05003679 Rectangle sourceArea(x, y, width, height);
3680
Jamie Madill05b35b22017-10-03 09:01:44 -04003681 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003682 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003683 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003684}
3685
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003686void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003687 GLint level,
3688 GLint xoffset,
3689 GLint yoffset,
3690 GLint x,
3691 GLint y,
3692 GLsizei width,
3693 GLsizei height)
3694{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003695 if (width == 0 || height == 0)
3696 {
3697 return;
3698 }
3699
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003700 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003701 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003702
Jamie Madillc29968b2016-01-20 11:17:23 -05003703 Offset destOffset(xoffset, yoffset, 0);
3704 Rectangle sourceArea(x, y, width, height);
3705
Jamie Madill05b35b22017-10-03 09:01:44 -04003706 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003707 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003708 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003709}
3710
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003711void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003712 GLint level,
3713 GLint xoffset,
3714 GLint yoffset,
3715 GLint zoffset,
3716 GLint x,
3717 GLint y,
3718 GLsizei width,
3719 GLsizei height)
3720{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003721 if (width == 0 || height == 0)
3722 {
3723 return;
3724 }
3725
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003726 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003727 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003728
Jamie Madillc29968b2016-01-20 11:17:23 -05003729 Offset destOffset(xoffset, yoffset, zoffset);
3730 Rectangle sourceArea(x, y, width, height);
3731
Jamie Madill05b35b22017-10-03 09:01:44 -04003732 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3733 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003734 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3735 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003736}
3737
3738void Context::framebufferTexture2D(GLenum target,
3739 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003740 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003741 GLuint texture,
3742 GLint level)
3743{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003744 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003745 ASSERT(framebuffer);
3746
3747 if (texture != 0)
3748 {
3749 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003750 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003751 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003752 }
3753 else
3754 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003755 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003756 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003757
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003758 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003759}
3760
3761void Context::framebufferRenderbuffer(GLenum target,
3762 GLenum attachment,
3763 GLenum renderbuffertarget,
3764 GLuint renderbuffer)
3765{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003766 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003767 ASSERT(framebuffer);
3768
3769 if (renderbuffer != 0)
3770 {
3771 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003772
Jamie Madillcc129372018-04-12 09:13:18 -04003773 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003774 renderbufferObject);
3775 }
3776 else
3777 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003778 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003779 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003780
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003781 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003782}
3783
3784void Context::framebufferTextureLayer(GLenum target,
3785 GLenum attachment,
3786 GLuint texture,
3787 GLint level,
3788 GLint layer)
3789{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003790 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003791 ASSERT(framebuffer);
3792
3793 if (texture != 0)
3794 {
3795 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003796 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003797 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003798 }
3799 else
3800 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003801 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003802 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003803
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003804 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003805}
3806
Brandon Jones59770802018-04-02 13:18:42 -07003807void Context::framebufferTextureMultiviewLayered(GLenum target,
3808 GLenum attachment,
3809 GLuint texture,
3810 GLint level,
3811 GLint baseViewIndex,
3812 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003813{
Martin Radev82ef7742017-08-08 17:44:58 +03003814 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3815 ASSERT(framebuffer);
3816
3817 if (texture != 0)
3818 {
3819 Texture *textureObj = getTexture(texture);
3820
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003821 ImageIndex index;
3822 if (textureObj->getType() == TextureType::_2DArray)
3823 {
3824 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3825 }
3826 else
3827 {
3828 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3829 ASSERT(level == 0);
3830 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3831 }
Martin Radev82ef7742017-08-08 17:44:58 +03003832 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3833 numViews, baseViewIndex);
3834 }
3835 else
3836 {
3837 framebuffer->resetAttachment(this, attachment);
3838 }
3839
3840 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003841}
3842
Brandon Jones59770802018-04-02 13:18:42 -07003843void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3844 GLenum attachment,
3845 GLuint texture,
3846 GLint level,
3847 GLsizei numViews,
3848 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003849{
Martin Radev5dae57b2017-07-14 16:15:55 +03003850 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3851 ASSERT(framebuffer);
3852
3853 if (texture != 0)
3854 {
3855 Texture *textureObj = getTexture(texture);
3856
3857 ImageIndex index = ImageIndex::Make2D(level);
3858 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3859 textureObj, numViews, viewportOffsets);
3860 }
3861 else
3862 {
3863 framebuffer->resetAttachment(this, attachment);
3864 }
3865
3866 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003867}
3868
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003869void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3870{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003871 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3872 ASSERT(framebuffer);
3873
3874 if (texture != 0)
3875 {
3876 Texture *textureObj = getTexture(texture);
3877
3878 ImageIndex index = ImageIndex::MakeFromType(
3879 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3880 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3881 }
3882 else
3883 {
3884 framebuffer->resetAttachment(this, attachment);
3885 }
3886
3887 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003888}
3889
Jamie Madillc29968b2016-01-20 11:17:23 -05003890void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3891{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003892 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003893 ASSERT(framebuffer);
3894 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003895 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003896 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003897}
3898
3899void Context::readBuffer(GLenum mode)
3900{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003901 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003902 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003903 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003904}
3905
3906void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3907{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003908 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003909 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003910
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003911 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003912 ASSERT(framebuffer);
3913
3914 // The specification isn't clear what should be done when the framebuffer isn't complete.
3915 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003916 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003917}
3918
3919void Context::invalidateFramebuffer(GLenum target,
3920 GLsizei numAttachments,
3921 const GLenum *attachments)
3922{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003923 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003924 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003925
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003926 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003927 ASSERT(framebuffer);
3928
Jamie Madill427064d2018-04-13 16:20:34 -04003929 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003930 {
Jamie Madill437fa652016-05-03 15:13:24 -04003931 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003932 }
Jamie Madill437fa652016-05-03 15:13:24 -04003933
Jamie Madill4928b7c2017-06-20 12:57:39 -04003934 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003935}
3936
3937void Context::invalidateSubFramebuffer(GLenum target,
3938 GLsizei numAttachments,
3939 const GLenum *attachments,
3940 GLint x,
3941 GLint y,
3942 GLsizei width,
3943 GLsizei height)
3944{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003945 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003946 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003947
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003948 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003949 ASSERT(framebuffer);
3950
Jamie Madill427064d2018-04-13 16:20:34 -04003951 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003952 {
Jamie Madill437fa652016-05-03 15:13:24 -04003953 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003954 }
Jamie Madill437fa652016-05-03 15:13:24 -04003955
3956 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003957 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003958}
3959
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003960void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003961 GLint level,
3962 GLint internalformat,
3963 GLsizei width,
3964 GLsizei height,
3965 GLint border,
3966 GLenum format,
3967 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003968 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003969{
Jamie Madillbc918e72018-03-08 09:47:21 -05003970 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003971
3972 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003973 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003974 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07003975 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003976}
3977
Brandon Jones59770802018-04-02 13:18:42 -07003978void Context::texImage2DRobust(TextureTarget target,
3979 GLint level,
3980 GLint internalformat,
3981 GLsizei width,
3982 GLsizei height,
3983 GLint border,
3984 GLenum format,
3985 GLenum type,
3986 GLsizei bufSize,
3987 const void *pixels)
3988{
3989 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
3990}
3991
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003992void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003993 GLint level,
3994 GLint internalformat,
3995 GLsizei width,
3996 GLsizei height,
3997 GLsizei depth,
3998 GLint border,
3999 GLenum format,
4000 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004001 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004002{
Jamie Madillbc918e72018-03-08 09:47:21 -05004003 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004004
4005 Extents size(width, height, depth);
4006 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004007 handleError(texture->setImage(this, mGLState.getUnpackState(),
4008 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004009 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004010}
4011
Brandon Jones59770802018-04-02 13:18:42 -07004012void Context::texImage3DRobust(TextureType target,
4013 GLint level,
4014 GLint internalformat,
4015 GLsizei width,
4016 GLsizei height,
4017 GLsizei depth,
4018 GLint border,
4019 GLenum format,
4020 GLenum type,
4021 GLsizei bufSize,
4022 const void *pixels)
4023{
4024 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4025}
4026
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004027void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004028 GLint level,
4029 GLint xoffset,
4030 GLint yoffset,
4031 GLsizei width,
4032 GLsizei height,
4033 GLenum format,
4034 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004035 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004036{
4037 // Zero sized uploads are valid but no-ops
4038 if (width == 0 || height == 0)
4039 {
4040 return;
4041 }
4042
Jamie Madillbc918e72018-03-08 09:47:21 -05004043 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004044
4045 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004046 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004047
4048 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4049
4050 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4051 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004052}
4053
Brandon Jones59770802018-04-02 13:18:42 -07004054void Context::texSubImage2DRobust(TextureTarget target,
4055 GLint level,
4056 GLint xoffset,
4057 GLint yoffset,
4058 GLsizei width,
4059 GLsizei height,
4060 GLenum format,
4061 GLenum type,
4062 GLsizei bufSize,
4063 const void *pixels)
4064{
4065 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4066}
4067
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004068void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004069 GLint level,
4070 GLint xoffset,
4071 GLint yoffset,
4072 GLint zoffset,
4073 GLsizei width,
4074 GLsizei height,
4075 GLsizei depth,
4076 GLenum format,
4077 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004078 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004079{
4080 // Zero sized uploads are valid but no-ops
4081 if (width == 0 || height == 0 || depth == 0)
4082 {
4083 return;
4084 }
4085
Jamie Madillbc918e72018-03-08 09:47:21 -05004086 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004087
4088 Box area(xoffset, yoffset, zoffset, width, height, depth);
4089 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004090
4091 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4092
4093 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004094 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004095 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004096}
4097
Brandon Jones59770802018-04-02 13:18:42 -07004098void Context::texSubImage3DRobust(TextureType target,
4099 GLint level,
4100 GLint xoffset,
4101 GLint yoffset,
4102 GLint zoffset,
4103 GLsizei width,
4104 GLsizei height,
4105 GLsizei depth,
4106 GLenum format,
4107 GLenum type,
4108 GLsizei bufSize,
4109 const void *pixels)
4110{
4111 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4112 pixels);
4113}
4114
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004115void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004116 GLint level,
4117 GLenum internalformat,
4118 GLsizei width,
4119 GLsizei height,
4120 GLint border,
4121 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004122 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004123{
Jamie Madillbc918e72018-03-08 09:47:21 -05004124 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004125
4126 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004127 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004128 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4129 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004130 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004131}
4132
Brandon Jones59770802018-04-02 13:18:42 -07004133void Context::compressedTexImage2DRobust(TextureTarget target,
4134 GLint level,
4135 GLenum internalformat,
4136 GLsizei width,
4137 GLsizei height,
4138 GLint border,
4139 GLsizei imageSize,
4140 GLsizei dataSize,
4141 const GLvoid *data)
4142{
4143 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4144}
4145
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004146void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004147 GLint level,
4148 GLenum internalformat,
4149 GLsizei width,
4150 GLsizei height,
4151 GLsizei depth,
4152 GLint border,
4153 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004154 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004155{
Jamie Madillbc918e72018-03-08 09:47:21 -05004156 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004157
4158 Extents size(width, height, depth);
4159 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004160 handleError(texture->setCompressedImage(
4161 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004162 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004163}
4164
Brandon Jones59770802018-04-02 13:18:42 -07004165void Context::compressedTexImage3DRobust(TextureType target,
4166 GLint level,
4167 GLenum internalformat,
4168 GLsizei width,
4169 GLsizei height,
4170 GLsizei depth,
4171 GLint border,
4172 GLsizei imageSize,
4173 GLsizei dataSize,
4174 const GLvoid *data)
4175{
4176 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4177 data);
4178}
4179
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004180void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004181 GLint level,
4182 GLint xoffset,
4183 GLint yoffset,
4184 GLsizei width,
4185 GLsizei height,
4186 GLenum format,
4187 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004188 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004189{
Jamie Madillbc918e72018-03-08 09:47:21 -05004190 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004191
4192 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004193 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004194 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4195 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004196 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004197}
4198
Brandon Jones59770802018-04-02 13:18:42 -07004199void Context::compressedTexSubImage2DRobust(TextureTarget target,
4200 GLint level,
4201 GLint xoffset,
4202 GLint yoffset,
4203 GLsizei width,
4204 GLsizei height,
4205 GLenum format,
4206 GLsizei imageSize,
4207 GLsizei dataSize,
4208 const GLvoid *data)
4209{
4210 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4211 data);
4212}
4213
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004214void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004215 GLint level,
4216 GLint xoffset,
4217 GLint yoffset,
4218 GLint zoffset,
4219 GLsizei width,
4220 GLsizei height,
4221 GLsizei depth,
4222 GLenum format,
4223 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004224 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004225{
4226 // Zero sized uploads are valid but no-ops
4227 if (width == 0 || height == 0)
4228 {
4229 return;
4230 }
4231
Jamie Madillbc918e72018-03-08 09:47:21 -05004232 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004233
4234 Box area(xoffset, yoffset, zoffset, width, height, depth);
4235 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004236 handleError(texture->setCompressedSubImage(
4237 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004238 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004239}
4240
Brandon Jones59770802018-04-02 13:18:42 -07004241void Context::compressedTexSubImage3DRobust(TextureType target,
4242 GLint level,
4243 GLint xoffset,
4244 GLint yoffset,
4245 GLint zoffset,
4246 GLsizei width,
4247 GLsizei height,
4248 GLsizei depth,
4249 GLenum format,
4250 GLsizei imageSize,
4251 GLsizei dataSize,
4252 const GLvoid *data)
4253{
4254 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4255 imageSize, data);
4256}
4257
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004258void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004259{
4260 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004261 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004262}
4263
Jamie Madill007530e2017-12-28 14:27:04 -05004264void Context::copyTexture(GLuint sourceId,
4265 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004266 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004267 GLuint destId,
4268 GLint destLevel,
4269 GLint internalFormat,
4270 GLenum destType,
4271 GLboolean unpackFlipY,
4272 GLboolean unpackPremultiplyAlpha,
4273 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004274{
Jamie Madillbc918e72018-03-08 09:47:21 -05004275 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004276
4277 gl::Texture *sourceTexture = getTexture(sourceId);
4278 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004279 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4280 sourceLevel, ConvertToBool(unpackFlipY),
4281 ConvertToBool(unpackPremultiplyAlpha),
4282 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004283}
4284
Jamie Madill007530e2017-12-28 14:27:04 -05004285void Context::copySubTexture(GLuint sourceId,
4286 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004287 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004288 GLuint destId,
4289 GLint destLevel,
4290 GLint xoffset,
4291 GLint yoffset,
4292 GLint x,
4293 GLint y,
4294 GLsizei width,
4295 GLsizei height,
4296 GLboolean unpackFlipY,
4297 GLboolean unpackPremultiplyAlpha,
4298 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004299{
4300 // Zero sized copies are valid but no-ops
4301 if (width == 0 || height == 0)
4302 {
4303 return;
4304 }
4305
Jamie Madillbc918e72018-03-08 09:47:21 -05004306 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004307
4308 gl::Texture *sourceTexture = getTexture(sourceId);
4309 gl::Texture *destTexture = getTexture(destId);
4310 Offset offset(xoffset, yoffset, 0);
4311 Rectangle area(x, y, width, height);
Geoff Lang92019432017-11-20 13:09:34 -05004312 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, area,
4313 ConvertToBool(unpackFlipY),
4314 ConvertToBool(unpackPremultiplyAlpha),
4315 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004316}
4317
Jamie Madill007530e2017-12-28 14:27:04 -05004318void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004319{
Jamie Madillbc918e72018-03-08 09:47:21 -05004320 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004321
4322 gl::Texture *sourceTexture = getTexture(sourceId);
4323 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004324 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004325}
4326
Corentin Wallez336129f2017-10-17 15:55:40 -04004327void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004328{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004329 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004330 ASSERT(buffer);
4331
Geoff Lang496c02d2016-10-20 11:38:11 -07004332 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004333}
4334
Brandon Jones59770802018-04-02 13:18:42 -07004335void Context::getBufferPointervRobust(BufferBinding target,
4336 GLenum pname,
4337 GLsizei bufSize,
4338 GLsizei *length,
4339 void **params)
4340{
4341 getBufferPointerv(target, pname, params);
4342}
4343
Corentin Wallez336129f2017-10-17 15:55:40 -04004344void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004345{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004346 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004347 ASSERT(buffer);
4348
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004349 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004350 if (error.isError())
4351 {
Jamie Madill437fa652016-05-03 15:13:24 -04004352 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004353 return nullptr;
4354 }
4355
4356 return buffer->getMapPointer();
4357}
4358
Corentin Wallez336129f2017-10-17 15:55:40 -04004359GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004360{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004361 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004362 ASSERT(buffer);
4363
4364 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004365 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004366 if (error.isError())
4367 {
Jamie Madill437fa652016-05-03 15:13:24 -04004368 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004369 return GL_FALSE;
4370 }
4371
4372 return result;
4373}
4374
Corentin Wallez336129f2017-10-17 15:55:40 -04004375void *Context::mapBufferRange(BufferBinding target,
4376 GLintptr offset,
4377 GLsizeiptr length,
4378 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004379{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004380 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004381 ASSERT(buffer);
4382
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004383 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004384 if (error.isError())
4385 {
Jamie Madill437fa652016-05-03 15:13:24 -04004386 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004387 return nullptr;
4388 }
4389
4390 return buffer->getMapPointer();
4391}
4392
Corentin Wallez336129f2017-10-17 15:55:40 -04004393void Context::flushMappedBufferRange(BufferBinding /*target*/,
4394 GLintptr /*offset*/,
4395 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004396{
4397 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4398}
4399
Jamie Madillbc918e72018-03-08 09:47:21 -05004400Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004401{
Geoff Langa8cb2872018-03-09 16:09:40 -05004402 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004403}
4404
Jamie Madillbc918e72018-03-08 09:47:21 -05004405Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004406{
Geoff Langa8cb2872018-03-09 16:09:40 -05004407 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004408}
4409
Jamie Madillbc918e72018-03-08 09:47:21 -05004410Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004411{
Geoff Langa8cb2872018-03-09 16:09:40 -05004412 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004413}
4414
Geoff Lang9bf86f02018-07-26 11:46:34 -04004415Error Context::syncStateForPathOperation()
4416{
4417 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4418
4419 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4420 ANGLE_TRY(syncDirtyBits());
4421
4422 return NoError();
4423}
4424
Jiajia Qin5451d532017-11-16 17:16:34 +08004425void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4426{
4427 UNIMPLEMENTED();
4428}
4429
Jamie Madillc20ab272016-06-09 07:20:46 -07004430void Context::activeTexture(GLenum texture)
4431{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004432 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004433}
4434
Jamie Madill876429b2017-04-20 15:46:24 -04004435void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004436{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004437 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004438}
4439
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004440void Context::blendEquation(GLenum mode)
4441{
4442 mGLState.setBlendEquation(mode, mode);
4443}
4444
Jamie Madillc20ab272016-06-09 07:20:46 -07004445void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4446{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004447 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004448}
4449
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004450void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4451{
4452 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4453}
4454
Jamie Madillc20ab272016-06-09 07:20:46 -07004455void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4456{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004457 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004458}
4459
Jamie Madill876429b2017-04-20 15:46:24 -04004460void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004461{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004462 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004463}
4464
Jamie Madill876429b2017-04-20 15:46:24 -04004465void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004466{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004467 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07004468}
4469
4470void Context::clearStencil(GLint s)
4471{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004472 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004473}
4474
4475void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4476{
Geoff Lang92019432017-11-20 13:09:34 -05004477 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4478 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004479}
4480
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004481void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004482{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004483 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004484}
4485
4486void Context::depthFunc(GLenum func)
4487{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004488 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004489}
4490
4491void Context::depthMask(GLboolean flag)
4492{
Geoff Lang92019432017-11-20 13:09:34 -05004493 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004494}
4495
Jamie Madill876429b2017-04-20 15:46:24 -04004496void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004497{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004498 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07004499}
4500
4501void Context::disable(GLenum cap)
4502{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004503 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004504 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004505}
4506
4507void Context::disableVertexAttribArray(GLuint index)
4508{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004509 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004510 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004511}
4512
4513void Context::enable(GLenum cap)
4514{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004515 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004516 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004517}
4518
4519void Context::enableVertexAttribArray(GLuint index)
4520{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004521 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004522 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004523}
4524
4525void Context::frontFace(GLenum mode)
4526{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004527 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004528}
4529
4530void Context::hint(GLenum target, GLenum mode)
4531{
4532 switch (target)
4533 {
4534 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004535 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004536 break;
4537
4538 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004539 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004540 break;
4541
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004542 case GL_PERSPECTIVE_CORRECTION_HINT:
4543 case GL_POINT_SMOOTH_HINT:
4544 case GL_LINE_SMOOTH_HINT:
4545 case GL_FOG_HINT:
4546 mGLState.gles1().setHint(target, mode);
4547 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004548 default:
4549 UNREACHABLE();
4550 return;
4551 }
4552}
4553
4554void Context::lineWidth(GLfloat width)
4555{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004556 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004557}
4558
4559void Context::pixelStorei(GLenum pname, GLint param)
4560{
4561 switch (pname)
4562 {
4563 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004564 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004565 break;
4566
4567 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004568 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004569 break;
4570
4571 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004572 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004573 break;
4574
4575 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004576 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004577 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004578 break;
4579
4580 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004581 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004582 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004583 break;
4584
4585 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004586 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004587 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004588 break;
4589
4590 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004591 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004592 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004593 break;
4594
4595 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004596 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004597 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004598 break;
4599
4600 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004601 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004602 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004603 break;
4604
4605 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004606 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004607 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004608 break;
4609
4610 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004611 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004612 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004613 break;
4614
4615 default:
4616 UNREACHABLE();
4617 return;
4618 }
4619}
4620
4621void Context::polygonOffset(GLfloat factor, GLfloat units)
4622{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004623 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004624}
4625
Jamie Madill876429b2017-04-20 15:46:24 -04004626void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004627{
Geoff Lang92019432017-11-20 13:09:34 -05004628 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004629}
4630
Jiawei Shaodb342272017-09-27 10:21:45 +08004631void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4632{
4633 mGLState.setSampleMaskParams(maskNumber, mask);
4634}
4635
Jamie Madillc20ab272016-06-09 07:20:46 -07004636void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4637{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004638 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004639}
4640
4641void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4642{
4643 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4644 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004645 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004646 }
4647
4648 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4649 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004650 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004651 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004652
4653 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004654}
4655
4656void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4657{
4658 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4659 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004660 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004661 }
4662
4663 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4664 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004665 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004666 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004667
4668 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004669}
4670
4671void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4672{
4673 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4674 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004675 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004676 }
4677
4678 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4679 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004680 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004681 }
4682}
4683
4684void Context::vertexAttrib1f(GLuint index, GLfloat x)
4685{
4686 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004687 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004688 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004689}
4690
4691void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4692{
4693 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004694 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004695 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004696}
4697
4698void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4699{
4700 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004701 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004702 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004703}
4704
4705void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4706{
4707 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004708 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004709 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004710}
4711
4712void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4713{
4714 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004715 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004716 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004717}
4718
4719void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4720{
4721 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004722 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004723 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004724}
4725
4726void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4727{
4728 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004729 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004730 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004731}
4732
4733void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4734{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004735 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004736 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004737}
4738
4739void Context::vertexAttribPointer(GLuint index,
4740 GLint size,
4741 GLenum type,
4742 GLboolean normalized,
4743 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004744 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004745{
Corentin Wallez336129f2017-10-17 15:55:40 -04004746 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004747 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004748 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004749}
4750
Shao80957d92017-02-20 21:25:59 +08004751void Context::vertexAttribFormat(GLuint attribIndex,
4752 GLint size,
4753 GLenum type,
4754 GLboolean normalized,
4755 GLuint relativeOffset)
4756{
Geoff Lang92019432017-11-20 13:09:34 -05004757 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004758 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004759 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004760}
4761
4762void Context::vertexAttribIFormat(GLuint attribIndex,
4763 GLint size,
4764 GLenum type,
4765 GLuint relativeOffset)
4766{
4767 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004768 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004769}
4770
4771void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4772{
Shaodde78e82017-05-22 14:13:27 +08004773 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004774 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004775}
4776
Jiajia Qin5451d532017-11-16 17:16:34 +08004777void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004778{
4779 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004780 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004781}
4782
Jamie Madillc20ab272016-06-09 07:20:46 -07004783void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4784{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004785 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004786}
4787
4788void Context::vertexAttribIPointer(GLuint index,
4789 GLint size,
4790 GLenum type,
4791 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004792 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004793{
Corentin Wallez336129f2017-10-17 15:55:40 -04004794 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4795 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004796 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004797}
4798
4799void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4800{
4801 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004802 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004803 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004804}
4805
4806void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4807{
4808 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004809 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004810 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004811}
4812
4813void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4814{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004815 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004816 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004817}
4818
4819void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4820{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004821 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004822 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004823}
4824
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004825void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4826{
4827 const VertexAttribCurrentValueData &currentValues =
4828 getGLState().getVertexAttribCurrentValue(index);
4829 const VertexArray *vao = getGLState().getVertexArray();
4830 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4831 currentValues, pname, params);
4832}
4833
Brandon Jones59770802018-04-02 13:18:42 -07004834void Context::getVertexAttribivRobust(GLuint index,
4835 GLenum pname,
4836 GLsizei bufSize,
4837 GLsizei *length,
4838 GLint *params)
4839{
4840 getVertexAttribiv(index, pname, params);
4841}
4842
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004843void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4844{
4845 const VertexAttribCurrentValueData &currentValues =
4846 getGLState().getVertexAttribCurrentValue(index);
4847 const VertexArray *vao = getGLState().getVertexArray();
4848 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4849 currentValues, pname, params);
4850}
4851
Brandon Jones59770802018-04-02 13:18:42 -07004852void Context::getVertexAttribfvRobust(GLuint index,
4853 GLenum pname,
4854 GLsizei bufSize,
4855 GLsizei *length,
4856 GLfloat *params)
4857{
4858 getVertexAttribfv(index, pname, params);
4859}
4860
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004861void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4862{
4863 const VertexAttribCurrentValueData &currentValues =
4864 getGLState().getVertexAttribCurrentValue(index);
4865 const VertexArray *vao = getGLState().getVertexArray();
4866 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4867 currentValues, pname, params);
4868}
4869
Brandon Jones59770802018-04-02 13:18:42 -07004870void Context::getVertexAttribIivRobust(GLuint index,
4871 GLenum pname,
4872 GLsizei bufSize,
4873 GLsizei *length,
4874 GLint *params)
4875{
4876 getVertexAttribIiv(index, pname, params);
4877}
4878
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004879void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4880{
4881 const VertexAttribCurrentValueData &currentValues =
4882 getGLState().getVertexAttribCurrentValue(index);
4883 const VertexArray *vao = getGLState().getVertexArray();
4884 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4885 currentValues, pname, params);
4886}
4887
Brandon Jones59770802018-04-02 13:18:42 -07004888void Context::getVertexAttribIuivRobust(GLuint index,
4889 GLenum pname,
4890 GLsizei bufSize,
4891 GLsizei *length,
4892 GLuint *params)
4893{
4894 getVertexAttribIuiv(index, pname, params);
4895}
4896
Jamie Madill876429b2017-04-20 15:46:24 -04004897void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004898{
4899 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4900 QueryVertexAttribPointerv(attrib, pname, pointer);
4901}
4902
Brandon Jones59770802018-04-02 13:18:42 -07004903void Context::getVertexAttribPointervRobust(GLuint index,
4904 GLenum pname,
4905 GLsizei bufSize,
4906 GLsizei *length,
4907 void **pointer)
4908{
4909 getVertexAttribPointerv(index, pname, pointer);
4910}
4911
Jamie Madillc20ab272016-06-09 07:20:46 -07004912void Context::debugMessageControl(GLenum source,
4913 GLenum type,
4914 GLenum severity,
4915 GLsizei count,
4916 const GLuint *ids,
4917 GLboolean enabled)
4918{
4919 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004920 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05004921 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07004922}
4923
4924void Context::debugMessageInsert(GLenum source,
4925 GLenum type,
4926 GLuint id,
4927 GLenum severity,
4928 GLsizei length,
4929 const GLchar *buf)
4930{
4931 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004932 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07004933}
4934
4935void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
4936{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004937 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07004938}
4939
4940GLuint Context::getDebugMessageLog(GLuint count,
4941 GLsizei bufSize,
4942 GLenum *sources,
4943 GLenum *types,
4944 GLuint *ids,
4945 GLenum *severities,
4946 GLsizei *lengths,
4947 GLchar *messageLog)
4948{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004949 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
4950 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07004951}
4952
4953void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
4954{
4955 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004956 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05004957 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07004958}
4959
4960void Context::popDebugGroup()
4961{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004962 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05004963 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07004964}
4965
Corentin Wallez336129f2017-10-17 15:55:40 -04004966void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04004967{
4968 Buffer *buffer = mGLState.getTargetBuffer(target);
4969 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004970 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04004971}
4972
Corentin Wallez336129f2017-10-17 15:55:40 -04004973void Context::bufferSubData(BufferBinding target,
4974 GLintptr offset,
4975 GLsizeiptr size,
4976 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04004977{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06004978 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04004979 {
4980 return;
4981 }
4982
4983 Buffer *buffer = mGLState.getTargetBuffer(target);
4984 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004985 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04004986}
4987
Jamie Madillef300b12016-10-07 15:12:09 -04004988void Context::attachShader(GLuint program, GLuint shader)
4989{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05004990 Program *programObject = mState.mShaderPrograms->getProgram(program);
4991 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04004992 ASSERT(programObject && shaderObject);
4993 programObject->attachShader(shaderObject);
4994}
4995
Kenneth Russellf2f6f652016-10-05 19:53:23 -07004996const Workarounds &Context::getWorkarounds() const
4997{
4998 return mWorkarounds;
4999}
5000
Corentin Wallez336129f2017-10-17 15:55:40 -04005001void Context::copyBufferSubData(BufferBinding readTarget,
5002 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005003 GLintptr readOffset,
5004 GLintptr writeOffset,
5005 GLsizeiptr size)
5006{
5007 // if size is zero, the copy is a successful no-op
5008 if (size == 0)
5009 {
5010 return;
5011 }
5012
5013 // TODO(jmadill): cache these.
5014 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5015 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5016
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005017 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005018}
5019
Jamie Madill01a80ee2016-11-07 12:06:18 -05005020void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5021{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005022 // Ideally we could share the program query with the validation layer if possible.
5023 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005024 ASSERT(programObject);
5025 programObject->bindAttributeLocation(index, name);
5026}
5027
Corentin Wallez336129f2017-10-17 15:55:40 -04005028void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005029{
Corentin Wallez336129f2017-10-17 15:55:40 -04005030 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5031 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005032 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005033}
5034
Corentin Wallez336129f2017-10-17 15:55:40 -04005035void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005036{
5037 bindBufferRange(target, index, buffer, 0, 0);
5038}
5039
Corentin Wallez336129f2017-10-17 15:55:40 -04005040void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005041 GLuint index,
5042 GLuint buffer,
5043 GLintptr offset,
5044 GLsizeiptr size)
5045{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005046 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5047 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5048 if (target == BufferBinding::Uniform)
5049 {
5050 mUniformBufferObserverBindings[index].bind(object ? object->getImplementation() : nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04005051 mStateCache.onUniformBufferStateChange(this);
5052 }
5053 else
5054 {
5055 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005056 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005057}
5058
Jamie Madill01a80ee2016-11-07 12:06:18 -05005059void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5060{
5061 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5062 {
5063 bindReadFramebuffer(framebuffer);
5064 }
5065
5066 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5067 {
5068 bindDrawFramebuffer(framebuffer);
5069 }
5070}
5071
5072void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5073{
5074 ASSERT(target == GL_RENDERBUFFER);
5075 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005076 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005077 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005078}
5079
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005080void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005081 GLsizei samples,
5082 GLenum internalformat,
5083 GLsizei width,
5084 GLsizei height,
5085 GLboolean fixedsamplelocations)
5086{
5087 Extents size(width, height, 1);
5088 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005089 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5090 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005091}
5092
Olli Etuaho89664842018-08-24 14:45:36 +03005093void Context::texStorage3DMultisample(TextureType target,
5094 GLsizei samples,
5095 GLenum internalformat,
5096 GLsizei width,
5097 GLsizei height,
5098 GLsizei depth,
5099 GLboolean fixedsamplelocations)
5100{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005101 Extents size(width, height, depth);
5102 Texture *texture = getTargetTexture(target);
5103 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5104 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005105}
5106
JiangYizhoubddc46b2016-12-09 09:50:51 +08005107void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5108{
JiangYizhou5b03f472017-01-09 10:22:53 +08005109 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5110 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005111 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005112 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005113
5114 switch (pname)
5115 {
5116 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005117 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005118 break;
5119 default:
5120 UNREACHABLE();
5121 }
5122}
5123
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005124void Context::getMultisamplefvRobust(GLenum pname,
5125 GLuint index,
5126 GLsizei bufSize,
5127 GLsizei *length,
5128 GLfloat *val)
5129{
5130 UNIMPLEMENTED();
5131}
5132
Jamie Madille8fb6402017-02-14 17:56:40 -05005133void Context::renderbufferStorage(GLenum target,
5134 GLenum internalformat,
5135 GLsizei width,
5136 GLsizei height)
5137{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005138 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5139 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5140
Jamie Madille8fb6402017-02-14 17:56:40 -05005141 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005142 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005143}
5144
5145void Context::renderbufferStorageMultisample(GLenum target,
5146 GLsizei samples,
5147 GLenum internalformat,
5148 GLsizei width,
5149 GLsizei height)
5150{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005151 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5152 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005153
5154 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005155 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005156 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005157}
5158
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005159void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5160{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005161 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005162 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005163}
5164
JiangYizhoue18e6392017-02-20 10:32:23 +08005165void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5166{
5167 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5168 QueryFramebufferParameteriv(framebuffer, pname, params);
5169}
5170
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005171void Context::getFramebufferParameterivRobust(GLenum target,
5172 GLenum pname,
5173 GLsizei bufSize,
5174 GLsizei *length,
5175 GLint *params)
5176{
5177 UNIMPLEMENTED();
5178}
5179
Jiajia Qin5451d532017-11-16 17:16:34 +08005180void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005181{
5182 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005183 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005184}
5185
Jamie Madilldec86232018-07-11 09:01:18 -04005186bool Context::getScratchBuffer(size_t requstedSizeBytes,
5187 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005188{
Jamie Madilldec86232018-07-11 09:01:18 -04005189 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005190}
5191
Jamie Madilldec86232018-07-11 09:01:18 -04005192bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5193 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005194{
Jamie Madilldec86232018-07-11 09:01:18 -04005195 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005196}
5197
Xinghua Cao10a4d432017-11-28 14:46:26 +08005198Error Context::prepareForDispatch()
5199{
Geoff Langa8cb2872018-03-09 16:09:40 -05005200 ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005201
5202 if (isRobustResourceInitEnabled())
5203 {
5204 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5205 }
5206
5207 return NoError();
5208}
5209
Xinghua Cao2b396592017-03-29 15:36:04 +08005210void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5211{
5212 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5213 {
5214 return;
5215 }
5216
Xinghua Cao10a4d432017-11-28 14:46:26 +08005217 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005218 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005219}
5220
Jiajia Qin5451d532017-11-16 17:16:34 +08005221void Context::dispatchComputeIndirect(GLintptr indirect)
5222{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005223 ANGLE_CONTEXT_TRY(prepareForDispatch());
5224 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005225}
5226
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005227void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005228 GLsizei levels,
5229 GLenum internalFormat,
5230 GLsizei width,
5231 GLsizei height)
5232{
5233 Extents size(width, height, 1);
5234 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005235 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005236}
5237
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005238void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005239 GLsizei levels,
5240 GLenum internalFormat,
5241 GLsizei width,
5242 GLsizei height,
5243 GLsizei depth)
5244{
5245 Extents size(width, height, depth);
5246 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005247 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005248}
5249
Jiajia Qin5451d532017-11-16 17:16:34 +08005250void Context::memoryBarrier(GLbitfield barriers)
5251{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005252 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005253}
5254
5255void Context::memoryBarrierByRegion(GLbitfield barriers)
5256{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005257 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005258}
5259
Jamie Madillc1d770e2017-04-13 17:31:24 -04005260GLenum Context::checkFramebufferStatus(GLenum target)
5261{
5262 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5263 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005264 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005265}
5266
5267void Context::compileShader(GLuint shader)
5268{
5269 Shader *shaderObject = GetValidShader(this, shader);
5270 if (!shaderObject)
5271 {
5272 return;
5273 }
5274 shaderObject->compile(this);
5275}
5276
5277void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5278{
5279 for (int i = 0; i < n; i++)
5280 {
5281 deleteBuffer(buffers[i]);
5282 }
5283}
5284
5285void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5286{
5287 for (int i = 0; i < n; i++)
5288 {
5289 if (framebuffers[i] != 0)
5290 {
5291 deleteFramebuffer(framebuffers[i]);
5292 }
5293 }
5294}
5295
5296void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5297{
5298 for (int i = 0; i < n; i++)
5299 {
5300 deleteRenderbuffer(renderbuffers[i]);
5301 }
5302}
5303
5304void Context::deleteTextures(GLsizei n, const GLuint *textures)
5305{
5306 for (int i = 0; i < n; i++)
5307 {
5308 if (textures[i] != 0)
5309 {
5310 deleteTexture(textures[i]);
5311 }
5312 }
5313}
5314
5315void Context::detachShader(GLuint program, GLuint shader)
5316{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005317 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005318 ASSERT(programObject);
5319
5320 Shader *shaderObject = getShader(shader);
5321 ASSERT(shaderObject);
5322
5323 programObject->detachShader(this, shaderObject);
5324}
5325
5326void Context::genBuffers(GLsizei n, GLuint *buffers)
5327{
5328 for (int i = 0; i < n; i++)
5329 {
5330 buffers[i] = createBuffer();
5331 }
5332}
5333
5334void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5335{
5336 for (int i = 0; i < n; i++)
5337 {
5338 framebuffers[i] = createFramebuffer();
5339 }
5340}
5341
5342void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5343{
5344 for (int i = 0; i < n; i++)
5345 {
5346 renderbuffers[i] = createRenderbuffer();
5347 }
5348}
5349
5350void Context::genTextures(GLsizei n, GLuint *textures)
5351{
5352 for (int i = 0; i < n; i++)
5353 {
5354 textures[i] = createTexture();
5355 }
5356}
5357
5358void Context::getActiveAttrib(GLuint program,
5359 GLuint index,
5360 GLsizei bufsize,
5361 GLsizei *length,
5362 GLint *size,
5363 GLenum *type,
5364 GLchar *name)
5365{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005366 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005367 ASSERT(programObject);
5368 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5369}
5370
5371void Context::getActiveUniform(GLuint program,
5372 GLuint index,
5373 GLsizei bufsize,
5374 GLsizei *length,
5375 GLint *size,
5376 GLenum *type,
5377 GLchar *name)
5378{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005379 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005380 ASSERT(programObject);
5381 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5382}
5383
5384void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5385{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005386 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005387 ASSERT(programObject);
5388 programObject->getAttachedShaders(maxcount, count, shaders);
5389}
5390
5391GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5392{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005393 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005394 ASSERT(programObject);
5395 return programObject->getAttributeLocation(name);
5396}
5397
5398void Context::getBooleanv(GLenum pname, GLboolean *params)
5399{
5400 GLenum nativeType;
5401 unsigned int numParams = 0;
5402 getQueryParameterInfo(pname, &nativeType, &numParams);
5403
5404 if (nativeType == GL_BOOL)
5405 {
5406 getBooleanvImpl(pname, params);
5407 }
5408 else
5409 {
5410 CastStateValues(this, nativeType, pname, numParams, params);
5411 }
5412}
5413
Brandon Jones59770802018-04-02 13:18:42 -07005414void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5415{
5416 getBooleanv(pname, params);
5417}
5418
Jamie Madillc1d770e2017-04-13 17:31:24 -04005419void Context::getFloatv(GLenum pname, GLfloat *params)
5420{
5421 GLenum nativeType;
5422 unsigned int numParams = 0;
5423 getQueryParameterInfo(pname, &nativeType, &numParams);
5424
5425 if (nativeType == GL_FLOAT)
5426 {
5427 getFloatvImpl(pname, params);
5428 }
5429 else
5430 {
5431 CastStateValues(this, nativeType, pname, numParams, params);
5432 }
5433}
5434
Brandon Jones59770802018-04-02 13:18:42 -07005435void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5436{
5437 getFloatv(pname, params);
5438}
5439
Jamie Madillc1d770e2017-04-13 17:31:24 -04005440void Context::getIntegerv(GLenum pname, GLint *params)
5441{
5442 GLenum nativeType;
5443 unsigned int numParams = 0;
5444 getQueryParameterInfo(pname, &nativeType, &numParams);
5445
5446 if (nativeType == GL_INT)
5447 {
5448 getIntegervImpl(pname, params);
5449 }
5450 else
5451 {
5452 CastStateValues(this, nativeType, pname, numParams, params);
5453 }
5454}
5455
Brandon Jones59770802018-04-02 13:18:42 -07005456void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5457{
5458 getIntegerv(pname, data);
5459}
5460
Jamie Madillc1d770e2017-04-13 17:31:24 -04005461void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5462{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005463 // Don't resolve link if checking the link completion status.
5464 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5465 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005466 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005467 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005468}
5469
Brandon Jones59770802018-04-02 13:18:42 -07005470void Context::getProgramivRobust(GLuint program,
5471 GLenum pname,
5472 GLsizei bufSize,
5473 GLsizei *length,
5474 GLint *params)
5475{
5476 getProgramiv(program, pname, params);
5477}
5478
Jiajia Qin5451d532017-11-16 17:16:34 +08005479void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5480{
5481 UNIMPLEMENTED();
5482}
5483
Jamie Madillbe849e42017-05-02 15:49:00 -04005484void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005485{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005486 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005487 ASSERT(programObject);
5488 programObject->getInfoLog(bufsize, length, infolog);
5489}
5490
Jiajia Qin5451d532017-11-16 17:16:34 +08005491void Context::getProgramPipelineInfoLog(GLuint pipeline,
5492 GLsizei bufSize,
5493 GLsizei *length,
5494 GLchar *infoLog)
5495{
5496 UNIMPLEMENTED();
5497}
5498
Jamie Madillc1d770e2017-04-13 17:31:24 -04005499void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5500{
5501 Shader *shaderObject = getShader(shader);
5502 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005503 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005504}
5505
Brandon Jones59770802018-04-02 13:18:42 -07005506void Context::getShaderivRobust(GLuint shader,
5507 GLenum pname,
5508 GLsizei bufSize,
5509 GLsizei *length,
5510 GLint *params)
5511{
5512 getShaderiv(shader, pname, params);
5513}
5514
Jamie Madillc1d770e2017-04-13 17:31:24 -04005515void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5516{
5517 Shader *shaderObject = getShader(shader);
5518 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005519 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005520}
5521
5522void Context::getShaderPrecisionFormat(GLenum shadertype,
5523 GLenum precisiontype,
5524 GLint *range,
5525 GLint *precision)
5526{
5527 // TODO(jmadill): Compute shaders.
5528
5529 switch (shadertype)
5530 {
5531 case GL_VERTEX_SHADER:
5532 switch (precisiontype)
5533 {
5534 case GL_LOW_FLOAT:
5535 mCaps.vertexLowpFloat.get(range, precision);
5536 break;
5537 case GL_MEDIUM_FLOAT:
5538 mCaps.vertexMediumpFloat.get(range, precision);
5539 break;
5540 case GL_HIGH_FLOAT:
5541 mCaps.vertexHighpFloat.get(range, precision);
5542 break;
5543
5544 case GL_LOW_INT:
5545 mCaps.vertexLowpInt.get(range, precision);
5546 break;
5547 case GL_MEDIUM_INT:
5548 mCaps.vertexMediumpInt.get(range, precision);
5549 break;
5550 case GL_HIGH_INT:
5551 mCaps.vertexHighpInt.get(range, precision);
5552 break;
5553
5554 default:
5555 UNREACHABLE();
5556 return;
5557 }
5558 break;
5559
5560 case GL_FRAGMENT_SHADER:
5561 switch (precisiontype)
5562 {
5563 case GL_LOW_FLOAT:
5564 mCaps.fragmentLowpFloat.get(range, precision);
5565 break;
5566 case GL_MEDIUM_FLOAT:
5567 mCaps.fragmentMediumpFloat.get(range, precision);
5568 break;
5569 case GL_HIGH_FLOAT:
5570 mCaps.fragmentHighpFloat.get(range, precision);
5571 break;
5572
5573 case GL_LOW_INT:
5574 mCaps.fragmentLowpInt.get(range, precision);
5575 break;
5576 case GL_MEDIUM_INT:
5577 mCaps.fragmentMediumpInt.get(range, precision);
5578 break;
5579 case GL_HIGH_INT:
5580 mCaps.fragmentHighpInt.get(range, precision);
5581 break;
5582
5583 default:
5584 UNREACHABLE();
5585 return;
5586 }
5587 break;
5588
5589 default:
5590 UNREACHABLE();
5591 return;
5592 }
5593}
5594
5595void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5596{
5597 Shader *shaderObject = getShader(shader);
5598 ASSERT(shaderObject);
5599 shaderObject->getSource(bufsize, length, source);
5600}
5601
5602void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5603{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005604 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005605 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005606 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005607}
5608
Brandon Jones59770802018-04-02 13:18:42 -07005609void Context::getUniformfvRobust(GLuint program,
5610 GLint location,
5611 GLsizei bufSize,
5612 GLsizei *length,
5613 GLfloat *params)
5614{
5615 getUniformfv(program, location, params);
5616}
5617
Jamie Madillc1d770e2017-04-13 17:31:24 -04005618void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5619{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005620 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005621 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005622 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005623}
5624
Brandon Jones59770802018-04-02 13:18:42 -07005625void Context::getUniformivRobust(GLuint program,
5626 GLint location,
5627 GLsizei bufSize,
5628 GLsizei *length,
5629 GLint *params)
5630{
5631 getUniformiv(program, location, params);
5632}
5633
Jamie Madillc1d770e2017-04-13 17:31:24 -04005634GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5635{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005636 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005637 ASSERT(programObject);
5638 return programObject->getUniformLocation(name);
5639}
5640
5641GLboolean Context::isBuffer(GLuint buffer)
5642{
5643 if (buffer == 0)
5644 {
5645 return GL_FALSE;
5646 }
5647
5648 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5649}
5650
5651GLboolean Context::isEnabled(GLenum cap)
5652{
5653 return mGLState.getEnableFeature(cap);
5654}
5655
5656GLboolean Context::isFramebuffer(GLuint framebuffer)
5657{
5658 if (framebuffer == 0)
5659 {
5660 return GL_FALSE;
5661 }
5662
5663 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5664}
5665
5666GLboolean Context::isProgram(GLuint program)
5667{
5668 if (program == 0)
5669 {
5670 return GL_FALSE;
5671 }
5672
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005673 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005674}
5675
5676GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5677{
5678 if (renderbuffer == 0)
5679 {
5680 return GL_FALSE;
5681 }
5682
5683 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5684}
5685
5686GLboolean Context::isShader(GLuint shader)
5687{
5688 if (shader == 0)
5689 {
5690 return GL_FALSE;
5691 }
5692
5693 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5694}
5695
5696GLboolean Context::isTexture(GLuint texture)
5697{
5698 if (texture == 0)
5699 {
5700 return GL_FALSE;
5701 }
5702
5703 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5704}
5705
5706void Context::linkProgram(GLuint program)
5707{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005708 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005709 ASSERT(programObject);
5710 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08005711
5712 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
5713 // don't need to worry that:
5714 // 1. Draw calls after link use the new executable code or the old one depending on the link
5715 // result.
5716 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
5717 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
5718 // ProgramD3D.
5719 if (programObject->isInUse())
5720 {
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005721 programObject->resolveLink();
Jamie Madilldf836ff2018-10-01 10:36:24 -04005722 if (programObject->isLinked())
5723 {
5724 mGLState.onProgramExecutableChange(programObject);
5725 }
5726
jchen107ae70d82018-07-06 13:47:01 +08005727 mStateCache.onProgramExecutableChange(this);
5728 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005729}
5730
5731void Context::releaseShaderCompiler()
5732{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005733 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005734}
5735
5736void Context::shaderBinary(GLsizei n,
5737 const GLuint *shaders,
5738 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005739 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005740 GLsizei length)
5741{
5742 // No binary shader formats are supported.
5743 UNIMPLEMENTED();
5744}
5745
5746void Context::shaderSource(GLuint shader,
5747 GLsizei count,
5748 const GLchar *const *string,
5749 const GLint *length)
5750{
5751 Shader *shaderObject = getShader(shader);
5752 ASSERT(shaderObject);
5753 shaderObject->setSource(count, string, length);
5754}
5755
5756void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5757{
5758 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5759}
5760
5761void Context::stencilMask(GLuint mask)
5762{
5763 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5764}
5765
5766void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5767{
5768 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5769}
5770
5771void Context::uniform1f(GLint location, GLfloat x)
5772{
5773 Program *program = mGLState.getProgram();
5774 program->setUniform1fv(location, 1, &x);
5775}
5776
5777void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5778{
5779 Program *program = mGLState.getProgram();
5780 program->setUniform1fv(location, count, v);
5781}
5782
Jamie Madill7e4eff12018-08-08 15:49:26 -04005783void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005784{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005785 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04005786 {
5787 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04005788 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04005789 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005790}
5791
Jamie Madill7e4eff12018-08-08 15:49:26 -04005792void Context::uniform1i(GLint location, GLint x)
5793{
5794 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
5795}
5796
Jamie Madillc1d770e2017-04-13 17:31:24 -04005797void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5798{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005799 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005800}
5801
5802void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5803{
5804 GLfloat xy[2] = {x, y};
5805 Program *program = mGLState.getProgram();
5806 program->setUniform2fv(location, 1, xy);
5807}
5808
5809void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5810{
5811 Program *program = mGLState.getProgram();
5812 program->setUniform2fv(location, count, v);
5813}
5814
5815void Context::uniform2i(GLint location, GLint x, GLint y)
5816{
5817 GLint xy[2] = {x, y};
5818 Program *program = mGLState.getProgram();
5819 program->setUniform2iv(location, 1, xy);
5820}
5821
5822void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
5823{
5824 Program *program = mGLState.getProgram();
5825 program->setUniform2iv(location, count, v);
5826}
5827
5828void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5829{
5830 GLfloat xyz[3] = {x, y, z};
5831 Program *program = mGLState.getProgram();
5832 program->setUniform3fv(location, 1, xyz);
5833}
5834
5835void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
5836{
5837 Program *program = mGLState.getProgram();
5838 program->setUniform3fv(location, count, v);
5839}
5840
5841void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
5842{
5843 GLint xyz[3] = {x, y, z};
5844 Program *program = mGLState.getProgram();
5845 program->setUniform3iv(location, 1, xyz);
5846}
5847
5848void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
5849{
5850 Program *program = mGLState.getProgram();
5851 program->setUniform3iv(location, count, v);
5852}
5853
5854void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5855{
5856 GLfloat xyzw[4] = {x, y, z, w};
5857 Program *program = mGLState.getProgram();
5858 program->setUniform4fv(location, 1, xyzw);
5859}
5860
5861void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
5862{
5863 Program *program = mGLState.getProgram();
5864 program->setUniform4fv(location, count, v);
5865}
5866
5867void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5868{
5869 GLint xyzw[4] = {x, y, z, w};
5870 Program *program = mGLState.getProgram();
5871 program->setUniform4iv(location, 1, xyzw);
5872}
5873
5874void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
5875{
5876 Program *program = mGLState.getProgram();
5877 program->setUniform4iv(location, count, v);
5878}
5879
5880void Context::uniformMatrix2fv(GLint location,
5881 GLsizei count,
5882 GLboolean transpose,
5883 const GLfloat *value)
5884{
5885 Program *program = mGLState.getProgram();
5886 program->setUniformMatrix2fv(location, count, transpose, value);
5887}
5888
5889void Context::uniformMatrix3fv(GLint location,
5890 GLsizei count,
5891 GLboolean transpose,
5892 const GLfloat *value)
5893{
5894 Program *program = mGLState.getProgram();
5895 program->setUniformMatrix3fv(location, count, transpose, value);
5896}
5897
5898void Context::uniformMatrix4fv(GLint location,
5899 GLsizei count,
5900 GLboolean transpose,
5901 const GLfloat *value)
5902{
5903 Program *program = mGLState.getProgram();
5904 program->setUniformMatrix4fv(location, count, transpose, value);
5905}
5906
5907void Context::validateProgram(GLuint program)
5908{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005909 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005910 ASSERT(programObject);
5911 programObject->validate(mCaps);
5912}
5913
Jiajia Qin5451d532017-11-16 17:16:34 +08005914void Context::validateProgramPipeline(GLuint pipeline)
5915{
5916 UNIMPLEMENTED();
5917}
5918
Jamie Madilld04908b2017-06-09 14:15:35 -04005919void Context::getProgramBinary(GLuint program,
5920 GLsizei bufSize,
5921 GLsizei *length,
5922 GLenum *binaryFormat,
5923 void *binary)
5924{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005925 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04005926 ASSERT(programObject != nullptr);
5927
5928 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
5929}
5930
5931void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
5932{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005933 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04005934 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04005935
Jamie Madilld04908b2017-06-09 14:15:35 -04005936 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04005937 if (programObject->isInUse())
5938 {
Jamie Madilldf836ff2018-10-01 10:36:24 -04005939 mGLState.onProgramExecutableChange(programObject);
5940 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04005941 }
Jamie Madilld04908b2017-06-09 14:15:35 -04005942}
5943
Jamie Madillff325f12017-08-26 15:06:05 -04005944void Context::uniform1ui(GLint location, GLuint v0)
5945{
5946 Program *program = mGLState.getProgram();
5947 program->setUniform1uiv(location, 1, &v0);
5948}
5949
5950void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
5951{
5952 Program *program = mGLState.getProgram();
5953 const GLuint xy[] = {v0, v1};
5954 program->setUniform2uiv(location, 1, xy);
5955}
5956
5957void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
5958{
5959 Program *program = mGLState.getProgram();
5960 const GLuint xyz[] = {v0, v1, v2};
5961 program->setUniform3uiv(location, 1, xyz);
5962}
5963
5964void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
5965{
5966 Program *program = mGLState.getProgram();
5967 const GLuint xyzw[] = {v0, v1, v2, v3};
5968 program->setUniform4uiv(location, 1, xyzw);
5969}
5970
5971void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
5972{
5973 Program *program = mGLState.getProgram();
5974 program->setUniform1uiv(location, count, value);
5975}
5976void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
5977{
5978 Program *program = mGLState.getProgram();
5979 program->setUniform2uiv(location, count, value);
5980}
5981
5982void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
5983{
5984 Program *program = mGLState.getProgram();
5985 program->setUniform3uiv(location, count, value);
5986}
5987
5988void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
5989{
5990 Program *program = mGLState.getProgram();
5991 program->setUniform4uiv(location, count, value);
5992}
5993
Jamie Madillf0e04492017-08-26 15:28:42 -04005994void Context::genQueries(GLsizei n, GLuint *ids)
5995{
5996 for (GLsizei i = 0; i < n; i++)
5997 {
5998 GLuint handle = mQueryHandleAllocator.allocate();
5999 mQueryMap.assign(handle, nullptr);
6000 ids[i] = handle;
6001 }
6002}
6003
6004void Context::deleteQueries(GLsizei n, const GLuint *ids)
6005{
6006 for (int i = 0; i < n; i++)
6007 {
6008 GLuint query = ids[i];
6009
6010 Query *queryObject = nullptr;
6011 if (mQueryMap.erase(query, &queryObject))
6012 {
6013 mQueryHandleAllocator.release(query);
6014 if (queryObject)
6015 {
6016 queryObject->release(this);
6017 }
6018 }
6019 }
6020}
6021
6022GLboolean Context::isQuery(GLuint id)
6023{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006024 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006025}
6026
Jamie Madillc8c95812017-08-26 18:40:09 -04006027void Context::uniformMatrix2x3fv(GLint location,
6028 GLsizei count,
6029 GLboolean transpose,
6030 const GLfloat *value)
6031{
6032 Program *program = mGLState.getProgram();
6033 program->setUniformMatrix2x3fv(location, count, transpose, value);
6034}
6035
6036void Context::uniformMatrix3x2fv(GLint location,
6037 GLsizei count,
6038 GLboolean transpose,
6039 const GLfloat *value)
6040{
6041 Program *program = mGLState.getProgram();
6042 program->setUniformMatrix3x2fv(location, count, transpose, value);
6043}
6044
6045void Context::uniformMatrix2x4fv(GLint location,
6046 GLsizei count,
6047 GLboolean transpose,
6048 const GLfloat *value)
6049{
6050 Program *program = mGLState.getProgram();
6051 program->setUniformMatrix2x4fv(location, count, transpose, value);
6052}
6053
6054void Context::uniformMatrix4x2fv(GLint location,
6055 GLsizei count,
6056 GLboolean transpose,
6057 const GLfloat *value)
6058{
6059 Program *program = mGLState.getProgram();
6060 program->setUniformMatrix4x2fv(location, count, transpose, value);
6061}
6062
6063void Context::uniformMatrix3x4fv(GLint location,
6064 GLsizei count,
6065 GLboolean transpose,
6066 const GLfloat *value)
6067{
6068 Program *program = mGLState.getProgram();
6069 program->setUniformMatrix3x4fv(location, count, transpose, value);
6070}
6071
6072void Context::uniformMatrix4x3fv(GLint location,
6073 GLsizei count,
6074 GLboolean transpose,
6075 const GLfloat *value)
6076{
6077 Program *program = mGLState.getProgram();
6078 program->setUniformMatrix4x3fv(location, count, transpose, value);
6079}
6080
Jamie Madilld7576732017-08-26 18:49:50 -04006081void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6082{
6083 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6084 {
6085 GLuint vertexArray = arrays[arrayIndex];
6086
6087 if (arrays[arrayIndex] != 0)
6088 {
6089 VertexArray *vertexArrayObject = nullptr;
6090 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6091 {
6092 if (vertexArrayObject != nullptr)
6093 {
6094 detachVertexArray(vertexArray);
6095 vertexArrayObject->onDestroy(this);
6096 }
6097
6098 mVertexArrayHandleAllocator.release(vertexArray);
6099 }
6100 }
6101 }
6102}
6103
6104void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6105{
6106 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6107 {
6108 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6109 mVertexArrayMap.assign(vertexArray, nullptr);
6110 arrays[arrayIndex] = vertexArray;
6111 }
6112}
6113
6114bool Context::isVertexArray(GLuint array)
6115{
6116 if (array == 0)
6117 {
6118 return GL_FALSE;
6119 }
6120
6121 VertexArray *vao = getVertexArray(array);
6122 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6123}
6124
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006125void Context::endTransformFeedback()
6126{
6127 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6128 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006129 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006130}
6131
6132void Context::transformFeedbackVaryings(GLuint program,
6133 GLsizei count,
6134 const GLchar *const *varyings,
6135 GLenum bufferMode)
6136{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006137 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006138 ASSERT(programObject);
6139 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6140}
6141
6142void Context::getTransformFeedbackVarying(GLuint program,
6143 GLuint index,
6144 GLsizei bufSize,
6145 GLsizei *length,
6146 GLsizei *size,
6147 GLenum *type,
6148 GLchar *name)
6149{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006150 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006151 ASSERT(programObject);
6152 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6153}
6154
6155void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6156{
6157 for (int i = 0; i < n; i++)
6158 {
6159 GLuint transformFeedback = ids[i];
6160 if (transformFeedback == 0)
6161 {
6162 continue;
6163 }
6164
6165 TransformFeedback *transformFeedbackObject = nullptr;
6166 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6167 {
6168 if (transformFeedbackObject != nullptr)
6169 {
6170 detachTransformFeedback(transformFeedback);
6171 transformFeedbackObject->release(this);
6172 }
6173
6174 mTransformFeedbackHandleAllocator.release(transformFeedback);
6175 }
6176 }
6177}
6178
6179void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6180{
6181 for (int i = 0; i < n; i++)
6182 {
6183 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6184 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6185 ids[i] = transformFeedback;
6186 }
6187}
6188
6189bool Context::isTransformFeedback(GLuint id)
6190{
6191 if (id == 0)
6192 {
6193 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6194 // returns FALSE
6195 return GL_FALSE;
6196 }
6197
6198 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6199 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6200}
6201
6202void Context::pauseTransformFeedback()
6203{
6204 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6205 transformFeedback->pause();
6206}
6207
6208void Context::resumeTransformFeedback()
6209{
6210 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6211 transformFeedback->resume();
6212}
6213
Jamie Madill12e957f2017-08-26 21:42:26 -04006214void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6215{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006216 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006217 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006218}
6219
Brandon Jones59770802018-04-02 13:18:42 -07006220void Context::getUniformuivRobust(GLuint program,
6221 GLint location,
6222 GLsizei bufSize,
6223 GLsizei *length,
6224 GLuint *params)
6225{
6226 getUniformuiv(program, location, params);
6227}
6228
Jamie Madill12e957f2017-08-26 21:42:26 -04006229GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6230{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006231 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006232 return programObject->getFragDataLocation(name);
6233}
6234
6235void Context::getUniformIndices(GLuint program,
6236 GLsizei uniformCount,
6237 const GLchar *const *uniformNames,
6238 GLuint *uniformIndices)
6239{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006240 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006241 if (!programObject->isLinked())
6242 {
6243 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6244 {
6245 uniformIndices[uniformId] = GL_INVALID_INDEX;
6246 }
6247 }
6248 else
6249 {
6250 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6251 {
6252 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6253 }
6254 }
6255}
6256
6257void Context::getActiveUniformsiv(GLuint program,
6258 GLsizei uniformCount,
6259 const GLuint *uniformIndices,
6260 GLenum pname,
6261 GLint *params)
6262{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006263 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006264 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6265 {
6266 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006267 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006268 }
6269}
6270
6271GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6272{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006273 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006274 return programObject->getUniformBlockIndex(uniformBlockName);
6275}
6276
6277void Context::getActiveUniformBlockiv(GLuint program,
6278 GLuint uniformBlockIndex,
6279 GLenum pname,
6280 GLint *params)
6281{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006282 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006283 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6284}
6285
Brandon Jones59770802018-04-02 13:18:42 -07006286void Context::getActiveUniformBlockivRobust(GLuint program,
6287 GLuint uniformBlockIndex,
6288 GLenum pname,
6289 GLsizei bufSize,
6290 GLsizei *length,
6291 GLint *params)
6292{
6293 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6294}
6295
Jamie Madill12e957f2017-08-26 21:42:26 -04006296void Context::getActiveUniformBlockName(GLuint program,
6297 GLuint uniformBlockIndex,
6298 GLsizei bufSize,
6299 GLsizei *length,
6300 GLchar *uniformBlockName)
6301{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006302 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006303 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6304}
6305
6306void Context::uniformBlockBinding(GLuint program,
6307 GLuint uniformBlockIndex,
6308 GLuint uniformBlockBinding)
6309{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006310 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006311 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006312
6313 if (programObject->isInUse())
6314 {
6315 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006316 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006317 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006318}
6319
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006320GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6321{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006322 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6323 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006324
Jamie Madill70b5bb02017-08-28 13:32:37 -04006325 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006326 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006327 if (error.isError())
6328 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006329 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006330 handleError(error);
6331 return nullptr;
6332 }
6333
Jamie Madill70b5bb02017-08-28 13:32:37 -04006334 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006335}
6336
6337GLboolean Context::isSync(GLsync sync)
6338{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006339 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006340}
6341
6342GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6343{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006344 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006345
6346 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006347 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006348 return result;
6349}
6350
6351void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6352{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006353 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006354 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006355}
6356
6357void Context::getInteger64v(GLenum pname, GLint64 *params)
6358{
6359 GLenum nativeType = GL_NONE;
6360 unsigned int numParams = 0;
6361 getQueryParameterInfo(pname, &nativeType, &numParams);
6362
6363 if (nativeType == GL_INT_64_ANGLEX)
6364 {
6365 getInteger64vImpl(pname, params);
6366 }
6367 else
6368 {
6369 CastStateValues(this, nativeType, pname, numParams, params);
6370 }
6371}
6372
Brandon Jones59770802018-04-02 13:18:42 -07006373void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6374{
6375 getInteger64v(pname, data);
6376}
6377
Corentin Wallez336129f2017-10-17 15:55:40 -04006378void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006379{
6380 Buffer *buffer = mGLState.getTargetBuffer(target);
6381 QueryBufferParameteri64v(buffer, pname, params);
6382}
6383
Brandon Jones59770802018-04-02 13:18:42 -07006384void Context::getBufferParameteri64vRobust(BufferBinding target,
6385 GLenum pname,
6386 GLsizei bufSize,
6387 GLsizei *length,
6388 GLint64 *params)
6389{
6390 getBufferParameteri64v(target, pname, params);
6391}
6392
Jamie Madill3ef140a2017-08-26 23:11:21 -04006393void Context::genSamplers(GLsizei count, GLuint *samplers)
6394{
6395 for (int i = 0; i < count; i++)
6396 {
6397 samplers[i] = mState.mSamplers->createSampler();
6398 }
6399}
6400
6401void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6402{
6403 for (int i = 0; i < count; i++)
6404 {
6405 GLuint sampler = samplers[i];
6406
6407 if (mState.mSamplers->getSampler(sampler))
6408 {
6409 detachSampler(sampler);
6410 }
6411
6412 mState.mSamplers->deleteObject(this, sampler);
6413 }
6414}
6415
6416void Context::getInternalformativ(GLenum target,
6417 GLenum internalformat,
6418 GLenum pname,
6419 GLsizei bufSize,
6420 GLint *params)
6421{
6422 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6423 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6424}
6425
Brandon Jones59770802018-04-02 13:18:42 -07006426void Context::getInternalformativRobust(GLenum target,
6427 GLenum internalformat,
6428 GLenum pname,
6429 GLsizei bufSize,
6430 GLsizei *length,
6431 GLint *params)
6432{
6433 getInternalformativ(target, internalformat, pname, bufSize, params);
6434}
6435
Jiajia Qin5451d532017-11-16 17:16:34 +08006436void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6437{
6438 programUniform1iv(program, location, 1, &v0);
6439}
6440
6441void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6442{
6443 GLint xy[2] = {v0, v1};
6444 programUniform2iv(program, location, 1, xy);
6445}
6446
6447void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6448{
6449 GLint xyz[3] = {v0, v1, v2};
6450 programUniform3iv(program, location, 1, xyz);
6451}
6452
6453void Context::programUniform4i(GLuint program,
6454 GLint location,
6455 GLint v0,
6456 GLint v1,
6457 GLint v2,
6458 GLint v3)
6459{
6460 GLint xyzw[4] = {v0, v1, v2, v3};
6461 programUniform4iv(program, location, 1, xyzw);
6462}
6463
6464void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6465{
6466 programUniform1uiv(program, location, 1, &v0);
6467}
6468
6469void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6470{
6471 GLuint xy[2] = {v0, v1};
6472 programUniform2uiv(program, location, 1, xy);
6473}
6474
6475void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6476{
6477 GLuint xyz[3] = {v0, v1, v2};
6478 programUniform3uiv(program, location, 1, xyz);
6479}
6480
6481void Context::programUniform4ui(GLuint program,
6482 GLint location,
6483 GLuint v0,
6484 GLuint v1,
6485 GLuint v2,
6486 GLuint v3)
6487{
6488 GLuint xyzw[4] = {v0, v1, v2, v3};
6489 programUniform4uiv(program, location, 1, xyzw);
6490}
6491
6492void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6493{
6494 programUniform1fv(program, location, 1, &v0);
6495}
6496
6497void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6498{
6499 GLfloat xy[2] = {v0, v1};
6500 programUniform2fv(program, location, 1, xy);
6501}
6502
6503void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6504{
6505 GLfloat xyz[3] = {v0, v1, v2};
6506 programUniform3fv(program, location, 1, xyz);
6507}
6508
6509void Context::programUniform4f(GLuint program,
6510 GLint location,
6511 GLfloat v0,
6512 GLfloat v1,
6513 GLfloat v2,
6514 GLfloat v3)
6515{
6516 GLfloat xyzw[4] = {v0, v1, v2, v3};
6517 programUniform4fv(program, location, 1, xyzw);
6518}
6519
Jamie Madill81c2e252017-09-09 23:32:46 -04006520void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6521{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006522 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006523 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006524 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006525}
6526
Jiajia Qin5451d532017-11-16 17:16:34 +08006527void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6528{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006529 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006530 ASSERT(programObject);
6531 programObject->setUniform2iv(location, count, value);
6532}
6533
6534void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6535{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006536 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006537 ASSERT(programObject);
6538 programObject->setUniform3iv(location, count, value);
6539}
6540
6541void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6542{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006543 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006544 ASSERT(programObject);
6545 programObject->setUniform4iv(location, count, value);
6546}
6547
6548void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6549{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006550 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006551 ASSERT(programObject);
6552 programObject->setUniform1uiv(location, count, value);
6553}
6554
6555void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6556{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006557 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006558 ASSERT(programObject);
6559 programObject->setUniform2uiv(location, count, value);
6560}
6561
6562void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6563{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006564 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006565 ASSERT(programObject);
6566 programObject->setUniform3uiv(location, count, value);
6567}
6568
6569void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6570{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006571 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006572 ASSERT(programObject);
6573 programObject->setUniform4uiv(location, count, value);
6574}
6575
6576void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6577{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006578 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006579 ASSERT(programObject);
6580 programObject->setUniform1fv(location, count, value);
6581}
6582
6583void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6584{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006585 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006586 ASSERT(programObject);
6587 programObject->setUniform2fv(location, count, value);
6588}
6589
6590void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6591{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006592 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006593 ASSERT(programObject);
6594 programObject->setUniform3fv(location, count, value);
6595}
6596
6597void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6598{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006599 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006600 ASSERT(programObject);
6601 programObject->setUniform4fv(location, count, value);
6602}
6603
6604void Context::programUniformMatrix2fv(GLuint program,
6605 GLint location,
6606 GLsizei count,
6607 GLboolean transpose,
6608 const GLfloat *value)
6609{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006610 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006611 ASSERT(programObject);
6612 programObject->setUniformMatrix2fv(location, count, transpose, value);
6613}
6614
6615void Context::programUniformMatrix3fv(GLuint program,
6616 GLint location,
6617 GLsizei count,
6618 GLboolean transpose,
6619 const GLfloat *value)
6620{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006621 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006622 ASSERT(programObject);
6623 programObject->setUniformMatrix3fv(location, count, transpose, value);
6624}
6625
6626void Context::programUniformMatrix4fv(GLuint program,
6627 GLint location,
6628 GLsizei count,
6629 GLboolean transpose,
6630 const GLfloat *value)
6631{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006632 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006633 ASSERT(programObject);
6634 programObject->setUniformMatrix4fv(location, count, transpose, value);
6635}
6636
6637void Context::programUniformMatrix2x3fv(GLuint program,
6638 GLint location,
6639 GLsizei count,
6640 GLboolean transpose,
6641 const GLfloat *value)
6642{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006643 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006644 ASSERT(programObject);
6645 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6646}
6647
6648void Context::programUniformMatrix3x2fv(GLuint program,
6649 GLint location,
6650 GLsizei count,
6651 GLboolean transpose,
6652 const GLfloat *value)
6653{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006654 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006655 ASSERT(programObject);
6656 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6657}
6658
6659void Context::programUniformMatrix2x4fv(GLuint program,
6660 GLint location,
6661 GLsizei count,
6662 GLboolean transpose,
6663 const GLfloat *value)
6664{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006665 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006666 ASSERT(programObject);
6667 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6668}
6669
6670void Context::programUniformMatrix4x2fv(GLuint program,
6671 GLint location,
6672 GLsizei count,
6673 GLboolean transpose,
6674 const GLfloat *value)
6675{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006676 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006677 ASSERT(programObject);
6678 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6679}
6680
6681void Context::programUniformMatrix3x4fv(GLuint program,
6682 GLint location,
6683 GLsizei count,
6684 GLboolean transpose,
6685 const GLfloat *value)
6686{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006687 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006688 ASSERT(programObject);
6689 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6690}
6691
6692void Context::programUniformMatrix4x3fv(GLuint program,
6693 GLint location,
6694 GLsizei count,
6695 GLboolean transpose,
6696 const GLfloat *value)
6697{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006698 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006699 ASSERT(programObject);
6700 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6701}
6702
Jamie Madill81c2e252017-09-09 23:32:46 -04006703void Context::onTextureChange(const Texture *texture)
6704{
6705 // Conservatively assume all textures are dirty.
6706 // TODO(jmadill): More fine-grained update.
6707 mGLState.setObjectDirty(GL_TEXTURE);
6708}
6709
James Darpiniane8a93c62018-01-04 18:02:24 -08006710bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6711{
6712 return mGLState.isCurrentTransformFeedback(tf);
6713}
James Darpiniane8a93c62018-01-04 18:02:24 -08006714
Yunchao Hea336b902017-08-02 16:05:21 +08006715void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6716{
6717 for (int i = 0; i < count; i++)
6718 {
6719 pipelines[i] = createProgramPipeline();
6720 }
6721}
6722
6723void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6724{
6725 for (int i = 0; i < count; i++)
6726 {
6727 if (pipelines[i] != 0)
6728 {
6729 deleteProgramPipeline(pipelines[i]);
6730 }
6731 }
6732}
6733
6734GLboolean Context::isProgramPipeline(GLuint pipeline)
6735{
6736 if (pipeline == 0)
6737 {
6738 return GL_FALSE;
6739 }
6740
6741 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6742}
6743
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006744void Context::finishFenceNV(GLuint fence)
6745{
6746 FenceNV *fenceObject = getFenceNV(fence);
6747
6748 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04006749 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006750}
6751
6752void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6753{
6754 FenceNV *fenceObject = getFenceNV(fence);
6755
6756 ASSERT(fenceObject && fenceObject->isSet());
6757
6758 switch (pname)
6759 {
6760 case GL_FENCE_STATUS_NV:
6761 {
6762 // GL_NV_fence spec:
6763 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6764 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6765 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6766 GLboolean status = GL_TRUE;
6767 if (fenceObject->getStatus() != GL_TRUE)
6768 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006769 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006770 }
6771 *params = status;
6772 break;
6773 }
6774
6775 case GL_FENCE_CONDITION_NV:
6776 {
6777 *params = static_cast<GLint>(fenceObject->getCondition());
6778 break;
6779 }
6780
6781 default:
6782 UNREACHABLE();
6783 }
6784}
6785
6786void Context::getTranslatedShaderSource(GLuint shader,
6787 GLsizei bufsize,
6788 GLsizei *length,
6789 GLchar *source)
6790{
6791 Shader *shaderObject = getShader(shader);
6792 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08006793 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006794}
6795
6796void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6797{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006798 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006799 ASSERT(programObject);
6800
6801 programObject->getUniformfv(this, location, params);
6802}
6803
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006804void Context::getnUniformfvRobust(GLuint program,
6805 GLint location,
6806 GLsizei bufSize,
6807 GLsizei *length,
6808 GLfloat *params)
6809{
6810 UNIMPLEMENTED();
6811}
6812
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006813void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
6814{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006815 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006816 ASSERT(programObject);
6817
6818 programObject->getUniformiv(this, location, params);
6819}
6820
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006821void Context::getnUniformivRobust(GLuint program,
6822 GLint location,
6823 GLsizei bufSize,
6824 GLsizei *length,
6825 GLint *params)
6826{
6827 UNIMPLEMENTED();
6828}
6829
6830void Context::getnUniformuivRobust(GLuint program,
6831 GLint location,
6832 GLsizei bufSize,
6833 GLsizei *length,
6834 GLuint *params)
6835{
6836 UNIMPLEMENTED();
6837}
6838
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006839GLboolean Context::isFenceNV(GLuint fence)
6840{
6841 FenceNV *fenceObject = getFenceNV(fence);
6842
6843 if (fenceObject == nullptr)
6844 {
6845 return GL_FALSE;
6846 }
6847
6848 // GL_NV_fence spec:
6849 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
6850 // existing fence.
6851 return fenceObject->isSet();
6852}
6853
6854void Context::readnPixels(GLint x,
6855 GLint y,
6856 GLsizei width,
6857 GLsizei height,
6858 GLenum format,
6859 GLenum type,
6860 GLsizei bufSize,
6861 void *data)
6862{
6863 return readPixels(x, y, width, height, format, type, data);
6864}
6865
Jamie Madill007530e2017-12-28 14:27:04 -05006866void Context::setFenceNV(GLuint fence, GLenum condition)
6867{
6868 ASSERT(condition == GL_ALL_COMPLETED_NV);
6869
6870 FenceNV *fenceObject = getFenceNV(fence);
6871 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04006872 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05006873}
6874
6875GLboolean Context::testFenceNV(GLuint fence)
6876{
6877 FenceNV *fenceObject = getFenceNV(fence);
6878
6879 ASSERT(fenceObject != nullptr);
6880 ASSERT(fenceObject->isSet() == GL_TRUE);
6881
6882 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04006883 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05006884 if (error.isError())
6885 {
6886 handleError(error);
6887 return GL_TRUE;
6888 }
6889
6890 return result;
6891}
6892
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006893void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006894{
6895 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07006896 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05006897 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05006898}
6899
Jamie Madillfa920eb2018-01-04 11:45:50 -05006900void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006901{
6902 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07006903 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05006904 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
6905}
6906
Jamie Madillfa920eb2018-01-04 11:45:50 -05006907void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
6908{
6909 UNIMPLEMENTED();
6910}
6911
Jamie Madill5b772312018-03-08 20:28:32 -05006912bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
6913{
6914 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
6915 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
6916 // to the fact that it is stored internally as a float, and so would require conversion
6917 // if returned from Context::getIntegerv. Since this conversion is already implemented
6918 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
6919 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
6920 // application.
6921 switch (pname)
6922 {
6923 case GL_COMPRESSED_TEXTURE_FORMATS:
6924 {
6925 *type = GL_INT;
6926 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
6927 return true;
6928 }
6929 case GL_SHADER_BINARY_FORMATS:
6930 {
6931 *type = GL_INT;
6932 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
6933 return true;
6934 }
6935
6936 case GL_MAX_VERTEX_ATTRIBS:
6937 case GL_MAX_VERTEX_UNIFORM_VECTORS:
6938 case GL_MAX_VARYING_VECTORS:
6939 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
6940 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
6941 case GL_MAX_TEXTURE_IMAGE_UNITS:
6942 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
6943 case GL_MAX_RENDERBUFFER_SIZE:
6944 case GL_NUM_SHADER_BINARY_FORMATS:
6945 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
6946 case GL_ARRAY_BUFFER_BINDING:
6947 case GL_FRAMEBUFFER_BINDING:
6948 case GL_RENDERBUFFER_BINDING:
6949 case GL_CURRENT_PROGRAM:
6950 case GL_PACK_ALIGNMENT:
6951 case GL_UNPACK_ALIGNMENT:
6952 case GL_GENERATE_MIPMAP_HINT:
6953 case GL_RED_BITS:
6954 case GL_GREEN_BITS:
6955 case GL_BLUE_BITS:
6956 case GL_ALPHA_BITS:
6957 case GL_DEPTH_BITS:
6958 case GL_STENCIL_BITS:
6959 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
6960 case GL_CULL_FACE_MODE:
6961 case GL_FRONT_FACE:
6962 case GL_ACTIVE_TEXTURE:
6963 case GL_STENCIL_FUNC:
6964 case GL_STENCIL_VALUE_MASK:
6965 case GL_STENCIL_REF:
6966 case GL_STENCIL_FAIL:
6967 case GL_STENCIL_PASS_DEPTH_FAIL:
6968 case GL_STENCIL_PASS_DEPTH_PASS:
6969 case GL_STENCIL_BACK_FUNC:
6970 case GL_STENCIL_BACK_VALUE_MASK:
6971 case GL_STENCIL_BACK_REF:
6972 case GL_STENCIL_BACK_FAIL:
6973 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
6974 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
6975 case GL_DEPTH_FUNC:
6976 case GL_BLEND_SRC_RGB:
6977 case GL_BLEND_SRC_ALPHA:
6978 case GL_BLEND_DST_RGB:
6979 case GL_BLEND_DST_ALPHA:
6980 case GL_BLEND_EQUATION_RGB:
6981 case GL_BLEND_EQUATION_ALPHA:
6982 case GL_STENCIL_WRITEMASK:
6983 case GL_STENCIL_BACK_WRITEMASK:
6984 case GL_STENCIL_CLEAR_VALUE:
6985 case GL_SUBPIXEL_BITS:
6986 case GL_MAX_TEXTURE_SIZE:
6987 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
6988 case GL_SAMPLE_BUFFERS:
6989 case GL_SAMPLES:
6990 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
6991 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
6992 case GL_TEXTURE_BINDING_2D:
6993 case GL_TEXTURE_BINDING_CUBE_MAP:
6994 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
6995 {
6996 *type = GL_INT;
6997 *numParams = 1;
6998 return true;
6999 }
7000 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7001 {
7002 if (!getExtensions().packReverseRowOrder)
7003 {
7004 return false;
7005 }
7006 *type = GL_INT;
7007 *numParams = 1;
7008 return true;
7009 }
7010 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7011 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7012 {
7013 if (!getExtensions().textureRectangle)
7014 {
7015 return false;
7016 }
7017 *type = GL_INT;
7018 *numParams = 1;
7019 return true;
7020 }
7021 case GL_MAX_DRAW_BUFFERS_EXT:
7022 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7023 {
7024 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7025 {
7026 return false;
7027 }
7028 *type = GL_INT;
7029 *numParams = 1;
7030 return true;
7031 }
7032 case GL_MAX_VIEWPORT_DIMS:
7033 {
7034 *type = GL_INT;
7035 *numParams = 2;
7036 return true;
7037 }
7038 case GL_VIEWPORT:
7039 case GL_SCISSOR_BOX:
7040 {
7041 *type = GL_INT;
7042 *numParams = 4;
7043 return true;
7044 }
7045 case GL_SHADER_COMPILER:
7046 case GL_SAMPLE_COVERAGE_INVERT:
7047 case GL_DEPTH_WRITEMASK:
7048 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7049 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7050 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7051 // bool-natural
7052 case GL_SAMPLE_COVERAGE:
7053 case GL_SCISSOR_TEST:
7054 case GL_STENCIL_TEST:
7055 case GL_DEPTH_TEST:
7056 case GL_BLEND:
7057 case GL_DITHER:
7058 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7059 {
7060 *type = GL_BOOL;
7061 *numParams = 1;
7062 return true;
7063 }
7064 case GL_COLOR_WRITEMASK:
7065 {
7066 *type = GL_BOOL;
7067 *numParams = 4;
7068 return true;
7069 }
7070 case GL_POLYGON_OFFSET_FACTOR:
7071 case GL_POLYGON_OFFSET_UNITS:
7072 case GL_SAMPLE_COVERAGE_VALUE:
7073 case GL_DEPTH_CLEAR_VALUE:
7074 case GL_LINE_WIDTH:
7075 {
7076 *type = GL_FLOAT;
7077 *numParams = 1;
7078 return true;
7079 }
7080 case GL_ALIASED_LINE_WIDTH_RANGE:
7081 case GL_ALIASED_POINT_SIZE_RANGE:
7082 case GL_DEPTH_RANGE:
7083 {
7084 *type = GL_FLOAT;
7085 *numParams = 2;
7086 return true;
7087 }
7088 case GL_COLOR_CLEAR_VALUE:
7089 case GL_BLEND_COLOR:
7090 {
7091 *type = GL_FLOAT;
7092 *numParams = 4;
7093 return true;
7094 }
7095 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7096 if (!getExtensions().textureFilterAnisotropic)
7097 {
7098 return false;
7099 }
7100 *type = GL_FLOAT;
7101 *numParams = 1;
7102 return true;
7103 case GL_TIMESTAMP_EXT:
7104 if (!getExtensions().disjointTimerQuery)
7105 {
7106 return false;
7107 }
7108 *type = GL_INT_64_ANGLEX;
7109 *numParams = 1;
7110 return true;
7111 case GL_GPU_DISJOINT_EXT:
7112 if (!getExtensions().disjointTimerQuery)
7113 {
7114 return false;
7115 }
7116 *type = GL_INT;
7117 *numParams = 1;
7118 return true;
7119 case GL_COVERAGE_MODULATION_CHROMIUM:
7120 if (!getExtensions().framebufferMixedSamples)
7121 {
7122 return false;
7123 }
7124 *type = GL_INT;
7125 *numParams = 1;
7126 return true;
7127 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7128 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7129 {
7130 return false;
7131 }
7132 *type = GL_INT;
7133 *numParams = 1;
7134 return true;
7135 }
7136
7137 if (getExtensions().debug)
7138 {
7139 switch (pname)
7140 {
7141 case GL_DEBUG_LOGGED_MESSAGES:
7142 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7143 case GL_DEBUG_GROUP_STACK_DEPTH:
7144 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7145 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7146 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7147 case GL_MAX_LABEL_LENGTH:
7148 *type = GL_INT;
7149 *numParams = 1;
7150 return true;
7151
7152 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7153 case GL_DEBUG_OUTPUT:
7154 *type = GL_BOOL;
7155 *numParams = 1;
7156 return true;
7157 }
7158 }
7159
7160 if (getExtensions().multisampleCompatibility)
7161 {
7162 switch (pname)
7163 {
7164 case GL_MULTISAMPLE_EXT:
7165 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7166 *type = GL_BOOL;
7167 *numParams = 1;
7168 return true;
7169 }
7170 }
7171
7172 if (getExtensions().pathRendering)
7173 {
7174 switch (pname)
7175 {
7176 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7177 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7178 *type = GL_FLOAT;
7179 *numParams = 16;
7180 return true;
7181 }
7182 }
7183
7184 if (getExtensions().bindGeneratesResource)
7185 {
7186 switch (pname)
7187 {
7188 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7189 *type = GL_BOOL;
7190 *numParams = 1;
7191 return true;
7192 }
7193 }
7194
7195 if (getExtensions().clientArrays)
7196 {
7197 switch (pname)
7198 {
7199 case GL_CLIENT_ARRAYS_ANGLE:
7200 *type = GL_BOOL;
7201 *numParams = 1;
7202 return true;
7203 }
7204 }
7205
7206 if (getExtensions().sRGBWriteControl)
7207 {
7208 switch (pname)
7209 {
7210 case GL_FRAMEBUFFER_SRGB_EXT:
7211 *type = GL_BOOL;
7212 *numParams = 1;
7213 return true;
7214 }
7215 }
7216
7217 if (getExtensions().robustResourceInitialization &&
7218 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7219 {
7220 *type = GL_BOOL;
7221 *numParams = 1;
7222 return true;
7223 }
7224
7225 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7226 {
7227 *type = GL_BOOL;
7228 *numParams = 1;
7229 return true;
7230 }
7231
jchen1082af6202018-06-22 10:59:52 +08007232 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7233 {
7234 *type = GL_INT;
7235 *numParams = 1;
7236 return true;
7237 }
7238
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007239 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7240 {
7241 *type = GL_INT;
7242 *numParams = 1;
7243 return true;
7244 }
7245
Jamie Madill5b772312018-03-08 20:28:32 -05007246 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7247 switch (pname)
7248 {
7249 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7250 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7251 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7252 {
7253 return false;
7254 }
7255 *type = GL_INT;
7256 *numParams = 1;
7257 return true;
7258
7259 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7260 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7261 {
7262 return false;
7263 }
7264 *type = GL_INT;
7265 *numParams = 1;
7266 return true;
7267
7268 case GL_PROGRAM_BINARY_FORMATS_OES:
7269 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7270 {
7271 return false;
7272 }
7273 *type = GL_INT;
7274 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7275 return true;
7276
7277 case GL_PACK_ROW_LENGTH:
7278 case GL_PACK_SKIP_ROWS:
7279 case GL_PACK_SKIP_PIXELS:
7280 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7281 {
7282 return false;
7283 }
7284 *type = GL_INT;
7285 *numParams = 1;
7286 return true;
7287 case GL_UNPACK_ROW_LENGTH:
7288 case GL_UNPACK_SKIP_ROWS:
7289 case GL_UNPACK_SKIP_PIXELS:
7290 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7291 {
7292 return false;
7293 }
7294 *type = GL_INT;
7295 *numParams = 1;
7296 return true;
7297 case GL_VERTEX_ARRAY_BINDING:
7298 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7299 {
7300 return false;
7301 }
7302 *type = GL_INT;
7303 *numParams = 1;
7304 return true;
7305 case GL_PIXEL_PACK_BUFFER_BINDING:
7306 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7307 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7308 {
7309 return false;
7310 }
7311 *type = GL_INT;
7312 *numParams = 1;
7313 return true;
7314 case GL_MAX_SAMPLES:
7315 {
7316 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7317 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7318 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7319 {
7320 return false;
7321 }
7322 *type = GL_INT;
7323 *numParams = 1;
7324 return true;
7325
7326 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7327 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7328 {
7329 return false;
7330 }
7331 *type = GL_INT;
7332 *numParams = 1;
7333 return true;
7334 }
7335 }
7336
7337 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7338 {
7339 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7340 {
7341 return false;
7342 }
7343 *type = GL_INT;
7344 *numParams = 1;
7345 return true;
7346 }
7347
7348 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7349 {
7350 *type = GL_INT;
7351 *numParams = 1;
7352 return true;
7353 }
7354
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007355 if (getClientVersion() < Version(2, 0))
7356 {
7357 switch (pname)
7358 {
7359 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007360 case GL_CLIENT_ACTIVE_TEXTURE:
7361 case GL_MATRIX_MODE:
7362 case GL_MAX_TEXTURE_UNITS:
7363 case GL_MAX_MODELVIEW_STACK_DEPTH:
7364 case GL_MAX_PROJECTION_STACK_DEPTH:
7365 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007366 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007367 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007368 case GL_VERTEX_ARRAY_STRIDE:
7369 case GL_NORMAL_ARRAY_STRIDE:
7370 case GL_COLOR_ARRAY_STRIDE:
7371 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7372 case GL_VERTEX_ARRAY_SIZE:
7373 case GL_COLOR_ARRAY_SIZE:
7374 case GL_TEXTURE_COORD_ARRAY_SIZE:
7375 case GL_VERTEX_ARRAY_TYPE:
7376 case GL_NORMAL_ARRAY_TYPE:
7377 case GL_COLOR_ARRAY_TYPE:
7378 case GL_TEXTURE_COORD_ARRAY_TYPE:
7379 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7380 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7381 case GL_COLOR_ARRAY_BUFFER_BINDING:
7382 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7383 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7384 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7385 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007386 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007387 case GL_MODELVIEW_STACK_DEPTH:
7388 case GL_PROJECTION_STACK_DEPTH:
7389 case GL_TEXTURE_STACK_DEPTH:
7390 case GL_LOGIC_OP_MODE:
7391 case GL_BLEND_SRC:
7392 case GL_BLEND_DST:
7393 case GL_PERSPECTIVE_CORRECTION_HINT:
7394 case GL_POINT_SMOOTH_HINT:
7395 case GL_LINE_SMOOTH_HINT:
7396 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007397 *type = GL_INT;
7398 *numParams = 1;
7399 return true;
7400 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007401 case GL_FOG_DENSITY:
7402 case GL_FOG_START:
7403 case GL_FOG_END:
7404 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007405 case GL_POINT_SIZE:
7406 case GL_POINT_SIZE_MIN:
7407 case GL_POINT_SIZE_MAX:
7408 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007409 *type = GL_FLOAT;
7410 *numParams = 1;
7411 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007412 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007413 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007414 *type = GL_FLOAT;
7415 *numParams = 2;
7416 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007417 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007418 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007419 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007420 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007421 *type = GL_FLOAT;
7422 *numParams = 4;
7423 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007424 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007425 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007426 *type = GL_FLOAT;
7427 *numParams = 3;
7428 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007429 case GL_MODELVIEW_MATRIX:
7430 case GL_PROJECTION_MATRIX:
7431 case GL_TEXTURE_MATRIX:
7432 *type = GL_FLOAT;
7433 *numParams = 16;
7434 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007435 case GL_LIGHT_MODEL_TWO_SIDE:
7436 *type = GL_BOOL;
7437 *numParams = 1;
7438 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007439 }
7440 }
7441
Jamie Madill5b772312018-03-08 20:28:32 -05007442 if (getClientVersion() < Version(3, 0))
7443 {
7444 return false;
7445 }
7446
7447 // Check for ES3.0+ parameter names
7448 switch (pname)
7449 {
7450 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7451 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7452 case GL_UNIFORM_BUFFER_BINDING:
7453 case GL_TRANSFORM_FEEDBACK_BINDING:
7454 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7455 case GL_COPY_READ_BUFFER_BINDING:
7456 case GL_COPY_WRITE_BUFFER_BINDING:
7457 case GL_SAMPLER_BINDING:
7458 case GL_READ_BUFFER:
7459 case GL_TEXTURE_BINDING_3D:
7460 case GL_TEXTURE_BINDING_2D_ARRAY:
7461 case GL_MAX_3D_TEXTURE_SIZE:
7462 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7463 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7464 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7465 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7466 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7467 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7468 case GL_MAX_VARYING_COMPONENTS:
7469 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7470 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7471 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7472 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7473 case GL_NUM_EXTENSIONS:
7474 case GL_MAJOR_VERSION:
7475 case GL_MINOR_VERSION:
7476 case GL_MAX_ELEMENTS_INDICES:
7477 case GL_MAX_ELEMENTS_VERTICES:
7478 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7479 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7480 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7481 case GL_UNPACK_IMAGE_HEIGHT:
7482 case GL_UNPACK_SKIP_IMAGES:
7483 {
7484 *type = GL_INT;
7485 *numParams = 1;
7486 return true;
7487 }
7488
7489 case GL_MAX_ELEMENT_INDEX:
7490 case GL_MAX_UNIFORM_BLOCK_SIZE:
7491 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7492 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7493 case GL_MAX_SERVER_WAIT_TIMEOUT:
7494 {
7495 *type = GL_INT_64_ANGLEX;
7496 *numParams = 1;
7497 return true;
7498 }
7499
7500 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7501 case GL_TRANSFORM_FEEDBACK_PAUSED:
7502 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7503 case GL_RASTERIZER_DISCARD:
7504 {
7505 *type = GL_BOOL;
7506 *numParams = 1;
7507 return true;
7508 }
7509
7510 case GL_MAX_TEXTURE_LOD_BIAS:
7511 {
7512 *type = GL_FLOAT;
7513 *numParams = 1;
7514 return true;
7515 }
7516 }
7517
7518 if (getExtensions().requestExtension)
7519 {
7520 switch (pname)
7521 {
7522 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7523 *type = GL_INT;
7524 *numParams = 1;
7525 return true;
7526 }
7527 }
7528
7529 if (getClientVersion() < Version(3, 1))
7530 {
7531 return false;
7532 }
7533
7534 switch (pname)
7535 {
7536 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7537 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7538 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7539 case GL_MAX_FRAMEBUFFER_WIDTH:
7540 case GL_MAX_FRAMEBUFFER_HEIGHT:
7541 case GL_MAX_FRAMEBUFFER_SAMPLES:
7542 case GL_MAX_SAMPLE_MASK_WORDS:
7543 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7544 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7545 case GL_MAX_INTEGER_SAMPLES:
7546 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7547 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7548 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7549 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7550 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7551 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7552 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7553 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7554 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7555 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7556 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7557 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7558 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7559 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7560 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7561 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7562 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7563 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7564 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7565 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7566 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7567 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7568 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7569 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7570 case GL_MAX_UNIFORM_LOCATIONS:
7571 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7572 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7573 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7574 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7575 case GL_MAX_IMAGE_UNITS:
7576 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7577 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7578 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7579 case GL_SHADER_STORAGE_BUFFER_BINDING:
7580 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7581 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007582 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007583 *type = GL_INT;
7584 *numParams = 1;
7585 return true;
7586 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7587 *type = GL_INT_64_ANGLEX;
7588 *numParams = 1;
7589 return true;
7590 case GL_SAMPLE_MASK:
7591 *type = GL_BOOL;
7592 *numParams = 1;
7593 return true;
7594 }
7595
7596 if (getExtensions().geometryShader)
7597 {
7598 switch (pname)
7599 {
7600 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7601 case GL_LAYER_PROVOKING_VERTEX_EXT:
7602 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7603 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7604 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7605 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7606 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7607 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7608 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7609 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7610 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7611 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7612 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7613 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7614 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7615 *type = GL_INT;
7616 *numParams = 1;
7617 return true;
7618 }
7619 }
7620
7621 return false;
7622}
7623
7624bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7625{
7626 if (getClientVersion() < Version(3, 0))
7627 {
7628 return false;
7629 }
7630
7631 switch (target)
7632 {
7633 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7634 case GL_UNIFORM_BUFFER_BINDING:
7635 {
7636 *type = GL_INT;
7637 *numParams = 1;
7638 return true;
7639 }
7640 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7641 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7642 case GL_UNIFORM_BUFFER_START:
7643 case GL_UNIFORM_BUFFER_SIZE:
7644 {
7645 *type = GL_INT_64_ANGLEX;
7646 *numParams = 1;
7647 return true;
7648 }
7649 }
7650
7651 if (getClientVersion() < Version(3, 1))
7652 {
7653 return false;
7654 }
7655
7656 switch (target)
7657 {
7658 case GL_IMAGE_BINDING_LAYERED:
7659 {
7660 *type = GL_BOOL;
7661 *numParams = 1;
7662 return true;
7663 }
7664 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7665 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7666 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7667 case GL_SHADER_STORAGE_BUFFER_BINDING:
7668 case GL_VERTEX_BINDING_BUFFER:
7669 case GL_VERTEX_BINDING_DIVISOR:
7670 case GL_VERTEX_BINDING_OFFSET:
7671 case GL_VERTEX_BINDING_STRIDE:
7672 case GL_SAMPLE_MASK_VALUE:
7673 case GL_IMAGE_BINDING_NAME:
7674 case GL_IMAGE_BINDING_LEVEL:
7675 case GL_IMAGE_BINDING_LAYER:
7676 case GL_IMAGE_BINDING_ACCESS:
7677 case GL_IMAGE_BINDING_FORMAT:
7678 {
7679 *type = GL_INT;
7680 *numParams = 1;
7681 return true;
7682 }
7683 case GL_ATOMIC_COUNTER_BUFFER_START:
7684 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7685 case GL_SHADER_STORAGE_BUFFER_START:
7686 case GL_SHADER_STORAGE_BUFFER_SIZE:
7687 {
7688 *type = GL_INT_64_ANGLEX;
7689 *numParams = 1;
7690 return true;
7691 }
7692 }
7693
7694 return false;
7695}
7696
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007697Program *Context::getProgramResolveLink(GLuint handle) const
7698{
7699 Program *program = mState.mShaderPrograms->getProgram(handle);
7700 if (program)
7701 {
7702 program->resolveLink();
7703 }
7704 return program;
7705}
7706
7707Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05007708{
7709 return mState.mShaderPrograms->getProgram(handle);
7710}
7711
7712Shader *Context::getShader(GLuint handle) const
7713{
7714 return mState.mShaderPrograms->getShader(handle);
7715}
7716
7717bool Context::isTextureGenerated(GLuint texture) const
7718{
7719 return mState.mTextures->isHandleGenerated(texture);
7720}
7721
Jamie Madill5b772312018-03-08 20:28:32 -05007722bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7723{
7724 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7725}
7726
7727bool Context::isFramebufferGenerated(GLuint framebuffer) const
7728{
7729 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7730}
7731
7732bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7733{
7734 return mState.mPipelines->isHandleGenerated(pipeline);
7735}
7736
7737bool Context::usingDisplayTextureShareGroup() const
7738{
7739 return mDisplayTextureShareGroup;
7740}
7741
7742GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7743{
7744 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7745 internalformat == GL_DEPTH_STENCIL
7746 ? GL_DEPTH24_STENCIL8
7747 : internalformat;
7748}
7749
jchen1082af6202018-06-22 10:59:52 +08007750void Context::maxShaderCompilerThreads(GLuint count)
7751{
jchen107ae70d82018-07-06 13:47:01 +08007752 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08007753 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08007754 // A count of zero specifies a request for no parallel compiling or linking.
7755 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
7756 {
7757 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
7758 }
7759 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08007760}
7761
Jamie Madill2eb65032018-07-30 10:25:57 -04007762bool Context::isGLES1() const
7763{
7764 return mState.getClientVersion() < Version(2, 0);
7765}
7766
Jamie Madilla11819d2018-07-30 10:26:01 -04007767void Context::onSubjectStateChange(const Context *context,
7768 angle::SubjectIndex index,
7769 angle::SubjectMessage message)
7770{
Jamie Madilla11819d2018-07-30 10:26:01 -04007771 switch (index)
7772 {
7773 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007774 switch (message)
7775 {
7776 case angle::SubjectMessage::CONTENTS_CHANGED:
7777 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
7778 mStateCache.onVertexArrayBufferContentsChange(this);
7779 break;
7780 case angle::SubjectMessage::RESOURCE_MAPPED:
7781 case angle::SubjectMessage::RESOURCE_UNMAPPED:
7782 case angle::SubjectMessage::BINDING_CHANGED:
7783 mStateCache.onVertexArrayBufferStateChange(this);
7784 break;
7785 default:
7786 break;
7787 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007788 break;
7789
7790 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007791 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7792 {
7793 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
7794 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007795 break;
7796
7797 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007798 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7799 {
7800 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
7801 }
7802 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04007803 break;
7804
7805 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04007806 if (index < kTextureMaxSubjectIndex)
7807 {
7808 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04007809 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007810 }
Jamie Madille25b8002018-09-20 13:39:49 -04007811 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04007812 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04007813 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04007814 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007815 }
Jamie Madille25b8002018-09-20 13:39:49 -04007816 else
7817 {
7818 ASSERT(index < kSamplerMaxSubjectIndex);
7819 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
7820 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007821 break;
7822 }
7823}
7824
Jamie Madill6b873dd2018-07-12 23:56:30 -04007825// ErrorSet implementation.
7826ErrorSet::ErrorSet(Context *context) : mContext(context)
7827{
7828}
7829
7830ErrorSet::~ErrorSet() = default;
7831
Jamie Madill306b6c12018-07-27 08:12:49 -04007832void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04007833{
7834 // This internal enum is used to filter internal errors that are already handled.
7835 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
7836 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
7837 {
7838 return;
7839 }
7840
7841 if (ANGLE_UNLIKELY(error.isError()))
7842 {
7843 GLenum code = error.getCode();
7844 mErrors.insert(code);
7845 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
7846 {
7847 mContext->markContextLost();
7848 }
7849
7850 ASSERT(!error.getMessage().empty());
7851 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
7852 error.getID(), GL_DEBUG_SEVERITY_HIGH,
7853 error.getMessage());
7854 }
7855}
7856
7857bool ErrorSet::empty() const
7858{
7859 return mErrors.empty();
7860}
7861
7862GLenum ErrorSet::popError()
7863{
7864 ASSERT(!empty());
7865 GLenum error = *mErrors.begin();
7866 mErrors.erase(mErrors.begin());
7867 return error;
7868}
Jamie Madilldc358af2018-07-31 11:22:13 -04007869
7870// StateCache implementation.
Jamie Madill16e28fd2018-09-12 11:03:05 -04007871StateCache::StateCache(Context *context)
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007872 : mCachedHasAnyEnabledClientAttrib(false),
7873 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04007874 mCachedInstancedVertexElementLimit(0),
7875 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madilldc358af2018-07-31 11:22:13 -04007876{
Jamie Madill16e28fd2018-09-12 11:03:05 -04007877 updateValidDrawModes(context);
Jamie Madilldc358af2018-07-31 11:22:13 -04007878}
7879
7880StateCache::~StateCache() = default;
7881
7882void StateCache::updateActiveAttribsMask(Context *context)
7883{
7884 bool isGLES1 = context->isGLES1();
7885 const State &glState = context->getGLState();
7886
7887 if (!isGLES1 && !glState.getProgram())
7888 {
7889 mCachedActiveBufferedAttribsMask = AttributesMask();
7890 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04007891 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04007892 return;
7893 }
7894
7895 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
7896 : glState.getProgram()->getActiveAttribLocationsMask();
7897
7898 const VertexArray *vao = glState.getVertexArray();
7899 ASSERT(vao);
7900
7901 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
7902 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04007903 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04007904
Jamie Madill0a17e482018-08-31 17:19:11 -04007905 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
7906 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04007907 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04007908 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
7909}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007910
7911void StateCache::updateVertexElementLimits(Context *context)
7912{
7913 const VertexArray *vao = context->getGLState().getVertexArray();
7914
7915 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
7916 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
7917
7918 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
7919 // If there are no buffered attributes then we should not limit the draw call count.
7920 if (!vao || !mCachedActiveBufferedAttribsMask.any())
7921 {
7922 return;
7923 }
7924
7925 const auto &vertexAttribs = vao->getVertexAttributes();
7926 const auto &vertexBindings = vao->getVertexBindings();
7927
7928 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
7929 {
7930 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
7931 ASSERT(attrib.enabled);
7932
7933 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
7934 ASSERT(context->isGLES1() ||
7935 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
7936
7937 GLint64 limit = attrib.getCachedElementLimit();
7938 if (binding.getDivisor() > 0)
7939 {
7940 mCachedInstancedVertexElementLimit =
7941 std::min(mCachedInstancedVertexElementLimit, limit);
7942 }
7943 else
7944 {
7945 mCachedNonInstancedVertexElementLimit =
7946 std::min(mCachedNonInstancedVertexElementLimit, limit);
7947 }
7948 }
7949}
Jamie Madillc43cdad2018-08-08 15:49:25 -04007950
Jamie Madilld84b6732018-09-06 15:54:35 -04007951void StateCache::updateBasicDrawStatesError()
7952{
7953 mCachedBasicDrawStatesError = kInvalidPointer;
7954}
7955
7956intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
7957{
7958 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
7959 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
7960 return mCachedBasicDrawStatesError;
7961}
7962
Jamie Madillc43cdad2018-08-08 15:49:25 -04007963void StateCache::onVertexArrayBindingChange(Context *context)
7964{
7965 updateActiveAttribsMask(context);
7966 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04007967 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04007968}
7969
7970void StateCache::onProgramExecutableChange(Context *context)
7971{
7972 updateActiveAttribsMask(context);
7973 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04007974 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04007975 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04007976}
7977
Jamie Madilld84b6732018-09-06 15:54:35 -04007978void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04007979{
7980 updateVertexElementLimits(context);
7981}
7982
Jamie Madilld84b6732018-09-06 15:54:35 -04007983void StateCache::onVertexArrayBufferContentsChange(Context *context)
7984{
7985 updateVertexElementLimits(context);
7986 updateBasicDrawStatesError();
7987}
7988
Jamie Madillc43cdad2018-08-08 15:49:25 -04007989void StateCache::onVertexArrayStateChange(Context *context)
7990{
7991 updateActiveAttribsMask(context);
7992 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04007993 updateBasicDrawStatesError();
7994}
7995
7996void StateCache::onVertexArrayBufferStateChange(Context *context)
7997{
7998 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04007999}
8000
8001void StateCache::onGLES1ClientStateChange(Context *context)
8002{
8003 updateActiveAttribsMask(context);
8004}
Jamie Madilld84b6732018-09-06 15:54:35 -04008005
8006void StateCache::onDrawFramebufferChange(Context *context)
8007{
8008 updateBasicDrawStatesError();
8009}
8010
8011void StateCache::onContextCapChange(Context *context)
8012{
8013 updateBasicDrawStatesError();
8014}
8015
8016void StateCache::onStencilStateChange(Context *context)
8017{
8018 updateBasicDrawStatesError();
8019}
8020
8021void StateCache::onDefaultVertexAttributeChange(Context *context)
8022{
8023 updateBasicDrawStatesError();
8024}
8025
8026void StateCache::onActiveTextureChange(Context *context)
8027{
8028 updateBasicDrawStatesError();
8029}
8030
8031void StateCache::onQueryChange(Context *context)
8032{
8033 updateBasicDrawStatesError();
8034}
8035
8036void StateCache::onTransformFeedbackChange(Context *context)
8037{
8038 updateBasicDrawStatesError();
8039}
8040
8041void StateCache::onUniformBufferStateChange(Context *context)
8042{
8043 updateBasicDrawStatesError();
8044}
8045
8046void StateCache::onBufferBindingChange(Context *context)
8047{
8048 updateBasicDrawStatesError();
8049}
Jamie Madill526a6f62018-09-12 11:03:05 -04008050
8051void StateCache::updateValidDrawModes(Context *context)
8052{
8053 Program *program = context->getGLState().getProgram();
8054 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8055 {
8056 mCachedValidDrawModes = {{
8057 true, /* Points */
8058 true, /* Lines */
8059 true, /* LineLoop */
8060 true, /* LineStrip */
8061 true, /* Triangles */
8062 true, /* TriangleStrip */
8063 true, /* TriangleFan */
8064 false, /* LinesAdjacency */
8065 false, /* LineStripAdjacency */
8066 false, /* TrianglesAdjacency */
8067 false, /* TriangleStripAdjacency */
8068 false, /* InvalidEnum */
8069 }};
8070 }
8071 else
8072 {
8073 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8074
8075 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8076
8077 mCachedValidDrawModes = {{
8078 gsMode == PrimitiveMode::Points, /* Points */
8079 gsMode == PrimitiveMode::Lines, /* Lines */
8080 gsMode == PrimitiveMode::Lines, /* LineLoop */
8081 gsMode == PrimitiveMode::Lines, /* LineStrip */
8082 gsMode == PrimitiveMode::Triangles, /* Triangles */
8083 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8084 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8085 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8086 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8087 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8088 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8089 false, /* InvalidEnum */
8090 }};
8091 }
8092}
Jamie Madillc29968b2016-01-20 11:17:23 -05008093} // namespace gl