blob: 7335733042119aedc48f81804736d5ae54a6010f [file] [log] [blame]
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001//
Geoff Langeeba6e12014-02-03 13:12:30 -05002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Context.cpp: Implements the gl::Context class, managing all GL state and performing
8// rendering operations. It is the GLES2 specific implementation of EGLContext.
9
Geoff Lang2b5420c2014-11-19 14:20:15 -050010#include "libANGLE/Context.h"
apatrick@chromium.org144f2802012-07-12 01:42:34 +000011
Jamie Madill231c7f52017-04-26 13:45:37 -040012#include <string.h>
Jamie Madillb9293972015-02-19 11:07:54 -050013#include <iterator>
14#include <sstream>
Sami Väisänend59ca052016-06-21 16:10:00 +030015#include <vector>
Jamie Madillb9293972015-02-19 11:07:54 -050016
Tobin Ehlisd7890bc2018-06-29 11:57:22 -060017#include "common/PackedEnums.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030018#include "common/matrix_utils.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040019#include "common/platform.h"
Jamie Madillb9293972015-02-19 11:07:54 -050020#include "common/utilities.h"
Geoff Langc339c4e2016-11-29 10:37:36 -050021#include "common/version.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050022#include "libANGLE/Buffer.h"
Jamie Madillb9293972015-02-19 11:07:54 -050023#include "libANGLE/Compiler.h"
Jamie Madill948bbe52017-06-01 13:10:42 -040024#include "libANGLE/Display.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050025#include "libANGLE/Fence.h"
26#include "libANGLE/Framebuffer.h"
27#include "libANGLE/FramebufferAttachment.h"
Lingfeng Yang461b09a2018-04-23 09:02:09 -070028#include "libANGLE/GLES1Renderer.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030029#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050030#include "libANGLE/Program.h"
Yunchao Hea336b902017-08-02 16:05:21 +080031#include "libANGLE/ProgramPipeline.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050032#include "libANGLE/Query.h"
Jamie Madillb9293972015-02-19 11:07:54 -050033#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050034#include "libANGLE/ResourceManager.h"
35#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050036#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050037#include "libANGLE/Texture.h"
38#include "libANGLE/TransformFeedback.h"
39#include "libANGLE/VertexArray.h"
Kenneth Russellf2f6f652016-10-05 19:53:23 -070040#include "libANGLE/Workarounds.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040041#include "libANGLE/formatutils.h"
Martin Radev66fb8202016-07-28 11:45:20 +030042#include "libANGLE/queryconversions.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040043#include "libANGLE/queryutils.h"
Jamie Madill6d32cef2018-08-14 02:34:28 -040044#include "libANGLE/renderer/BufferImpl.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040045#include "libANGLE/renderer/ContextImpl.h"
46#include "libANGLE/renderer/EGLImplFactory.h"
Jamie Madill7b62cf92017-11-02 15:20:49 -040047#include "libANGLE/renderer/Format.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040048#include "libANGLE/validationES.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000049
Geoff Langf6db0982015-08-25 13:04:00 -040050namespace
51{
52
Jamie Madillb6664922017-07-25 12:55:04 -040053#define ANGLE_HANDLE_ERR(X) \
54 handleError(X); \
55 return;
56#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
57
Ian Ewell3ffd78b2016-01-22 16:09:42 -050058template <typename T>
Geoff Lang4ddf5af2016-12-01 14:30:44 -050059std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030060 GLsizei numPaths,
61 const void *paths,
62 GLuint pathBase)
63{
64 std::vector<gl::Path *> ret;
65 ret.reserve(numPaths);
66
67 const auto *nameArray = static_cast<const T *>(paths);
68
69 for (GLsizei i = 0; i < numPaths; ++i)
70 {
71 const GLuint pathName = nameArray[i] + pathBase;
72
73 ret.push_back(resourceManager.getPath(pathName));
74 }
75
76 return ret;
77}
78
Geoff Lang4ddf5af2016-12-01 14:30:44 -050079std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030080 GLsizei numPaths,
81 GLenum pathNameType,
82 const void *paths,
83 GLuint pathBase)
84{
85 switch (pathNameType)
86 {
87 case GL_UNSIGNED_BYTE:
88 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
89
90 case GL_BYTE:
91 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
92
93 case GL_UNSIGNED_SHORT:
94 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
95
96 case GL_SHORT:
97 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
98
99 case GL_UNSIGNED_INT:
100 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
101
102 case GL_INT:
103 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
104 }
105
106 UNREACHABLE();
107 return std::vector<gl::Path *>();
108}
109
110template <typename T>
Jamie Madill5188a272018-07-25 10:53:56 -0400111gl::Error GetQueryObjectParameter(const gl::Context *context,
112 gl::Query *query,
113 GLenum pname,
114 T *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500115{
Geoff Lang2186c382016-10-14 10:54:54 -0400116 ASSERT(query != nullptr);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500117
118 switch (pname)
119 {
120 case GL_QUERY_RESULT_EXT:
Jamie Madill5188a272018-07-25 10:53:56 -0400121 return query->getResult(context, params);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500122 case GL_QUERY_RESULT_AVAILABLE_EXT:
123 {
124 bool available;
Jamie Madill5188a272018-07-25 10:53:56 -0400125 gl::Error error = query->isResultAvailable(context, &available);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500126 if (!error.isError())
127 {
jchen10a99ed552017-09-22 08:10:32 +0800128 *params = gl::CastFromStateValue<T>(pname, static_cast<GLuint>(available));
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500129 }
130 return error;
131 }
132 default:
133 UNREACHABLE();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500134 return gl::InternalError() << "Unreachable Error";
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500135 }
136}
137
Jamie Madill09463932018-04-04 05:26:59 -0400138void MarkTransformFeedbackBufferUsage(const gl::Context *context,
139 gl::TransformFeedback *transformFeedback,
James Darpinian30b604d2018-03-12 17:26:57 -0700140 GLsizei count,
141 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -0400142{
Geoff Lang1a683462015-09-29 15:09:59 -0400143 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400144 {
Jamie Madill09463932018-04-04 05:26:59 -0400145 transformFeedback->onVerticesDrawn(context, count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -0400146 }
147}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500148
149// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300150EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500151{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400152 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500153}
154
Martin Radev1be913c2016-07-11 17:59:16 +0300155EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
156{
157 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
158}
159
Geoff Langeb66a6e2016-10-31 13:06:12 -0400160gl::Version GetClientVersion(const egl::AttributeMap &attribs)
161{
162 return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
163}
164
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500165GLenum GetResetStrategy(const egl::AttributeMap &attribs)
166{
Lingfeng Yangb27b03a2018-02-19 13:38:48 -0800167 EGLAttrib attrib =
168 attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500169 switch (attrib)
170 {
171 case EGL_NO_RESET_NOTIFICATION:
172 return GL_NO_RESET_NOTIFICATION_EXT;
173 case EGL_LOSE_CONTEXT_ON_RESET:
174 return GL_LOSE_CONTEXT_ON_RESET_EXT;
175 default:
176 UNREACHABLE();
177 return GL_NONE;
178 }
179}
180
181bool GetRobustAccess(const egl::AttributeMap &attribs)
182{
Geoff Lang077f20a2016-11-01 10:08:02 -0400183 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
184 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
185 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500186}
187
188bool GetDebug(const egl::AttributeMap &attribs)
189{
Geoff Lang077f20a2016-11-01 10:08:02 -0400190 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
191 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500192}
193
194bool GetNoError(const egl::AttributeMap &attribs)
195{
196 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
197}
198
Geoff Langc287ea62016-09-16 14:46:51 -0400199bool GetWebGLContext(const egl::AttributeMap &attribs)
200{
Jamie Madill4230d482018-09-14 10:14:45 -0400201 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
Geoff Langc287ea62016-09-16 14:46:51 -0400202}
203
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400204bool GetExtensionsEnabled(const egl::AttributeMap &attribs, bool webGLContext)
205{
206 // If the context is WebGL, extensions are disabled by default
207 EGLAttrib defaultValue = webGLContext ? EGL_FALSE : EGL_TRUE;
208 return (attribs.get(EGL_EXTENSIONS_ENABLED_ANGLE, defaultValue) == EGL_TRUE);
209}
210
Geoff Langf41a7152016-09-19 15:11:17 -0400211bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
212{
Jamie Madill4230d482018-09-14 10:14:45 -0400213 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
Geoff Langf41a7152016-09-19 15:11:17 -0400214}
215
Geoff Langfeb8c682017-02-13 16:07:35 -0500216bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
217{
218 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
219}
220
Geoff Langb433e872017-10-05 14:01:47 -0400221bool GetRobustResourceInit(const egl::AttributeMap &attribs)
222{
223 return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
224}
225
Martin Radev9d901792016-07-15 15:58:58 +0300226std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
227{
228 std::string labelName;
229 if (label != nullptr)
230 {
231 size_t labelLength = length < 0 ? strlen(label) : length;
232 labelName = std::string(label, labelLength);
233 }
234 return labelName;
235}
236
237void GetObjectLabelBase(const std::string &objectLabel,
238 GLsizei bufSize,
239 GLsizei *length,
240 GLchar *label)
241{
242 size_t writeLength = objectLabel.length();
243 if (label != nullptr && bufSize > 0)
244 {
245 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
246 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
247 label[writeLength] = '\0';
248 }
249
250 if (length != nullptr)
251 {
252 *length = static_cast<GLsizei>(writeLength);
253 }
254}
255
Jamie Madill0f80ed82017-09-19 00:24:56 -0400256template <typename CapT, typename MaxT>
257void LimitCap(CapT *cap, MaxT maximum)
258{
259 *cap = std::min(*cap, static_cast<CapT>(maximum));
260}
261
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600262constexpr angle::PackedEnumMap<gl::PrimitiveMode, GLsizei> kMinimumPrimitiveCounts = {{
Jamie Madill526a6f62018-09-12 11:03:05 -0400263 1, /* Points */
264 2, /* Lines */
265 2, /* LineLoop */
266 2, /* LineStrip */
267 3, /* Triangles */
268 3, /* TriangleStrip */
269 3, /* TriangleFan */
270 2, /* LinesAdjacency */
271 2, /* LineStripAdjacency */
272 3, /* TrianglesAdjacency */
273 3, /* TriangleStripAdjacency */
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600274}};
275// Indices above are code-gen'd so make sure they don't change
276// if any of these static asserts are hit, must update kMinimumPrimitiveCounts abouve
277static_assert(static_cast<gl::PrimitiveMode>(0) == gl::PrimitiveMode::Points,
278 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
279static_assert(static_cast<gl::PrimitiveMode>(1) == gl::PrimitiveMode::Lines,
280 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
281static_assert(static_cast<gl::PrimitiveMode>(2) == gl::PrimitiveMode::LineLoop,
282 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
283static_assert(static_cast<gl::PrimitiveMode>(3) == gl::PrimitiveMode::LineStrip,
284 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
285static_assert(static_cast<gl::PrimitiveMode>(4) == gl::PrimitiveMode::Triangles,
286 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
287static_assert(static_cast<gl::PrimitiveMode>(5) == gl::PrimitiveMode::TriangleStrip,
288 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
289static_assert(static_cast<gl::PrimitiveMode>(6) == gl::PrimitiveMode::TriangleFan,
290 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
291static_assert(static_cast<gl::PrimitiveMode>(7) == gl::PrimitiveMode::LinesAdjacency,
292 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
293static_assert(static_cast<gl::PrimitiveMode>(8) == gl::PrimitiveMode::LineStripAdjacency,
294 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
295static_assert(static_cast<gl::PrimitiveMode>(9) == gl::PrimitiveMode::TrianglesAdjacency,
296 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
297static_assert(static_cast<gl::PrimitiveMode>(10) == gl::PrimitiveMode::TriangleStripAdjacency,
298 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
299static_assert(static_cast<gl::PrimitiveMode>(11) == gl::PrimitiveMode::EnumCount,
300 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
301
Jamie Madill6d32cef2018-08-14 02:34:28 -0400302enum SubjectIndexes : angle::SubjectIndex
303{
304 kTexture0SubjectIndex = 0,
305 kTextureMaxSubjectIndex = kTexture0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
306 kUniformBuffer0SubjectIndex = kTextureMaxSubjectIndex,
307 kUniformBufferMaxSubjectIndex =
308 kUniformBuffer0SubjectIndex + gl::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS,
Jamie Madille25b8002018-09-20 13:39:49 -0400309 kSampler0SubjectIndex = kUniformBufferMaxSubjectIndex,
310 kSamplerMaxSubjectIndex = kSampler0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
311 kVertexArraySubjectIndex = kSamplerMaxSubjectIndex,
Jamie Madill6d32cef2018-08-14 02:34:28 -0400312 kReadFramebufferSubjectIndex,
313 kDrawFramebufferSubjectIndex
314};
Geoff Langf6db0982015-08-25 13:04:00 -0400315} // anonymous namespace
316
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000317namespace gl
318{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000319
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400320Context::Context(rx::EGLImplFactory *implFactory,
321 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400322 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500323 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400324 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500325 const egl::AttributeMap &attribs,
Brandon Jones2b0cdcc2018-05-02 08:02:50 -0700326 const egl::DisplayExtensions &displayExtensions,
327 const egl::ClientExtensions &clientExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500328 : mState(reinterpret_cast<ContextID>(this),
329 shareContext ? &shareContext->mState : nullptr,
330 shareTextures,
331 GetClientVersion(attribs),
332 &mGLState,
333 mCaps,
334 mTextureCaps,
335 mExtensions,
336 mLimitations),
337 mSkipValidation(GetNoError(attribs)),
338 mDisplayTextureShareGroup(shareTextures != nullptr),
339 mSavedArgsType(nullptr),
Geoff Lang3cacf692018-06-20 16:49:57 -0400340 mImplementation(implFactory->createContext(mState, config, shareContext, attribs)),
Geoff Lang75359662018-04-11 01:42:27 -0400341 mLabel(nullptr),
Jamie Madill2f348d22017-06-05 10:50:59 -0400342 mCompiler(),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400343 mGLState(GetDebug(attribs),
344 GetBindGeneratesResource(attribs),
345 GetClientArraysEnabled(attribs),
346 GetRobustResourceInit(attribs),
347 memoryProgramCache != nullptr),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400348 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500349 mClientType(EGL_OPENGL_ES_API),
Jamie Madill6b873dd2018-07-12 23:56:30 -0400350 mErrors(this),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500351 mHasBeenCurrent(false),
352 mContextLost(false),
353 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700354 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500355 mResetStrategy(GetResetStrategy(attribs)),
356 mRobustAccess(GetRobustAccess(attribs)),
Geoff Lang33f11fb2018-05-07 13:42:47 -0400357 mSurfacelessSupported(displayExtensions.surfacelessContext),
358 mExplicitContextAvailable(clientExtensions.explicitContext),
Jamie Madill61e16b42017-06-19 11:13:23 -0400359 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
360 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madille14951e2017-03-09 18:55:16 -0500361 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400362 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400363 mMemoryProgramCache(memoryProgramCache),
Jamie Madill16e28fd2018-09-12 11:03:05 -0400364 mStateCache(this),
Jamie Madilla11819d2018-07-30 10:26:01 -0400365 mVertexArrayObserverBinding(this, kVertexArraySubjectIndex),
366 mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex),
367 mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400368 mScratchBuffer(1000u),
jchen107ae70d82018-07-06 13:47:01 +0800369 mZeroFilledBuffer(1000u),
370 mThreadPool(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000371{
Jamie Madill5b772312018-03-08 20:28:32 -0500372 // Needed to solve a Clang warning of unused variables.
Jamie Madillc6dbc252018-04-30 19:07:56 -0400373 ANGLE_UNUSED_VARIABLE(mSavedArgsType);
374 ANGLE_UNUSED_VARIABLE(mParamsBuffer);
Jamie Madill6d32cef2018-08-14 02:34:28 -0400375
376 for (angle::SubjectIndex uboIndex = kUniformBuffer0SubjectIndex;
377 uboIndex < kUniformBufferMaxSubjectIndex; ++uboIndex)
378 {
379 mUniformBufferObserverBindings.emplace_back(this, uboIndex);
380 }
Jamie Madille25b8002018-09-20 13:39:49 -0400381
382 for (angle::SubjectIndex samplerIndex = kSampler0SubjectIndex;
383 samplerIndex < kSamplerMaxSubjectIndex; ++samplerIndex)
384 {
385 mSamplerObserverBindings.emplace_back(this, samplerIndex);
386 }
Geoff Lang33f11fb2018-05-07 13:42:47 -0400387}
Jamie Madill5b772312018-03-08 20:28:32 -0500388
Geoff Lang33f11fb2018-05-07 13:42:47 -0400389void Context::initialize()
390{
391 mImplementation->setMemoryProgramCache(mMemoryProgramCache);
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400392
Geoff Lang33f11fb2018-05-07 13:42:47 -0400393 initCaps();
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700394 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400395
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400396 mGLState.initialize(this);
Régis Fénéon83107972015-02-05 12:57:44 +0100397
Shannon Woods53a94a82014-06-24 15:20:36 -0400398 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400399
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000400 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400401 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000402 // and cube map texture state vectors respectively associated with them.
403 // In order that access to these initial textures not be lost, they are treated as texture
404 // objects all of whose names are 0.
405
Corentin Wallez99d492c2018-02-27 15:17:10 -0500406 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800407 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500408
Corentin Wallez99d492c2018-02-27 15:17:10 -0500409 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800410 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400411
Geoff Langeb66a6e2016-10-31 13:06:12 -0400412 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400413 {
414 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500415 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800416 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400417
Corentin Wallez99d492c2018-02-27 15:17:10 -0500418 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800419 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400420 }
Geoff Lang3b573612016-10-31 14:08:10 -0400421 if (getClientVersion() >= Version(3, 1))
422 {
Olli Etuahod310a432018-08-24 15:40:23 +0300423 // TODO(http://anglebug.com/2775): These could also be enabled via extension
Geoff Lang3b573612016-10-31 14:08:10 -0400424 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500425 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800426 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Olli Etuahod310a432018-08-24 15:40:23 +0300427 Texture *zeroTexture2DMultisampleArray =
428 new Texture(mImplementation.get(), 0, TextureType::_2DMultisampleArray);
429 mZeroTextures[TextureType::_2DMultisampleArray].set(this, zeroTexture2DMultisampleArray);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800430
Jiajia Qin6eafb042016-12-27 17:04:07 +0800431 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
432 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800433 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800434 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800435
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800436 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
437 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400438 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800439 }
Geoff Lang3b573612016-10-31 14:08:10 -0400440 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000441
Geoff Langb0f917f2017-12-05 13:41:54 -0500442 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400443 {
444 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500445 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800446 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400447 }
448
Geoff Langb0f917f2017-12-05 13:41:54 -0500449 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400450 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500451 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800452 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400453 }
454
Jamie Madill4928b7c2017-06-20 12:57:39 -0400455 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500456
Jamie Madill57a89722013-07-02 11:57:03 -0400457 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000458
Geoff Langeb66a6e2016-10-31 13:06:12 -0400459 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400460 {
461 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
462 // In the initial state, a default transform feedback object is bound and treated as
463 // a transform feedback object with a name of zero. That object is bound any time
464 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400465 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400466 }
Geoff Langc8058452014-02-03 12:04:11 -0500467
Corentin Wallez336129f2017-10-17 15:55:40 -0400468 for (auto type : angle::AllEnums<BufferBinding>())
469 {
470 bindBuffer(type, 0);
471 }
472
473 bindRenderbuffer(GL_RENDERBUFFER, 0);
474
475 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
476 {
477 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
478 }
479
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700480 // Initialize GLES1 renderer if appropriate.
481 if (getClientVersion() < Version(2, 0))
482 {
483 mGLES1Renderer.reset(new GLES1Renderer());
484 }
485
Jamie Madillad9f24e2016-02-12 09:27:24 -0500486 // Initialize dirty bit masks
Geoff Lang9bf86f02018-07-26 11:46:34 -0400487 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
488 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
489 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400490 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400491 mDrawDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400492
493 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
494 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
495 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madille25b8002018-09-20 13:39:49 -0400496 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400497
Jamie Madillc67323a2017-11-02 23:11:41 -0400498 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500499 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500500 // No dirty objects.
501
502 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400503 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500504 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400505 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500506 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
507
508 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
509 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
510 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
511 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
512 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
513 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
514 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
515 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
516 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
517 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
518 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400519 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500520 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
521
522 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
523 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700524 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400525 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
526 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500527 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
528 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400529
Xinghua Cao10a4d432017-11-28 14:46:26 +0800530 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
jchen1099118c12018-09-10 16:28:51 +0800531 mComputeDirtyBits.set(State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
532 mComputeDirtyBits.set(State::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800533 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
534 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
535 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
536 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
jchen1099118c12018-09-10 16:28:51 +0800537 mComputeDirtyBits.set(State::DIRTY_BIT_IMAGE_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800538 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800539 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400540 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400541 mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800542
Jamie Madillb4927eb2018-07-16 11:39:46 -0400543 mImplementation->setErrorSet(&mErrors);
544
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400545 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000546}
547
Jamie Madill4928b7c2017-06-20 12:57:39 -0400548egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000549{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700550 if (mGLES1Renderer)
551 {
552 mGLES1Renderer->onDestroy(this, &mGLState);
553 }
554
Jamie Madille7b3fe22018-04-05 09:42:46 -0400555 // Delete the Surface first to trigger a finish() in Vulkan.
Jamie Madille7b3fe22018-04-05 09:42:46 -0400556 ANGLE_TRY(releaseSurface(display));
557
Corentin Wallez80b24112015-08-25 16:41:57 -0400558 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000559 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400560 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000561 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400562 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000563
Corentin Wallez80b24112015-08-25 16:41:57 -0400564 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000565 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400566 if (query.second != nullptr)
567 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400568 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400569 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000570 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400571 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000572
Corentin Wallez80b24112015-08-25 16:41:57 -0400573 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400574 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400575 if (vertexArray.second)
576 {
577 vertexArray.second->onDestroy(this);
578 }
Jamie Madill57a89722013-07-02 11:57:03 -0400579 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400580 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400581
Corentin Wallez80b24112015-08-25 16:41:57 -0400582 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500583 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500584 if (transformFeedback.second != nullptr)
585 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500586 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500587 }
Geoff Langc8058452014-02-03 12:04:11 -0500588 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400589 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500590
Jamie Madill5b772312018-03-08 20:28:32 -0500591 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400592 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800593 if (zeroTexture.get() != nullptr)
594 {
595 ANGLE_TRY(zeroTexture->onDestroy(this));
596 zeroTexture.set(this, nullptr);
597 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400598 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000599
Jamie Madill2f348d22017-06-05 10:50:59 -0400600 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500601
Jamie Madill4928b7c2017-06-20 12:57:39 -0400602 mGLState.reset(this);
603
Jamie Madill6c1f6712017-02-14 19:08:04 -0500604 mState.mBuffers->release(this);
605 mState.mShaderPrograms->release(this);
606 mState.mTextures->release(this);
607 mState.mRenderbuffers->release(this);
608 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400609 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500610 mState.mPaths->release(this);
611 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800612 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400613
jchen107ae70d82018-07-06 13:47:01 +0800614 mThreadPool.reset();
615
Jamie Madill76e471e2017-10-21 09:56:01 -0400616 mImplementation->onDestroy(this);
617
Jamie Madill4928b7c2017-06-20 12:57:39 -0400618 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000619}
620
Jamie Madill70ee0f62017-02-06 16:04:20 -0500621Context::~Context()
622{
623}
624
Geoff Lang75359662018-04-11 01:42:27 -0400625void Context::setLabel(EGLLabelKHR label)
626{
627 mLabel = label;
628}
629
630EGLLabelKHR Context::getLabel() const
631{
632 return mLabel;
633}
634
Jamie Madill4928b7c2017-06-20 12:57:39 -0400635egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000636{
Jamie Madill61e16b42017-06-19 11:13:23 -0400637 mCurrentDisplay = display;
638
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000639 if (!mHasBeenCurrent)
640 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400641 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000642 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500643 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400644 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000645
Corentin Wallezc295e512017-01-27 17:47:50 -0500646 int width = 0;
647 int height = 0;
648 if (surface != nullptr)
649 {
650 width = surface->getWidth();
651 height = surface->getHeight();
652 }
653
654 mGLState.setViewportParams(0, 0, width, height);
655 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000656
657 mHasBeenCurrent = true;
658 }
659
Jamie Madill1b94d432015-08-07 13:23:23 -0400660 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700661 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400662 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400663
Jamie Madill4928b7c2017-06-20 12:57:39 -0400664 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500665
666 Framebuffer *newDefault = nullptr;
667 if (surface != nullptr)
668 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400669 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500670 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400671 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500672 }
673 else
674 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400675 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500676 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000677
Corentin Wallez37c39792015-08-20 14:19:46 -0400678 // Update default framebuffer, the binding of the previous default
679 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400680 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400681 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700682 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400683 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400684 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400685 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700686 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400687 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400688 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400689 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400690 }
Ian Ewell292f0052016-02-04 10:37:32 -0500691
692 // Notify the renderer of a context switch
Luc Ferron5396f2a2018-07-12 08:24:23 -0400693 ANGLE_TRY(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400694 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000695}
696
Jamie Madill4928b7c2017-06-20 12:57:39 -0400697egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400698{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400699 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400700
Geoff Langbf7b95d2018-05-01 16:48:21 -0400701 // Remove the default framebuffer
702 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500703 {
704 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400705 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500706 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400707
708 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500709 {
710 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400711 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500712 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400713
714 if (defaultFramebuffer)
715 {
716 defaultFramebuffer->onDestroy(this);
717 delete defaultFramebuffer;
718 }
719
Corentin Wallezc295e512017-01-27 17:47:50 -0500720 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
721
722 if (mCurrentSurface)
723 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400724 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500725 mCurrentSurface = nullptr;
726 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400727
728 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400729}
730
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000731GLuint Context::createBuffer()
732{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500733 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000734}
735
736GLuint Context::createProgram()
737{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500738 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000739}
740
Jiawei Shao385b3e02018-03-21 09:43:28 +0800741GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000742{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500743 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000744}
745
746GLuint Context::createTexture()
747{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500748 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000749}
750
751GLuint Context::createRenderbuffer()
752{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500753 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000754}
755
Jamie Madill13951342018-09-30 15:24:28 -0400756void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
757{
758 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(mImplementation.get(), range, createdOut));
759}
760
Brandon Jones59770802018-04-02 13:18:42 -0700761GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300762{
Jamie Madill13951342018-09-30 15:24:28 -0400763 GLuint created = 0;
764 tryGenPaths(range, &created);
765 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300766}
767
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000768// Returns an unused framebuffer name
769GLuint Context::createFramebuffer()
770{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500771 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000772}
773
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500774void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000775{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500776 for (int i = 0; i < n; i++)
777 {
778 GLuint handle = mFenceNVHandleAllocator.allocate();
779 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
780 fences[i] = handle;
781 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000782}
783
Yunchao Hea336b902017-08-02 16:05:21 +0800784GLuint Context::createProgramPipeline()
785{
786 return mState.mPipelines->createProgramPipeline();
787}
788
Jiawei Shao385b3e02018-03-21 09:43:28 +0800789GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800790{
791 UNIMPLEMENTED();
792 return 0u;
793}
794
James Darpinian4d9d4832018-03-13 12:43:28 -0700795void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000796{
James Darpinian4d9d4832018-03-13 12:43:28 -0700797 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
798 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000799 {
800 detachBuffer(buffer);
801 }
Jamie Madill893ab082014-05-16 16:56:10 -0400802
James Darpinian4d9d4832018-03-13 12:43:28 -0700803 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000804}
805
806void Context::deleteShader(GLuint shader)
807{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500808 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000809}
810
811void Context::deleteProgram(GLuint program)
812{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500813 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000814}
815
816void Context::deleteTexture(GLuint texture)
817{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500818 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000819 {
820 detachTexture(texture);
821 }
822
Jamie Madill6c1f6712017-02-14 19:08:04 -0500823 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000824}
825
826void Context::deleteRenderbuffer(GLuint renderbuffer)
827{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500828 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000829 {
830 detachRenderbuffer(renderbuffer);
831 }
Jamie Madill893ab082014-05-16 16:56:10 -0400832
Jamie Madill6c1f6712017-02-14 19:08:04 -0500833 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000834}
835
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400836void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400837{
838 // The spec specifies the underlying Fence object is not deleted until all current
839 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
840 // and since our API is currently designed for being called from a single thread, we can delete
841 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400842 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400843}
844
Yunchao Hea336b902017-08-02 16:05:21 +0800845void Context::deleteProgramPipeline(GLuint pipeline)
846{
847 if (mState.mPipelines->getProgramPipeline(pipeline))
848 {
849 detachProgramPipeline(pipeline);
850 }
851
852 mState.mPipelines->deleteObject(this, pipeline);
853}
854
Sami Väisänene45e53b2016-05-25 10:36:04 +0300855void Context::deletePaths(GLuint first, GLsizei range)
856{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500857 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300858}
859
Brandon Jones59770802018-04-02 13:18:42 -0700860bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300861{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500862 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300863 if (pathObj == nullptr)
864 return false;
865
866 return pathObj->hasPathData();
867}
868
Brandon Jones59770802018-04-02 13:18:42 -0700869bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300870{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500871 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300872}
873
Brandon Jones59770802018-04-02 13:18:42 -0700874void Context::pathCommands(GLuint path,
875 GLsizei numCommands,
876 const GLubyte *commands,
877 GLsizei numCoords,
878 GLenum coordType,
879 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300880{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500881 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300882
883 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
884}
885
Jamie Madill007530e2017-12-28 14:27:04 -0500886void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300887{
Jamie Madill007530e2017-12-28 14:27:04 -0500888 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300889
890 switch (pname)
891 {
892 case GL_PATH_STROKE_WIDTH_CHROMIUM:
893 pathObj->setStrokeWidth(value);
894 break;
895 case GL_PATH_END_CAPS_CHROMIUM:
896 pathObj->setEndCaps(static_cast<GLenum>(value));
897 break;
898 case GL_PATH_JOIN_STYLE_CHROMIUM:
899 pathObj->setJoinStyle(static_cast<GLenum>(value));
900 break;
901 case GL_PATH_MITER_LIMIT_CHROMIUM:
902 pathObj->setMiterLimit(value);
903 break;
904 case GL_PATH_STROKE_BOUND_CHROMIUM:
905 pathObj->setStrokeBound(value);
906 break;
907 default:
908 UNREACHABLE();
909 break;
910 }
911}
912
Jamie Madill007530e2017-12-28 14:27:04 -0500913void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300914{
Jamie Madill007530e2017-12-28 14:27:04 -0500915 // TODO(jmadill): Should use proper clamping/casting.
916 pathParameterf(path, pname, static_cast<GLfloat>(value));
917}
918
919void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
920{
921 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300922
923 switch (pname)
924 {
925 case GL_PATH_STROKE_WIDTH_CHROMIUM:
926 *value = pathObj->getStrokeWidth();
927 break;
928 case GL_PATH_END_CAPS_CHROMIUM:
929 *value = static_cast<GLfloat>(pathObj->getEndCaps());
930 break;
931 case GL_PATH_JOIN_STYLE_CHROMIUM:
932 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
933 break;
934 case GL_PATH_MITER_LIMIT_CHROMIUM:
935 *value = pathObj->getMiterLimit();
936 break;
937 case GL_PATH_STROKE_BOUND_CHROMIUM:
938 *value = pathObj->getStrokeBound();
939 break;
940 default:
941 UNREACHABLE();
942 break;
943 }
944}
945
Jamie Madill007530e2017-12-28 14:27:04 -0500946void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
947{
948 GLfloat val = 0.0f;
949 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
950 if (value)
951 *value = static_cast<GLint>(val);
952}
953
Brandon Jones59770802018-04-02 13:18:42 -0700954void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300955{
956 mGLState.setPathStencilFunc(func, ref, mask);
957}
958
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000959void Context::deleteFramebuffer(GLuint framebuffer)
960{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500961 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000962 {
963 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000964 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500965
Jamie Madill6c1f6712017-02-14 19:08:04 -0500966 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000967}
968
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500969void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000970{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500971 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000972 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500973 GLuint fence = fences[i];
974
975 FenceNV *fenceObject = nullptr;
976 if (mFenceNVMap.erase(fence, &fenceObject))
977 {
978 mFenceNVHandleAllocator.release(fence);
979 delete fenceObject;
980 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000981 }
982}
983
Geoff Lang70d0f492015-12-10 17:45:46 -0500984Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000985{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500986 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000987}
988
Geoff Lang70d0f492015-12-10 17:45:46 -0500989Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000990{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500991 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000992}
993
Jamie Madill70b5bb02017-08-28 13:32:37 -0400994Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400995{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400996 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400997}
998
Jamie Madill57a89722013-07-02 11:57:03 -0400999VertexArray *Context::getVertexArray(GLuint handle) const
1000{
Jamie Madill96a483b2017-06-27 16:49:21 -04001001 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -04001002}
1003
Jamie Madilldc356042013-07-19 16:36:57 -04001004Sampler *Context::getSampler(GLuint handle) const
1005{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001006 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -04001007}
1008
Geoff Langc8058452014-02-03 12:04:11 -05001009TransformFeedback *Context::getTransformFeedback(GLuint handle) const
1010{
Jamie Madill96a483b2017-06-27 16:49:21 -04001011 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -05001012}
1013
Yunchao Hea336b902017-08-02 16:05:21 +08001014ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
1015{
1016 return mState.mPipelines->getProgramPipeline(handle);
1017}
1018
Geoff Lang75359662018-04-11 01:42:27 -04001019gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001020{
1021 switch (identifier)
1022 {
1023 case GL_BUFFER:
1024 return getBuffer(name);
1025 case GL_SHADER:
1026 return getShader(name);
1027 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04001028 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -05001029 case GL_VERTEX_ARRAY:
1030 return getVertexArray(name);
1031 case GL_QUERY:
1032 return getQuery(name);
1033 case GL_TRANSFORM_FEEDBACK:
1034 return getTransformFeedback(name);
1035 case GL_SAMPLER:
1036 return getSampler(name);
1037 case GL_TEXTURE:
1038 return getTexture(name);
1039 case GL_RENDERBUFFER:
1040 return getRenderbuffer(name);
1041 case GL_FRAMEBUFFER:
1042 return getFramebuffer(name);
1043 default:
1044 UNREACHABLE();
1045 return nullptr;
1046 }
1047}
1048
Geoff Lang75359662018-04-11 01:42:27 -04001049gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001050{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001051 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001052}
1053
Martin Radev9d901792016-07-15 15:58:58 +03001054void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1055{
Geoff Lang75359662018-04-11 01:42:27 -04001056 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001057 ASSERT(object != nullptr);
1058
1059 std::string labelName = GetObjectLabelFromPointer(length, label);
1060 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001061
1062 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1063 // specified object is active until we do this.
1064 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001065}
1066
1067void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1068{
Geoff Lang75359662018-04-11 01:42:27 -04001069 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001070 ASSERT(object != nullptr);
1071
1072 std::string labelName = GetObjectLabelFromPointer(length, label);
1073 object->setLabel(labelName);
1074}
1075
1076void Context::getObjectLabel(GLenum identifier,
1077 GLuint name,
1078 GLsizei bufSize,
1079 GLsizei *length,
1080 GLchar *label) const
1081{
Geoff Lang75359662018-04-11 01:42:27 -04001082 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001083 ASSERT(object != nullptr);
1084
1085 const std::string &objectLabel = object->getLabel();
1086 GetObjectLabelBase(objectLabel, bufSize, length, label);
1087}
1088
1089void Context::getObjectPtrLabel(const void *ptr,
1090 GLsizei bufSize,
1091 GLsizei *length,
1092 GLchar *label) const
1093{
Geoff Lang75359662018-04-11 01:42:27 -04001094 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001095 ASSERT(object != nullptr);
1096
1097 const std::string &objectLabel = object->getLabel();
1098 GetObjectLabelBase(objectLabel, bufSize, length, label);
1099}
1100
Jamie Madilldc356042013-07-19 16:36:57 -04001101bool Context::isSampler(GLuint samplerName) const
1102{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001103 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001104}
1105
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001106void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001107{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001108 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001109
Jamie Madilldedd7b92014-11-05 16:30:36 -05001110 if (handle == 0)
1111 {
1112 texture = mZeroTextures[target].get();
1113 }
1114 else
1115 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001116 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001117 }
1118
1119 ASSERT(texture);
Jamie Madill14246812018-10-03 17:51:16 -04001120 ANGLE_CONTEXT_TRY(mGLState.setSamplerTexture(this, target, texture));
Jamie Madilld84b6732018-09-06 15:54:35 -04001121 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001122}
1123
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001124void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001125{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001126 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1127 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001128 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001129 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001130}
1131
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001132void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001133{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001134 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1135 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001136 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001137 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001138 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001139}
1140
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001141void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001142{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001143 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001144 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001145 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001146 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001147}
1148
Shao80957d92017-02-20 21:25:59 +08001149void Context::bindVertexBuffer(GLuint bindingIndex,
1150 GLuint bufferHandle,
1151 GLintptr offset,
1152 GLsizei stride)
1153{
1154 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001155 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001156 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001157}
1158
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001159void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001160{
Geoff Lang76b10c92014-09-05 16:28:14 -04001161 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001162 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001163 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001164 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001165 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001166}
1167
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001168void Context::bindImageTexture(GLuint unit,
1169 GLuint texture,
1170 GLint level,
1171 GLboolean layered,
1172 GLint layer,
1173 GLenum access,
1174 GLenum format)
1175{
1176 Texture *tex = mState.mTextures->getTexture(texture);
1177 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1178}
1179
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001180void Context::useProgram(GLuint program)
1181{
Jamie Madille3bb6b72018-10-03 17:51:15 -04001182 ANGLE_CONTEXT_TRY(mGLState.setProgram(this, getProgramResolveLink(program)));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001183 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001184}
1185
Jiajia Qin5451d532017-11-16 17:16:34 +08001186void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1187{
1188 UNIMPLEMENTED();
1189}
1190
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001191void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001192{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001193 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001194 TransformFeedback *transformFeedback =
1195 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001196 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Jamie Madilld84b6732018-09-06 15:54:35 -04001197 mStateCache.onTransformFeedbackChange(this);
Geoff Langc8058452014-02-03 12:04:11 -05001198}
1199
Yunchao Hea336b902017-08-02 16:05:21 +08001200void Context::bindProgramPipeline(GLuint pipelineHandle)
1201{
1202 ProgramPipeline *pipeline =
1203 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1204 mGLState.setProgramPipelineBinding(this, pipeline);
1205}
1206
Corentin Wallezad3ae902018-03-09 13:40:42 -05001207void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001208{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001209 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001210 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001211
Geoff Lang5aad9672014-09-08 11:10:42 -04001212 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001213 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001214
1215 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001216 mGLState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001217 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001218}
1219
Corentin Wallezad3ae902018-03-09 13:40:42 -05001220void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001221{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001222 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001223 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001224
Jamie Madill5188a272018-07-25 10:53:56 -04001225 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001226
Geoff Lang5aad9672014-09-08 11:10:42 -04001227 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001228 mGLState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001229 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001230}
1231
Corentin Wallezad3ae902018-03-09 13:40:42 -05001232void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001233{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001234 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001235
1236 Query *queryObject = getQuery(id, true, target);
1237 ASSERT(queryObject);
1238
Jamie Madill5188a272018-07-25 10:53:56 -04001239 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001240}
1241
Corentin Wallezad3ae902018-03-09 13:40:42 -05001242void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001243{
1244 switch (pname)
1245 {
1246 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001247 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001248 break;
1249 case GL_QUERY_COUNTER_BITS_EXT:
1250 switch (target)
1251 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001252 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001253 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1254 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001255 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001256 params[0] = getExtensions().queryCounterBitsTimestamp;
1257 break;
1258 default:
1259 UNREACHABLE();
1260 params[0] = 0;
1261 break;
1262 }
1263 break;
1264 default:
1265 UNREACHABLE();
1266 return;
1267 }
1268}
1269
Corentin Wallezad3ae902018-03-09 13:40:42 -05001270void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001271 GLenum pname,
1272 GLsizei bufSize,
1273 GLsizei *length,
1274 GLint *params)
1275{
1276 getQueryiv(target, pname, params);
1277}
1278
Geoff Lang2186c382016-10-14 10:54:54 -04001279void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001280{
Jamie Madill5188a272018-07-25 10:53:56 -04001281 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001282}
1283
Brandon Jones59770802018-04-02 13:18:42 -07001284void Context::getQueryObjectivRobust(GLuint id,
1285 GLenum pname,
1286 GLsizei bufSize,
1287 GLsizei *length,
1288 GLint *params)
1289{
1290 getQueryObjectiv(id, pname, params);
1291}
1292
Geoff Lang2186c382016-10-14 10:54:54 -04001293void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001294{
Jamie Madill5188a272018-07-25 10:53:56 -04001295 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001296}
1297
Brandon Jones59770802018-04-02 13:18:42 -07001298void Context::getQueryObjectuivRobust(GLuint id,
1299 GLenum pname,
1300 GLsizei bufSize,
1301 GLsizei *length,
1302 GLuint *params)
1303{
1304 getQueryObjectuiv(id, pname, params);
1305}
1306
Geoff Lang2186c382016-10-14 10:54:54 -04001307void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001308{
Jamie Madill5188a272018-07-25 10:53:56 -04001309 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001310}
1311
Brandon Jones59770802018-04-02 13:18:42 -07001312void Context::getQueryObjecti64vRobust(GLuint id,
1313 GLenum pname,
1314 GLsizei bufSize,
1315 GLsizei *length,
1316 GLint64 *params)
1317{
1318 getQueryObjecti64v(id, pname, params);
1319}
1320
Geoff Lang2186c382016-10-14 10:54:54 -04001321void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001322{
Jamie Madill5188a272018-07-25 10:53:56 -04001323 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001324}
1325
Brandon Jones59770802018-04-02 13:18:42 -07001326void Context::getQueryObjectui64vRobust(GLuint id,
1327 GLenum pname,
1328 GLsizei bufSize,
1329 GLsizei *length,
1330 GLuint64 *params)
1331{
1332 getQueryObjectui64v(id, pname, params);
1333}
1334
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001335Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001336{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001337 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001338}
1339
Jamie Madill2f348d22017-06-05 10:50:59 -04001340FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001341{
Jamie Madill96a483b2017-06-27 16:49:21 -04001342 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001343}
1344
Corentin Wallezad3ae902018-03-09 13:40:42 -05001345Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001346{
Jamie Madill96a483b2017-06-27 16:49:21 -04001347 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001348 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001349 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001350 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001351
1352 Query *query = mQueryMap.query(handle);
1353 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001354 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001355 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001356 query = new Query(mImplementation->createQuery(type), handle);
1357 query->addRef();
1358 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001359 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001360 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001361}
1362
Geoff Lang70d0f492015-12-10 17:45:46 -05001363Query *Context::getQuery(GLuint handle) const
1364{
Jamie Madill96a483b2017-06-27 16:49:21 -04001365 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001366}
1367
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001368Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001369{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001370 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1371 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001372}
1373
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001374Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001375{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001376 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001377}
1378
Geoff Lang492a7e42014-11-05 13:27:06 -05001379Compiler *Context::getCompiler() const
1380{
Jamie Madill2f348d22017-06-05 10:50:59 -04001381 if (mCompiler.get() == nullptr)
1382 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001383 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001384 }
1385 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001386}
1387
Jamie Madillc1d770e2017-04-13 17:31:24 -04001388void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001389{
1390 switch (pname)
1391 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001392 case GL_SHADER_COMPILER:
1393 *params = GL_TRUE;
1394 break;
1395 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1396 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1397 break;
1398 default:
1399 mGLState.getBooleanv(pname, params);
1400 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001401 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001402}
1403
Jamie Madillc1d770e2017-04-13 17:31:24 -04001404void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001405{
Shannon Woods53a94a82014-06-24 15:20:36 -04001406 // Queries about context capabilities and maximums are answered by Context.
1407 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001408 switch (pname)
1409 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001410 case GL_ALIASED_LINE_WIDTH_RANGE:
1411 params[0] = mCaps.minAliasedLineWidth;
1412 params[1] = mCaps.maxAliasedLineWidth;
1413 break;
1414 case GL_ALIASED_POINT_SIZE_RANGE:
1415 params[0] = mCaps.minAliasedPointSize;
1416 params[1] = mCaps.maxAliasedPointSize;
1417 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001418 case GL_SMOOTH_POINT_SIZE_RANGE:
1419 params[0] = mCaps.minSmoothPointSize;
1420 params[1] = mCaps.maxSmoothPointSize;
1421 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001422 case GL_SMOOTH_LINE_WIDTH_RANGE:
1423 params[0] = mCaps.minSmoothLineWidth;
1424 params[1] = mCaps.maxSmoothLineWidth;
1425 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001426 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1427 ASSERT(mExtensions.textureFilterAnisotropic);
1428 *params = mExtensions.maxTextureAnisotropy;
1429 break;
1430 case GL_MAX_TEXTURE_LOD_BIAS:
1431 *params = mCaps.maxLODBias;
1432 break;
1433
1434 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1435 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1436 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001437 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1438 // GLES1 constants for modelview/projection matrix.
1439 if (getClientVersion() < Version(2, 0))
1440 {
1441 mGLState.getFloatv(pname, params);
1442 }
1443 else
1444 {
1445 ASSERT(mExtensions.pathRendering);
1446 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1447 memcpy(params, m, 16 * sizeof(GLfloat));
1448 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001449 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001450 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001451
Jamie Madill231c7f52017-04-26 13:45:37 -04001452 default:
1453 mGLState.getFloatv(pname, params);
1454 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001455 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001456}
1457
Jamie Madillc1d770e2017-04-13 17:31:24 -04001458void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001459{
Shannon Woods53a94a82014-06-24 15:20:36 -04001460 // Queries about context capabilities and maximums are answered by Context.
1461 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001462
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001463 switch (pname)
1464 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001465 case GL_MAX_VERTEX_ATTRIBS:
1466 *params = mCaps.maxVertexAttributes;
1467 break;
1468 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1469 *params = mCaps.maxVertexUniformVectors;
1470 break;
1471 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001472 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001473 break;
1474 case GL_MAX_VARYING_VECTORS:
1475 *params = mCaps.maxVaryingVectors;
1476 break;
1477 case GL_MAX_VARYING_COMPONENTS:
1478 *params = mCaps.maxVertexOutputComponents;
1479 break;
1480 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1481 *params = mCaps.maxCombinedTextureImageUnits;
1482 break;
1483 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001484 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001485 break;
1486 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001487 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001488 break;
1489 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1490 *params = mCaps.maxFragmentUniformVectors;
1491 break;
1492 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001493 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001494 break;
1495 case GL_MAX_RENDERBUFFER_SIZE:
1496 *params = mCaps.maxRenderbufferSize;
1497 break;
1498 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1499 *params = mCaps.maxColorAttachments;
1500 break;
1501 case GL_MAX_DRAW_BUFFERS_EXT:
1502 *params = mCaps.maxDrawBuffers;
1503 break;
1504 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1505 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1506 case GL_SUBPIXEL_BITS:
1507 *params = 4;
1508 break;
1509 case GL_MAX_TEXTURE_SIZE:
1510 *params = mCaps.max2DTextureSize;
1511 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001512 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1513 *params = mCaps.maxRectangleTextureSize;
1514 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001515 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1516 *params = mCaps.maxCubeMapTextureSize;
1517 break;
1518 case GL_MAX_3D_TEXTURE_SIZE:
1519 *params = mCaps.max3DTextureSize;
1520 break;
1521 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1522 *params = mCaps.maxArrayTextureLayers;
1523 break;
1524 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1525 *params = mCaps.uniformBufferOffsetAlignment;
1526 break;
1527 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1528 *params = mCaps.maxUniformBufferBindings;
1529 break;
1530 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001531 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001532 break;
1533 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001534 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001535 break;
1536 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1537 *params = mCaps.maxCombinedTextureImageUnits;
1538 break;
1539 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1540 *params = mCaps.maxVertexOutputComponents;
1541 break;
1542 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1543 *params = mCaps.maxFragmentInputComponents;
1544 break;
1545 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1546 *params = mCaps.minProgramTexelOffset;
1547 break;
1548 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1549 *params = mCaps.maxProgramTexelOffset;
1550 break;
1551 case GL_MAJOR_VERSION:
1552 *params = getClientVersion().major;
1553 break;
1554 case GL_MINOR_VERSION:
1555 *params = getClientVersion().minor;
1556 break;
1557 case GL_MAX_ELEMENTS_INDICES:
1558 *params = mCaps.maxElementsIndices;
1559 break;
1560 case GL_MAX_ELEMENTS_VERTICES:
1561 *params = mCaps.maxElementsVertices;
1562 break;
1563 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1564 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1565 break;
1566 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1567 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1568 break;
1569 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1570 *params = mCaps.maxTransformFeedbackSeparateComponents;
1571 break;
1572 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1573 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1574 break;
1575 case GL_MAX_SAMPLES_ANGLE:
1576 *params = mCaps.maxSamples;
1577 break;
1578 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001579 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001580 params[0] = mCaps.maxViewportWidth;
1581 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001582 }
1583 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001584 case GL_COMPRESSED_TEXTURE_FORMATS:
1585 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1586 params);
1587 break;
1588 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1589 *params = mResetStrategy;
1590 break;
1591 case GL_NUM_SHADER_BINARY_FORMATS:
1592 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1593 break;
1594 case GL_SHADER_BINARY_FORMATS:
1595 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1596 break;
1597 case GL_NUM_PROGRAM_BINARY_FORMATS:
1598 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1599 break;
1600 case GL_PROGRAM_BINARY_FORMATS:
1601 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1602 break;
1603 case GL_NUM_EXTENSIONS:
1604 *params = static_cast<GLint>(mExtensionStrings.size());
1605 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001606
Geoff Lang38f24ee2018-10-01 13:04:59 -04001607 // GL_ANGLE_request_extension
1608 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1609 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1610 break;
1611
Jamie Madill231c7f52017-04-26 13:45:37 -04001612 // GL_KHR_debug
1613 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1614 *params = mExtensions.maxDebugMessageLength;
1615 break;
1616 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1617 *params = mExtensions.maxDebugLoggedMessages;
1618 break;
1619 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1620 *params = mExtensions.maxDebugGroupStackDepth;
1621 break;
1622 case GL_MAX_LABEL_LENGTH:
1623 *params = mExtensions.maxLabelLength;
1624 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001625
Martin Radeve5285d22017-07-14 16:23:53 +03001626 // GL_ANGLE_multiview
1627 case GL_MAX_VIEWS_ANGLE:
1628 *params = mExtensions.maxViews;
1629 break;
1630
Jamie Madill231c7f52017-04-26 13:45:37 -04001631 // GL_EXT_disjoint_timer_query
1632 case GL_GPU_DISJOINT_EXT:
1633 *params = mImplementation->getGPUDisjoint();
1634 break;
1635 case GL_MAX_FRAMEBUFFER_WIDTH:
1636 *params = mCaps.maxFramebufferWidth;
1637 break;
1638 case GL_MAX_FRAMEBUFFER_HEIGHT:
1639 *params = mCaps.maxFramebufferHeight;
1640 break;
1641 case GL_MAX_FRAMEBUFFER_SAMPLES:
1642 *params = mCaps.maxFramebufferSamples;
1643 break;
1644 case GL_MAX_SAMPLE_MASK_WORDS:
1645 *params = mCaps.maxSampleMaskWords;
1646 break;
1647 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1648 *params = mCaps.maxColorTextureSamples;
1649 break;
1650 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1651 *params = mCaps.maxDepthTextureSamples;
1652 break;
1653 case GL_MAX_INTEGER_SAMPLES:
1654 *params = mCaps.maxIntegerSamples;
1655 break;
1656 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1657 *params = mCaps.maxVertexAttribRelativeOffset;
1658 break;
1659 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1660 *params = mCaps.maxVertexAttribBindings;
1661 break;
1662 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1663 *params = mCaps.maxVertexAttribStride;
1664 break;
1665 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001666 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001667 break;
1668 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001669 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001670 break;
1671 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001672 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001673 break;
1674 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001675 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001676 break;
1677 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001678 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001679 break;
1680 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001681 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001682 break;
1683 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001684 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001685 break;
1686 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001687 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001688 break;
1689 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1690 *params = mCaps.minProgramTextureGatherOffset;
1691 break;
1692 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1693 *params = mCaps.maxProgramTextureGatherOffset;
1694 break;
1695 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1696 *params = mCaps.maxComputeWorkGroupInvocations;
1697 break;
1698 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001699 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001700 break;
1701 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001702 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001703 break;
1704 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1705 *params = mCaps.maxComputeSharedMemorySize;
1706 break;
1707 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001708 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001709 break;
1710 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001711 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001712 break;
1713 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001714 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001715 break;
1716 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001717 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001718 break;
1719 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001720 *params =
1721 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001722 break;
1723 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001724 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001725 break;
1726 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1727 *params = mCaps.maxCombinedShaderOutputResources;
1728 break;
1729 case GL_MAX_UNIFORM_LOCATIONS:
1730 *params = mCaps.maxUniformLocations;
1731 break;
1732 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1733 *params = mCaps.maxAtomicCounterBufferBindings;
1734 break;
1735 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1736 *params = mCaps.maxAtomicCounterBufferSize;
1737 break;
1738 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1739 *params = mCaps.maxCombinedAtomicCounterBuffers;
1740 break;
1741 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1742 *params = mCaps.maxCombinedAtomicCounters;
1743 break;
1744 case GL_MAX_IMAGE_UNITS:
1745 *params = mCaps.maxImageUnits;
1746 break;
1747 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1748 *params = mCaps.maxCombinedImageUniforms;
1749 break;
1750 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1751 *params = mCaps.maxShaderStorageBufferBindings;
1752 break;
1753 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1754 *params = mCaps.maxCombinedShaderStorageBlocks;
1755 break;
1756 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1757 *params = mCaps.shaderStorageBufferOffsetAlignment;
1758 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001759
1760 // GL_EXT_geometry_shader
1761 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1762 *params = mCaps.maxFramebufferLayers;
1763 break;
1764 case GL_LAYER_PROVOKING_VERTEX_EXT:
1765 *params = mCaps.layerProvokingVertex;
1766 break;
1767 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001768 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001769 break;
1770 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001771 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001772 break;
1773 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001774 *params =
1775 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001776 break;
1777 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1778 *params = mCaps.maxGeometryInputComponents;
1779 break;
1780 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1781 *params = mCaps.maxGeometryOutputComponents;
1782 break;
1783 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1784 *params = mCaps.maxGeometryOutputVertices;
1785 break;
1786 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1787 *params = mCaps.maxGeometryTotalOutputComponents;
1788 break;
1789 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1790 *params = mCaps.maxGeometryShaderInvocations;
1791 break;
1792 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001793 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001794 break;
1795 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001796 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001797 break;
1798 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001799 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001800 break;
1801 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001802 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001803 break;
1804 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001805 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001806 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001807 // GLES1 emulation: Caps queries
1808 case GL_MAX_TEXTURE_UNITS:
1809 *params = mCaps.maxMultitextureUnits;
1810 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001811 case GL_MAX_MODELVIEW_STACK_DEPTH:
1812 *params = mCaps.maxModelviewMatrixStackDepth;
1813 break;
1814 case GL_MAX_PROJECTION_STACK_DEPTH:
1815 *params = mCaps.maxProjectionMatrixStackDepth;
1816 break;
1817 case GL_MAX_TEXTURE_STACK_DEPTH:
1818 *params = mCaps.maxTextureMatrixStackDepth;
1819 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001820 case GL_MAX_LIGHTS:
1821 *params = mCaps.maxLights;
1822 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001823 case GL_MAX_CLIP_PLANES:
1824 *params = mCaps.maxClipPlanes;
1825 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001826 // GLES1 emulation: Vertex attribute queries
1827 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1828 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1829 case GL_COLOR_ARRAY_BUFFER_BINDING:
1830 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1831 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1832 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1833 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1834 break;
1835 case GL_VERTEX_ARRAY_STRIDE:
1836 case GL_NORMAL_ARRAY_STRIDE:
1837 case GL_COLOR_ARRAY_STRIDE:
1838 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1839 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1840 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1841 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1842 break;
1843 case GL_VERTEX_ARRAY_SIZE:
1844 case GL_COLOR_ARRAY_SIZE:
1845 case GL_TEXTURE_COORD_ARRAY_SIZE:
1846 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1847 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1848 break;
1849 case GL_VERTEX_ARRAY_TYPE:
1850 case GL_COLOR_ARRAY_TYPE:
1851 case GL_NORMAL_ARRAY_TYPE:
1852 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1853 case GL_TEXTURE_COORD_ARRAY_TYPE:
1854 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1855 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1856 break;
1857
jchen1082af6202018-06-22 10:59:52 +08001858 // GL_KHR_parallel_shader_compile
1859 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1860 *params = mGLState.getMaxShaderCompilerThreads();
1861 break;
1862
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001863 // GL_EXT_blend_func_extended
1864 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
1865 *params = mExtensions.maxDualSourceDrawBuffers;
1866 break;
1867
Jamie Madill231c7f52017-04-26 13:45:37 -04001868 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001869 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001870 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001871 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001872}
1873
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001874void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001875{
Shannon Woods53a94a82014-06-24 15:20:36 -04001876 // Queries about context capabilities and maximums are answered by Context.
1877 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001878 switch (pname)
1879 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001880 case GL_MAX_ELEMENT_INDEX:
1881 *params = mCaps.maxElementIndex;
1882 break;
1883 case GL_MAX_UNIFORM_BLOCK_SIZE:
1884 *params = mCaps.maxUniformBlockSize;
1885 break;
1886 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001887 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001888 break;
1889 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001890 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001891 break;
1892 case GL_MAX_SERVER_WAIT_TIMEOUT:
1893 *params = mCaps.maxServerWaitTimeout;
1894 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001895
Jamie Madill231c7f52017-04-26 13:45:37 -04001896 // GL_EXT_disjoint_timer_query
1897 case GL_TIMESTAMP_EXT:
1898 *params = mImplementation->getTimestamp();
1899 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001900
Jamie Madill231c7f52017-04-26 13:45:37 -04001901 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1902 *params = mCaps.maxShaderStorageBlockSize;
1903 break;
1904 default:
1905 UNREACHABLE();
1906 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001907 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001908}
1909
Geoff Lang70d0f492015-12-10 17:45:46 -05001910void Context::getPointerv(GLenum pname, void **params) const
1911{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001912 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001913}
1914
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001915void Context::getPointervRobustANGLERobust(GLenum pname,
1916 GLsizei bufSize,
1917 GLsizei *length,
1918 void **params)
1919{
1920 UNIMPLEMENTED();
1921}
1922
Martin Radev66fb8202016-07-28 11:45:20 +03001923void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001924{
Shannon Woods53a94a82014-06-24 15:20:36 -04001925 // Queries about context capabilities and maximums are answered by Context.
1926 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001927
1928 GLenum nativeType;
1929 unsigned int numParams;
1930 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1931 ASSERT(queryStatus);
1932
1933 if (nativeType == GL_INT)
1934 {
1935 switch (target)
1936 {
1937 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1938 ASSERT(index < 3u);
1939 *data = mCaps.maxComputeWorkGroupCount[index];
1940 break;
1941 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1942 ASSERT(index < 3u);
1943 *data = mCaps.maxComputeWorkGroupSize[index];
1944 break;
1945 default:
1946 mGLState.getIntegeri_v(target, index, data);
1947 }
1948 }
1949 else
1950 {
1951 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1952 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001953}
1954
Brandon Jones59770802018-04-02 13:18:42 -07001955void Context::getIntegeri_vRobust(GLenum target,
1956 GLuint index,
1957 GLsizei bufSize,
1958 GLsizei *length,
1959 GLint *data)
1960{
1961 getIntegeri_v(target, index, data);
1962}
1963
Martin Radev66fb8202016-07-28 11:45:20 +03001964void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001965{
Shannon Woods53a94a82014-06-24 15:20:36 -04001966 // Queries about context capabilities and maximums are answered by Context.
1967 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001968
1969 GLenum nativeType;
1970 unsigned int numParams;
1971 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1972 ASSERT(queryStatus);
1973
1974 if (nativeType == GL_INT_64_ANGLEX)
1975 {
1976 mGLState.getInteger64i_v(target, index, data);
1977 }
1978 else
1979 {
1980 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1981 }
1982}
1983
Brandon Jones59770802018-04-02 13:18:42 -07001984void Context::getInteger64i_vRobust(GLenum target,
1985 GLuint index,
1986 GLsizei bufSize,
1987 GLsizei *length,
1988 GLint64 *data)
1989{
1990 getInteger64i_v(target, index, data);
1991}
1992
Martin Radev66fb8202016-07-28 11:45:20 +03001993void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1994{
1995 // Queries about context capabilities and maximums are answered by Context.
1996 // Queries about current GL state values are answered by State.
1997
1998 GLenum nativeType;
1999 unsigned int numParams;
2000 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
2001 ASSERT(queryStatus);
2002
2003 if (nativeType == GL_BOOL)
2004 {
2005 mGLState.getBooleani_v(target, index, data);
2006 }
2007 else
2008 {
2009 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
2010 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04002011}
2012
Brandon Jones59770802018-04-02 13:18:42 -07002013void Context::getBooleani_vRobust(GLenum target,
2014 GLuint index,
2015 GLsizei bufSize,
2016 GLsizei *length,
2017 GLboolean *data)
2018{
2019 getBooleani_v(target, index, data);
2020}
2021
Corentin Wallez336129f2017-10-17 15:55:40 -04002022void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002023{
2024 Buffer *buffer = mGLState.getTargetBuffer(target);
2025 QueryBufferParameteriv(buffer, pname, params);
2026}
2027
Brandon Jones59770802018-04-02 13:18:42 -07002028void Context::getBufferParameterivRobust(BufferBinding target,
2029 GLenum pname,
2030 GLsizei bufSize,
2031 GLsizei *length,
2032 GLint *params)
2033{
2034 getBufferParameteriv(target, pname, params);
2035}
2036
He Yunchao010e4db2017-03-03 14:22:06 +08002037void Context::getFramebufferAttachmentParameteriv(GLenum target,
2038 GLenum attachment,
2039 GLenum pname,
2040 GLint *params)
2041{
2042 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002043 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002044}
2045
Brandon Jones59770802018-04-02 13:18:42 -07002046void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2047 GLenum attachment,
2048 GLenum pname,
2049 GLsizei bufSize,
2050 GLsizei *length,
2051 GLint *params)
2052{
2053 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2054}
2055
He Yunchao010e4db2017-03-03 14:22:06 +08002056void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2057{
2058 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2059 QueryRenderbufferiv(this, renderbuffer, pname, params);
2060}
2061
Brandon Jones59770802018-04-02 13:18:42 -07002062void Context::getRenderbufferParameterivRobust(GLenum target,
2063 GLenum pname,
2064 GLsizei bufSize,
2065 GLsizei *length,
2066 GLint *params)
2067{
2068 getRenderbufferParameteriv(target, pname, params);
2069}
2070
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002071void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002072{
2073 Texture *texture = getTargetTexture(target);
2074 QueryTexParameterfv(texture, pname, params);
2075}
2076
Brandon Jones59770802018-04-02 13:18:42 -07002077void Context::getTexParameterfvRobust(TextureType target,
2078 GLenum pname,
2079 GLsizei bufSize,
2080 GLsizei *length,
2081 GLfloat *params)
2082{
2083 getTexParameterfv(target, pname, params);
2084}
2085
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002086void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002087{
2088 Texture *texture = getTargetTexture(target);
2089 QueryTexParameteriv(texture, pname, params);
2090}
Jiajia Qin5451d532017-11-16 17:16:34 +08002091
Brandon Jones59770802018-04-02 13:18:42 -07002092void Context::getTexParameterivRobust(TextureType target,
2093 GLenum pname,
2094 GLsizei bufSize,
2095 GLsizei *length,
2096 GLint *params)
2097{
2098 getTexParameteriv(target, pname, params);
2099}
2100
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002101void Context::getTexParameterIivRobust(TextureType target,
2102 GLenum pname,
2103 GLsizei bufSize,
2104 GLsizei *length,
2105 GLint *params)
2106{
2107 UNIMPLEMENTED();
2108}
2109
2110void Context::getTexParameterIuivRobust(TextureType target,
2111 GLenum pname,
2112 GLsizei bufSize,
2113 GLsizei *length,
2114 GLuint *params)
2115{
2116 UNIMPLEMENTED();
2117}
2118
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002119void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002120{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002121 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002122 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002123}
2124
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002125void Context::getTexLevelParameterivRobust(TextureTarget target,
2126 GLint level,
2127 GLenum pname,
2128 GLsizei bufSize,
2129 GLsizei *length,
2130 GLint *params)
2131{
2132 UNIMPLEMENTED();
2133}
2134
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002135void Context::getTexLevelParameterfv(TextureTarget target,
2136 GLint level,
2137 GLenum pname,
2138 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002139{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002140 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002141 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002142}
2143
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002144void Context::getTexLevelParameterfvRobust(TextureTarget target,
2145 GLint level,
2146 GLenum pname,
2147 GLsizei bufSize,
2148 GLsizei *length,
2149 GLfloat *params)
2150{
2151 UNIMPLEMENTED();
2152}
2153
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002154void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002155{
2156 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002157 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002158 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002159}
2160
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002161void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002162{
2163 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002164 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002165 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002166}
2167
Brandon Jones59770802018-04-02 13:18:42 -07002168void Context::texParameterfvRobust(TextureType target,
2169 GLenum pname,
2170 GLsizei bufSize,
2171 const GLfloat *params)
2172{
2173 texParameterfv(target, pname, params);
2174}
2175
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002176void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002177{
2178 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002179 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002180 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002181}
2182
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002183void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002184{
2185 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002186 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002187 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002188}
2189
Brandon Jones59770802018-04-02 13:18:42 -07002190void Context::texParameterivRobust(TextureType target,
2191 GLenum pname,
2192 GLsizei bufSize,
2193 const GLint *params)
2194{
2195 texParameteriv(target, pname, params);
2196}
2197
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002198void Context::texParameterIivRobust(TextureType target,
2199 GLenum pname,
2200 GLsizei bufSize,
2201 const GLint *params)
2202{
2203 UNIMPLEMENTED();
2204}
2205
2206void Context::texParameterIuivRobust(TextureType target,
2207 GLenum pname,
2208 GLsizei bufSize,
2209 const GLuint *params)
2210{
2211 UNIMPLEMENTED();
2212}
2213
Jamie Madill493f9572018-05-24 19:52:15 -04002214void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002215{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002216 // No-op if count draws no primitives for given mode
2217 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002218 {
2219 return;
2220 }
2221
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002222 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002223 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002224 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002225}
2226
Jamie Madill493f9572018-05-24 19:52:15 -04002227void Context::drawArraysInstanced(PrimitiveMode mode,
2228 GLint first,
2229 GLsizei count,
2230 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002231{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002232 // No-op if count draws no primitives for given mode
2233 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002234 {
2235 return;
2236 }
2237
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002238 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002239 ANGLE_CONTEXT_TRY(
2240 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002241 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2242 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002243}
2244
Jamie Madill493f9572018-05-24 19:52:15 -04002245void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002246{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002247 // No-op if count draws no primitives for given mode
2248 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002249 {
2250 return;
2251 }
2252
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002253 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002254 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002255}
2256
Jamie Madill493f9572018-05-24 19:52:15 -04002257void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002258 GLsizei count,
2259 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002260 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002261 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002262{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002263 // No-op if count draws no primitives for given mode
2264 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002265 {
2266 return;
2267 }
2268
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002269 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002270 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002271 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002272}
2273
Jamie Madill493f9572018-05-24 19:52:15 -04002274void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002275 GLuint start,
2276 GLuint end,
2277 GLsizei count,
2278 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002279 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002280{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002281 // No-op if count draws no primitives for given mode
2282 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002283 {
2284 return;
2285 }
2286
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002287 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002288 ANGLE_CONTEXT_TRY(
2289 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002290}
2291
Jamie Madill493f9572018-05-24 19:52:15 -04002292void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002293{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002294 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002295 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002296}
2297
Jamie Madill493f9572018-05-24 19:52:15 -04002298void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002299{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002300 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002301 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002302}
2303
Jamie Madill675fe712016-12-19 13:07:54 -05002304void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002305{
Jamie Madillafa02a22017-11-23 12:57:38 -05002306 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002307}
2308
Jamie Madill675fe712016-12-19 13:07:54 -05002309void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002310{
Jamie Madillafa02a22017-11-23 12:57:38 -05002311 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002312}
2313
Austin Kinross6ee1e782015-05-29 17:05:37 -07002314void Context::insertEventMarker(GLsizei length, const char *marker)
2315{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002316 ASSERT(mImplementation);
2317 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002318}
2319
2320void Context::pushGroupMarker(GLsizei length, const char *marker)
2321{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002322 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002323
2324 if (marker == nullptr)
2325 {
2326 // From the EXT_debug_marker spec,
2327 // "If <marker> is null then an empty string is pushed on the stack."
2328 mImplementation->pushGroupMarker(length, "");
2329 }
2330 else
2331 {
2332 mImplementation->pushGroupMarker(length, marker);
2333 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002334}
2335
2336void Context::popGroupMarker()
2337{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002338 ASSERT(mImplementation);
2339 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002340}
2341
Geoff Langd8605522016-04-13 10:19:12 -04002342void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2343{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002344 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002345 ASSERT(programObject);
2346
2347 programObject->bindUniformLocation(location, name);
2348}
2349
Brandon Jones59770802018-04-02 13:18:42 -07002350void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002351{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002352 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002353}
2354
Brandon Jones59770802018-04-02 13:18:42 -07002355void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002356{
2357 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2358}
2359
Brandon Jones59770802018-04-02 13:18:42 -07002360void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002361{
2362 GLfloat I[16];
2363 angle::Matrix<GLfloat>::setToIdentity(I);
2364
2365 mGLState.loadPathRenderingMatrix(matrixMode, I);
2366}
2367
2368void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2369{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002370 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002371 if (!pathObj)
2372 return;
2373
Geoff Lang9bf86f02018-07-26 11:46:34 -04002374 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002375
2376 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2377}
2378
2379void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2380{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002381 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002382 if (!pathObj)
2383 return;
2384
Geoff Lang9bf86f02018-07-26 11:46:34 -04002385 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002386
2387 mImplementation->stencilStrokePath(pathObj, reference, mask);
2388}
2389
2390void Context::coverFillPath(GLuint path, GLenum coverMode)
2391{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002392 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002393 if (!pathObj)
2394 return;
2395
Geoff Lang9bf86f02018-07-26 11:46:34 -04002396 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002397
2398 mImplementation->coverFillPath(pathObj, coverMode);
2399}
2400
2401void Context::coverStrokePath(GLuint path, GLenum coverMode)
2402{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002403 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002404 if (!pathObj)
2405 return;
2406
Geoff Lang9bf86f02018-07-26 11:46:34 -04002407 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002408
2409 mImplementation->coverStrokePath(pathObj, coverMode);
2410}
2411
2412void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2413{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002414 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002415 if (!pathObj)
2416 return;
2417
Geoff Lang9bf86f02018-07-26 11:46:34 -04002418 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002419
2420 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2421}
2422
2423void Context::stencilThenCoverStrokePath(GLuint path,
2424 GLint reference,
2425 GLuint mask,
2426 GLenum coverMode)
2427{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002428 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002429 if (!pathObj)
2430 return;
2431
Geoff Lang9bf86f02018-07-26 11:46:34 -04002432 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002433
2434 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2435}
2436
Sami Väisänend59ca052016-06-21 16:10:00 +03002437void Context::coverFillPathInstanced(GLsizei numPaths,
2438 GLenum pathNameType,
2439 const void *paths,
2440 GLuint pathBase,
2441 GLenum coverMode,
2442 GLenum transformType,
2443 const GLfloat *transformValues)
2444{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002445 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002446
Geoff Lang9bf86f02018-07-26 11:46:34 -04002447 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002448
2449 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2450}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002451
Sami Väisänend59ca052016-06-21 16:10:00 +03002452void Context::coverStrokePathInstanced(GLsizei numPaths,
2453 GLenum pathNameType,
2454 const void *paths,
2455 GLuint pathBase,
2456 GLenum coverMode,
2457 GLenum transformType,
2458 const GLfloat *transformValues)
2459{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002460 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002461
2462 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002463 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002464
2465 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2466 transformValues);
2467}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002468
Sami Väisänend59ca052016-06-21 16:10:00 +03002469void Context::stencilFillPathInstanced(GLsizei numPaths,
2470 GLenum pathNameType,
2471 const void *paths,
2472 GLuint pathBase,
2473 GLenum fillMode,
2474 GLuint mask,
2475 GLenum transformType,
2476 const GLfloat *transformValues)
2477{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002478 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002479
2480 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002481 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002482
2483 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2484 transformValues);
2485}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002486
Sami Väisänend59ca052016-06-21 16:10:00 +03002487void Context::stencilStrokePathInstanced(GLsizei numPaths,
2488 GLenum pathNameType,
2489 const void *paths,
2490 GLuint pathBase,
2491 GLint reference,
2492 GLuint mask,
2493 GLenum transformType,
2494 const GLfloat *transformValues)
2495{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002496 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002497
Geoff Lang9bf86f02018-07-26 11:46:34 -04002498 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002499
2500 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2501 transformValues);
2502}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002503
Sami Väisänend59ca052016-06-21 16:10:00 +03002504void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2505 GLenum pathNameType,
2506 const void *paths,
2507 GLuint pathBase,
2508 GLenum fillMode,
2509 GLuint mask,
2510 GLenum coverMode,
2511 GLenum transformType,
2512 const GLfloat *transformValues)
2513{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002514 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002515
Geoff Lang9bf86f02018-07-26 11:46:34 -04002516 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002517
2518 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2519 transformType, transformValues);
2520}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002521
Sami Väisänend59ca052016-06-21 16:10:00 +03002522void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2523 GLenum pathNameType,
2524 const void *paths,
2525 GLuint pathBase,
2526 GLint reference,
2527 GLuint mask,
2528 GLenum coverMode,
2529 GLenum transformType,
2530 const GLfloat *transformValues)
2531{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002532 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002533
Geoff Lang9bf86f02018-07-26 11:46:34 -04002534 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002535
2536 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2537 transformType, transformValues);
2538}
2539
Sami Väisänen46eaa942016-06-29 10:26:37 +03002540void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2541{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002542 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002543
2544 programObject->bindFragmentInputLocation(location, name);
2545}
2546
2547void Context::programPathFragmentInputGen(GLuint program,
2548 GLint location,
2549 GLenum genMode,
2550 GLint components,
2551 const GLfloat *coeffs)
2552{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002553 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002554
jchen103fd614d2018-08-13 12:21:58 +08002555 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002556}
2557
jchen1015015f72017-03-16 13:54:21 +08002558GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2559{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002560 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002561 return QueryProgramResourceIndex(programObject, programInterface, name);
2562}
2563
jchen10fd7c3b52017-03-21 15:36:03 +08002564void Context::getProgramResourceName(GLuint program,
2565 GLenum programInterface,
2566 GLuint index,
2567 GLsizei bufSize,
2568 GLsizei *length,
2569 GLchar *name)
2570{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002571 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002572 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2573}
2574
jchen10191381f2017-04-11 13:59:04 +08002575GLint Context::getProgramResourceLocation(GLuint program,
2576 GLenum programInterface,
2577 const GLchar *name)
2578{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002579 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002580 return QueryProgramResourceLocation(programObject, programInterface, name);
2581}
2582
jchen10880683b2017-04-12 16:21:55 +08002583void Context::getProgramResourceiv(GLuint program,
2584 GLenum programInterface,
2585 GLuint index,
2586 GLsizei propCount,
2587 const GLenum *props,
2588 GLsizei bufSize,
2589 GLsizei *length,
2590 GLint *params)
2591{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002592 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002593 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2594 length, params);
2595}
2596
jchen10d9cd7b72017-08-30 15:04:25 +08002597void Context::getProgramInterfaceiv(GLuint program,
2598 GLenum programInterface,
2599 GLenum pname,
2600 GLint *params)
2601{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002602 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002603 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2604}
2605
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002606void Context::getProgramInterfaceivRobust(GLuint program,
2607 GLenum programInterface,
2608 GLenum pname,
2609 GLsizei bufSize,
2610 GLsizei *length,
2611 GLint *params)
2612{
2613 UNIMPLEMENTED();
2614}
2615
Jamie Madill306b6c12018-07-27 08:12:49 -04002616void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002617{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002618 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002619}
2620
2621// Get one of the recorded errors and clear its flag, if any.
2622// [OpenGL ES 2.0.24] section 2.5 page 13.
2623GLenum Context::getError()
2624{
Geoff Langda5777c2014-07-11 09:52:58 -04002625 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002626 {
Geoff Langda5777c2014-07-11 09:52:58 -04002627 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002628 }
Geoff Langda5777c2014-07-11 09:52:58 -04002629 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002630 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002631 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002632 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002633}
2634
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002635// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002636void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002637{
2638 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002639 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002640 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002641 mContextLostForced = true;
2642 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002643 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002644}
2645
Jamie Madillfa920eb2018-01-04 11:45:50 -05002646GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002647{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002648 // Even if the application doesn't want to know about resets, we want to know
2649 // as it will allow us to skip all the calls.
2650 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002651 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002652 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002653 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002654 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002655 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002656
2657 // EXT_robustness, section 2.6: If the reset notification behavior is
2658 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2659 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2660 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002661 }
2662
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002663 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2664 // status should be returned at least once, and GL_NO_ERROR should be returned
2665 // once the device has finished resetting.
2666 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002667 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002668 ASSERT(mResetStatus == GL_NO_ERROR);
2669 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002670
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002671 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002672 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002673 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002674 }
2675 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002676 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002677 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002678 // If markContextLost was used to mark the context lost then
2679 // assume that is not recoverable, and continue to report the
2680 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002681 mResetStatus = mImplementation->getResetStatus();
2682 }
Jamie Madill893ab082014-05-16 16:56:10 -04002683
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002684 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002685}
2686
2687bool Context::isResetNotificationEnabled()
2688{
2689 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2690}
2691
Corentin Walleze3b10e82015-05-20 11:06:25 -04002692const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002693{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002694 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002695}
2696
2697EGLenum Context::getClientType() const
2698{
2699 return mClientType;
2700}
2701
2702EGLenum Context::getRenderBuffer() const
2703{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002704 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2705 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002706 {
2707 return EGL_NONE;
2708 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002709
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002710 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002711 ASSERT(backAttachment != nullptr);
2712 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002713}
2714
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002715VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002716{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002717 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002718 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2719 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002720 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002721 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2722 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002723
Jamie Madill96a483b2017-06-27 16:49:21 -04002724 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002725 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002726
2727 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002728}
2729
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002730TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002731{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002732 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002733 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2734 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002735 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002736 transformFeedback =
2737 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002738 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002739 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002740 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002741
2742 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002743}
2744
2745bool Context::isVertexArrayGenerated(GLuint vertexArray)
2746{
Jamie Madill96a483b2017-06-27 16:49:21 -04002747 ASSERT(mVertexArrayMap.contains(0));
2748 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002749}
2750
2751bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2752{
Jamie Madill96a483b2017-06-27 16:49:21 -04002753 ASSERT(mTransformFeedbackMap.contains(0));
2754 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002755}
2756
Shannon Woods53a94a82014-06-24 15:20:36 -04002757void Context::detachTexture(GLuint texture)
2758{
2759 // Simple pass-through to State's detachTexture method, as textures do not require
2760 // allocation map management either here or in the resource manager at detach time.
2761 // Zero textures are held by the Context, and we don't attempt to request them from
2762 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002763 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002764}
2765
James Darpinian4d9d4832018-03-13 12:43:28 -07002766void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002767{
Yuly Novikov5807a532015-12-03 13:01:22 -05002768 // Simple pass-through to State's detachBuffer method, since
2769 // only buffer attachments to container objects that are bound to the current context
2770 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002771
Yuly Novikov5807a532015-12-03 13:01:22 -05002772 // [OpenGL ES 3.2] section 5.1.2 page 45:
2773 // Attachments to unbound container objects, such as
2774 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2775 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002776 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002777}
2778
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002779void Context::detachFramebuffer(GLuint framebuffer)
2780{
Shannon Woods53a94a82014-06-24 15:20:36 -04002781 // Framebuffer detachment is handled by Context, because 0 is a valid
2782 // Framebuffer object, and a pointer to it must be passed from Context
2783 // to State at binding time.
2784
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002785 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002786 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2787 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2788 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002789
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002790 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002791 {
2792 bindReadFramebuffer(0);
2793 }
2794
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002795 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002796 {
2797 bindDrawFramebuffer(0);
2798 }
2799}
2800
2801void Context::detachRenderbuffer(GLuint renderbuffer)
2802{
Jamie Madilla02315b2017-02-23 14:14:47 -05002803 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002804}
2805
Jamie Madill57a89722013-07-02 11:57:03 -04002806void Context::detachVertexArray(GLuint vertexArray)
2807{
Jamie Madill77a72f62015-04-14 11:18:32 -04002808 // Vertex array detachment is handled by Context, because 0 is a valid
2809 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002810 // binding time.
2811
Jamie Madill57a89722013-07-02 11:57:03 -04002812 // [OpenGL ES 3.0.2] section 2.10 page 43:
2813 // If a vertex array object that is currently bound is deleted, the binding
2814 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002815 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002816 {
2817 bindVertexArray(0);
2818 }
2819}
2820
Geoff Langc8058452014-02-03 12:04:11 -05002821void Context::detachTransformFeedback(GLuint transformFeedback)
2822{
Corentin Walleza2257da2016-04-19 16:43:12 -04002823 // Transform feedback detachment is handled by Context, because 0 is a valid
2824 // transform feedback, and a pointer to it must be passed from Context to State at
2825 // binding time.
2826
2827 // The OpenGL specification doesn't mention what should happen when the currently bound
2828 // transform feedback object is deleted. Since it is a container object, we treat it like
2829 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002830 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002831 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002832 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002833 }
Geoff Langc8058452014-02-03 12:04:11 -05002834}
2835
Jamie Madilldc356042013-07-19 16:36:57 -04002836void Context::detachSampler(GLuint sampler)
2837{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002838 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002839}
2840
Yunchao Hea336b902017-08-02 16:05:21 +08002841void Context::detachProgramPipeline(GLuint pipeline)
2842{
2843 mGLState.detachProgramPipeline(this, pipeline);
2844}
2845
Jamie Madill3ef140a2017-08-26 23:11:21 -04002846void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002847{
Shaodde78e82017-05-22 14:13:27 +08002848 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002849 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002850}
2851
Jamie Madille29d1672013-07-19 16:36:57 -04002852void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2853{
Geoff Langc1984ed2016-10-07 12:41:00 -04002854 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002855 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002856 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002857}
Jamie Madille29d1672013-07-19 16:36:57 -04002858
Geoff Langc1984ed2016-10-07 12:41:00 -04002859void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2860{
2861 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002862 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002863 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002864}
2865
Brandon Jones59770802018-04-02 13:18:42 -07002866void Context::samplerParameterivRobust(GLuint sampler,
2867 GLenum pname,
2868 GLsizei bufSize,
2869 const GLint *param)
2870{
2871 samplerParameteriv(sampler, pname, param);
2872}
2873
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002874void Context::samplerParameterIivRobust(GLuint sampler,
2875 GLenum pname,
2876 GLsizei bufSize,
2877 const GLint *param)
2878{
2879 UNIMPLEMENTED();
2880}
2881
2882void Context::samplerParameterIuivRobust(GLuint sampler,
2883 GLenum pname,
2884 GLsizei bufSize,
2885 const GLuint *param)
2886{
2887 UNIMPLEMENTED();
2888}
2889
Jamie Madille29d1672013-07-19 16:36:57 -04002890void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2891{
Geoff Langc1984ed2016-10-07 12:41:00 -04002892 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002893 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002894 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002895}
2896
Geoff Langc1984ed2016-10-07 12:41:00 -04002897void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002898{
Geoff Langc1984ed2016-10-07 12:41:00 -04002899 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002900 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002901 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002902}
2903
Brandon Jones59770802018-04-02 13:18:42 -07002904void Context::samplerParameterfvRobust(GLuint sampler,
2905 GLenum pname,
2906 GLsizei bufSize,
2907 const GLfloat *param)
2908{
2909 samplerParameterfv(sampler, pname, param);
2910}
2911
Geoff Langc1984ed2016-10-07 12:41:00 -04002912void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002913{
Geoff Langc1984ed2016-10-07 12:41:00 -04002914 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002915 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002916 QuerySamplerParameteriv(samplerObject, pname, params);
2917}
Jamie Madill9675b802013-07-19 16:36:59 -04002918
Brandon Jones59770802018-04-02 13:18:42 -07002919void Context::getSamplerParameterivRobust(GLuint sampler,
2920 GLenum pname,
2921 GLsizei bufSize,
2922 GLsizei *length,
2923 GLint *params)
2924{
2925 getSamplerParameteriv(sampler, pname, params);
2926}
2927
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002928void Context::getSamplerParameterIivRobust(GLuint sampler,
2929 GLenum pname,
2930 GLsizei bufSize,
2931 GLsizei *length,
2932 GLint *params)
2933{
2934 UNIMPLEMENTED();
2935}
2936
2937void Context::getSamplerParameterIuivRobust(GLuint sampler,
2938 GLenum pname,
2939 GLsizei bufSize,
2940 GLsizei *length,
2941 GLuint *params)
2942{
2943 UNIMPLEMENTED();
2944}
2945
Geoff Langc1984ed2016-10-07 12:41:00 -04002946void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2947{
2948 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002949 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002950 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04002951}
2952
Brandon Jones59770802018-04-02 13:18:42 -07002953void Context::getSamplerParameterfvRobust(GLuint sampler,
2954 GLenum pname,
2955 GLsizei bufSize,
2956 GLsizei *length,
2957 GLfloat *params)
2958{
2959 getSamplerParameterfv(sampler, pname, params);
2960}
2961
Olli Etuahof0fee072016-03-30 15:11:58 +03002962void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2963{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002964 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08002965 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002966}
2967
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002968void Context::initRendererString()
2969{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002970 std::ostringstream rendererString;
2971 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002972 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002973 rendererString << ")";
2974
Geoff Langcec35902014-04-16 10:52:36 -04002975 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002976}
2977
Geoff Langc339c4e2016-11-29 10:37:36 -05002978void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002979{
Geoff Langc339c4e2016-11-29 10:37:36 -05002980 const Version &clientVersion = getClientVersion();
2981
2982 std::ostringstream versionString;
2983 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2984 << ANGLE_VERSION_STRING << ")";
2985 mVersionString = MakeStaticString(versionString.str());
2986
2987 std::ostringstream shadingLanguageVersionString;
2988 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2989 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2990 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
2991 << ")";
2992 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002993}
2994
Geoff Langcec35902014-04-16 10:52:36 -04002995void Context::initExtensionStrings()
2996{
Geoff Langc339c4e2016-11-29 10:37:36 -05002997 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
2998 std::ostringstream combinedStringStream;
2999 std::copy(strings.begin(), strings.end(),
3000 std::ostream_iterator<const char *>(combinedStringStream, " "));
3001 return MakeStaticString(combinedStringStream.str());
3002 };
3003
3004 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003005 for (const auto &extensionString : mExtensions.getStrings())
3006 {
3007 mExtensionStrings.push_back(MakeStaticString(extensionString));
3008 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003009 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003010
Geoff Langc339c4e2016-11-29 10:37:36 -05003011 mRequestableExtensionStrings.clear();
3012 for (const auto &extensionInfo : GetExtensionInfoMap())
3013 {
3014 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003015 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003016 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003017 {
3018 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3019 }
3020 }
3021 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003022}
3023
Geoff Langc339c4e2016-11-29 10:37:36 -05003024const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003025{
Geoff Langc339c4e2016-11-29 10:37:36 -05003026 switch (name)
3027 {
3028 case GL_VENDOR:
3029 return reinterpret_cast<const GLubyte *>("Google Inc.");
3030
3031 case GL_RENDERER:
3032 return reinterpret_cast<const GLubyte *>(mRendererString);
3033
3034 case GL_VERSION:
3035 return reinterpret_cast<const GLubyte *>(mVersionString);
3036
3037 case GL_SHADING_LANGUAGE_VERSION:
3038 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3039
3040 case GL_EXTENSIONS:
3041 return reinterpret_cast<const GLubyte *>(mExtensionString);
3042
3043 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3044 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3045
3046 default:
3047 UNREACHABLE();
3048 return nullptr;
3049 }
Geoff Langcec35902014-04-16 10:52:36 -04003050}
3051
Geoff Langc339c4e2016-11-29 10:37:36 -05003052const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003053{
Geoff Langc339c4e2016-11-29 10:37:36 -05003054 switch (name)
3055 {
3056 case GL_EXTENSIONS:
3057 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3058
3059 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3060 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3061
3062 default:
3063 UNREACHABLE();
3064 return nullptr;
3065 }
Geoff Langcec35902014-04-16 10:52:36 -04003066}
3067
3068size_t Context::getExtensionStringCount() const
3069{
3070 return mExtensionStrings.size();
3071}
3072
Geoff Lang111a99e2017-10-17 10:58:41 -04003073bool Context::isExtensionRequestable(const char *name)
3074{
3075 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3076 auto extension = extensionInfos.find(name);
3077
Geoff Lang111a99e2017-10-17 10:58:41 -04003078 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003079 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003080}
3081
Geoff Langc339c4e2016-11-29 10:37:36 -05003082void Context::requestExtension(const char *name)
3083{
3084 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3085 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3086 const auto &extension = extensionInfos.at(name);
3087 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003088 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003089
3090 if (mExtensions.*(extension.ExtensionsMember))
3091 {
3092 // Extension already enabled
3093 return;
3094 }
3095
3096 mExtensions.*(extension.ExtensionsMember) = true;
3097 updateCaps();
3098 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003099
Jamie Madill2f348d22017-06-05 10:50:59 -04003100 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3101 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003102
Jamie Madill81c2e252017-09-09 23:32:46 -04003103 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3104 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003105 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003106 for (auto &zeroTexture : mZeroTextures)
3107 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003108 if (zeroTexture.get() != nullptr)
3109 {
3110 zeroTexture->signalDirty(this, InitState::Initialized);
3111 }
Geoff Lang9aded172017-04-05 11:07:56 -04003112 }
3113
Jamie Madillb983a4b2018-08-01 11:34:51 -04003114 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003115}
3116
3117size_t Context::getRequestableExtensionStringCount() const
3118{
3119 return mRequestableExtensionStrings.size();
3120}
3121
Jamie Madill493f9572018-05-24 19:52:15 -04003122void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003123{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003124 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003125 ASSERT(transformFeedback != nullptr);
3126 ASSERT(!transformFeedback->isPaused());
3127
Jamie Madill6c1f6712017-02-14 19:08:04 -05003128 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003129 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003130}
3131
3132bool Context::hasActiveTransformFeedback(GLuint program) const
3133{
3134 for (auto pair : mTransformFeedbackMap)
3135 {
3136 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3137 {
3138 return true;
3139 }
3140 }
3141 return false;
3142}
3143
Geoff Lang33f11fb2018-05-07 13:42:47 -04003144Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003145{
3146 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3147
jchen1082af6202018-06-22 10:59:52 +08003148 // Explicitly enable GL_KHR_parallel_shader_compile
3149 supportedExtensions.parallelShaderCompile = true;
3150
Geoff Langb0f917f2017-12-05 13:41:54 -05003151 if (getClientVersion() < ES_2_0)
3152 {
3153 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003154 supportedExtensions.pointSizeArray = true;
3155 supportedExtensions.textureCubeMap = true;
3156 supportedExtensions.pointSprite = true;
3157 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003158 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003159 }
3160
3161 if (getClientVersion() < ES_3_0)
3162 {
3163 // Disable ES3+ extensions
3164 supportedExtensions.colorBufferFloat = false;
3165 supportedExtensions.eglImageExternalEssl3 = false;
3166 supportedExtensions.textureNorm16 = false;
3167 supportedExtensions.multiview = false;
3168 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003169 supportedExtensions.copyTexture3d = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003170 }
3171
3172 if (getClientVersion() < ES_3_1)
3173 {
3174 // Disable ES3.1+ extensions
3175 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003176
3177 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3178 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003179 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003180 }
3181
3182 if (getClientVersion() > ES_2_0)
3183 {
3184 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3185 // supportedExtensions.sRGB = false;
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03003186
3187 // EXT_blend_func_extended is only implemented against GLES2 now
3188 // TODO(http://anglebug.com/1085): remove this limitation once GLES3 binding API for the
3189 // outputs is in place.
3190 supportedExtensions.blendFuncExtended = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003191 }
3192
3193 // Some extensions are always available because they are implemented in the GL layer.
3194 supportedExtensions.bindUniformLocation = true;
3195 supportedExtensions.vertexArrayObject = true;
3196 supportedExtensions.bindGeneratesResource = true;
3197 supportedExtensions.clientArrays = true;
3198 supportedExtensions.requestExtension = true;
3199
3200 // Enable the no error extension if the context was created with the flag.
3201 supportedExtensions.noError = mSkipValidation;
3202
3203 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003204 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003205
3206 // Explicitly enable GL_KHR_debug
3207 supportedExtensions.debug = true;
3208 supportedExtensions.maxDebugMessageLength = 1024;
3209 supportedExtensions.maxDebugLoggedMessages = 1024;
3210 supportedExtensions.maxDebugGroupStackDepth = 1024;
3211 supportedExtensions.maxLabelLength = 1024;
3212
3213 // Explicitly enable GL_ANGLE_robust_client_memory
3214 supportedExtensions.robustClientMemory = true;
3215
3216 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003217 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003218
3219 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3220 // supports it.
3221 supportedExtensions.robustBufferAccessBehavior =
3222 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3223
3224 // Enable the cache control query unconditionally.
3225 supportedExtensions.programCacheControl = true;
3226
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003227 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003228 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003229 {
3230 // GL_ANGLE_explicit_context_gles1
3231 supportedExtensions.explicitContextGles1 = true;
3232 // GL_ANGLE_explicit_context
3233 supportedExtensions.explicitContext = true;
3234 }
3235
Geoff Langb0f917f2017-12-05 13:41:54 -05003236 return supportedExtensions;
3237}
3238
Geoff Lang33f11fb2018-05-07 13:42:47 -04003239void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003240{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003241 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003242
Geoff Lang33f11fb2018-05-07 13:42:47 -04003243 mSupportedExtensions = generateSupportedExtensions();
3244 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003245
3246 mLimitations = mImplementation->getNativeLimitations();
3247
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003248 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3249 if (getClientVersion() < Version(2, 0))
3250 {
3251 mCaps.maxMultitextureUnits = 4;
3252 mCaps.maxClipPlanes = 6;
3253 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003254 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3255 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3256 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003257 mCaps.minSmoothPointSize = 1.0f;
3258 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003259 mCaps.minSmoothLineWidth = 1.0f;
3260 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003261 }
3262
Luc Ferronad2ae932018-06-11 15:31:17 -04003263 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003264 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003265
Luc Ferronad2ae932018-06-11 15:31:17 -04003266 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3267
Jamie Madill0f80ed82017-09-19 00:24:56 -04003268 if (getClientVersion() < ES_3_1)
3269 {
3270 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3271 }
3272 else
3273 {
3274 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3275 }
Geoff Lang301d1612014-07-09 10:34:37 -04003276
Jiawei Shao54aafe52018-04-27 14:54:57 +08003277 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3278 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003279 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3280
Jamie Madill0f80ed82017-09-19 00:24:56 -04003281 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3282 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3283
3284 // Limit textures as well, so we can use fast bitsets with texture bindings.
3285 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003286 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3287 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3288 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3289 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003290
Jiawei Shaodb342272017-09-27 10:21:45 +08003291 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3292
Geoff Langc287ea62016-09-16 14:46:51 -04003293 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003294 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003295 for (const auto &extensionInfo : GetExtensionInfoMap())
3296 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003297 // If the user has requested that extensions start disabled and they are requestable,
3298 // disable them.
3299 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003300 {
3301 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3302 }
3303 }
3304
3305 // Generate texture caps
3306 updateCaps();
3307}
3308
3309void Context::updateCaps()
3310{
Geoff Lang900013c2014-07-07 11:32:19 -04003311 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003312 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003313
Jamie Madill7b62cf92017-11-02 15:20:49 -04003314 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003315 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003316 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003317 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003318
Geoff Lang0d8b7242015-09-09 14:56:53 -04003319 // Update the format caps based on the client version and extensions.
3320 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3321 // ES3.
3322 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003323 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003324 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003325 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003326 formatCaps.textureAttachment =
3327 formatCaps.textureAttachment &&
3328 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3329 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3330 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003331
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003332 // OpenGL ES does not support multisampling with non-rendererable formats
3333 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003334 if (!formatCaps.renderbuffer ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003335 (getClientVersion() < ES_3_1 &&
3336 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003337 {
Geoff Langd87878e2014-09-19 15:42:59 -04003338 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003339 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003340 else
3341 {
3342 // We may have limited the max samples for some required renderbuffer formats due to
3343 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3344 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3345
3346 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3347 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3348 // exception of signed and unsigned integer formats."
3349 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3350 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3351 {
3352 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3353 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3354 }
3355
3356 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3357 if (getClientVersion() >= ES_3_1)
3358 {
3359 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3360 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3361 // the exception that the signed and unsigned integer formats are required only to
3362 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3363 // multisamples, which must be at least one."
3364 if (formatInfo.componentType == GL_INT ||
3365 formatInfo.componentType == GL_UNSIGNED_INT)
3366 {
3367 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3368 }
3369
3370 // GLES 3.1 section 19.3.1.
3371 if (formatCaps.texturable)
3372 {
3373 if (formatInfo.depthBits > 0)
3374 {
3375 mCaps.maxDepthTextureSamples =
3376 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3377 }
3378 else if (formatInfo.redBits > 0)
3379 {
3380 mCaps.maxColorTextureSamples =
3381 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3382 }
3383 }
3384 }
3385 }
Geoff Langd87878e2014-09-19 15:42:59 -04003386
3387 if (formatCaps.texturable && formatInfo.compressed)
3388 {
Geoff Langca271392017-04-05 12:30:00 -04003389 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003390 }
3391
Geoff Langca271392017-04-05 12:30:00 -04003392 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003393 }
Jamie Madill32447362017-06-28 14:53:52 -04003394
3395 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003396 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003397 {
3398 mMemoryProgramCache = nullptr;
3399 }
Corentin Walleze4477002017-12-01 14:39:58 -05003400
3401 // Compute which buffer types are allowed
3402 mValidBufferBindings.reset();
3403 mValidBufferBindings.set(BufferBinding::ElementArray);
3404 mValidBufferBindings.set(BufferBinding::Array);
3405
3406 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3407 {
3408 mValidBufferBindings.set(BufferBinding::PixelPack);
3409 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3410 }
3411
3412 if (getClientVersion() >= ES_3_0)
3413 {
3414 mValidBufferBindings.set(BufferBinding::CopyRead);
3415 mValidBufferBindings.set(BufferBinding::CopyWrite);
3416 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3417 mValidBufferBindings.set(BufferBinding::Uniform);
3418 }
3419
3420 if (getClientVersion() >= ES_3_1)
3421 {
3422 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3423 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3424 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3425 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3426 }
jchen107ae70d82018-07-06 13:47:01 +08003427
3428 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Geoff Lang493daf52014-07-03 13:38:44 -04003429}
3430
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003431void Context::initWorkarounds()
3432{
Jamie Madill761b02c2017-06-23 16:27:06 -04003433 // Apply back-end workarounds.
3434 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3435
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003436 // Lose the context upon out of memory error if the application is
3437 // expecting to watch for those events.
3438 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
3439}
3440
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003441// Return true if the draw is a no-op, else return false.
3442// A no-op draw occurs if the count of vertices is less than the minimum required to
3443// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3444bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3445{
3446 return count < kMinimumPrimitiveCounts[mode];
3447}
3448
3449bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3450{
3451 return (instanceCount == 0) || noopDraw(mode, count);
3452}
3453
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003454Error Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003455{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003456 if (mGLES1Renderer)
3457 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003458 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003459 }
3460
Geoff Lang9bf86f02018-07-26 11:46:34 -04003461 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003462
3463 if (isRobustResourceInitEnabled())
3464 {
3465 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3466 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3467 }
3468
Geoff Langa8cb2872018-03-09 16:09:40 -05003469 ANGLE_TRY(syncDirtyBits());
Geoff Langd4fff502017-09-22 11:28:28 -04003470 return NoError();
3471}
3472
3473Error Context::prepareForClear(GLbitfield mask)
3474{
Geoff Langa8cb2872018-03-09 16:09:40 -05003475 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003476 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003477 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003478 return NoError();
3479}
3480
3481Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3482{
Geoff Langa8cb2872018-03-09 16:09:40 -05003483 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003484 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3485 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003486 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003487 return NoError();
3488}
3489
Geoff Langa8cb2872018-03-09 16:09:40 -05003490Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003491{
Geoff Langa8cb2872018-03-09 16:09:40 -05003492 ANGLE_TRY(syncDirtyObjects(objectMask));
3493 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003494 return NoError();
3495}
3496
Geoff Langa8cb2872018-03-09 16:09:40 -05003497Error Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003498{
3499 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill189ad872018-07-09 13:32:37 -04003500 ANGLE_TRY(mImplementation->syncState(this, dirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003501 mGLState.clearDirtyBits();
3502 return NoError();
3503}
3504
Geoff Langa8cb2872018-03-09 16:09:40 -05003505Error Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003506{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003507 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill189ad872018-07-09 13:32:37 -04003508 ANGLE_TRY(mImplementation->syncState(this, dirtyBits));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003509 mGLState.clearDirtyBits(dirtyBits);
Jamie Madillbc918e72018-03-08 09:47:21 -05003510 return NoError();
Jamie Madill1b94d432015-08-07 13:23:23 -04003511}
Jamie Madillc29968b2016-01-20 11:17:23 -05003512
Geoff Langa8cb2872018-03-09 16:09:40 -05003513Error Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003514{
3515 return mGLState.syncDirtyObjects(this, objectMask);
3516}
3517
Jamie Madillc29968b2016-01-20 11:17:23 -05003518void Context::blitFramebuffer(GLint srcX0,
3519 GLint srcY0,
3520 GLint srcX1,
3521 GLint srcY1,
3522 GLint dstX0,
3523 GLint dstY0,
3524 GLint dstX1,
3525 GLint dstY1,
3526 GLbitfield mask,
3527 GLenum filter)
3528{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003529 if (mask == 0)
3530 {
3531 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3532 // buffers are copied.
3533 return;
3534 }
3535
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003536 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003537 ASSERT(drawFramebuffer);
3538
3539 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3540 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3541
Jamie Madillbc918e72018-03-08 09:47:21 -05003542 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003543
Jamie Madillc564c072017-06-01 12:45:42 -04003544 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003545}
Jamie Madillc29968b2016-01-20 11:17:23 -05003546
3547void Context::clear(GLbitfield mask)
3548{
Geoff Langd4fff502017-09-22 11:28:28 -04003549 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3550 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003551}
3552
3553void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3554{
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003555 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3556 // that the backend doesn't need to take this case into account.
Olli Etuahodbce1f82018-09-19 15:32:17 +03003557 if (buffer == GL_DEPTH && !getGLState().getDrawFramebuffer()->getDepthbuffer())
3558 {
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003559 return;
3560 }
3561 if (buffer == GL_COLOR && !getGLState().getDrawFramebuffer()->getColorbuffer(drawbuffer))
3562 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003563 return;
3564 }
Geoff Langd4fff502017-09-22 11:28:28 -04003565 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3566 ANGLE_CONTEXT_TRY(
3567 mGLState.getDrawFramebuffer()->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003568}
3569
3570void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3571{
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003572 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3573 // that the backend doesn't need to take this case into account.
3574 if (buffer == GL_COLOR && !getGLState().getDrawFramebuffer()->getColorbuffer(drawbuffer))
3575 {
3576 return;
3577 }
Geoff Langd4fff502017-09-22 11:28:28 -04003578 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3579 ANGLE_CONTEXT_TRY(
3580 mGLState.getDrawFramebuffer()->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003581}
3582
3583void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3584{
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003585 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3586 // that the backend doesn't need to take this case into account.
Olli Etuahodbce1f82018-09-19 15:32:17 +03003587 if (buffer == GL_STENCIL && !getGLState().getDrawFramebuffer()->getStencilbuffer())
3588 {
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003589 return;
3590 }
3591 if (buffer == GL_COLOR && !getGLState().getDrawFramebuffer()->getColorbuffer(drawbuffer))
3592 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003593 return;
3594 }
Geoff Langd4fff502017-09-22 11:28:28 -04003595 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3596 ANGLE_CONTEXT_TRY(
3597 mGLState.getDrawFramebuffer()->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003598}
3599
3600void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3601{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003602 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003603 ASSERT(framebufferObject);
3604
3605 // If a buffer is not present, the clear has no effect
3606 if (framebufferObject->getDepthbuffer() == nullptr &&
3607 framebufferObject->getStencilbuffer() == nullptr)
3608 {
3609 return;
3610 }
3611
Geoff Langd4fff502017-09-22 11:28:28 -04003612 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3613 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003614}
3615
3616void Context::readPixels(GLint x,
3617 GLint y,
3618 GLsizei width,
3619 GLsizei height,
3620 GLenum format,
3621 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003622 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003623{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003624 if (width == 0 || height == 0)
3625 {
3626 return;
3627 }
3628
Jamie Madillbc918e72018-03-08 09:47:21 -05003629 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003630
Jamie Madillb6664922017-07-25 12:55:04 -04003631 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3632 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003633
3634 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003635 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003636}
3637
Brandon Jones59770802018-04-02 13:18:42 -07003638void Context::readPixelsRobust(GLint x,
3639 GLint y,
3640 GLsizei width,
3641 GLsizei height,
3642 GLenum format,
3643 GLenum type,
3644 GLsizei bufSize,
3645 GLsizei *length,
3646 GLsizei *columns,
3647 GLsizei *rows,
3648 void *pixels)
3649{
3650 readPixels(x, y, width, height, format, type, pixels);
3651}
3652
3653void Context::readnPixelsRobust(GLint x,
3654 GLint y,
3655 GLsizei width,
3656 GLsizei height,
3657 GLenum format,
3658 GLenum type,
3659 GLsizei bufSize,
3660 GLsizei *length,
3661 GLsizei *columns,
3662 GLsizei *rows,
3663 void *data)
3664{
3665 readPixels(x, y, width, height, format, type, data);
3666}
3667
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003668void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003669 GLint level,
3670 GLenum internalformat,
3671 GLint x,
3672 GLint y,
3673 GLsizei width,
3674 GLsizei height,
3675 GLint border)
3676{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003677 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003678 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003679
Jamie Madillc29968b2016-01-20 11:17:23 -05003680 Rectangle sourceArea(x, y, width, height);
3681
Jamie Madill05b35b22017-10-03 09:01:44 -04003682 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003683 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003684 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003685}
3686
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003687void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003688 GLint level,
3689 GLint xoffset,
3690 GLint yoffset,
3691 GLint x,
3692 GLint y,
3693 GLsizei width,
3694 GLsizei height)
3695{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003696 if (width == 0 || height == 0)
3697 {
3698 return;
3699 }
3700
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003701 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003702 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003703
Jamie Madillc29968b2016-01-20 11:17:23 -05003704 Offset destOffset(xoffset, yoffset, 0);
3705 Rectangle sourceArea(x, y, width, height);
3706
Jamie Madill05b35b22017-10-03 09:01:44 -04003707 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003708 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003709 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003710}
3711
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003712void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003713 GLint level,
3714 GLint xoffset,
3715 GLint yoffset,
3716 GLint zoffset,
3717 GLint x,
3718 GLint y,
3719 GLsizei width,
3720 GLsizei height)
3721{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003722 if (width == 0 || height == 0)
3723 {
3724 return;
3725 }
3726
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003727 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003728 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003729
Jamie Madillc29968b2016-01-20 11:17:23 -05003730 Offset destOffset(xoffset, yoffset, zoffset);
3731 Rectangle sourceArea(x, y, width, height);
3732
Jamie Madill05b35b22017-10-03 09:01:44 -04003733 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3734 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003735 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3736 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003737}
3738
3739void Context::framebufferTexture2D(GLenum target,
3740 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003741 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003742 GLuint texture,
3743 GLint level)
3744{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003745 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003746 ASSERT(framebuffer);
3747
3748 if (texture != 0)
3749 {
3750 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003751 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003752 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003753 }
3754 else
3755 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003756 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003757 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003758
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003759 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003760}
3761
3762void Context::framebufferRenderbuffer(GLenum target,
3763 GLenum attachment,
3764 GLenum renderbuffertarget,
3765 GLuint renderbuffer)
3766{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003767 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003768 ASSERT(framebuffer);
3769
3770 if (renderbuffer != 0)
3771 {
3772 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003773
Jamie Madillcc129372018-04-12 09:13:18 -04003774 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003775 renderbufferObject);
3776 }
3777 else
3778 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003779 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003780 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003781
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003782 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003783}
3784
3785void Context::framebufferTextureLayer(GLenum target,
3786 GLenum attachment,
3787 GLuint texture,
3788 GLint level,
3789 GLint layer)
3790{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003791 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003792 ASSERT(framebuffer);
3793
3794 if (texture != 0)
3795 {
3796 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003797 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003798 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003799 }
3800 else
3801 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003802 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003803 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003804
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003805 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003806}
3807
Brandon Jones59770802018-04-02 13:18:42 -07003808void Context::framebufferTextureMultiviewLayered(GLenum target,
3809 GLenum attachment,
3810 GLuint texture,
3811 GLint level,
3812 GLint baseViewIndex,
3813 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003814{
Martin Radev82ef7742017-08-08 17:44:58 +03003815 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3816 ASSERT(framebuffer);
3817
3818 if (texture != 0)
3819 {
3820 Texture *textureObj = getTexture(texture);
3821
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003822 ImageIndex index;
3823 if (textureObj->getType() == TextureType::_2DArray)
3824 {
3825 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3826 }
3827 else
3828 {
3829 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3830 ASSERT(level == 0);
3831 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3832 }
Martin Radev82ef7742017-08-08 17:44:58 +03003833 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3834 numViews, baseViewIndex);
3835 }
3836 else
3837 {
3838 framebuffer->resetAttachment(this, attachment);
3839 }
3840
3841 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003842}
3843
Brandon Jones59770802018-04-02 13:18:42 -07003844void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3845 GLenum attachment,
3846 GLuint texture,
3847 GLint level,
3848 GLsizei numViews,
3849 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003850{
Martin Radev5dae57b2017-07-14 16:15:55 +03003851 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3852 ASSERT(framebuffer);
3853
3854 if (texture != 0)
3855 {
3856 Texture *textureObj = getTexture(texture);
3857
3858 ImageIndex index = ImageIndex::Make2D(level);
3859 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3860 textureObj, numViews, viewportOffsets);
3861 }
3862 else
3863 {
3864 framebuffer->resetAttachment(this, attachment);
3865 }
3866
3867 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003868}
3869
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003870void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3871{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003872 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3873 ASSERT(framebuffer);
3874
3875 if (texture != 0)
3876 {
3877 Texture *textureObj = getTexture(texture);
3878
3879 ImageIndex index = ImageIndex::MakeFromType(
3880 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3881 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3882 }
3883 else
3884 {
3885 framebuffer->resetAttachment(this, attachment);
3886 }
3887
3888 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003889}
3890
Jamie Madillc29968b2016-01-20 11:17:23 -05003891void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3892{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003893 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003894 ASSERT(framebuffer);
3895 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003896 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003897 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003898}
3899
3900void Context::readBuffer(GLenum mode)
3901{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003902 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003903 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003904 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003905}
3906
3907void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3908{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003909 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003910 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003911
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003912 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003913 ASSERT(framebuffer);
3914
3915 // The specification isn't clear what should be done when the framebuffer isn't complete.
3916 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003917 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003918}
3919
3920void Context::invalidateFramebuffer(GLenum target,
3921 GLsizei numAttachments,
3922 const GLenum *attachments)
3923{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003924 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003925 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003926
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003927 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003928 ASSERT(framebuffer);
3929
Jamie Madill427064d2018-04-13 16:20:34 -04003930 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003931 {
Jamie Madill437fa652016-05-03 15:13:24 -04003932 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003933 }
Jamie Madill437fa652016-05-03 15:13:24 -04003934
Jamie Madill4928b7c2017-06-20 12:57:39 -04003935 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003936}
3937
3938void Context::invalidateSubFramebuffer(GLenum target,
3939 GLsizei numAttachments,
3940 const GLenum *attachments,
3941 GLint x,
3942 GLint y,
3943 GLsizei width,
3944 GLsizei height)
3945{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003946 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003947 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003948
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003949 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003950 ASSERT(framebuffer);
3951
Jamie Madill427064d2018-04-13 16:20:34 -04003952 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003953 {
Jamie Madill437fa652016-05-03 15:13:24 -04003954 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003955 }
Jamie Madill437fa652016-05-03 15:13:24 -04003956
3957 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003958 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003959}
3960
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003961void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003962 GLint level,
3963 GLint internalformat,
3964 GLsizei width,
3965 GLsizei height,
3966 GLint border,
3967 GLenum format,
3968 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003969 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003970{
Jamie Madillbc918e72018-03-08 09:47:21 -05003971 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003972
3973 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003974 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003975 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07003976 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003977}
3978
Brandon Jones59770802018-04-02 13:18:42 -07003979void Context::texImage2DRobust(TextureTarget target,
3980 GLint level,
3981 GLint internalformat,
3982 GLsizei width,
3983 GLsizei height,
3984 GLint border,
3985 GLenum format,
3986 GLenum type,
3987 GLsizei bufSize,
3988 const void *pixels)
3989{
3990 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
3991}
3992
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003993void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003994 GLint level,
3995 GLint internalformat,
3996 GLsizei width,
3997 GLsizei height,
3998 GLsizei depth,
3999 GLint border,
4000 GLenum format,
4001 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004002 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004003{
Jamie Madillbc918e72018-03-08 09:47:21 -05004004 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004005
4006 Extents size(width, height, depth);
4007 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004008 handleError(texture->setImage(this, mGLState.getUnpackState(),
4009 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004010 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004011}
4012
Brandon Jones59770802018-04-02 13:18:42 -07004013void Context::texImage3DRobust(TextureType target,
4014 GLint level,
4015 GLint internalformat,
4016 GLsizei width,
4017 GLsizei height,
4018 GLsizei depth,
4019 GLint border,
4020 GLenum format,
4021 GLenum type,
4022 GLsizei bufSize,
4023 const void *pixels)
4024{
4025 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4026}
4027
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004028void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004029 GLint level,
4030 GLint xoffset,
4031 GLint yoffset,
4032 GLsizei width,
4033 GLsizei height,
4034 GLenum format,
4035 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004036 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004037{
4038 // Zero sized uploads are valid but no-ops
4039 if (width == 0 || height == 0)
4040 {
4041 return;
4042 }
4043
Jamie Madillbc918e72018-03-08 09:47:21 -05004044 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004045
4046 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004047 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004048
4049 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4050
4051 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4052 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004053}
4054
Brandon Jones59770802018-04-02 13:18:42 -07004055void Context::texSubImage2DRobust(TextureTarget target,
4056 GLint level,
4057 GLint xoffset,
4058 GLint yoffset,
4059 GLsizei width,
4060 GLsizei height,
4061 GLenum format,
4062 GLenum type,
4063 GLsizei bufSize,
4064 const void *pixels)
4065{
4066 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4067}
4068
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004069void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004070 GLint level,
4071 GLint xoffset,
4072 GLint yoffset,
4073 GLint zoffset,
4074 GLsizei width,
4075 GLsizei height,
4076 GLsizei depth,
4077 GLenum format,
4078 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004079 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004080{
4081 // Zero sized uploads are valid but no-ops
4082 if (width == 0 || height == 0 || depth == 0)
4083 {
4084 return;
4085 }
4086
Jamie Madillbc918e72018-03-08 09:47:21 -05004087 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004088
4089 Box area(xoffset, yoffset, zoffset, width, height, depth);
4090 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004091
4092 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4093
4094 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004095 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004096 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004097}
4098
Brandon Jones59770802018-04-02 13:18:42 -07004099void Context::texSubImage3DRobust(TextureType target,
4100 GLint level,
4101 GLint xoffset,
4102 GLint yoffset,
4103 GLint zoffset,
4104 GLsizei width,
4105 GLsizei height,
4106 GLsizei depth,
4107 GLenum format,
4108 GLenum type,
4109 GLsizei bufSize,
4110 const void *pixels)
4111{
4112 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4113 pixels);
4114}
4115
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004116void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004117 GLint level,
4118 GLenum internalformat,
4119 GLsizei width,
4120 GLsizei height,
4121 GLint border,
4122 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004123 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004124{
Jamie Madillbc918e72018-03-08 09:47:21 -05004125 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004126
4127 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004128 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004129 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4130 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004131 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004132}
4133
Brandon Jones59770802018-04-02 13:18:42 -07004134void Context::compressedTexImage2DRobust(TextureTarget target,
4135 GLint level,
4136 GLenum internalformat,
4137 GLsizei width,
4138 GLsizei height,
4139 GLint border,
4140 GLsizei imageSize,
4141 GLsizei dataSize,
4142 const GLvoid *data)
4143{
4144 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4145}
4146
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004147void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004148 GLint level,
4149 GLenum internalformat,
4150 GLsizei width,
4151 GLsizei height,
4152 GLsizei depth,
4153 GLint border,
4154 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004155 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004156{
Jamie Madillbc918e72018-03-08 09:47:21 -05004157 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004158
4159 Extents size(width, height, depth);
4160 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004161 handleError(texture->setCompressedImage(
4162 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004163 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004164}
4165
Brandon Jones59770802018-04-02 13:18:42 -07004166void Context::compressedTexImage3DRobust(TextureType target,
4167 GLint level,
4168 GLenum internalformat,
4169 GLsizei width,
4170 GLsizei height,
4171 GLsizei depth,
4172 GLint border,
4173 GLsizei imageSize,
4174 GLsizei dataSize,
4175 const GLvoid *data)
4176{
4177 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4178 data);
4179}
4180
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004181void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004182 GLint level,
4183 GLint xoffset,
4184 GLint yoffset,
4185 GLsizei width,
4186 GLsizei height,
4187 GLenum format,
4188 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004189 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004190{
Jamie Madillbc918e72018-03-08 09:47:21 -05004191 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004192
4193 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004194 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004195 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4196 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004197 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004198}
4199
Brandon Jones59770802018-04-02 13:18:42 -07004200void Context::compressedTexSubImage2DRobust(TextureTarget target,
4201 GLint level,
4202 GLint xoffset,
4203 GLint yoffset,
4204 GLsizei width,
4205 GLsizei height,
4206 GLenum format,
4207 GLsizei imageSize,
4208 GLsizei dataSize,
4209 const GLvoid *data)
4210{
4211 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4212 data);
4213}
4214
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004215void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004216 GLint level,
4217 GLint xoffset,
4218 GLint yoffset,
4219 GLint zoffset,
4220 GLsizei width,
4221 GLsizei height,
4222 GLsizei depth,
4223 GLenum format,
4224 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004225 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004226{
4227 // Zero sized uploads are valid but no-ops
4228 if (width == 0 || height == 0)
4229 {
4230 return;
4231 }
4232
Jamie Madillbc918e72018-03-08 09:47:21 -05004233 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004234
4235 Box area(xoffset, yoffset, zoffset, width, height, depth);
4236 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004237 handleError(texture->setCompressedSubImage(
4238 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004239 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004240}
4241
Brandon Jones59770802018-04-02 13:18:42 -07004242void Context::compressedTexSubImage3DRobust(TextureType target,
4243 GLint level,
4244 GLint xoffset,
4245 GLint yoffset,
4246 GLint zoffset,
4247 GLsizei width,
4248 GLsizei height,
4249 GLsizei depth,
4250 GLenum format,
4251 GLsizei imageSize,
4252 GLsizei dataSize,
4253 const GLvoid *data)
4254{
4255 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4256 imageSize, data);
4257}
4258
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004259void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004260{
4261 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004262 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004263}
4264
Jamie Madill007530e2017-12-28 14:27:04 -05004265void Context::copyTexture(GLuint sourceId,
4266 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004267 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004268 GLuint destId,
4269 GLint destLevel,
4270 GLint internalFormat,
4271 GLenum destType,
4272 GLboolean unpackFlipY,
4273 GLboolean unpackPremultiplyAlpha,
4274 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004275{
Jamie Madillbc918e72018-03-08 09:47:21 -05004276 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004277
4278 gl::Texture *sourceTexture = getTexture(sourceId);
4279 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004280 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4281 sourceLevel, ConvertToBool(unpackFlipY),
4282 ConvertToBool(unpackPremultiplyAlpha),
4283 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004284}
4285
Jamie Madill007530e2017-12-28 14:27:04 -05004286void Context::copySubTexture(GLuint sourceId,
4287 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004288 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004289 GLuint destId,
4290 GLint destLevel,
4291 GLint xoffset,
4292 GLint yoffset,
4293 GLint x,
4294 GLint y,
4295 GLsizei width,
4296 GLsizei height,
4297 GLboolean unpackFlipY,
4298 GLboolean unpackPremultiplyAlpha,
4299 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004300{
4301 // Zero sized copies are valid but no-ops
4302 if (width == 0 || height == 0)
4303 {
4304 return;
4305 }
4306
Jamie Madillbc918e72018-03-08 09:47:21 -05004307 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004308
4309 gl::Texture *sourceTexture = getTexture(sourceId);
4310 gl::Texture *destTexture = getTexture(destId);
4311 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004312 Box box(x, y, 0, width, height, 1);
4313 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4314 ConvertToBool(unpackFlipY),
4315 ConvertToBool(unpackPremultiplyAlpha),
4316 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4317}
4318
4319void Context::copyTexture3D(GLuint sourceId,
4320 GLint sourceLevel,
4321 TextureTarget destTarget,
4322 GLuint destId,
4323 GLint destLevel,
4324 GLint internalFormat,
4325 GLenum destType,
4326 GLboolean unpackFlipY,
4327 GLboolean unpackPremultiplyAlpha,
4328 GLboolean unpackUnmultiplyAlpha)
4329{
4330 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4331
4332 Texture *sourceTexture = getTexture(sourceId);
4333 Texture *destTexture = getTexture(destId);
4334 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4335 sourceLevel, ConvertToBool(unpackFlipY),
4336 ConvertToBool(unpackPremultiplyAlpha),
4337 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4338}
4339
4340void Context::copySubTexture3D(GLuint sourceId,
4341 GLint sourceLevel,
4342 TextureTarget destTarget,
4343 GLuint destId,
4344 GLint destLevel,
4345 GLint xoffset,
4346 GLint yoffset,
4347 GLint zoffset,
4348 GLint x,
4349 GLint y,
4350 GLint z,
4351 GLsizei width,
4352 GLsizei height,
4353 GLsizei depth,
4354 GLboolean unpackFlipY,
4355 GLboolean unpackPremultiplyAlpha,
4356 GLboolean unpackUnmultiplyAlpha)
4357{
4358 // Zero sized copies are valid but no-ops
4359 if (width == 0 || height == 0 || depth == 0)
4360 {
4361 return;
4362 }
4363
4364 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4365
4366 Texture *sourceTexture = getTexture(sourceId);
4367 Texture *destTexture = getTexture(destId);
4368 Offset offset(xoffset, yoffset, zoffset);
4369 Box box(x, y, z, width, height, depth);
4370 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004371 ConvertToBool(unpackFlipY),
4372 ConvertToBool(unpackPremultiplyAlpha),
4373 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004374}
4375
Jamie Madill007530e2017-12-28 14:27:04 -05004376void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004377{
Jamie Madillbc918e72018-03-08 09:47:21 -05004378 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004379
4380 gl::Texture *sourceTexture = getTexture(sourceId);
4381 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004382 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004383}
4384
Corentin Wallez336129f2017-10-17 15:55:40 -04004385void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004386{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004387 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004388 ASSERT(buffer);
4389
Geoff Lang496c02d2016-10-20 11:38:11 -07004390 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004391}
4392
Brandon Jones59770802018-04-02 13:18:42 -07004393void Context::getBufferPointervRobust(BufferBinding target,
4394 GLenum pname,
4395 GLsizei bufSize,
4396 GLsizei *length,
4397 void **params)
4398{
4399 getBufferPointerv(target, pname, params);
4400}
4401
Corentin Wallez336129f2017-10-17 15:55:40 -04004402void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004403{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004404 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004405 ASSERT(buffer);
4406
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004407 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004408 if (error.isError())
4409 {
Jamie Madill437fa652016-05-03 15:13:24 -04004410 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004411 return nullptr;
4412 }
4413
4414 return buffer->getMapPointer();
4415}
4416
Corentin Wallez336129f2017-10-17 15:55:40 -04004417GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004418{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004419 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004420 ASSERT(buffer);
4421
4422 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004423 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004424 if (error.isError())
4425 {
Jamie Madill437fa652016-05-03 15:13:24 -04004426 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004427 return GL_FALSE;
4428 }
4429
4430 return result;
4431}
4432
Corentin Wallez336129f2017-10-17 15:55:40 -04004433void *Context::mapBufferRange(BufferBinding target,
4434 GLintptr offset,
4435 GLsizeiptr length,
4436 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004437{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004438 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004439 ASSERT(buffer);
4440
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004441 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004442 if (error.isError())
4443 {
Jamie Madill437fa652016-05-03 15:13:24 -04004444 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004445 return nullptr;
4446 }
4447
4448 return buffer->getMapPointer();
4449}
4450
Corentin Wallez336129f2017-10-17 15:55:40 -04004451void Context::flushMappedBufferRange(BufferBinding /*target*/,
4452 GLintptr /*offset*/,
4453 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004454{
4455 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4456}
4457
Jamie Madillbc918e72018-03-08 09:47:21 -05004458Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004459{
Geoff Langa8cb2872018-03-09 16:09:40 -05004460 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004461}
4462
Jamie Madillbc918e72018-03-08 09:47:21 -05004463Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004464{
Geoff Langa8cb2872018-03-09 16:09:40 -05004465 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004466}
4467
Jamie Madillbc918e72018-03-08 09:47:21 -05004468Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004469{
Geoff Langa8cb2872018-03-09 16:09:40 -05004470 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004471}
4472
Geoff Lang9bf86f02018-07-26 11:46:34 -04004473Error Context::syncStateForPathOperation()
4474{
4475 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4476
4477 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4478 ANGLE_TRY(syncDirtyBits());
4479
4480 return NoError();
4481}
4482
Jiajia Qin5451d532017-11-16 17:16:34 +08004483void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4484{
4485 UNIMPLEMENTED();
4486}
4487
Jamie Madillc20ab272016-06-09 07:20:46 -07004488void Context::activeTexture(GLenum texture)
4489{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004490 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004491}
4492
Jamie Madill876429b2017-04-20 15:46:24 -04004493void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004494{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004495 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004496}
4497
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004498void Context::blendEquation(GLenum mode)
4499{
4500 mGLState.setBlendEquation(mode, mode);
4501}
4502
Jamie Madillc20ab272016-06-09 07:20:46 -07004503void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4504{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004505 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004506}
4507
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004508void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4509{
4510 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4511}
4512
Jamie Madillc20ab272016-06-09 07:20:46 -07004513void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4514{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004515 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004516}
4517
Jamie Madill876429b2017-04-20 15:46:24 -04004518void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004519{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004520 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004521}
4522
Jamie Madill876429b2017-04-20 15:46:24 -04004523void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004524{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004525 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07004526}
4527
4528void Context::clearStencil(GLint s)
4529{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004530 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004531}
4532
4533void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4534{
Geoff Lang92019432017-11-20 13:09:34 -05004535 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4536 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004537}
4538
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004539void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004540{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004541 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004542}
4543
4544void Context::depthFunc(GLenum func)
4545{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004546 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004547}
4548
4549void Context::depthMask(GLboolean flag)
4550{
Geoff Lang92019432017-11-20 13:09:34 -05004551 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004552}
4553
Jamie Madill876429b2017-04-20 15:46:24 -04004554void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004555{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004556 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07004557}
4558
4559void Context::disable(GLenum cap)
4560{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004561 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004562 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004563}
4564
4565void Context::disableVertexAttribArray(GLuint index)
4566{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004567 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004568 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004569}
4570
4571void Context::enable(GLenum cap)
4572{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004573 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004574 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004575}
4576
4577void Context::enableVertexAttribArray(GLuint index)
4578{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004579 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004580 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004581}
4582
4583void Context::frontFace(GLenum mode)
4584{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004585 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004586}
4587
4588void Context::hint(GLenum target, GLenum mode)
4589{
4590 switch (target)
4591 {
4592 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004593 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004594 break;
4595
4596 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004597 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004598 break;
4599
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004600 case GL_PERSPECTIVE_CORRECTION_HINT:
4601 case GL_POINT_SMOOTH_HINT:
4602 case GL_LINE_SMOOTH_HINT:
4603 case GL_FOG_HINT:
4604 mGLState.gles1().setHint(target, mode);
4605 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004606 default:
4607 UNREACHABLE();
4608 return;
4609 }
4610}
4611
4612void Context::lineWidth(GLfloat width)
4613{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004614 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004615}
4616
4617void Context::pixelStorei(GLenum pname, GLint param)
4618{
4619 switch (pname)
4620 {
4621 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004622 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004623 break;
4624
4625 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004626 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004627 break;
4628
4629 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004630 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004631 break;
4632
4633 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004634 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004635 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004636 break;
4637
4638 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004639 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004640 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004641 break;
4642
4643 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004644 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004645 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004646 break;
4647
4648 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004649 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004650 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004651 break;
4652
4653 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004654 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004655 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004656 break;
4657
4658 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004659 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004660 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004661 break;
4662
4663 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004664 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004665 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004666 break;
4667
4668 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004669 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004670 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004671 break;
4672
4673 default:
4674 UNREACHABLE();
4675 return;
4676 }
4677}
4678
4679void Context::polygonOffset(GLfloat factor, GLfloat units)
4680{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004681 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004682}
4683
Jamie Madill876429b2017-04-20 15:46:24 -04004684void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004685{
Geoff Lang92019432017-11-20 13:09:34 -05004686 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004687}
4688
Jiawei Shaodb342272017-09-27 10:21:45 +08004689void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4690{
4691 mGLState.setSampleMaskParams(maskNumber, mask);
4692}
4693
Jamie Madillc20ab272016-06-09 07:20:46 -07004694void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4695{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004696 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004697}
4698
4699void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4700{
4701 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4702 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004703 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004704 }
4705
4706 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4707 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004708 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004709 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004710
4711 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004712}
4713
4714void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4715{
4716 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4717 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004718 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004719 }
4720
4721 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4722 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004723 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004724 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004725
4726 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004727}
4728
4729void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4730{
4731 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4732 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004733 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004734 }
4735
4736 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4737 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004738 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004739 }
4740}
4741
4742void Context::vertexAttrib1f(GLuint index, GLfloat x)
4743{
4744 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004745 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004746 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004747}
4748
4749void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4750{
4751 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004752 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004753 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004754}
4755
4756void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4757{
4758 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004759 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004760 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004761}
4762
4763void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4764{
4765 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004766 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004767 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004768}
4769
4770void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4771{
4772 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004773 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004774 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004775}
4776
4777void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4778{
4779 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004780 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004781 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004782}
4783
4784void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4785{
4786 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004787 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004788 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004789}
4790
4791void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4792{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004793 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004794 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004795}
4796
4797void Context::vertexAttribPointer(GLuint index,
4798 GLint size,
4799 GLenum type,
4800 GLboolean normalized,
4801 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004802 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004803{
Corentin Wallez336129f2017-10-17 15:55:40 -04004804 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004805 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004806 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004807}
4808
Shao80957d92017-02-20 21:25:59 +08004809void Context::vertexAttribFormat(GLuint attribIndex,
4810 GLint size,
4811 GLenum type,
4812 GLboolean normalized,
4813 GLuint relativeOffset)
4814{
Geoff Lang92019432017-11-20 13:09:34 -05004815 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004816 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004817 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004818}
4819
4820void Context::vertexAttribIFormat(GLuint attribIndex,
4821 GLint size,
4822 GLenum type,
4823 GLuint relativeOffset)
4824{
4825 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004826 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004827}
4828
4829void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4830{
Shaodde78e82017-05-22 14:13:27 +08004831 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004832 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004833}
4834
Jiajia Qin5451d532017-11-16 17:16:34 +08004835void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004836{
4837 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004838 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004839}
4840
Jamie Madillc20ab272016-06-09 07:20:46 -07004841void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4842{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004843 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004844}
4845
4846void Context::vertexAttribIPointer(GLuint index,
4847 GLint size,
4848 GLenum type,
4849 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004850 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004851{
Corentin Wallez336129f2017-10-17 15:55:40 -04004852 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4853 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004854 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004855}
4856
4857void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4858{
4859 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004860 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004861 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004862}
4863
4864void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4865{
4866 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004867 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004868 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004869}
4870
4871void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4872{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004873 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004874 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004875}
4876
4877void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4878{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004879 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004880 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004881}
4882
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004883void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4884{
4885 const VertexAttribCurrentValueData &currentValues =
4886 getGLState().getVertexAttribCurrentValue(index);
4887 const VertexArray *vao = getGLState().getVertexArray();
4888 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4889 currentValues, pname, params);
4890}
4891
Brandon Jones59770802018-04-02 13:18:42 -07004892void Context::getVertexAttribivRobust(GLuint index,
4893 GLenum pname,
4894 GLsizei bufSize,
4895 GLsizei *length,
4896 GLint *params)
4897{
4898 getVertexAttribiv(index, pname, params);
4899}
4900
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004901void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4902{
4903 const VertexAttribCurrentValueData &currentValues =
4904 getGLState().getVertexAttribCurrentValue(index);
4905 const VertexArray *vao = getGLState().getVertexArray();
4906 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4907 currentValues, pname, params);
4908}
4909
Brandon Jones59770802018-04-02 13:18:42 -07004910void Context::getVertexAttribfvRobust(GLuint index,
4911 GLenum pname,
4912 GLsizei bufSize,
4913 GLsizei *length,
4914 GLfloat *params)
4915{
4916 getVertexAttribfv(index, pname, params);
4917}
4918
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004919void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4920{
4921 const VertexAttribCurrentValueData &currentValues =
4922 getGLState().getVertexAttribCurrentValue(index);
4923 const VertexArray *vao = getGLState().getVertexArray();
4924 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4925 currentValues, pname, params);
4926}
4927
Brandon Jones59770802018-04-02 13:18:42 -07004928void Context::getVertexAttribIivRobust(GLuint index,
4929 GLenum pname,
4930 GLsizei bufSize,
4931 GLsizei *length,
4932 GLint *params)
4933{
4934 getVertexAttribIiv(index, pname, params);
4935}
4936
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004937void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4938{
4939 const VertexAttribCurrentValueData &currentValues =
4940 getGLState().getVertexAttribCurrentValue(index);
4941 const VertexArray *vao = getGLState().getVertexArray();
4942 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4943 currentValues, pname, params);
4944}
4945
Brandon Jones59770802018-04-02 13:18:42 -07004946void Context::getVertexAttribIuivRobust(GLuint index,
4947 GLenum pname,
4948 GLsizei bufSize,
4949 GLsizei *length,
4950 GLuint *params)
4951{
4952 getVertexAttribIuiv(index, pname, params);
4953}
4954
Jamie Madill876429b2017-04-20 15:46:24 -04004955void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004956{
4957 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4958 QueryVertexAttribPointerv(attrib, pname, pointer);
4959}
4960
Brandon Jones59770802018-04-02 13:18:42 -07004961void Context::getVertexAttribPointervRobust(GLuint index,
4962 GLenum pname,
4963 GLsizei bufSize,
4964 GLsizei *length,
4965 void **pointer)
4966{
4967 getVertexAttribPointerv(index, pname, pointer);
4968}
4969
Jamie Madillc20ab272016-06-09 07:20:46 -07004970void Context::debugMessageControl(GLenum source,
4971 GLenum type,
4972 GLenum severity,
4973 GLsizei count,
4974 const GLuint *ids,
4975 GLboolean enabled)
4976{
4977 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004978 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05004979 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07004980}
4981
4982void Context::debugMessageInsert(GLenum source,
4983 GLenum type,
4984 GLuint id,
4985 GLenum severity,
4986 GLsizei length,
4987 const GLchar *buf)
4988{
4989 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004990 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07004991}
4992
4993void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
4994{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004995 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07004996}
4997
4998GLuint Context::getDebugMessageLog(GLuint count,
4999 GLsizei bufSize,
5000 GLenum *sources,
5001 GLenum *types,
5002 GLuint *ids,
5003 GLenum *severities,
5004 GLsizei *lengths,
5005 GLchar *messageLog)
5006{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005007 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5008 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005009}
5010
5011void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5012{
5013 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005014 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005015 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005016}
5017
5018void Context::popDebugGroup()
5019{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005020 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005021 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005022}
5023
Corentin Wallez336129f2017-10-17 15:55:40 -04005024void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005025{
5026 Buffer *buffer = mGLState.getTargetBuffer(target);
5027 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005028 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005029}
5030
Corentin Wallez336129f2017-10-17 15:55:40 -04005031void Context::bufferSubData(BufferBinding target,
5032 GLintptr offset,
5033 GLsizeiptr size,
5034 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005035{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005036 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005037 {
5038 return;
5039 }
5040
5041 Buffer *buffer = mGLState.getTargetBuffer(target);
5042 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005043 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005044}
5045
Jamie Madillef300b12016-10-07 15:12:09 -04005046void Context::attachShader(GLuint program, GLuint shader)
5047{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005048 Program *programObject = mState.mShaderPrograms->getProgram(program);
5049 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005050 ASSERT(programObject && shaderObject);
5051 programObject->attachShader(shaderObject);
5052}
5053
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005054const Workarounds &Context::getWorkarounds() const
5055{
5056 return mWorkarounds;
5057}
5058
Corentin Wallez336129f2017-10-17 15:55:40 -04005059void Context::copyBufferSubData(BufferBinding readTarget,
5060 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005061 GLintptr readOffset,
5062 GLintptr writeOffset,
5063 GLsizeiptr size)
5064{
5065 // if size is zero, the copy is a successful no-op
5066 if (size == 0)
5067 {
5068 return;
5069 }
5070
5071 // TODO(jmadill): cache these.
5072 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5073 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5074
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005075 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005076}
5077
Jamie Madill01a80ee2016-11-07 12:06:18 -05005078void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5079{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005080 // Ideally we could share the program query with the validation layer if possible.
5081 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005082 ASSERT(programObject);
5083 programObject->bindAttributeLocation(index, name);
5084}
5085
Corentin Wallez336129f2017-10-17 15:55:40 -04005086void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005087{
Corentin Wallez336129f2017-10-17 15:55:40 -04005088 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5089 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005090 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005091}
5092
Corentin Wallez336129f2017-10-17 15:55:40 -04005093void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005094{
5095 bindBufferRange(target, index, buffer, 0, 0);
5096}
5097
Corentin Wallez336129f2017-10-17 15:55:40 -04005098void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005099 GLuint index,
5100 GLuint buffer,
5101 GLintptr offset,
5102 GLsizeiptr size)
5103{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005104 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5105 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5106 if (target == BufferBinding::Uniform)
5107 {
5108 mUniformBufferObserverBindings[index].bind(object ? object->getImplementation() : nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04005109 mStateCache.onUniformBufferStateChange(this);
5110 }
5111 else
5112 {
5113 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005114 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005115}
5116
Jamie Madill01a80ee2016-11-07 12:06:18 -05005117void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5118{
5119 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5120 {
5121 bindReadFramebuffer(framebuffer);
5122 }
5123
5124 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5125 {
5126 bindDrawFramebuffer(framebuffer);
5127 }
5128}
5129
5130void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5131{
5132 ASSERT(target == GL_RENDERBUFFER);
5133 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005134 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005135 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005136}
5137
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005138void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005139 GLsizei samples,
5140 GLenum internalformat,
5141 GLsizei width,
5142 GLsizei height,
5143 GLboolean fixedsamplelocations)
5144{
5145 Extents size(width, height, 1);
5146 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005147 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5148 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005149}
5150
Olli Etuaho89664842018-08-24 14:45:36 +03005151void Context::texStorage3DMultisample(TextureType target,
5152 GLsizei samples,
5153 GLenum internalformat,
5154 GLsizei width,
5155 GLsizei height,
5156 GLsizei depth,
5157 GLboolean fixedsamplelocations)
5158{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005159 Extents size(width, height, depth);
5160 Texture *texture = getTargetTexture(target);
5161 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5162 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005163}
5164
JiangYizhoubddc46b2016-12-09 09:50:51 +08005165void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5166{
JiangYizhou5b03f472017-01-09 10:22:53 +08005167 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5168 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005169 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005170 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005171
5172 switch (pname)
5173 {
5174 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005175 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005176 break;
5177 default:
5178 UNREACHABLE();
5179 }
5180}
5181
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005182void Context::getMultisamplefvRobust(GLenum pname,
5183 GLuint index,
5184 GLsizei bufSize,
5185 GLsizei *length,
5186 GLfloat *val)
5187{
5188 UNIMPLEMENTED();
5189}
5190
Jamie Madille8fb6402017-02-14 17:56:40 -05005191void Context::renderbufferStorage(GLenum target,
5192 GLenum internalformat,
5193 GLsizei width,
5194 GLsizei height)
5195{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005196 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5197 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5198
Jamie Madille8fb6402017-02-14 17:56:40 -05005199 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005200 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005201}
5202
5203void Context::renderbufferStorageMultisample(GLenum target,
5204 GLsizei samples,
5205 GLenum internalformat,
5206 GLsizei width,
5207 GLsizei height)
5208{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005209 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5210 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005211
5212 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005213 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005214 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005215}
5216
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005217void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5218{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005219 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005220 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005221}
5222
JiangYizhoue18e6392017-02-20 10:32:23 +08005223void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5224{
5225 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5226 QueryFramebufferParameteriv(framebuffer, pname, params);
5227}
5228
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005229void Context::getFramebufferParameterivRobust(GLenum target,
5230 GLenum pname,
5231 GLsizei bufSize,
5232 GLsizei *length,
5233 GLint *params)
5234{
5235 UNIMPLEMENTED();
5236}
5237
Jiajia Qin5451d532017-11-16 17:16:34 +08005238void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005239{
5240 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005241 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005242}
5243
Jamie Madilldec86232018-07-11 09:01:18 -04005244bool Context::getScratchBuffer(size_t requstedSizeBytes,
5245 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005246{
Jamie Madilldec86232018-07-11 09:01:18 -04005247 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005248}
5249
Jamie Madilldec86232018-07-11 09:01:18 -04005250bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5251 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005252{
Jamie Madilldec86232018-07-11 09:01:18 -04005253 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005254}
5255
Xinghua Cao10a4d432017-11-28 14:46:26 +08005256Error Context::prepareForDispatch()
5257{
Geoff Langa8cb2872018-03-09 16:09:40 -05005258 ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005259
5260 if (isRobustResourceInitEnabled())
5261 {
5262 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5263 }
5264
5265 return NoError();
5266}
5267
Xinghua Cao2b396592017-03-29 15:36:04 +08005268void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5269{
5270 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5271 {
5272 return;
5273 }
5274
Xinghua Cao10a4d432017-11-28 14:46:26 +08005275 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005276 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005277}
5278
Jiajia Qin5451d532017-11-16 17:16:34 +08005279void Context::dispatchComputeIndirect(GLintptr indirect)
5280{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005281 ANGLE_CONTEXT_TRY(prepareForDispatch());
5282 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005283}
5284
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005285void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005286 GLsizei levels,
5287 GLenum internalFormat,
5288 GLsizei width,
5289 GLsizei height)
5290{
5291 Extents size(width, height, 1);
5292 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005293 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005294}
5295
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005296void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005297 GLsizei levels,
5298 GLenum internalFormat,
5299 GLsizei width,
5300 GLsizei height,
5301 GLsizei depth)
5302{
5303 Extents size(width, height, depth);
5304 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005305 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005306}
5307
Jiajia Qin5451d532017-11-16 17:16:34 +08005308void Context::memoryBarrier(GLbitfield barriers)
5309{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005310 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005311}
5312
5313void Context::memoryBarrierByRegion(GLbitfield barriers)
5314{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005315 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005316}
5317
Jamie Madillc1d770e2017-04-13 17:31:24 -04005318GLenum Context::checkFramebufferStatus(GLenum target)
5319{
5320 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5321 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005322 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005323}
5324
5325void Context::compileShader(GLuint shader)
5326{
5327 Shader *shaderObject = GetValidShader(this, shader);
5328 if (!shaderObject)
5329 {
5330 return;
5331 }
5332 shaderObject->compile(this);
5333}
5334
5335void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5336{
5337 for (int i = 0; i < n; i++)
5338 {
5339 deleteBuffer(buffers[i]);
5340 }
5341}
5342
5343void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5344{
5345 for (int i = 0; i < n; i++)
5346 {
5347 if (framebuffers[i] != 0)
5348 {
5349 deleteFramebuffer(framebuffers[i]);
5350 }
5351 }
5352}
5353
5354void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5355{
5356 for (int i = 0; i < n; i++)
5357 {
5358 deleteRenderbuffer(renderbuffers[i]);
5359 }
5360}
5361
5362void Context::deleteTextures(GLsizei n, const GLuint *textures)
5363{
5364 for (int i = 0; i < n; i++)
5365 {
5366 if (textures[i] != 0)
5367 {
5368 deleteTexture(textures[i]);
5369 }
5370 }
5371}
5372
5373void Context::detachShader(GLuint program, GLuint shader)
5374{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005375 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005376 ASSERT(programObject);
5377
5378 Shader *shaderObject = getShader(shader);
5379 ASSERT(shaderObject);
5380
5381 programObject->detachShader(this, shaderObject);
5382}
5383
5384void Context::genBuffers(GLsizei n, GLuint *buffers)
5385{
5386 for (int i = 0; i < n; i++)
5387 {
5388 buffers[i] = createBuffer();
5389 }
5390}
5391
5392void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5393{
5394 for (int i = 0; i < n; i++)
5395 {
5396 framebuffers[i] = createFramebuffer();
5397 }
5398}
5399
5400void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5401{
5402 for (int i = 0; i < n; i++)
5403 {
5404 renderbuffers[i] = createRenderbuffer();
5405 }
5406}
5407
5408void Context::genTextures(GLsizei n, GLuint *textures)
5409{
5410 for (int i = 0; i < n; i++)
5411 {
5412 textures[i] = createTexture();
5413 }
5414}
5415
5416void Context::getActiveAttrib(GLuint program,
5417 GLuint index,
5418 GLsizei bufsize,
5419 GLsizei *length,
5420 GLint *size,
5421 GLenum *type,
5422 GLchar *name)
5423{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005424 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005425 ASSERT(programObject);
5426 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5427}
5428
5429void Context::getActiveUniform(GLuint program,
5430 GLuint index,
5431 GLsizei bufsize,
5432 GLsizei *length,
5433 GLint *size,
5434 GLenum *type,
5435 GLchar *name)
5436{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005437 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005438 ASSERT(programObject);
5439 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5440}
5441
5442void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5443{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005444 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005445 ASSERT(programObject);
5446 programObject->getAttachedShaders(maxcount, count, shaders);
5447}
5448
5449GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5450{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005451 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005452 ASSERT(programObject);
5453 return programObject->getAttributeLocation(name);
5454}
5455
5456void Context::getBooleanv(GLenum pname, GLboolean *params)
5457{
5458 GLenum nativeType;
5459 unsigned int numParams = 0;
5460 getQueryParameterInfo(pname, &nativeType, &numParams);
5461
5462 if (nativeType == GL_BOOL)
5463 {
5464 getBooleanvImpl(pname, params);
5465 }
5466 else
5467 {
5468 CastStateValues(this, nativeType, pname, numParams, params);
5469 }
5470}
5471
Brandon Jones59770802018-04-02 13:18:42 -07005472void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5473{
5474 getBooleanv(pname, params);
5475}
5476
Jamie Madillc1d770e2017-04-13 17:31:24 -04005477void Context::getFloatv(GLenum pname, GLfloat *params)
5478{
5479 GLenum nativeType;
5480 unsigned int numParams = 0;
5481 getQueryParameterInfo(pname, &nativeType, &numParams);
5482
5483 if (nativeType == GL_FLOAT)
5484 {
5485 getFloatvImpl(pname, params);
5486 }
5487 else
5488 {
5489 CastStateValues(this, nativeType, pname, numParams, params);
5490 }
5491}
5492
Brandon Jones59770802018-04-02 13:18:42 -07005493void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5494{
5495 getFloatv(pname, params);
5496}
5497
Jamie Madillc1d770e2017-04-13 17:31:24 -04005498void Context::getIntegerv(GLenum pname, GLint *params)
5499{
5500 GLenum nativeType;
5501 unsigned int numParams = 0;
5502 getQueryParameterInfo(pname, &nativeType, &numParams);
5503
5504 if (nativeType == GL_INT)
5505 {
5506 getIntegervImpl(pname, params);
5507 }
5508 else
5509 {
5510 CastStateValues(this, nativeType, pname, numParams, params);
5511 }
5512}
5513
Brandon Jones59770802018-04-02 13:18:42 -07005514void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5515{
5516 getIntegerv(pname, data);
5517}
5518
Jamie Madillc1d770e2017-04-13 17:31:24 -04005519void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5520{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005521 // Don't resolve link if checking the link completion status.
5522 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5523 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005524 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005525 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005526}
5527
Brandon Jones59770802018-04-02 13:18:42 -07005528void Context::getProgramivRobust(GLuint program,
5529 GLenum pname,
5530 GLsizei bufSize,
5531 GLsizei *length,
5532 GLint *params)
5533{
5534 getProgramiv(program, pname, params);
5535}
5536
Jiajia Qin5451d532017-11-16 17:16:34 +08005537void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5538{
5539 UNIMPLEMENTED();
5540}
5541
Jamie Madillbe849e42017-05-02 15:49:00 -04005542void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005543{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005544 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005545 ASSERT(programObject);
5546 programObject->getInfoLog(bufsize, length, infolog);
5547}
5548
Jiajia Qin5451d532017-11-16 17:16:34 +08005549void Context::getProgramPipelineInfoLog(GLuint pipeline,
5550 GLsizei bufSize,
5551 GLsizei *length,
5552 GLchar *infoLog)
5553{
5554 UNIMPLEMENTED();
5555}
5556
Jamie Madillc1d770e2017-04-13 17:31:24 -04005557void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5558{
5559 Shader *shaderObject = getShader(shader);
5560 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005561 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005562}
5563
Brandon Jones59770802018-04-02 13:18:42 -07005564void Context::getShaderivRobust(GLuint shader,
5565 GLenum pname,
5566 GLsizei bufSize,
5567 GLsizei *length,
5568 GLint *params)
5569{
5570 getShaderiv(shader, pname, params);
5571}
5572
Jamie Madillc1d770e2017-04-13 17:31:24 -04005573void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5574{
5575 Shader *shaderObject = getShader(shader);
5576 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005577 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005578}
5579
5580void Context::getShaderPrecisionFormat(GLenum shadertype,
5581 GLenum precisiontype,
5582 GLint *range,
5583 GLint *precision)
5584{
5585 // TODO(jmadill): Compute shaders.
5586
5587 switch (shadertype)
5588 {
5589 case GL_VERTEX_SHADER:
5590 switch (precisiontype)
5591 {
5592 case GL_LOW_FLOAT:
5593 mCaps.vertexLowpFloat.get(range, precision);
5594 break;
5595 case GL_MEDIUM_FLOAT:
5596 mCaps.vertexMediumpFloat.get(range, precision);
5597 break;
5598 case GL_HIGH_FLOAT:
5599 mCaps.vertexHighpFloat.get(range, precision);
5600 break;
5601
5602 case GL_LOW_INT:
5603 mCaps.vertexLowpInt.get(range, precision);
5604 break;
5605 case GL_MEDIUM_INT:
5606 mCaps.vertexMediumpInt.get(range, precision);
5607 break;
5608 case GL_HIGH_INT:
5609 mCaps.vertexHighpInt.get(range, precision);
5610 break;
5611
5612 default:
5613 UNREACHABLE();
5614 return;
5615 }
5616 break;
5617
5618 case GL_FRAGMENT_SHADER:
5619 switch (precisiontype)
5620 {
5621 case GL_LOW_FLOAT:
5622 mCaps.fragmentLowpFloat.get(range, precision);
5623 break;
5624 case GL_MEDIUM_FLOAT:
5625 mCaps.fragmentMediumpFloat.get(range, precision);
5626 break;
5627 case GL_HIGH_FLOAT:
5628 mCaps.fragmentHighpFloat.get(range, precision);
5629 break;
5630
5631 case GL_LOW_INT:
5632 mCaps.fragmentLowpInt.get(range, precision);
5633 break;
5634 case GL_MEDIUM_INT:
5635 mCaps.fragmentMediumpInt.get(range, precision);
5636 break;
5637 case GL_HIGH_INT:
5638 mCaps.fragmentHighpInt.get(range, precision);
5639 break;
5640
5641 default:
5642 UNREACHABLE();
5643 return;
5644 }
5645 break;
5646
5647 default:
5648 UNREACHABLE();
5649 return;
5650 }
5651}
5652
5653void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5654{
5655 Shader *shaderObject = getShader(shader);
5656 ASSERT(shaderObject);
5657 shaderObject->getSource(bufsize, length, source);
5658}
5659
5660void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5661{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005662 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005663 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005664 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005665}
5666
Brandon Jones59770802018-04-02 13:18:42 -07005667void Context::getUniformfvRobust(GLuint program,
5668 GLint location,
5669 GLsizei bufSize,
5670 GLsizei *length,
5671 GLfloat *params)
5672{
5673 getUniformfv(program, location, params);
5674}
5675
Jamie Madillc1d770e2017-04-13 17:31:24 -04005676void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5677{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005678 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005679 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005680 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005681}
5682
Brandon Jones59770802018-04-02 13:18:42 -07005683void Context::getUniformivRobust(GLuint program,
5684 GLint location,
5685 GLsizei bufSize,
5686 GLsizei *length,
5687 GLint *params)
5688{
5689 getUniformiv(program, location, params);
5690}
5691
Jamie Madillc1d770e2017-04-13 17:31:24 -04005692GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5693{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005694 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005695 ASSERT(programObject);
5696 return programObject->getUniformLocation(name);
5697}
5698
5699GLboolean Context::isBuffer(GLuint buffer)
5700{
5701 if (buffer == 0)
5702 {
5703 return GL_FALSE;
5704 }
5705
5706 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5707}
5708
5709GLboolean Context::isEnabled(GLenum cap)
5710{
5711 return mGLState.getEnableFeature(cap);
5712}
5713
5714GLboolean Context::isFramebuffer(GLuint framebuffer)
5715{
5716 if (framebuffer == 0)
5717 {
5718 return GL_FALSE;
5719 }
5720
5721 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5722}
5723
5724GLboolean Context::isProgram(GLuint program)
5725{
5726 if (program == 0)
5727 {
5728 return GL_FALSE;
5729 }
5730
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005731 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005732}
5733
5734GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5735{
5736 if (renderbuffer == 0)
5737 {
5738 return GL_FALSE;
5739 }
5740
5741 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5742}
5743
5744GLboolean Context::isShader(GLuint shader)
5745{
5746 if (shader == 0)
5747 {
5748 return GL_FALSE;
5749 }
5750
5751 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5752}
5753
5754GLboolean Context::isTexture(GLuint texture)
5755{
5756 if (texture == 0)
5757 {
5758 return GL_FALSE;
5759 }
5760
5761 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5762}
5763
5764void Context::linkProgram(GLuint program)
5765{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005766 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005767 ASSERT(programObject);
5768 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08005769
5770 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
5771 // don't need to worry that:
5772 // 1. Draw calls after link use the new executable code or the old one depending on the link
5773 // result.
5774 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
5775 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
5776 // ProgramD3D.
5777 if (programObject->isInUse())
5778 {
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005779 programObject->resolveLink();
Jamie Madilldf836ff2018-10-01 10:36:24 -04005780 if (programObject->isLinked())
5781 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04005782 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04005783 }
jchen107ae70d82018-07-06 13:47:01 +08005784 mStateCache.onProgramExecutableChange(this);
5785 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005786}
5787
5788void Context::releaseShaderCompiler()
5789{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005790 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005791}
5792
5793void Context::shaderBinary(GLsizei n,
5794 const GLuint *shaders,
5795 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005796 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005797 GLsizei length)
5798{
5799 // No binary shader formats are supported.
5800 UNIMPLEMENTED();
5801}
5802
5803void Context::shaderSource(GLuint shader,
5804 GLsizei count,
5805 const GLchar *const *string,
5806 const GLint *length)
5807{
5808 Shader *shaderObject = getShader(shader);
5809 ASSERT(shaderObject);
5810 shaderObject->setSource(count, string, length);
5811}
5812
5813void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5814{
5815 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5816}
5817
5818void Context::stencilMask(GLuint mask)
5819{
5820 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5821}
5822
5823void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5824{
5825 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5826}
5827
5828void Context::uniform1f(GLint location, GLfloat x)
5829{
5830 Program *program = mGLState.getProgram();
5831 program->setUniform1fv(location, 1, &x);
5832}
5833
5834void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5835{
5836 Program *program = mGLState.getProgram();
5837 program->setUniform1fv(location, count, v);
5838}
5839
Jamie Madill7e4eff12018-08-08 15:49:26 -04005840void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005841{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005842 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04005843 {
5844 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04005845 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04005846 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005847}
5848
Jamie Madill7e4eff12018-08-08 15:49:26 -04005849void Context::uniform1i(GLint location, GLint x)
5850{
5851 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
5852}
5853
Jamie Madillc1d770e2017-04-13 17:31:24 -04005854void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5855{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005856 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005857}
5858
5859void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5860{
5861 GLfloat xy[2] = {x, y};
5862 Program *program = mGLState.getProgram();
5863 program->setUniform2fv(location, 1, xy);
5864}
5865
5866void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5867{
5868 Program *program = mGLState.getProgram();
5869 program->setUniform2fv(location, count, v);
5870}
5871
5872void Context::uniform2i(GLint location, GLint x, GLint y)
5873{
5874 GLint xy[2] = {x, y};
5875 Program *program = mGLState.getProgram();
5876 program->setUniform2iv(location, 1, xy);
5877}
5878
5879void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
5880{
5881 Program *program = mGLState.getProgram();
5882 program->setUniform2iv(location, count, v);
5883}
5884
5885void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5886{
5887 GLfloat xyz[3] = {x, y, z};
5888 Program *program = mGLState.getProgram();
5889 program->setUniform3fv(location, 1, xyz);
5890}
5891
5892void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
5893{
5894 Program *program = mGLState.getProgram();
5895 program->setUniform3fv(location, count, v);
5896}
5897
5898void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
5899{
5900 GLint xyz[3] = {x, y, z};
5901 Program *program = mGLState.getProgram();
5902 program->setUniform3iv(location, 1, xyz);
5903}
5904
5905void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
5906{
5907 Program *program = mGLState.getProgram();
5908 program->setUniform3iv(location, count, v);
5909}
5910
5911void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5912{
5913 GLfloat xyzw[4] = {x, y, z, w};
5914 Program *program = mGLState.getProgram();
5915 program->setUniform4fv(location, 1, xyzw);
5916}
5917
5918void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
5919{
5920 Program *program = mGLState.getProgram();
5921 program->setUniform4fv(location, count, v);
5922}
5923
5924void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5925{
5926 GLint xyzw[4] = {x, y, z, w};
5927 Program *program = mGLState.getProgram();
5928 program->setUniform4iv(location, 1, xyzw);
5929}
5930
5931void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
5932{
5933 Program *program = mGLState.getProgram();
5934 program->setUniform4iv(location, count, v);
5935}
5936
5937void Context::uniformMatrix2fv(GLint location,
5938 GLsizei count,
5939 GLboolean transpose,
5940 const GLfloat *value)
5941{
5942 Program *program = mGLState.getProgram();
5943 program->setUniformMatrix2fv(location, count, transpose, value);
5944}
5945
5946void Context::uniformMatrix3fv(GLint location,
5947 GLsizei count,
5948 GLboolean transpose,
5949 const GLfloat *value)
5950{
5951 Program *program = mGLState.getProgram();
5952 program->setUniformMatrix3fv(location, count, transpose, value);
5953}
5954
5955void Context::uniformMatrix4fv(GLint location,
5956 GLsizei count,
5957 GLboolean transpose,
5958 const GLfloat *value)
5959{
5960 Program *program = mGLState.getProgram();
5961 program->setUniformMatrix4fv(location, count, transpose, value);
5962}
5963
5964void Context::validateProgram(GLuint program)
5965{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005966 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005967 ASSERT(programObject);
5968 programObject->validate(mCaps);
5969}
5970
Jiajia Qin5451d532017-11-16 17:16:34 +08005971void Context::validateProgramPipeline(GLuint pipeline)
5972{
5973 UNIMPLEMENTED();
5974}
5975
Jamie Madilld04908b2017-06-09 14:15:35 -04005976void Context::getProgramBinary(GLuint program,
5977 GLsizei bufSize,
5978 GLsizei *length,
5979 GLenum *binaryFormat,
5980 void *binary)
5981{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005982 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04005983 ASSERT(programObject != nullptr);
5984
5985 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
5986}
5987
5988void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
5989{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005990 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04005991 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04005992
Jamie Madilld04908b2017-06-09 14:15:35 -04005993 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04005994 if (programObject->isInUse())
5995 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04005996 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04005997 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04005998 }
Jamie Madilld04908b2017-06-09 14:15:35 -04005999}
6000
Jamie Madillff325f12017-08-26 15:06:05 -04006001void Context::uniform1ui(GLint location, GLuint v0)
6002{
6003 Program *program = mGLState.getProgram();
6004 program->setUniform1uiv(location, 1, &v0);
6005}
6006
6007void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6008{
6009 Program *program = mGLState.getProgram();
6010 const GLuint xy[] = {v0, v1};
6011 program->setUniform2uiv(location, 1, xy);
6012}
6013
6014void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6015{
6016 Program *program = mGLState.getProgram();
6017 const GLuint xyz[] = {v0, v1, v2};
6018 program->setUniform3uiv(location, 1, xyz);
6019}
6020
6021void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6022{
6023 Program *program = mGLState.getProgram();
6024 const GLuint xyzw[] = {v0, v1, v2, v3};
6025 program->setUniform4uiv(location, 1, xyzw);
6026}
6027
6028void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6029{
6030 Program *program = mGLState.getProgram();
6031 program->setUniform1uiv(location, count, value);
6032}
6033void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6034{
6035 Program *program = mGLState.getProgram();
6036 program->setUniform2uiv(location, count, value);
6037}
6038
6039void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6040{
6041 Program *program = mGLState.getProgram();
6042 program->setUniform3uiv(location, count, value);
6043}
6044
6045void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6046{
6047 Program *program = mGLState.getProgram();
6048 program->setUniform4uiv(location, count, value);
6049}
6050
Jamie Madillf0e04492017-08-26 15:28:42 -04006051void Context::genQueries(GLsizei n, GLuint *ids)
6052{
6053 for (GLsizei i = 0; i < n; i++)
6054 {
6055 GLuint handle = mQueryHandleAllocator.allocate();
6056 mQueryMap.assign(handle, nullptr);
6057 ids[i] = handle;
6058 }
6059}
6060
6061void Context::deleteQueries(GLsizei n, const GLuint *ids)
6062{
6063 for (int i = 0; i < n; i++)
6064 {
6065 GLuint query = ids[i];
6066
6067 Query *queryObject = nullptr;
6068 if (mQueryMap.erase(query, &queryObject))
6069 {
6070 mQueryHandleAllocator.release(query);
6071 if (queryObject)
6072 {
6073 queryObject->release(this);
6074 }
6075 }
6076 }
6077}
6078
6079GLboolean Context::isQuery(GLuint id)
6080{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006081 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006082}
6083
Jamie Madillc8c95812017-08-26 18:40:09 -04006084void Context::uniformMatrix2x3fv(GLint location,
6085 GLsizei count,
6086 GLboolean transpose,
6087 const GLfloat *value)
6088{
6089 Program *program = mGLState.getProgram();
6090 program->setUniformMatrix2x3fv(location, count, transpose, value);
6091}
6092
6093void Context::uniformMatrix3x2fv(GLint location,
6094 GLsizei count,
6095 GLboolean transpose,
6096 const GLfloat *value)
6097{
6098 Program *program = mGLState.getProgram();
6099 program->setUniformMatrix3x2fv(location, count, transpose, value);
6100}
6101
6102void Context::uniformMatrix2x4fv(GLint location,
6103 GLsizei count,
6104 GLboolean transpose,
6105 const GLfloat *value)
6106{
6107 Program *program = mGLState.getProgram();
6108 program->setUniformMatrix2x4fv(location, count, transpose, value);
6109}
6110
6111void Context::uniformMatrix4x2fv(GLint location,
6112 GLsizei count,
6113 GLboolean transpose,
6114 const GLfloat *value)
6115{
6116 Program *program = mGLState.getProgram();
6117 program->setUniformMatrix4x2fv(location, count, transpose, value);
6118}
6119
6120void Context::uniformMatrix3x4fv(GLint location,
6121 GLsizei count,
6122 GLboolean transpose,
6123 const GLfloat *value)
6124{
6125 Program *program = mGLState.getProgram();
6126 program->setUniformMatrix3x4fv(location, count, transpose, value);
6127}
6128
6129void Context::uniformMatrix4x3fv(GLint location,
6130 GLsizei count,
6131 GLboolean transpose,
6132 const GLfloat *value)
6133{
6134 Program *program = mGLState.getProgram();
6135 program->setUniformMatrix4x3fv(location, count, transpose, value);
6136}
6137
Jamie Madilld7576732017-08-26 18:49:50 -04006138void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6139{
6140 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6141 {
6142 GLuint vertexArray = arrays[arrayIndex];
6143
6144 if (arrays[arrayIndex] != 0)
6145 {
6146 VertexArray *vertexArrayObject = nullptr;
6147 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6148 {
6149 if (vertexArrayObject != nullptr)
6150 {
6151 detachVertexArray(vertexArray);
6152 vertexArrayObject->onDestroy(this);
6153 }
6154
6155 mVertexArrayHandleAllocator.release(vertexArray);
6156 }
6157 }
6158 }
6159}
6160
6161void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6162{
6163 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6164 {
6165 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6166 mVertexArrayMap.assign(vertexArray, nullptr);
6167 arrays[arrayIndex] = vertexArray;
6168 }
6169}
6170
6171bool Context::isVertexArray(GLuint array)
6172{
6173 if (array == 0)
6174 {
6175 return GL_FALSE;
6176 }
6177
6178 VertexArray *vao = getVertexArray(array);
6179 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6180}
6181
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006182void Context::endTransformFeedback()
6183{
6184 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6185 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006186 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006187}
6188
6189void Context::transformFeedbackVaryings(GLuint program,
6190 GLsizei count,
6191 const GLchar *const *varyings,
6192 GLenum bufferMode)
6193{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006194 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006195 ASSERT(programObject);
6196 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6197}
6198
6199void Context::getTransformFeedbackVarying(GLuint program,
6200 GLuint index,
6201 GLsizei bufSize,
6202 GLsizei *length,
6203 GLsizei *size,
6204 GLenum *type,
6205 GLchar *name)
6206{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006207 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006208 ASSERT(programObject);
6209 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6210}
6211
6212void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6213{
6214 for (int i = 0; i < n; i++)
6215 {
6216 GLuint transformFeedback = ids[i];
6217 if (transformFeedback == 0)
6218 {
6219 continue;
6220 }
6221
6222 TransformFeedback *transformFeedbackObject = nullptr;
6223 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6224 {
6225 if (transformFeedbackObject != nullptr)
6226 {
6227 detachTransformFeedback(transformFeedback);
6228 transformFeedbackObject->release(this);
6229 }
6230
6231 mTransformFeedbackHandleAllocator.release(transformFeedback);
6232 }
6233 }
6234}
6235
6236void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6237{
6238 for (int i = 0; i < n; i++)
6239 {
6240 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6241 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6242 ids[i] = transformFeedback;
6243 }
6244}
6245
6246bool Context::isTransformFeedback(GLuint id)
6247{
6248 if (id == 0)
6249 {
6250 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6251 // returns FALSE
6252 return GL_FALSE;
6253 }
6254
6255 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6256 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6257}
6258
6259void Context::pauseTransformFeedback()
6260{
6261 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6262 transformFeedback->pause();
6263}
6264
6265void Context::resumeTransformFeedback()
6266{
6267 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6268 transformFeedback->resume();
6269}
6270
Jamie Madill12e957f2017-08-26 21:42:26 -04006271void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6272{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006273 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006274 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006275}
6276
Brandon Jones59770802018-04-02 13:18:42 -07006277void Context::getUniformuivRobust(GLuint program,
6278 GLint location,
6279 GLsizei bufSize,
6280 GLsizei *length,
6281 GLuint *params)
6282{
6283 getUniformuiv(program, location, params);
6284}
6285
Jamie Madill12e957f2017-08-26 21:42:26 -04006286GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6287{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006288 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006289 return programObject->getFragDataLocation(name);
6290}
6291
6292void Context::getUniformIndices(GLuint program,
6293 GLsizei uniformCount,
6294 const GLchar *const *uniformNames,
6295 GLuint *uniformIndices)
6296{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006297 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006298 if (!programObject->isLinked())
6299 {
6300 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6301 {
6302 uniformIndices[uniformId] = GL_INVALID_INDEX;
6303 }
6304 }
6305 else
6306 {
6307 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6308 {
6309 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6310 }
6311 }
6312}
6313
6314void Context::getActiveUniformsiv(GLuint program,
6315 GLsizei uniformCount,
6316 const GLuint *uniformIndices,
6317 GLenum pname,
6318 GLint *params)
6319{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006320 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006321 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6322 {
6323 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006324 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006325 }
6326}
6327
6328GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6329{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006330 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006331 return programObject->getUniformBlockIndex(uniformBlockName);
6332}
6333
6334void Context::getActiveUniformBlockiv(GLuint program,
6335 GLuint uniformBlockIndex,
6336 GLenum pname,
6337 GLint *params)
6338{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006339 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006340 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6341}
6342
Brandon Jones59770802018-04-02 13:18:42 -07006343void Context::getActiveUniformBlockivRobust(GLuint program,
6344 GLuint uniformBlockIndex,
6345 GLenum pname,
6346 GLsizei bufSize,
6347 GLsizei *length,
6348 GLint *params)
6349{
6350 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6351}
6352
Jamie Madill12e957f2017-08-26 21:42:26 -04006353void Context::getActiveUniformBlockName(GLuint program,
6354 GLuint uniformBlockIndex,
6355 GLsizei bufSize,
6356 GLsizei *length,
6357 GLchar *uniformBlockName)
6358{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006359 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006360 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6361}
6362
6363void Context::uniformBlockBinding(GLuint program,
6364 GLuint uniformBlockIndex,
6365 GLuint uniformBlockBinding)
6366{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006367 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006368 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006369
6370 if (programObject->isInUse())
6371 {
6372 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006373 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006374 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006375}
6376
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006377GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6378{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006379 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6380 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006381
Jamie Madill70b5bb02017-08-28 13:32:37 -04006382 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006383 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006384 if (error.isError())
6385 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006386 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006387 handleError(error);
6388 return nullptr;
6389 }
6390
Jamie Madill70b5bb02017-08-28 13:32:37 -04006391 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006392}
6393
6394GLboolean Context::isSync(GLsync sync)
6395{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006396 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006397}
6398
6399GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6400{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006401 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006402
6403 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006404 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006405 return result;
6406}
6407
6408void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6409{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006410 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006411 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006412}
6413
6414void Context::getInteger64v(GLenum pname, GLint64 *params)
6415{
6416 GLenum nativeType = GL_NONE;
6417 unsigned int numParams = 0;
6418 getQueryParameterInfo(pname, &nativeType, &numParams);
6419
6420 if (nativeType == GL_INT_64_ANGLEX)
6421 {
6422 getInteger64vImpl(pname, params);
6423 }
6424 else
6425 {
6426 CastStateValues(this, nativeType, pname, numParams, params);
6427 }
6428}
6429
Brandon Jones59770802018-04-02 13:18:42 -07006430void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6431{
6432 getInteger64v(pname, data);
6433}
6434
Corentin Wallez336129f2017-10-17 15:55:40 -04006435void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006436{
6437 Buffer *buffer = mGLState.getTargetBuffer(target);
6438 QueryBufferParameteri64v(buffer, pname, params);
6439}
6440
Brandon Jones59770802018-04-02 13:18:42 -07006441void Context::getBufferParameteri64vRobust(BufferBinding target,
6442 GLenum pname,
6443 GLsizei bufSize,
6444 GLsizei *length,
6445 GLint64 *params)
6446{
6447 getBufferParameteri64v(target, pname, params);
6448}
6449
Jamie Madill3ef140a2017-08-26 23:11:21 -04006450void Context::genSamplers(GLsizei count, GLuint *samplers)
6451{
6452 for (int i = 0; i < count; i++)
6453 {
6454 samplers[i] = mState.mSamplers->createSampler();
6455 }
6456}
6457
6458void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6459{
6460 for (int i = 0; i < count; i++)
6461 {
6462 GLuint sampler = samplers[i];
6463
6464 if (mState.mSamplers->getSampler(sampler))
6465 {
6466 detachSampler(sampler);
6467 }
6468
6469 mState.mSamplers->deleteObject(this, sampler);
6470 }
6471}
6472
6473void Context::getInternalformativ(GLenum target,
6474 GLenum internalformat,
6475 GLenum pname,
6476 GLsizei bufSize,
6477 GLint *params)
6478{
6479 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6480 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6481}
6482
Brandon Jones59770802018-04-02 13:18:42 -07006483void Context::getInternalformativRobust(GLenum target,
6484 GLenum internalformat,
6485 GLenum pname,
6486 GLsizei bufSize,
6487 GLsizei *length,
6488 GLint *params)
6489{
6490 getInternalformativ(target, internalformat, pname, bufSize, params);
6491}
6492
Jiajia Qin5451d532017-11-16 17:16:34 +08006493void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6494{
6495 programUniform1iv(program, location, 1, &v0);
6496}
6497
6498void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6499{
6500 GLint xy[2] = {v0, v1};
6501 programUniform2iv(program, location, 1, xy);
6502}
6503
6504void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6505{
6506 GLint xyz[3] = {v0, v1, v2};
6507 programUniform3iv(program, location, 1, xyz);
6508}
6509
6510void Context::programUniform4i(GLuint program,
6511 GLint location,
6512 GLint v0,
6513 GLint v1,
6514 GLint v2,
6515 GLint v3)
6516{
6517 GLint xyzw[4] = {v0, v1, v2, v3};
6518 programUniform4iv(program, location, 1, xyzw);
6519}
6520
6521void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6522{
6523 programUniform1uiv(program, location, 1, &v0);
6524}
6525
6526void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6527{
6528 GLuint xy[2] = {v0, v1};
6529 programUniform2uiv(program, location, 1, xy);
6530}
6531
6532void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6533{
6534 GLuint xyz[3] = {v0, v1, v2};
6535 programUniform3uiv(program, location, 1, xyz);
6536}
6537
6538void Context::programUniform4ui(GLuint program,
6539 GLint location,
6540 GLuint v0,
6541 GLuint v1,
6542 GLuint v2,
6543 GLuint v3)
6544{
6545 GLuint xyzw[4] = {v0, v1, v2, v3};
6546 programUniform4uiv(program, location, 1, xyzw);
6547}
6548
6549void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6550{
6551 programUniform1fv(program, location, 1, &v0);
6552}
6553
6554void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6555{
6556 GLfloat xy[2] = {v0, v1};
6557 programUniform2fv(program, location, 1, xy);
6558}
6559
6560void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6561{
6562 GLfloat xyz[3] = {v0, v1, v2};
6563 programUniform3fv(program, location, 1, xyz);
6564}
6565
6566void Context::programUniform4f(GLuint program,
6567 GLint location,
6568 GLfloat v0,
6569 GLfloat v1,
6570 GLfloat v2,
6571 GLfloat v3)
6572{
6573 GLfloat xyzw[4] = {v0, v1, v2, v3};
6574 programUniform4fv(program, location, 1, xyzw);
6575}
6576
Jamie Madill81c2e252017-09-09 23:32:46 -04006577void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6578{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006579 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006580 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006581 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006582}
6583
Jiajia Qin5451d532017-11-16 17:16:34 +08006584void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6585{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006586 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006587 ASSERT(programObject);
6588 programObject->setUniform2iv(location, count, value);
6589}
6590
6591void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6592{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006593 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006594 ASSERT(programObject);
6595 programObject->setUniform3iv(location, count, value);
6596}
6597
6598void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6599{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006600 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006601 ASSERT(programObject);
6602 programObject->setUniform4iv(location, count, value);
6603}
6604
6605void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6606{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006607 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006608 ASSERT(programObject);
6609 programObject->setUniform1uiv(location, count, value);
6610}
6611
6612void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6613{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006614 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006615 ASSERT(programObject);
6616 programObject->setUniform2uiv(location, count, value);
6617}
6618
6619void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *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->setUniform3uiv(location, count, value);
6624}
6625
6626void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6627{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006628 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006629 ASSERT(programObject);
6630 programObject->setUniform4uiv(location, count, value);
6631}
6632
6633void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6634{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006635 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006636 ASSERT(programObject);
6637 programObject->setUniform1fv(location, count, value);
6638}
6639
6640void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6641{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006642 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006643 ASSERT(programObject);
6644 programObject->setUniform2fv(location, count, value);
6645}
6646
6647void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6648{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006649 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006650 ASSERT(programObject);
6651 programObject->setUniform3fv(location, count, value);
6652}
6653
6654void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6655{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006656 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006657 ASSERT(programObject);
6658 programObject->setUniform4fv(location, count, value);
6659}
6660
6661void Context::programUniformMatrix2fv(GLuint program,
6662 GLint location,
6663 GLsizei count,
6664 GLboolean transpose,
6665 const GLfloat *value)
6666{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006667 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006668 ASSERT(programObject);
6669 programObject->setUniformMatrix2fv(location, count, transpose, value);
6670}
6671
6672void Context::programUniformMatrix3fv(GLuint program,
6673 GLint location,
6674 GLsizei count,
6675 GLboolean transpose,
6676 const GLfloat *value)
6677{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006678 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006679 ASSERT(programObject);
6680 programObject->setUniformMatrix3fv(location, count, transpose, value);
6681}
6682
6683void Context::programUniformMatrix4fv(GLuint program,
6684 GLint location,
6685 GLsizei count,
6686 GLboolean transpose,
6687 const GLfloat *value)
6688{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006689 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006690 ASSERT(programObject);
6691 programObject->setUniformMatrix4fv(location, count, transpose, value);
6692}
6693
6694void Context::programUniformMatrix2x3fv(GLuint program,
6695 GLint location,
6696 GLsizei count,
6697 GLboolean transpose,
6698 const GLfloat *value)
6699{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006700 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006701 ASSERT(programObject);
6702 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6703}
6704
6705void Context::programUniformMatrix3x2fv(GLuint program,
6706 GLint location,
6707 GLsizei count,
6708 GLboolean transpose,
6709 const GLfloat *value)
6710{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006711 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006712 ASSERT(programObject);
6713 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6714}
6715
6716void Context::programUniformMatrix2x4fv(GLuint program,
6717 GLint location,
6718 GLsizei count,
6719 GLboolean transpose,
6720 const GLfloat *value)
6721{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006722 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006723 ASSERT(programObject);
6724 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6725}
6726
6727void Context::programUniformMatrix4x2fv(GLuint program,
6728 GLint location,
6729 GLsizei count,
6730 GLboolean transpose,
6731 const GLfloat *value)
6732{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006733 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006734 ASSERT(programObject);
6735 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6736}
6737
6738void Context::programUniformMatrix3x4fv(GLuint program,
6739 GLint location,
6740 GLsizei count,
6741 GLboolean transpose,
6742 const GLfloat *value)
6743{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006744 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006745 ASSERT(programObject);
6746 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6747}
6748
6749void Context::programUniformMatrix4x3fv(GLuint program,
6750 GLint location,
6751 GLsizei count,
6752 GLboolean transpose,
6753 const GLfloat *value)
6754{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006755 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006756 ASSERT(programObject);
6757 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6758}
6759
Jamie Madill81c2e252017-09-09 23:32:46 -04006760void Context::onTextureChange(const Texture *texture)
6761{
6762 // Conservatively assume all textures are dirty.
6763 // TODO(jmadill): More fine-grained update.
6764 mGLState.setObjectDirty(GL_TEXTURE);
6765}
6766
James Darpiniane8a93c62018-01-04 18:02:24 -08006767bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6768{
6769 return mGLState.isCurrentTransformFeedback(tf);
6770}
James Darpiniane8a93c62018-01-04 18:02:24 -08006771
Yunchao Hea336b902017-08-02 16:05:21 +08006772void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6773{
6774 for (int i = 0; i < count; i++)
6775 {
6776 pipelines[i] = createProgramPipeline();
6777 }
6778}
6779
6780void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6781{
6782 for (int i = 0; i < count; i++)
6783 {
6784 if (pipelines[i] != 0)
6785 {
6786 deleteProgramPipeline(pipelines[i]);
6787 }
6788 }
6789}
6790
6791GLboolean Context::isProgramPipeline(GLuint pipeline)
6792{
6793 if (pipeline == 0)
6794 {
6795 return GL_FALSE;
6796 }
6797
6798 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6799}
6800
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006801void Context::finishFenceNV(GLuint fence)
6802{
6803 FenceNV *fenceObject = getFenceNV(fence);
6804
6805 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04006806 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006807}
6808
6809void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6810{
6811 FenceNV *fenceObject = getFenceNV(fence);
6812
6813 ASSERT(fenceObject && fenceObject->isSet());
6814
6815 switch (pname)
6816 {
6817 case GL_FENCE_STATUS_NV:
6818 {
6819 // GL_NV_fence spec:
6820 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6821 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6822 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6823 GLboolean status = GL_TRUE;
6824 if (fenceObject->getStatus() != GL_TRUE)
6825 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006826 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006827 }
6828 *params = status;
6829 break;
6830 }
6831
6832 case GL_FENCE_CONDITION_NV:
6833 {
6834 *params = static_cast<GLint>(fenceObject->getCondition());
6835 break;
6836 }
6837
6838 default:
6839 UNREACHABLE();
6840 }
6841}
6842
6843void Context::getTranslatedShaderSource(GLuint shader,
6844 GLsizei bufsize,
6845 GLsizei *length,
6846 GLchar *source)
6847{
6848 Shader *shaderObject = getShader(shader);
6849 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08006850 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006851}
6852
6853void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6854{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006855 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006856 ASSERT(programObject);
6857
6858 programObject->getUniformfv(this, location, params);
6859}
6860
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006861void Context::getnUniformfvRobust(GLuint program,
6862 GLint location,
6863 GLsizei bufSize,
6864 GLsizei *length,
6865 GLfloat *params)
6866{
6867 UNIMPLEMENTED();
6868}
6869
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006870void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
6871{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006872 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006873 ASSERT(programObject);
6874
6875 programObject->getUniformiv(this, location, params);
6876}
6877
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006878void Context::getnUniformivRobust(GLuint program,
6879 GLint location,
6880 GLsizei bufSize,
6881 GLsizei *length,
6882 GLint *params)
6883{
6884 UNIMPLEMENTED();
6885}
6886
6887void Context::getnUniformuivRobust(GLuint program,
6888 GLint location,
6889 GLsizei bufSize,
6890 GLsizei *length,
6891 GLuint *params)
6892{
6893 UNIMPLEMENTED();
6894}
6895
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006896GLboolean Context::isFenceNV(GLuint fence)
6897{
6898 FenceNV *fenceObject = getFenceNV(fence);
6899
6900 if (fenceObject == nullptr)
6901 {
6902 return GL_FALSE;
6903 }
6904
6905 // GL_NV_fence spec:
6906 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
6907 // existing fence.
6908 return fenceObject->isSet();
6909}
6910
6911void Context::readnPixels(GLint x,
6912 GLint y,
6913 GLsizei width,
6914 GLsizei height,
6915 GLenum format,
6916 GLenum type,
6917 GLsizei bufSize,
6918 void *data)
6919{
6920 return readPixels(x, y, width, height, format, type, data);
6921}
6922
Jamie Madill007530e2017-12-28 14:27:04 -05006923void Context::setFenceNV(GLuint fence, GLenum condition)
6924{
6925 ASSERT(condition == GL_ALL_COMPLETED_NV);
6926
6927 FenceNV *fenceObject = getFenceNV(fence);
6928 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04006929 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05006930}
6931
6932GLboolean Context::testFenceNV(GLuint fence)
6933{
6934 FenceNV *fenceObject = getFenceNV(fence);
6935
6936 ASSERT(fenceObject != nullptr);
6937 ASSERT(fenceObject->isSet() == GL_TRUE);
6938
6939 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04006940 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05006941 if (error.isError())
6942 {
6943 handleError(error);
6944 return GL_TRUE;
6945 }
6946
6947 return result;
6948}
6949
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006950void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006951{
6952 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07006953 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05006954 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05006955}
6956
Jamie Madillfa920eb2018-01-04 11:45:50 -05006957void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006958{
6959 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07006960 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05006961 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
6962}
6963
Jamie Madillfa920eb2018-01-04 11:45:50 -05006964void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
6965{
6966 UNIMPLEMENTED();
6967}
6968
Jamie Madill5b772312018-03-08 20:28:32 -05006969bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
6970{
6971 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
6972 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
6973 // to the fact that it is stored internally as a float, and so would require conversion
6974 // if returned from Context::getIntegerv. Since this conversion is already implemented
6975 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
6976 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
6977 // application.
6978 switch (pname)
6979 {
6980 case GL_COMPRESSED_TEXTURE_FORMATS:
6981 {
6982 *type = GL_INT;
6983 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
6984 return true;
6985 }
6986 case GL_SHADER_BINARY_FORMATS:
6987 {
6988 *type = GL_INT;
6989 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
6990 return true;
6991 }
6992
6993 case GL_MAX_VERTEX_ATTRIBS:
6994 case GL_MAX_VERTEX_UNIFORM_VECTORS:
6995 case GL_MAX_VARYING_VECTORS:
6996 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
6997 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
6998 case GL_MAX_TEXTURE_IMAGE_UNITS:
6999 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7000 case GL_MAX_RENDERBUFFER_SIZE:
7001 case GL_NUM_SHADER_BINARY_FORMATS:
7002 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7003 case GL_ARRAY_BUFFER_BINDING:
7004 case GL_FRAMEBUFFER_BINDING:
7005 case GL_RENDERBUFFER_BINDING:
7006 case GL_CURRENT_PROGRAM:
7007 case GL_PACK_ALIGNMENT:
7008 case GL_UNPACK_ALIGNMENT:
7009 case GL_GENERATE_MIPMAP_HINT:
7010 case GL_RED_BITS:
7011 case GL_GREEN_BITS:
7012 case GL_BLUE_BITS:
7013 case GL_ALPHA_BITS:
7014 case GL_DEPTH_BITS:
7015 case GL_STENCIL_BITS:
7016 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7017 case GL_CULL_FACE_MODE:
7018 case GL_FRONT_FACE:
7019 case GL_ACTIVE_TEXTURE:
7020 case GL_STENCIL_FUNC:
7021 case GL_STENCIL_VALUE_MASK:
7022 case GL_STENCIL_REF:
7023 case GL_STENCIL_FAIL:
7024 case GL_STENCIL_PASS_DEPTH_FAIL:
7025 case GL_STENCIL_PASS_DEPTH_PASS:
7026 case GL_STENCIL_BACK_FUNC:
7027 case GL_STENCIL_BACK_VALUE_MASK:
7028 case GL_STENCIL_BACK_REF:
7029 case GL_STENCIL_BACK_FAIL:
7030 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7031 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7032 case GL_DEPTH_FUNC:
7033 case GL_BLEND_SRC_RGB:
7034 case GL_BLEND_SRC_ALPHA:
7035 case GL_BLEND_DST_RGB:
7036 case GL_BLEND_DST_ALPHA:
7037 case GL_BLEND_EQUATION_RGB:
7038 case GL_BLEND_EQUATION_ALPHA:
7039 case GL_STENCIL_WRITEMASK:
7040 case GL_STENCIL_BACK_WRITEMASK:
7041 case GL_STENCIL_CLEAR_VALUE:
7042 case GL_SUBPIXEL_BITS:
7043 case GL_MAX_TEXTURE_SIZE:
7044 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7045 case GL_SAMPLE_BUFFERS:
7046 case GL_SAMPLES:
7047 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7048 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7049 case GL_TEXTURE_BINDING_2D:
7050 case GL_TEXTURE_BINDING_CUBE_MAP:
7051 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7052 {
7053 *type = GL_INT;
7054 *numParams = 1;
7055 return true;
7056 }
7057 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7058 {
7059 if (!getExtensions().packReverseRowOrder)
7060 {
7061 return false;
7062 }
7063 *type = GL_INT;
7064 *numParams = 1;
7065 return true;
7066 }
7067 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7068 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7069 {
7070 if (!getExtensions().textureRectangle)
7071 {
7072 return false;
7073 }
7074 *type = GL_INT;
7075 *numParams = 1;
7076 return true;
7077 }
7078 case GL_MAX_DRAW_BUFFERS_EXT:
7079 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7080 {
7081 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7082 {
7083 return false;
7084 }
7085 *type = GL_INT;
7086 *numParams = 1;
7087 return true;
7088 }
7089 case GL_MAX_VIEWPORT_DIMS:
7090 {
7091 *type = GL_INT;
7092 *numParams = 2;
7093 return true;
7094 }
7095 case GL_VIEWPORT:
7096 case GL_SCISSOR_BOX:
7097 {
7098 *type = GL_INT;
7099 *numParams = 4;
7100 return true;
7101 }
7102 case GL_SHADER_COMPILER:
7103 case GL_SAMPLE_COVERAGE_INVERT:
7104 case GL_DEPTH_WRITEMASK:
7105 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7106 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7107 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7108 // bool-natural
7109 case GL_SAMPLE_COVERAGE:
7110 case GL_SCISSOR_TEST:
7111 case GL_STENCIL_TEST:
7112 case GL_DEPTH_TEST:
7113 case GL_BLEND:
7114 case GL_DITHER:
7115 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7116 {
7117 *type = GL_BOOL;
7118 *numParams = 1;
7119 return true;
7120 }
7121 case GL_COLOR_WRITEMASK:
7122 {
7123 *type = GL_BOOL;
7124 *numParams = 4;
7125 return true;
7126 }
7127 case GL_POLYGON_OFFSET_FACTOR:
7128 case GL_POLYGON_OFFSET_UNITS:
7129 case GL_SAMPLE_COVERAGE_VALUE:
7130 case GL_DEPTH_CLEAR_VALUE:
7131 case GL_LINE_WIDTH:
7132 {
7133 *type = GL_FLOAT;
7134 *numParams = 1;
7135 return true;
7136 }
7137 case GL_ALIASED_LINE_WIDTH_RANGE:
7138 case GL_ALIASED_POINT_SIZE_RANGE:
7139 case GL_DEPTH_RANGE:
7140 {
7141 *type = GL_FLOAT;
7142 *numParams = 2;
7143 return true;
7144 }
7145 case GL_COLOR_CLEAR_VALUE:
7146 case GL_BLEND_COLOR:
7147 {
7148 *type = GL_FLOAT;
7149 *numParams = 4;
7150 return true;
7151 }
7152 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7153 if (!getExtensions().textureFilterAnisotropic)
7154 {
7155 return false;
7156 }
7157 *type = GL_FLOAT;
7158 *numParams = 1;
7159 return true;
7160 case GL_TIMESTAMP_EXT:
7161 if (!getExtensions().disjointTimerQuery)
7162 {
7163 return false;
7164 }
7165 *type = GL_INT_64_ANGLEX;
7166 *numParams = 1;
7167 return true;
7168 case GL_GPU_DISJOINT_EXT:
7169 if (!getExtensions().disjointTimerQuery)
7170 {
7171 return false;
7172 }
7173 *type = GL_INT;
7174 *numParams = 1;
7175 return true;
7176 case GL_COVERAGE_MODULATION_CHROMIUM:
7177 if (!getExtensions().framebufferMixedSamples)
7178 {
7179 return false;
7180 }
7181 *type = GL_INT;
7182 *numParams = 1;
7183 return true;
7184 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7185 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7186 {
7187 return false;
7188 }
7189 *type = GL_INT;
7190 *numParams = 1;
7191 return true;
7192 }
7193
7194 if (getExtensions().debug)
7195 {
7196 switch (pname)
7197 {
7198 case GL_DEBUG_LOGGED_MESSAGES:
7199 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7200 case GL_DEBUG_GROUP_STACK_DEPTH:
7201 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7202 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7203 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7204 case GL_MAX_LABEL_LENGTH:
7205 *type = GL_INT;
7206 *numParams = 1;
7207 return true;
7208
7209 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7210 case GL_DEBUG_OUTPUT:
7211 *type = GL_BOOL;
7212 *numParams = 1;
7213 return true;
7214 }
7215 }
7216
7217 if (getExtensions().multisampleCompatibility)
7218 {
7219 switch (pname)
7220 {
7221 case GL_MULTISAMPLE_EXT:
7222 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7223 *type = GL_BOOL;
7224 *numParams = 1;
7225 return true;
7226 }
7227 }
7228
7229 if (getExtensions().pathRendering)
7230 {
7231 switch (pname)
7232 {
7233 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7234 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7235 *type = GL_FLOAT;
7236 *numParams = 16;
7237 return true;
7238 }
7239 }
7240
7241 if (getExtensions().bindGeneratesResource)
7242 {
7243 switch (pname)
7244 {
7245 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7246 *type = GL_BOOL;
7247 *numParams = 1;
7248 return true;
7249 }
7250 }
7251
7252 if (getExtensions().clientArrays)
7253 {
7254 switch (pname)
7255 {
7256 case GL_CLIENT_ARRAYS_ANGLE:
7257 *type = GL_BOOL;
7258 *numParams = 1;
7259 return true;
7260 }
7261 }
7262
7263 if (getExtensions().sRGBWriteControl)
7264 {
7265 switch (pname)
7266 {
7267 case GL_FRAMEBUFFER_SRGB_EXT:
7268 *type = GL_BOOL;
7269 *numParams = 1;
7270 return true;
7271 }
7272 }
7273
7274 if (getExtensions().robustResourceInitialization &&
7275 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7276 {
7277 *type = GL_BOOL;
7278 *numParams = 1;
7279 return true;
7280 }
7281
7282 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7283 {
7284 *type = GL_BOOL;
7285 *numParams = 1;
7286 return true;
7287 }
7288
jchen1082af6202018-06-22 10:59:52 +08007289 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7290 {
7291 *type = GL_INT;
7292 *numParams = 1;
7293 return true;
7294 }
7295
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007296 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7297 {
7298 *type = GL_INT;
7299 *numParams = 1;
7300 return true;
7301 }
7302
Jamie Madill5b772312018-03-08 20:28:32 -05007303 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7304 switch (pname)
7305 {
7306 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7307 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7308 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7309 {
7310 return false;
7311 }
7312 *type = GL_INT;
7313 *numParams = 1;
7314 return true;
7315
7316 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7317 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7318 {
7319 return false;
7320 }
7321 *type = GL_INT;
7322 *numParams = 1;
7323 return true;
7324
7325 case GL_PROGRAM_BINARY_FORMATS_OES:
7326 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7327 {
7328 return false;
7329 }
7330 *type = GL_INT;
7331 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7332 return true;
7333
7334 case GL_PACK_ROW_LENGTH:
7335 case GL_PACK_SKIP_ROWS:
7336 case GL_PACK_SKIP_PIXELS:
7337 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7338 {
7339 return false;
7340 }
7341 *type = GL_INT;
7342 *numParams = 1;
7343 return true;
7344 case GL_UNPACK_ROW_LENGTH:
7345 case GL_UNPACK_SKIP_ROWS:
7346 case GL_UNPACK_SKIP_PIXELS:
7347 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7348 {
7349 return false;
7350 }
7351 *type = GL_INT;
7352 *numParams = 1;
7353 return true;
7354 case GL_VERTEX_ARRAY_BINDING:
7355 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7356 {
7357 return false;
7358 }
7359 *type = GL_INT;
7360 *numParams = 1;
7361 return true;
7362 case GL_PIXEL_PACK_BUFFER_BINDING:
7363 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7364 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7365 {
7366 return false;
7367 }
7368 *type = GL_INT;
7369 *numParams = 1;
7370 return true;
7371 case GL_MAX_SAMPLES:
7372 {
7373 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7374 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7375 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7376 {
7377 return false;
7378 }
7379 *type = GL_INT;
7380 *numParams = 1;
7381 return true;
7382
7383 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7384 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7385 {
7386 return false;
7387 }
7388 *type = GL_INT;
7389 *numParams = 1;
7390 return true;
7391 }
7392 }
7393
7394 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7395 {
7396 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7397 {
7398 return false;
7399 }
7400 *type = GL_INT;
7401 *numParams = 1;
7402 return true;
7403 }
7404
7405 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7406 {
7407 *type = GL_INT;
7408 *numParams = 1;
7409 return true;
7410 }
7411
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007412 if (getClientVersion() < Version(2, 0))
7413 {
7414 switch (pname)
7415 {
7416 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007417 case GL_CLIENT_ACTIVE_TEXTURE:
7418 case GL_MATRIX_MODE:
7419 case GL_MAX_TEXTURE_UNITS:
7420 case GL_MAX_MODELVIEW_STACK_DEPTH:
7421 case GL_MAX_PROJECTION_STACK_DEPTH:
7422 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007423 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007424 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007425 case GL_VERTEX_ARRAY_STRIDE:
7426 case GL_NORMAL_ARRAY_STRIDE:
7427 case GL_COLOR_ARRAY_STRIDE:
7428 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7429 case GL_VERTEX_ARRAY_SIZE:
7430 case GL_COLOR_ARRAY_SIZE:
7431 case GL_TEXTURE_COORD_ARRAY_SIZE:
7432 case GL_VERTEX_ARRAY_TYPE:
7433 case GL_NORMAL_ARRAY_TYPE:
7434 case GL_COLOR_ARRAY_TYPE:
7435 case GL_TEXTURE_COORD_ARRAY_TYPE:
7436 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7437 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7438 case GL_COLOR_ARRAY_BUFFER_BINDING:
7439 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7440 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7441 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7442 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007443 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007444 case GL_MODELVIEW_STACK_DEPTH:
7445 case GL_PROJECTION_STACK_DEPTH:
7446 case GL_TEXTURE_STACK_DEPTH:
7447 case GL_LOGIC_OP_MODE:
7448 case GL_BLEND_SRC:
7449 case GL_BLEND_DST:
7450 case GL_PERSPECTIVE_CORRECTION_HINT:
7451 case GL_POINT_SMOOTH_HINT:
7452 case GL_LINE_SMOOTH_HINT:
7453 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007454 *type = GL_INT;
7455 *numParams = 1;
7456 return true;
7457 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007458 case GL_FOG_DENSITY:
7459 case GL_FOG_START:
7460 case GL_FOG_END:
7461 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007462 case GL_POINT_SIZE:
7463 case GL_POINT_SIZE_MIN:
7464 case GL_POINT_SIZE_MAX:
7465 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007466 *type = GL_FLOAT;
7467 *numParams = 1;
7468 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007469 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007470 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007471 *type = GL_FLOAT;
7472 *numParams = 2;
7473 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007474 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007475 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007476 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007477 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007478 *type = GL_FLOAT;
7479 *numParams = 4;
7480 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007481 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007482 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007483 *type = GL_FLOAT;
7484 *numParams = 3;
7485 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007486 case GL_MODELVIEW_MATRIX:
7487 case GL_PROJECTION_MATRIX:
7488 case GL_TEXTURE_MATRIX:
7489 *type = GL_FLOAT;
7490 *numParams = 16;
7491 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007492 case GL_LIGHT_MODEL_TWO_SIDE:
7493 *type = GL_BOOL;
7494 *numParams = 1;
7495 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007496 }
7497 }
7498
Jamie Madill5b772312018-03-08 20:28:32 -05007499 if (getClientVersion() < Version(3, 0))
7500 {
7501 return false;
7502 }
7503
7504 // Check for ES3.0+ parameter names
7505 switch (pname)
7506 {
7507 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7508 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7509 case GL_UNIFORM_BUFFER_BINDING:
7510 case GL_TRANSFORM_FEEDBACK_BINDING:
7511 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7512 case GL_COPY_READ_BUFFER_BINDING:
7513 case GL_COPY_WRITE_BUFFER_BINDING:
7514 case GL_SAMPLER_BINDING:
7515 case GL_READ_BUFFER:
7516 case GL_TEXTURE_BINDING_3D:
7517 case GL_TEXTURE_BINDING_2D_ARRAY:
7518 case GL_MAX_3D_TEXTURE_SIZE:
7519 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7520 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7521 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7522 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7523 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7524 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7525 case GL_MAX_VARYING_COMPONENTS:
7526 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7527 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7528 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7529 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7530 case GL_NUM_EXTENSIONS:
7531 case GL_MAJOR_VERSION:
7532 case GL_MINOR_VERSION:
7533 case GL_MAX_ELEMENTS_INDICES:
7534 case GL_MAX_ELEMENTS_VERTICES:
7535 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7536 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7537 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7538 case GL_UNPACK_IMAGE_HEIGHT:
7539 case GL_UNPACK_SKIP_IMAGES:
7540 {
7541 *type = GL_INT;
7542 *numParams = 1;
7543 return true;
7544 }
7545
7546 case GL_MAX_ELEMENT_INDEX:
7547 case GL_MAX_UNIFORM_BLOCK_SIZE:
7548 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7549 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7550 case GL_MAX_SERVER_WAIT_TIMEOUT:
7551 {
7552 *type = GL_INT_64_ANGLEX;
7553 *numParams = 1;
7554 return true;
7555 }
7556
7557 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7558 case GL_TRANSFORM_FEEDBACK_PAUSED:
7559 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7560 case GL_RASTERIZER_DISCARD:
7561 {
7562 *type = GL_BOOL;
7563 *numParams = 1;
7564 return true;
7565 }
7566
7567 case GL_MAX_TEXTURE_LOD_BIAS:
7568 {
7569 *type = GL_FLOAT;
7570 *numParams = 1;
7571 return true;
7572 }
7573 }
7574
7575 if (getExtensions().requestExtension)
7576 {
7577 switch (pname)
7578 {
7579 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7580 *type = GL_INT;
7581 *numParams = 1;
7582 return true;
7583 }
7584 }
7585
7586 if (getClientVersion() < Version(3, 1))
7587 {
7588 return false;
7589 }
7590
7591 switch (pname)
7592 {
7593 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7594 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7595 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7596 case GL_MAX_FRAMEBUFFER_WIDTH:
7597 case GL_MAX_FRAMEBUFFER_HEIGHT:
7598 case GL_MAX_FRAMEBUFFER_SAMPLES:
7599 case GL_MAX_SAMPLE_MASK_WORDS:
7600 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7601 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7602 case GL_MAX_INTEGER_SAMPLES:
7603 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7604 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7605 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7606 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7607 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7608 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7609 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7610 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7611 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7612 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7613 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7614 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7615 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7616 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7617 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7618 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7619 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7620 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7621 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7622 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7623 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7624 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7625 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7626 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7627 case GL_MAX_UNIFORM_LOCATIONS:
7628 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7629 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7630 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7631 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7632 case GL_MAX_IMAGE_UNITS:
7633 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7634 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7635 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7636 case GL_SHADER_STORAGE_BUFFER_BINDING:
7637 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7638 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007639 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007640 *type = GL_INT;
7641 *numParams = 1;
7642 return true;
7643 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7644 *type = GL_INT_64_ANGLEX;
7645 *numParams = 1;
7646 return true;
7647 case GL_SAMPLE_MASK:
7648 *type = GL_BOOL;
7649 *numParams = 1;
7650 return true;
7651 }
7652
7653 if (getExtensions().geometryShader)
7654 {
7655 switch (pname)
7656 {
7657 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7658 case GL_LAYER_PROVOKING_VERTEX_EXT:
7659 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7660 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7661 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7662 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7663 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7664 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7665 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7666 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7667 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7668 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7669 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7670 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7671 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7672 *type = GL_INT;
7673 *numParams = 1;
7674 return true;
7675 }
7676 }
7677
7678 return false;
7679}
7680
7681bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7682{
7683 if (getClientVersion() < Version(3, 0))
7684 {
7685 return false;
7686 }
7687
7688 switch (target)
7689 {
7690 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7691 case GL_UNIFORM_BUFFER_BINDING:
7692 {
7693 *type = GL_INT;
7694 *numParams = 1;
7695 return true;
7696 }
7697 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7698 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7699 case GL_UNIFORM_BUFFER_START:
7700 case GL_UNIFORM_BUFFER_SIZE:
7701 {
7702 *type = GL_INT_64_ANGLEX;
7703 *numParams = 1;
7704 return true;
7705 }
7706 }
7707
7708 if (getClientVersion() < Version(3, 1))
7709 {
7710 return false;
7711 }
7712
7713 switch (target)
7714 {
7715 case GL_IMAGE_BINDING_LAYERED:
7716 {
7717 *type = GL_BOOL;
7718 *numParams = 1;
7719 return true;
7720 }
7721 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7722 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7723 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7724 case GL_SHADER_STORAGE_BUFFER_BINDING:
7725 case GL_VERTEX_BINDING_BUFFER:
7726 case GL_VERTEX_BINDING_DIVISOR:
7727 case GL_VERTEX_BINDING_OFFSET:
7728 case GL_VERTEX_BINDING_STRIDE:
7729 case GL_SAMPLE_MASK_VALUE:
7730 case GL_IMAGE_BINDING_NAME:
7731 case GL_IMAGE_BINDING_LEVEL:
7732 case GL_IMAGE_BINDING_LAYER:
7733 case GL_IMAGE_BINDING_ACCESS:
7734 case GL_IMAGE_BINDING_FORMAT:
7735 {
7736 *type = GL_INT;
7737 *numParams = 1;
7738 return true;
7739 }
7740 case GL_ATOMIC_COUNTER_BUFFER_START:
7741 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7742 case GL_SHADER_STORAGE_BUFFER_START:
7743 case GL_SHADER_STORAGE_BUFFER_SIZE:
7744 {
7745 *type = GL_INT_64_ANGLEX;
7746 *numParams = 1;
7747 return true;
7748 }
7749 }
7750
7751 return false;
7752}
7753
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007754Program *Context::getProgramResolveLink(GLuint handle) const
7755{
7756 Program *program = mState.mShaderPrograms->getProgram(handle);
7757 if (program)
7758 {
7759 program->resolveLink();
7760 }
7761 return program;
7762}
7763
7764Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05007765{
7766 return mState.mShaderPrograms->getProgram(handle);
7767}
7768
7769Shader *Context::getShader(GLuint handle) const
7770{
7771 return mState.mShaderPrograms->getShader(handle);
7772}
7773
7774bool Context::isTextureGenerated(GLuint texture) const
7775{
7776 return mState.mTextures->isHandleGenerated(texture);
7777}
7778
Jamie Madill5b772312018-03-08 20:28:32 -05007779bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7780{
7781 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7782}
7783
7784bool Context::isFramebufferGenerated(GLuint framebuffer) const
7785{
7786 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7787}
7788
7789bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7790{
7791 return mState.mPipelines->isHandleGenerated(pipeline);
7792}
7793
7794bool Context::usingDisplayTextureShareGroup() const
7795{
7796 return mDisplayTextureShareGroup;
7797}
7798
7799GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7800{
7801 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7802 internalformat == GL_DEPTH_STENCIL
7803 ? GL_DEPTH24_STENCIL8
7804 : internalformat;
7805}
7806
jchen1082af6202018-06-22 10:59:52 +08007807void Context::maxShaderCompilerThreads(GLuint count)
7808{
jchen107ae70d82018-07-06 13:47:01 +08007809 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08007810 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08007811 // A count of zero specifies a request for no parallel compiling or linking.
7812 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
7813 {
7814 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
7815 }
7816 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08007817}
7818
Jamie Madill2eb65032018-07-30 10:25:57 -04007819bool Context::isGLES1() const
7820{
7821 return mState.getClientVersion() < Version(2, 0);
7822}
7823
Jamie Madilla11819d2018-07-30 10:26:01 -04007824void Context::onSubjectStateChange(const Context *context,
7825 angle::SubjectIndex index,
7826 angle::SubjectMessage message)
7827{
Jamie Madilla11819d2018-07-30 10:26:01 -04007828 switch (index)
7829 {
7830 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007831 switch (message)
7832 {
7833 case angle::SubjectMessage::CONTENTS_CHANGED:
7834 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
7835 mStateCache.onVertexArrayBufferContentsChange(this);
7836 break;
7837 case angle::SubjectMessage::RESOURCE_MAPPED:
7838 case angle::SubjectMessage::RESOURCE_UNMAPPED:
7839 case angle::SubjectMessage::BINDING_CHANGED:
7840 mStateCache.onVertexArrayBufferStateChange(this);
7841 break;
7842 default:
7843 break;
7844 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007845 break;
7846
7847 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007848 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7849 {
7850 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
7851 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007852 break;
7853
7854 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007855 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7856 {
7857 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
7858 }
7859 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04007860 break;
7861
7862 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04007863 if (index < kTextureMaxSubjectIndex)
7864 {
7865 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04007866 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007867 }
Jamie Madille25b8002018-09-20 13:39:49 -04007868 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04007869 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04007870 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04007871 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007872 }
Jamie Madille25b8002018-09-20 13:39:49 -04007873 else
7874 {
7875 ASSERT(index < kSamplerMaxSubjectIndex);
7876 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
7877 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007878 break;
7879 }
7880}
7881
Jamie Madill6b873dd2018-07-12 23:56:30 -04007882// ErrorSet implementation.
7883ErrorSet::ErrorSet(Context *context) : mContext(context)
7884{
7885}
7886
7887ErrorSet::~ErrorSet() = default;
7888
Jamie Madill306b6c12018-07-27 08:12:49 -04007889void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04007890{
7891 // This internal enum is used to filter internal errors that are already handled.
7892 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
7893 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
7894 {
7895 return;
7896 }
7897
7898 if (ANGLE_UNLIKELY(error.isError()))
7899 {
7900 GLenum code = error.getCode();
7901 mErrors.insert(code);
7902 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
7903 {
7904 mContext->markContextLost();
7905 }
7906
7907 ASSERT(!error.getMessage().empty());
7908 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
7909 error.getID(), GL_DEBUG_SEVERITY_HIGH,
7910 error.getMessage());
7911 }
7912}
7913
7914bool ErrorSet::empty() const
7915{
7916 return mErrors.empty();
7917}
7918
7919GLenum ErrorSet::popError()
7920{
7921 ASSERT(!empty());
7922 GLenum error = *mErrors.begin();
7923 mErrors.erase(mErrors.begin());
7924 return error;
7925}
Jamie Madilldc358af2018-07-31 11:22:13 -04007926
7927// StateCache implementation.
Jamie Madill16e28fd2018-09-12 11:03:05 -04007928StateCache::StateCache(Context *context)
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007929 : mCachedHasAnyEnabledClientAttrib(false),
7930 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04007931 mCachedInstancedVertexElementLimit(0),
7932 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madilldc358af2018-07-31 11:22:13 -04007933{
Jamie Madill16e28fd2018-09-12 11:03:05 -04007934 updateValidDrawModes(context);
Jamie Madilldc358af2018-07-31 11:22:13 -04007935}
7936
7937StateCache::~StateCache() = default;
7938
7939void StateCache::updateActiveAttribsMask(Context *context)
7940{
7941 bool isGLES1 = context->isGLES1();
7942 const State &glState = context->getGLState();
7943
7944 if (!isGLES1 && !glState.getProgram())
7945 {
7946 mCachedActiveBufferedAttribsMask = AttributesMask();
7947 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04007948 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04007949 return;
7950 }
7951
7952 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
7953 : glState.getProgram()->getActiveAttribLocationsMask();
7954
7955 const VertexArray *vao = glState.getVertexArray();
7956 ASSERT(vao);
7957
7958 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
7959 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04007960 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04007961
Jamie Madill0a17e482018-08-31 17:19:11 -04007962 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
7963 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04007964 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04007965 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
7966}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007967
7968void StateCache::updateVertexElementLimits(Context *context)
7969{
7970 const VertexArray *vao = context->getGLState().getVertexArray();
7971
7972 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
7973 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
7974
7975 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
7976 // If there are no buffered attributes then we should not limit the draw call count.
7977 if (!vao || !mCachedActiveBufferedAttribsMask.any())
7978 {
7979 return;
7980 }
7981
7982 const auto &vertexAttribs = vao->getVertexAttributes();
7983 const auto &vertexBindings = vao->getVertexBindings();
7984
7985 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
7986 {
7987 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
7988 ASSERT(attrib.enabled);
7989
7990 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
7991 ASSERT(context->isGLES1() ||
7992 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
7993
7994 GLint64 limit = attrib.getCachedElementLimit();
7995 if (binding.getDivisor() > 0)
7996 {
7997 mCachedInstancedVertexElementLimit =
7998 std::min(mCachedInstancedVertexElementLimit, limit);
7999 }
8000 else
8001 {
8002 mCachedNonInstancedVertexElementLimit =
8003 std::min(mCachedNonInstancedVertexElementLimit, limit);
8004 }
8005 }
8006}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008007
Jamie Madilld84b6732018-09-06 15:54:35 -04008008void StateCache::updateBasicDrawStatesError()
8009{
8010 mCachedBasicDrawStatesError = kInvalidPointer;
8011}
8012
8013intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8014{
8015 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8016 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8017 return mCachedBasicDrawStatesError;
8018}
8019
Jamie Madillc43cdad2018-08-08 15:49:25 -04008020void StateCache::onVertexArrayBindingChange(Context *context)
8021{
8022 updateActiveAttribsMask(context);
8023 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008024 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008025}
8026
8027void StateCache::onProgramExecutableChange(Context *context)
8028{
8029 updateActiveAttribsMask(context);
8030 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008031 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008032 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008033}
8034
Jamie Madilld84b6732018-09-06 15:54:35 -04008035void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008036{
8037 updateVertexElementLimits(context);
8038}
8039
Jamie Madilld84b6732018-09-06 15:54:35 -04008040void StateCache::onVertexArrayBufferContentsChange(Context *context)
8041{
8042 updateVertexElementLimits(context);
8043 updateBasicDrawStatesError();
8044}
8045
Jamie Madillc43cdad2018-08-08 15:49:25 -04008046void StateCache::onVertexArrayStateChange(Context *context)
8047{
8048 updateActiveAttribsMask(context);
8049 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008050 updateBasicDrawStatesError();
8051}
8052
8053void StateCache::onVertexArrayBufferStateChange(Context *context)
8054{
8055 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008056}
8057
8058void StateCache::onGLES1ClientStateChange(Context *context)
8059{
8060 updateActiveAttribsMask(context);
8061}
Jamie Madilld84b6732018-09-06 15:54:35 -04008062
8063void StateCache::onDrawFramebufferChange(Context *context)
8064{
8065 updateBasicDrawStatesError();
8066}
8067
8068void StateCache::onContextCapChange(Context *context)
8069{
8070 updateBasicDrawStatesError();
8071}
8072
8073void StateCache::onStencilStateChange(Context *context)
8074{
8075 updateBasicDrawStatesError();
8076}
8077
8078void StateCache::onDefaultVertexAttributeChange(Context *context)
8079{
8080 updateBasicDrawStatesError();
8081}
8082
8083void StateCache::onActiveTextureChange(Context *context)
8084{
8085 updateBasicDrawStatesError();
8086}
8087
8088void StateCache::onQueryChange(Context *context)
8089{
8090 updateBasicDrawStatesError();
8091}
8092
8093void StateCache::onTransformFeedbackChange(Context *context)
8094{
8095 updateBasicDrawStatesError();
8096}
8097
8098void StateCache::onUniformBufferStateChange(Context *context)
8099{
8100 updateBasicDrawStatesError();
8101}
8102
8103void StateCache::onBufferBindingChange(Context *context)
8104{
8105 updateBasicDrawStatesError();
8106}
Jamie Madill526a6f62018-09-12 11:03:05 -04008107
8108void StateCache::updateValidDrawModes(Context *context)
8109{
8110 Program *program = context->getGLState().getProgram();
8111 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8112 {
8113 mCachedValidDrawModes = {{
8114 true, /* Points */
8115 true, /* Lines */
8116 true, /* LineLoop */
8117 true, /* LineStrip */
8118 true, /* Triangles */
8119 true, /* TriangleStrip */
8120 true, /* TriangleFan */
8121 false, /* LinesAdjacency */
8122 false, /* LineStripAdjacency */
8123 false, /* TrianglesAdjacency */
8124 false, /* TriangleStripAdjacency */
8125 false, /* InvalidEnum */
8126 }};
8127 }
8128 else
8129 {
8130 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8131
8132 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8133
8134 mCachedValidDrawModes = {{
8135 gsMode == PrimitiveMode::Points, /* Points */
8136 gsMode == PrimitiveMode::Lines, /* Lines */
8137 gsMode == PrimitiveMode::Lines, /* LineLoop */
8138 gsMode == PrimitiveMode::Lines, /* LineStrip */
8139 gsMode == PrimitiveMode::Triangles, /* Triangles */
8140 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8141 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8142 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8143 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8144 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8145 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8146 false, /* InvalidEnum */
8147 }};
8148 }
8149}
Jamie Madillc29968b2016-01-20 11:17:23 -05008150} // namespace gl