blob: c99cbe55243dc3cba3c45b82c69f583269881602 [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
Jamie Madillabfbc0f2018-10-09 12:48:52 -04002621void Context::handleError(GLenum errorCode,
2622 const char *message,
2623 const char *file,
2624 const char *function,
2625 unsigned int line)
2626{
2627 mErrors.handleError(errorCode, message, file, function, line);
2628}
2629
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002630// Get one of the recorded errors and clear its flag, if any.
2631// [OpenGL ES 2.0.24] section 2.5 page 13.
2632GLenum Context::getError()
2633{
Geoff Langda5777c2014-07-11 09:52:58 -04002634 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002635 {
Geoff Langda5777c2014-07-11 09:52:58 -04002636 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002637 }
Geoff Langda5777c2014-07-11 09:52:58 -04002638 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002639 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002640 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002641 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002642}
2643
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002644// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002645void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002646{
2647 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002648 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002649 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002650 mContextLostForced = true;
2651 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002652 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002653}
2654
Jamie Madillfa920eb2018-01-04 11:45:50 -05002655GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002656{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002657 // Even if the application doesn't want to know about resets, we want to know
2658 // as it will allow us to skip all the calls.
2659 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002660 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002661 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002662 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002663 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002664 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002665
2666 // EXT_robustness, section 2.6: If the reset notification behavior is
2667 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2668 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2669 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002670 }
2671
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002672 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2673 // status should be returned at least once, and GL_NO_ERROR should be returned
2674 // once the device has finished resetting.
2675 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002676 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002677 ASSERT(mResetStatus == GL_NO_ERROR);
2678 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002679
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002680 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002681 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002682 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002683 }
2684 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002685 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002686 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002687 // If markContextLost was used to mark the context lost then
2688 // assume that is not recoverable, and continue to report the
2689 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002690 mResetStatus = mImplementation->getResetStatus();
2691 }
Jamie Madill893ab082014-05-16 16:56:10 -04002692
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002693 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002694}
2695
2696bool Context::isResetNotificationEnabled()
2697{
2698 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2699}
2700
Corentin Walleze3b10e82015-05-20 11:06:25 -04002701const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002702{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002703 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002704}
2705
2706EGLenum Context::getClientType() const
2707{
2708 return mClientType;
2709}
2710
2711EGLenum Context::getRenderBuffer() const
2712{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002713 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2714 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002715 {
2716 return EGL_NONE;
2717 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002718
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002719 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002720 ASSERT(backAttachment != nullptr);
2721 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002722}
2723
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002724VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002725{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002726 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002727 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2728 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002729 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002730 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2731 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002732
Jamie Madill96a483b2017-06-27 16:49:21 -04002733 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002734 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002735
2736 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002737}
2738
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002739TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002740{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002741 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002742 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2743 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002744 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002745 transformFeedback =
2746 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002747 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002748 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002749 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002750
2751 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002752}
2753
2754bool Context::isVertexArrayGenerated(GLuint vertexArray)
2755{
Jamie Madill96a483b2017-06-27 16:49:21 -04002756 ASSERT(mVertexArrayMap.contains(0));
2757 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002758}
2759
2760bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2761{
Jamie Madill96a483b2017-06-27 16:49:21 -04002762 ASSERT(mTransformFeedbackMap.contains(0));
2763 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002764}
2765
Shannon Woods53a94a82014-06-24 15:20:36 -04002766void Context::detachTexture(GLuint texture)
2767{
2768 // Simple pass-through to State's detachTexture method, as textures do not require
2769 // allocation map management either here or in the resource manager at detach time.
2770 // Zero textures are held by the Context, and we don't attempt to request them from
2771 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002772 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002773}
2774
James Darpinian4d9d4832018-03-13 12:43:28 -07002775void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002776{
Yuly Novikov5807a532015-12-03 13:01:22 -05002777 // Simple pass-through to State's detachBuffer method, since
2778 // only buffer attachments to container objects that are bound to the current context
2779 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002780
Yuly Novikov5807a532015-12-03 13:01:22 -05002781 // [OpenGL ES 3.2] section 5.1.2 page 45:
2782 // Attachments to unbound container objects, such as
2783 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2784 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002785 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002786}
2787
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002788void Context::detachFramebuffer(GLuint framebuffer)
2789{
Shannon Woods53a94a82014-06-24 15:20:36 -04002790 // Framebuffer detachment is handled by Context, because 0 is a valid
2791 // Framebuffer object, and a pointer to it must be passed from Context
2792 // to State at binding time.
2793
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002794 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002795 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2796 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2797 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002798
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002799 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002800 {
2801 bindReadFramebuffer(0);
2802 }
2803
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002804 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002805 {
2806 bindDrawFramebuffer(0);
2807 }
2808}
2809
2810void Context::detachRenderbuffer(GLuint renderbuffer)
2811{
Jamie Madilla02315b2017-02-23 14:14:47 -05002812 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002813}
2814
Jamie Madill57a89722013-07-02 11:57:03 -04002815void Context::detachVertexArray(GLuint vertexArray)
2816{
Jamie Madill77a72f62015-04-14 11:18:32 -04002817 // Vertex array detachment is handled by Context, because 0 is a valid
2818 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002819 // binding time.
2820
Jamie Madill57a89722013-07-02 11:57:03 -04002821 // [OpenGL ES 3.0.2] section 2.10 page 43:
2822 // If a vertex array object that is currently bound is deleted, the binding
2823 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002824 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002825 {
2826 bindVertexArray(0);
2827 }
2828}
2829
Geoff Langc8058452014-02-03 12:04:11 -05002830void Context::detachTransformFeedback(GLuint transformFeedback)
2831{
Corentin Walleza2257da2016-04-19 16:43:12 -04002832 // Transform feedback detachment is handled by Context, because 0 is a valid
2833 // transform feedback, and a pointer to it must be passed from Context to State at
2834 // binding time.
2835
2836 // The OpenGL specification doesn't mention what should happen when the currently bound
2837 // transform feedback object is deleted. Since it is a container object, we treat it like
2838 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002839 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002840 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002841 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002842 }
Geoff Langc8058452014-02-03 12:04:11 -05002843}
2844
Jamie Madilldc356042013-07-19 16:36:57 -04002845void Context::detachSampler(GLuint sampler)
2846{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002847 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002848}
2849
Yunchao Hea336b902017-08-02 16:05:21 +08002850void Context::detachProgramPipeline(GLuint pipeline)
2851{
2852 mGLState.detachProgramPipeline(this, pipeline);
2853}
2854
Jamie Madill3ef140a2017-08-26 23:11:21 -04002855void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002856{
Shaodde78e82017-05-22 14:13:27 +08002857 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002858 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002859}
2860
Jamie Madille29d1672013-07-19 16:36:57 -04002861void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2862{
Geoff Langc1984ed2016-10-07 12:41:00 -04002863 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002864 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002865 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002866}
Jamie Madille29d1672013-07-19 16:36:57 -04002867
Geoff Langc1984ed2016-10-07 12:41:00 -04002868void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2869{
2870 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002871 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002872 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002873}
2874
Brandon Jones59770802018-04-02 13:18:42 -07002875void Context::samplerParameterivRobust(GLuint sampler,
2876 GLenum pname,
2877 GLsizei bufSize,
2878 const GLint *param)
2879{
2880 samplerParameteriv(sampler, pname, param);
2881}
2882
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002883void Context::samplerParameterIivRobust(GLuint sampler,
2884 GLenum pname,
2885 GLsizei bufSize,
2886 const GLint *param)
2887{
2888 UNIMPLEMENTED();
2889}
2890
2891void Context::samplerParameterIuivRobust(GLuint sampler,
2892 GLenum pname,
2893 GLsizei bufSize,
2894 const GLuint *param)
2895{
2896 UNIMPLEMENTED();
2897}
2898
Jamie Madille29d1672013-07-19 16:36:57 -04002899void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2900{
Geoff Langc1984ed2016-10-07 12:41:00 -04002901 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002902 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002903 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002904}
2905
Geoff Langc1984ed2016-10-07 12:41:00 -04002906void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002907{
Geoff Langc1984ed2016-10-07 12:41:00 -04002908 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002909 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002910 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002911}
2912
Brandon Jones59770802018-04-02 13:18:42 -07002913void Context::samplerParameterfvRobust(GLuint sampler,
2914 GLenum pname,
2915 GLsizei bufSize,
2916 const GLfloat *param)
2917{
2918 samplerParameterfv(sampler, pname, param);
2919}
2920
Geoff Langc1984ed2016-10-07 12:41:00 -04002921void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002922{
Geoff Langc1984ed2016-10-07 12:41:00 -04002923 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002924 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002925 QuerySamplerParameteriv(samplerObject, pname, params);
2926}
Jamie Madill9675b802013-07-19 16:36:59 -04002927
Brandon Jones59770802018-04-02 13:18:42 -07002928void Context::getSamplerParameterivRobust(GLuint sampler,
2929 GLenum pname,
2930 GLsizei bufSize,
2931 GLsizei *length,
2932 GLint *params)
2933{
2934 getSamplerParameteriv(sampler, pname, params);
2935}
2936
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002937void Context::getSamplerParameterIivRobust(GLuint sampler,
2938 GLenum pname,
2939 GLsizei bufSize,
2940 GLsizei *length,
2941 GLint *params)
2942{
2943 UNIMPLEMENTED();
2944}
2945
2946void Context::getSamplerParameterIuivRobust(GLuint sampler,
2947 GLenum pname,
2948 GLsizei bufSize,
2949 GLsizei *length,
2950 GLuint *params)
2951{
2952 UNIMPLEMENTED();
2953}
2954
Geoff Langc1984ed2016-10-07 12:41:00 -04002955void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2956{
2957 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002958 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002959 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04002960}
2961
Brandon Jones59770802018-04-02 13:18:42 -07002962void Context::getSamplerParameterfvRobust(GLuint sampler,
2963 GLenum pname,
2964 GLsizei bufSize,
2965 GLsizei *length,
2966 GLfloat *params)
2967{
2968 getSamplerParameterfv(sampler, pname, params);
2969}
2970
Olli Etuahof0fee072016-03-30 15:11:58 +03002971void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2972{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002973 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08002974 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002975}
2976
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002977void Context::initRendererString()
2978{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002979 std::ostringstream rendererString;
2980 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002981 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002982 rendererString << ")";
2983
Geoff Langcec35902014-04-16 10:52:36 -04002984 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002985}
2986
Geoff Langc339c4e2016-11-29 10:37:36 -05002987void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002988{
Geoff Langc339c4e2016-11-29 10:37:36 -05002989 const Version &clientVersion = getClientVersion();
2990
2991 std::ostringstream versionString;
2992 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2993 << ANGLE_VERSION_STRING << ")";
2994 mVersionString = MakeStaticString(versionString.str());
2995
2996 std::ostringstream shadingLanguageVersionString;
2997 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2998 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2999 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
3000 << ")";
3001 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003002}
3003
Geoff Langcec35902014-04-16 10:52:36 -04003004void Context::initExtensionStrings()
3005{
Geoff Langc339c4e2016-11-29 10:37:36 -05003006 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
3007 std::ostringstream combinedStringStream;
3008 std::copy(strings.begin(), strings.end(),
3009 std::ostream_iterator<const char *>(combinedStringStream, " "));
3010 return MakeStaticString(combinedStringStream.str());
3011 };
3012
3013 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003014 for (const auto &extensionString : mExtensions.getStrings())
3015 {
3016 mExtensionStrings.push_back(MakeStaticString(extensionString));
3017 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003018 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003019
Geoff Langc339c4e2016-11-29 10:37:36 -05003020 mRequestableExtensionStrings.clear();
3021 for (const auto &extensionInfo : GetExtensionInfoMap())
3022 {
3023 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003024 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003025 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003026 {
3027 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3028 }
3029 }
3030 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003031}
3032
Geoff Langc339c4e2016-11-29 10:37:36 -05003033const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003034{
Geoff Langc339c4e2016-11-29 10:37:36 -05003035 switch (name)
3036 {
3037 case GL_VENDOR:
3038 return reinterpret_cast<const GLubyte *>("Google Inc.");
3039
3040 case GL_RENDERER:
3041 return reinterpret_cast<const GLubyte *>(mRendererString);
3042
3043 case GL_VERSION:
3044 return reinterpret_cast<const GLubyte *>(mVersionString);
3045
3046 case GL_SHADING_LANGUAGE_VERSION:
3047 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3048
3049 case GL_EXTENSIONS:
3050 return reinterpret_cast<const GLubyte *>(mExtensionString);
3051
3052 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3053 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3054
3055 default:
3056 UNREACHABLE();
3057 return nullptr;
3058 }
Geoff Langcec35902014-04-16 10:52:36 -04003059}
3060
Geoff Langc339c4e2016-11-29 10:37:36 -05003061const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003062{
Geoff Langc339c4e2016-11-29 10:37:36 -05003063 switch (name)
3064 {
3065 case GL_EXTENSIONS:
3066 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3067
3068 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3069 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3070
3071 default:
3072 UNREACHABLE();
3073 return nullptr;
3074 }
Geoff Langcec35902014-04-16 10:52:36 -04003075}
3076
3077size_t Context::getExtensionStringCount() const
3078{
3079 return mExtensionStrings.size();
3080}
3081
Geoff Lang111a99e2017-10-17 10:58:41 -04003082bool Context::isExtensionRequestable(const char *name)
3083{
3084 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3085 auto extension = extensionInfos.find(name);
3086
Geoff Lang111a99e2017-10-17 10:58:41 -04003087 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003088 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003089}
3090
Geoff Langc339c4e2016-11-29 10:37:36 -05003091void Context::requestExtension(const char *name)
3092{
3093 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3094 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3095 const auto &extension = extensionInfos.at(name);
3096 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003097 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003098
3099 if (mExtensions.*(extension.ExtensionsMember))
3100 {
3101 // Extension already enabled
3102 return;
3103 }
3104
3105 mExtensions.*(extension.ExtensionsMember) = true;
3106 updateCaps();
3107 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003108
Jamie Madill2f348d22017-06-05 10:50:59 -04003109 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3110 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003111
Jamie Madill81c2e252017-09-09 23:32:46 -04003112 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3113 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003114 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003115 for (auto &zeroTexture : mZeroTextures)
3116 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003117 if (zeroTexture.get() != nullptr)
3118 {
3119 zeroTexture->signalDirty(this, InitState::Initialized);
3120 }
Geoff Lang9aded172017-04-05 11:07:56 -04003121 }
3122
Jamie Madillb983a4b2018-08-01 11:34:51 -04003123 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003124}
3125
3126size_t Context::getRequestableExtensionStringCount() const
3127{
3128 return mRequestableExtensionStrings.size();
3129}
3130
Jamie Madill493f9572018-05-24 19:52:15 -04003131void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003132{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003133 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003134 ASSERT(transformFeedback != nullptr);
3135 ASSERT(!transformFeedback->isPaused());
3136
Jamie Madill6c1f6712017-02-14 19:08:04 -05003137 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003138 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003139}
3140
3141bool Context::hasActiveTransformFeedback(GLuint program) const
3142{
3143 for (auto pair : mTransformFeedbackMap)
3144 {
3145 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3146 {
3147 return true;
3148 }
3149 }
3150 return false;
3151}
3152
Geoff Lang33f11fb2018-05-07 13:42:47 -04003153Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003154{
3155 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3156
jchen1082af6202018-06-22 10:59:52 +08003157 // Explicitly enable GL_KHR_parallel_shader_compile
3158 supportedExtensions.parallelShaderCompile = true;
3159
Geoff Langb0f917f2017-12-05 13:41:54 -05003160 if (getClientVersion() < ES_2_0)
3161 {
3162 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003163 supportedExtensions.pointSizeArray = true;
3164 supportedExtensions.textureCubeMap = true;
3165 supportedExtensions.pointSprite = true;
3166 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003167 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003168 }
3169
3170 if (getClientVersion() < ES_3_0)
3171 {
3172 // Disable ES3+ extensions
3173 supportedExtensions.colorBufferFloat = false;
3174 supportedExtensions.eglImageExternalEssl3 = false;
3175 supportedExtensions.textureNorm16 = false;
3176 supportedExtensions.multiview = false;
3177 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003178 supportedExtensions.copyTexture3d = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003179 }
3180
3181 if (getClientVersion() < ES_3_1)
3182 {
3183 // Disable ES3.1+ extensions
3184 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003185
3186 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3187 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003188 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003189 }
3190
3191 if (getClientVersion() > ES_2_0)
3192 {
3193 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3194 // supportedExtensions.sRGB = false;
3195 }
3196
3197 // Some extensions are always available because they are implemented in the GL layer.
3198 supportedExtensions.bindUniformLocation = true;
3199 supportedExtensions.vertexArrayObject = true;
3200 supportedExtensions.bindGeneratesResource = true;
3201 supportedExtensions.clientArrays = true;
3202 supportedExtensions.requestExtension = true;
3203
3204 // Enable the no error extension if the context was created with the flag.
3205 supportedExtensions.noError = mSkipValidation;
3206
3207 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003208 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003209
3210 // Explicitly enable GL_KHR_debug
3211 supportedExtensions.debug = true;
3212 supportedExtensions.maxDebugMessageLength = 1024;
3213 supportedExtensions.maxDebugLoggedMessages = 1024;
3214 supportedExtensions.maxDebugGroupStackDepth = 1024;
3215 supportedExtensions.maxLabelLength = 1024;
3216
3217 // Explicitly enable GL_ANGLE_robust_client_memory
3218 supportedExtensions.robustClientMemory = true;
3219
3220 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003221 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003222
3223 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3224 // supports it.
3225 supportedExtensions.robustBufferAccessBehavior =
3226 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3227
3228 // Enable the cache control query unconditionally.
3229 supportedExtensions.programCacheControl = true;
3230
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003231 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003232 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003233 {
3234 // GL_ANGLE_explicit_context_gles1
3235 supportedExtensions.explicitContextGles1 = true;
3236 // GL_ANGLE_explicit_context
3237 supportedExtensions.explicitContext = true;
3238 }
3239
Geoff Langb0f917f2017-12-05 13:41:54 -05003240 return supportedExtensions;
3241}
3242
Geoff Lang33f11fb2018-05-07 13:42:47 -04003243void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003244{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003245 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003246
Geoff Lang33f11fb2018-05-07 13:42:47 -04003247 mSupportedExtensions = generateSupportedExtensions();
3248 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003249
3250 mLimitations = mImplementation->getNativeLimitations();
3251
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003252 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3253 if (getClientVersion() < Version(2, 0))
3254 {
3255 mCaps.maxMultitextureUnits = 4;
3256 mCaps.maxClipPlanes = 6;
3257 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003258 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3259 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3260 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003261 mCaps.minSmoothPointSize = 1.0f;
3262 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003263 mCaps.minSmoothLineWidth = 1.0f;
3264 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003265 }
3266
Luc Ferronad2ae932018-06-11 15:31:17 -04003267 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003268 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003269
Luc Ferronad2ae932018-06-11 15:31:17 -04003270 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3271
Jamie Madill0f80ed82017-09-19 00:24:56 -04003272 if (getClientVersion() < ES_3_1)
3273 {
3274 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3275 }
3276 else
3277 {
3278 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3279 }
Geoff Lang301d1612014-07-09 10:34:37 -04003280
Jiawei Shao54aafe52018-04-27 14:54:57 +08003281 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3282 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003283 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3284
Jamie Madill0f80ed82017-09-19 00:24:56 -04003285 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3286 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3287
3288 // Limit textures as well, so we can use fast bitsets with texture bindings.
3289 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003290 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3291 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3292 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3293 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003294
Jiawei Shaodb342272017-09-27 10:21:45 +08003295 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3296
Geoff Langc287ea62016-09-16 14:46:51 -04003297 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003298 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003299 for (const auto &extensionInfo : GetExtensionInfoMap())
3300 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003301 // If the user has requested that extensions start disabled and they are requestable,
3302 // disable them.
3303 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003304 {
3305 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3306 }
3307 }
3308
3309 // Generate texture caps
3310 updateCaps();
3311}
3312
3313void Context::updateCaps()
3314{
Geoff Lang900013c2014-07-07 11:32:19 -04003315 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003316 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003317
Jamie Madill7b62cf92017-11-02 15:20:49 -04003318 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003319 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003320 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003321 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003322
Geoff Lang0d8b7242015-09-09 14:56:53 -04003323 // Update the format caps based on the client version and extensions.
3324 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3325 // ES3.
3326 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003327 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003328 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003329 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003330 formatCaps.textureAttachment =
3331 formatCaps.textureAttachment &&
3332 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3333 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3334 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003335
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003336 // OpenGL ES does not support multisampling with non-rendererable formats
3337 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003338 if (!formatCaps.renderbuffer ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003339 (getClientVersion() < ES_3_1 &&
3340 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003341 {
Geoff Langd87878e2014-09-19 15:42:59 -04003342 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003343 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003344 else
3345 {
3346 // We may have limited the max samples for some required renderbuffer formats due to
3347 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3348 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3349
3350 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3351 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3352 // exception of signed and unsigned integer formats."
3353 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3354 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3355 {
3356 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3357 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3358 }
3359
3360 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3361 if (getClientVersion() >= ES_3_1)
3362 {
3363 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3364 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3365 // the exception that the signed and unsigned integer formats are required only to
3366 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3367 // multisamples, which must be at least one."
3368 if (formatInfo.componentType == GL_INT ||
3369 formatInfo.componentType == GL_UNSIGNED_INT)
3370 {
3371 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3372 }
3373
3374 // GLES 3.1 section 19.3.1.
3375 if (formatCaps.texturable)
3376 {
3377 if (formatInfo.depthBits > 0)
3378 {
3379 mCaps.maxDepthTextureSamples =
3380 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3381 }
3382 else if (formatInfo.redBits > 0)
3383 {
3384 mCaps.maxColorTextureSamples =
3385 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3386 }
3387 }
3388 }
3389 }
Geoff Langd87878e2014-09-19 15:42:59 -04003390
3391 if (formatCaps.texturable && formatInfo.compressed)
3392 {
Geoff Langca271392017-04-05 12:30:00 -04003393 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003394 }
3395
Geoff Langca271392017-04-05 12:30:00 -04003396 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003397 }
Jamie Madill32447362017-06-28 14:53:52 -04003398
3399 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003400 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003401 {
3402 mMemoryProgramCache = nullptr;
3403 }
Corentin Walleze4477002017-12-01 14:39:58 -05003404
3405 // Compute which buffer types are allowed
3406 mValidBufferBindings.reset();
3407 mValidBufferBindings.set(BufferBinding::ElementArray);
3408 mValidBufferBindings.set(BufferBinding::Array);
3409
3410 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3411 {
3412 mValidBufferBindings.set(BufferBinding::PixelPack);
3413 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3414 }
3415
3416 if (getClientVersion() >= ES_3_0)
3417 {
3418 mValidBufferBindings.set(BufferBinding::CopyRead);
3419 mValidBufferBindings.set(BufferBinding::CopyWrite);
3420 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3421 mValidBufferBindings.set(BufferBinding::Uniform);
3422 }
3423
3424 if (getClientVersion() >= ES_3_1)
3425 {
3426 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3427 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3428 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3429 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3430 }
jchen107ae70d82018-07-06 13:47:01 +08003431
3432 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Geoff Lang493daf52014-07-03 13:38:44 -04003433}
3434
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003435void Context::initWorkarounds()
3436{
Jamie Madill761b02c2017-06-23 16:27:06 -04003437 // Apply back-end workarounds.
3438 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3439
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003440 // Lose the context upon out of memory error if the application is
3441 // expecting to watch for those events.
3442 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
3443}
3444
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003445// Return true if the draw is a no-op, else return false.
3446// A no-op draw occurs if the count of vertices is less than the minimum required to
3447// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3448bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3449{
3450 return count < kMinimumPrimitiveCounts[mode];
3451}
3452
3453bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3454{
3455 return (instanceCount == 0) || noopDraw(mode, count);
3456}
3457
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003458Error Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003459{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003460 if (mGLES1Renderer)
3461 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003462 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003463 }
3464
Geoff Lang9bf86f02018-07-26 11:46:34 -04003465 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003466
3467 if (isRobustResourceInitEnabled())
3468 {
3469 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3470 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3471 }
3472
Geoff Langa8cb2872018-03-09 16:09:40 -05003473 ANGLE_TRY(syncDirtyBits());
Geoff Langd4fff502017-09-22 11:28:28 -04003474 return NoError();
3475}
3476
3477Error Context::prepareForClear(GLbitfield mask)
3478{
Geoff Langa8cb2872018-03-09 16:09:40 -05003479 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003480 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003481 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003482 return NoError();
3483}
3484
3485Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3486{
Geoff Langa8cb2872018-03-09 16:09:40 -05003487 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003488 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3489 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003490 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003491 return NoError();
3492}
3493
Geoff Langa8cb2872018-03-09 16:09:40 -05003494Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003495{
Geoff Langa8cb2872018-03-09 16:09:40 -05003496 ANGLE_TRY(syncDirtyObjects(objectMask));
3497 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003498 return NoError();
3499}
3500
Geoff Langa8cb2872018-03-09 16:09:40 -05003501Error Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003502{
3503 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill189ad872018-07-09 13:32:37 -04003504 ANGLE_TRY(mImplementation->syncState(this, dirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003505 mGLState.clearDirtyBits();
3506 return NoError();
3507}
3508
Geoff Langa8cb2872018-03-09 16:09:40 -05003509Error Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003510{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003511 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill189ad872018-07-09 13:32:37 -04003512 ANGLE_TRY(mImplementation->syncState(this, dirtyBits));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003513 mGLState.clearDirtyBits(dirtyBits);
Jamie Madillbc918e72018-03-08 09:47:21 -05003514 return NoError();
Jamie Madill1b94d432015-08-07 13:23:23 -04003515}
Jamie Madillc29968b2016-01-20 11:17:23 -05003516
Geoff Langa8cb2872018-03-09 16:09:40 -05003517Error Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003518{
3519 return mGLState.syncDirtyObjects(this, objectMask);
3520}
3521
Jamie Madillc29968b2016-01-20 11:17:23 -05003522void Context::blitFramebuffer(GLint srcX0,
3523 GLint srcY0,
3524 GLint srcX1,
3525 GLint srcY1,
3526 GLint dstX0,
3527 GLint dstY0,
3528 GLint dstX1,
3529 GLint dstY1,
3530 GLbitfield mask,
3531 GLenum filter)
3532{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003533 if (mask == 0)
3534 {
3535 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3536 // buffers are copied.
3537 return;
3538 }
3539
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003540 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003541 ASSERT(drawFramebuffer);
3542
3543 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3544 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3545
Jamie Madillbc918e72018-03-08 09:47:21 -05003546 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003547
Jamie Madillc564c072017-06-01 12:45:42 -04003548 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003549}
Jamie Madillc29968b2016-01-20 11:17:23 -05003550
3551void Context::clear(GLbitfield mask)
3552{
Geoff Langd4fff502017-09-22 11:28:28 -04003553 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3554 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003555}
3556
3557void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3558{
Olli Etuaho78df3362018-10-05 16:43:27 +03003559 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3560 const FramebufferAttachment *attachment = nullptr;
3561 if (buffer == GL_DEPTH)
3562 {
3563 attachment = framebufferObject->getDepthbuffer();
3564 }
3565 if (buffer == GL_COLOR &&
3566 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3567 {
3568 attachment = framebufferObject->getColorbuffer(drawbuffer);
3569 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003570 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3571 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003572 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003573 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003574 return;
3575 }
Geoff Langd4fff502017-09-22 11:28:28 -04003576 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003577 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003578}
3579
3580void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3581{
Olli Etuaho78df3362018-10-05 16:43:27 +03003582 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3583 const FramebufferAttachment *attachment = nullptr;
3584 if (buffer == GL_COLOR &&
3585 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3586 {
3587 attachment = framebufferObject->getColorbuffer(drawbuffer);
3588 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003589 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3590 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003591 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003592 {
3593 return;
3594 }
Geoff Langd4fff502017-09-22 11:28:28 -04003595 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003596 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003597}
3598
3599void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3600{
Olli Etuaho78df3362018-10-05 16:43:27 +03003601 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3602 const FramebufferAttachment *attachment = nullptr;
3603 if (buffer == GL_STENCIL)
3604 {
3605 attachment = framebufferObject->getStencilbuffer();
3606 }
3607 if (buffer == GL_COLOR &&
3608 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3609 {
3610 attachment = framebufferObject->getColorbuffer(drawbuffer);
3611 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003612 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3613 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003614 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003615 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003616 return;
3617 }
Geoff Langd4fff502017-09-22 11:28:28 -04003618 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003619 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003620}
3621
3622void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3623{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003624 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003625 ASSERT(framebufferObject);
3626
3627 // If a buffer is not present, the clear has no effect
3628 if (framebufferObject->getDepthbuffer() == nullptr &&
3629 framebufferObject->getStencilbuffer() == nullptr)
3630 {
3631 return;
3632 }
3633
Geoff Langd4fff502017-09-22 11:28:28 -04003634 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3635 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003636}
3637
3638void Context::readPixels(GLint x,
3639 GLint y,
3640 GLsizei width,
3641 GLsizei height,
3642 GLenum format,
3643 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003644 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003645{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003646 if (width == 0 || height == 0)
3647 {
3648 return;
3649 }
3650
Jamie Madillbc918e72018-03-08 09:47:21 -05003651 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003652
Jamie Madillb6664922017-07-25 12:55:04 -04003653 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3654 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003655
3656 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003657 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003658}
3659
Brandon Jones59770802018-04-02 13:18:42 -07003660void Context::readPixelsRobust(GLint x,
3661 GLint y,
3662 GLsizei width,
3663 GLsizei height,
3664 GLenum format,
3665 GLenum type,
3666 GLsizei bufSize,
3667 GLsizei *length,
3668 GLsizei *columns,
3669 GLsizei *rows,
3670 void *pixels)
3671{
3672 readPixels(x, y, width, height, format, type, pixels);
3673}
3674
3675void Context::readnPixelsRobust(GLint x,
3676 GLint y,
3677 GLsizei width,
3678 GLsizei height,
3679 GLenum format,
3680 GLenum type,
3681 GLsizei bufSize,
3682 GLsizei *length,
3683 GLsizei *columns,
3684 GLsizei *rows,
3685 void *data)
3686{
3687 readPixels(x, y, width, height, format, type, data);
3688}
3689
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003690void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003691 GLint level,
3692 GLenum internalformat,
3693 GLint x,
3694 GLint y,
3695 GLsizei width,
3696 GLsizei height,
3697 GLint border)
3698{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003699 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003700 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003701
Jamie Madillc29968b2016-01-20 11:17:23 -05003702 Rectangle sourceArea(x, y, width, height);
3703
Jamie Madill05b35b22017-10-03 09:01:44 -04003704 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003705 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003706 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003707}
3708
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003709void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003710 GLint level,
3711 GLint xoffset,
3712 GLint yoffset,
3713 GLint x,
3714 GLint y,
3715 GLsizei width,
3716 GLsizei height)
3717{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003718 if (width == 0 || height == 0)
3719 {
3720 return;
3721 }
3722
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003723 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003724 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003725
Jamie Madillc29968b2016-01-20 11:17:23 -05003726 Offset destOffset(xoffset, yoffset, 0);
3727 Rectangle sourceArea(x, y, width, height);
3728
Jamie Madill05b35b22017-10-03 09:01:44 -04003729 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003730 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003731 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003732}
3733
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003734void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003735 GLint level,
3736 GLint xoffset,
3737 GLint yoffset,
3738 GLint zoffset,
3739 GLint x,
3740 GLint y,
3741 GLsizei width,
3742 GLsizei height)
3743{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003744 if (width == 0 || height == 0)
3745 {
3746 return;
3747 }
3748
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003749 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003750 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003751
Jamie Madillc29968b2016-01-20 11:17:23 -05003752 Offset destOffset(xoffset, yoffset, zoffset);
3753 Rectangle sourceArea(x, y, width, height);
3754
Jamie Madill05b35b22017-10-03 09:01:44 -04003755 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3756 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003757 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3758 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003759}
3760
3761void Context::framebufferTexture2D(GLenum target,
3762 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003763 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003764 GLuint texture,
3765 GLint level)
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 (texture != 0)
3771 {
3772 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003773 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003774 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003775 }
3776 else
3777 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003778 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003779 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003780
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003781 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003782}
3783
3784void Context::framebufferRenderbuffer(GLenum target,
3785 GLenum attachment,
3786 GLenum renderbuffertarget,
3787 GLuint renderbuffer)
3788{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003789 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003790 ASSERT(framebuffer);
3791
3792 if (renderbuffer != 0)
3793 {
3794 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003795
Jamie Madillcc129372018-04-12 09:13:18 -04003796 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003797 renderbufferObject);
3798 }
3799 else
3800 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003801 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003802 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003803
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003804 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003805}
3806
3807void Context::framebufferTextureLayer(GLenum target,
3808 GLenum attachment,
3809 GLuint texture,
3810 GLint level,
3811 GLint layer)
3812{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003813 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003814 ASSERT(framebuffer);
3815
3816 if (texture != 0)
3817 {
3818 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003819 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003820 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003821 }
3822 else
3823 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003824 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003825 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003826
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003827 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003828}
3829
Brandon Jones59770802018-04-02 13:18:42 -07003830void Context::framebufferTextureMultiviewLayered(GLenum target,
3831 GLenum attachment,
3832 GLuint texture,
3833 GLint level,
3834 GLint baseViewIndex,
3835 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003836{
Martin Radev82ef7742017-08-08 17:44:58 +03003837 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3838 ASSERT(framebuffer);
3839
3840 if (texture != 0)
3841 {
3842 Texture *textureObj = getTexture(texture);
3843
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003844 ImageIndex index;
3845 if (textureObj->getType() == TextureType::_2DArray)
3846 {
3847 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3848 }
3849 else
3850 {
3851 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3852 ASSERT(level == 0);
3853 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3854 }
Martin Radev82ef7742017-08-08 17:44:58 +03003855 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3856 numViews, baseViewIndex);
3857 }
3858 else
3859 {
3860 framebuffer->resetAttachment(this, attachment);
3861 }
3862
3863 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003864}
3865
Brandon Jones59770802018-04-02 13:18:42 -07003866void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3867 GLenum attachment,
3868 GLuint texture,
3869 GLint level,
3870 GLsizei numViews,
3871 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003872{
Martin Radev5dae57b2017-07-14 16:15:55 +03003873 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3874 ASSERT(framebuffer);
3875
3876 if (texture != 0)
3877 {
3878 Texture *textureObj = getTexture(texture);
3879
3880 ImageIndex index = ImageIndex::Make2D(level);
3881 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3882 textureObj, numViews, viewportOffsets);
3883 }
3884 else
3885 {
3886 framebuffer->resetAttachment(this, attachment);
3887 }
3888
3889 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003890}
3891
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003892void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3893{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003894 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3895 ASSERT(framebuffer);
3896
3897 if (texture != 0)
3898 {
3899 Texture *textureObj = getTexture(texture);
3900
3901 ImageIndex index = ImageIndex::MakeFromType(
3902 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3903 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3904 }
3905 else
3906 {
3907 framebuffer->resetAttachment(this, attachment);
3908 }
3909
3910 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003911}
3912
Jamie Madillc29968b2016-01-20 11:17:23 -05003913void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3914{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003915 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003916 ASSERT(framebuffer);
3917 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003918 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003919 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003920}
3921
3922void Context::readBuffer(GLenum mode)
3923{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003924 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003925 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003926 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003927}
3928
3929void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3930{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003931 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003932 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003933
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003934 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003935 ASSERT(framebuffer);
3936
3937 // The specification isn't clear what should be done when the framebuffer isn't complete.
3938 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003939 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003940}
3941
3942void Context::invalidateFramebuffer(GLenum target,
3943 GLsizei numAttachments,
3944 const GLenum *attachments)
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
Jamie Madill4928b7c2017-06-20 12:57:39 -04003957 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003958}
3959
3960void Context::invalidateSubFramebuffer(GLenum target,
3961 GLsizei numAttachments,
3962 const GLenum *attachments,
3963 GLint x,
3964 GLint y,
3965 GLsizei width,
3966 GLsizei height)
3967{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003968 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003969 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003970
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003971 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003972 ASSERT(framebuffer);
3973
Jamie Madill427064d2018-04-13 16:20:34 -04003974 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003975 {
Jamie Madill437fa652016-05-03 15:13:24 -04003976 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003977 }
Jamie Madill437fa652016-05-03 15:13:24 -04003978
3979 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003980 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003981}
3982
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003983void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003984 GLint level,
3985 GLint internalformat,
3986 GLsizei width,
3987 GLsizei height,
3988 GLint border,
3989 GLenum format,
3990 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003991 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003992{
Jamie Madillbc918e72018-03-08 09:47:21 -05003993 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003994
3995 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003996 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003997 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07003998 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003999}
4000
Brandon Jones59770802018-04-02 13:18:42 -07004001void Context::texImage2DRobust(TextureTarget target,
4002 GLint level,
4003 GLint internalformat,
4004 GLsizei width,
4005 GLsizei height,
4006 GLint border,
4007 GLenum format,
4008 GLenum type,
4009 GLsizei bufSize,
4010 const void *pixels)
4011{
4012 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4013}
4014
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004015void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004016 GLint level,
4017 GLint internalformat,
4018 GLsizei width,
4019 GLsizei height,
4020 GLsizei depth,
4021 GLint border,
4022 GLenum format,
4023 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004024 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004025{
Jamie Madillbc918e72018-03-08 09:47:21 -05004026 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004027
4028 Extents size(width, height, depth);
4029 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004030 handleError(texture->setImage(this, mGLState.getUnpackState(),
4031 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004032 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004033}
4034
Brandon Jones59770802018-04-02 13:18:42 -07004035void Context::texImage3DRobust(TextureType target,
4036 GLint level,
4037 GLint internalformat,
4038 GLsizei width,
4039 GLsizei height,
4040 GLsizei depth,
4041 GLint border,
4042 GLenum format,
4043 GLenum type,
4044 GLsizei bufSize,
4045 const void *pixels)
4046{
4047 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4048}
4049
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004050void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004051 GLint level,
4052 GLint xoffset,
4053 GLint yoffset,
4054 GLsizei width,
4055 GLsizei height,
4056 GLenum format,
4057 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004058 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004059{
4060 // Zero sized uploads are valid but no-ops
4061 if (width == 0 || height == 0)
4062 {
4063 return;
4064 }
4065
Jamie Madillbc918e72018-03-08 09:47:21 -05004066 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004067
4068 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004069 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004070
4071 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4072
4073 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4074 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004075}
4076
Brandon Jones59770802018-04-02 13:18:42 -07004077void Context::texSubImage2DRobust(TextureTarget target,
4078 GLint level,
4079 GLint xoffset,
4080 GLint yoffset,
4081 GLsizei width,
4082 GLsizei height,
4083 GLenum format,
4084 GLenum type,
4085 GLsizei bufSize,
4086 const void *pixels)
4087{
4088 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4089}
4090
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004091void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004092 GLint level,
4093 GLint xoffset,
4094 GLint yoffset,
4095 GLint zoffset,
4096 GLsizei width,
4097 GLsizei height,
4098 GLsizei depth,
4099 GLenum format,
4100 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004101 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004102{
4103 // Zero sized uploads are valid but no-ops
4104 if (width == 0 || height == 0 || depth == 0)
4105 {
4106 return;
4107 }
4108
Jamie Madillbc918e72018-03-08 09:47:21 -05004109 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004110
4111 Box area(xoffset, yoffset, zoffset, width, height, depth);
4112 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004113
4114 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4115
4116 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004117 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004118 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004119}
4120
Brandon Jones59770802018-04-02 13:18:42 -07004121void Context::texSubImage3DRobust(TextureType target,
4122 GLint level,
4123 GLint xoffset,
4124 GLint yoffset,
4125 GLint zoffset,
4126 GLsizei width,
4127 GLsizei height,
4128 GLsizei depth,
4129 GLenum format,
4130 GLenum type,
4131 GLsizei bufSize,
4132 const void *pixels)
4133{
4134 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4135 pixels);
4136}
4137
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004138void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004139 GLint level,
4140 GLenum internalformat,
4141 GLsizei width,
4142 GLsizei height,
4143 GLint border,
4144 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004145 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004146{
Jamie Madillbc918e72018-03-08 09:47:21 -05004147 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004148
4149 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004150 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004151 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4152 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004153 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004154}
4155
Brandon Jones59770802018-04-02 13:18:42 -07004156void Context::compressedTexImage2DRobust(TextureTarget target,
4157 GLint level,
4158 GLenum internalformat,
4159 GLsizei width,
4160 GLsizei height,
4161 GLint border,
4162 GLsizei imageSize,
4163 GLsizei dataSize,
4164 const GLvoid *data)
4165{
4166 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4167}
4168
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004169void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004170 GLint level,
4171 GLenum internalformat,
4172 GLsizei width,
4173 GLsizei height,
4174 GLsizei depth,
4175 GLint border,
4176 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004177 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004178{
Jamie Madillbc918e72018-03-08 09:47:21 -05004179 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004180
4181 Extents size(width, height, depth);
4182 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004183 handleError(texture->setCompressedImage(
4184 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004185 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004186}
4187
Brandon Jones59770802018-04-02 13:18:42 -07004188void Context::compressedTexImage3DRobust(TextureType target,
4189 GLint level,
4190 GLenum internalformat,
4191 GLsizei width,
4192 GLsizei height,
4193 GLsizei depth,
4194 GLint border,
4195 GLsizei imageSize,
4196 GLsizei dataSize,
4197 const GLvoid *data)
4198{
4199 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4200 data);
4201}
4202
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004203void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004204 GLint level,
4205 GLint xoffset,
4206 GLint yoffset,
4207 GLsizei width,
4208 GLsizei height,
4209 GLenum format,
4210 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004211 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004212{
Jamie Madillbc918e72018-03-08 09:47:21 -05004213 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004214
4215 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004216 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004217 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4218 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004219 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004220}
4221
Brandon Jones59770802018-04-02 13:18:42 -07004222void Context::compressedTexSubImage2DRobust(TextureTarget target,
4223 GLint level,
4224 GLint xoffset,
4225 GLint yoffset,
4226 GLsizei width,
4227 GLsizei height,
4228 GLenum format,
4229 GLsizei imageSize,
4230 GLsizei dataSize,
4231 const GLvoid *data)
4232{
4233 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4234 data);
4235}
4236
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004237void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004238 GLint level,
4239 GLint xoffset,
4240 GLint yoffset,
4241 GLint zoffset,
4242 GLsizei width,
4243 GLsizei height,
4244 GLsizei depth,
4245 GLenum format,
4246 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004247 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004248{
4249 // Zero sized uploads are valid but no-ops
4250 if (width == 0 || height == 0)
4251 {
4252 return;
4253 }
4254
Jamie Madillbc918e72018-03-08 09:47:21 -05004255 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004256
4257 Box area(xoffset, yoffset, zoffset, width, height, depth);
4258 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004259 handleError(texture->setCompressedSubImage(
4260 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004261 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004262}
4263
Brandon Jones59770802018-04-02 13:18:42 -07004264void Context::compressedTexSubImage3DRobust(TextureType target,
4265 GLint level,
4266 GLint xoffset,
4267 GLint yoffset,
4268 GLint zoffset,
4269 GLsizei width,
4270 GLsizei height,
4271 GLsizei depth,
4272 GLenum format,
4273 GLsizei imageSize,
4274 GLsizei dataSize,
4275 const GLvoid *data)
4276{
4277 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4278 imageSize, data);
4279}
4280
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004281void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004282{
4283 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004284 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004285}
4286
Jamie Madill007530e2017-12-28 14:27:04 -05004287void Context::copyTexture(GLuint sourceId,
4288 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004289 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004290 GLuint destId,
4291 GLint destLevel,
4292 GLint internalFormat,
4293 GLenum destType,
4294 GLboolean unpackFlipY,
4295 GLboolean unpackPremultiplyAlpha,
4296 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004297{
Jamie Madillbc918e72018-03-08 09:47:21 -05004298 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004299
4300 gl::Texture *sourceTexture = getTexture(sourceId);
4301 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004302 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4303 sourceLevel, ConvertToBool(unpackFlipY),
4304 ConvertToBool(unpackPremultiplyAlpha),
4305 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004306}
4307
Jamie Madill007530e2017-12-28 14:27:04 -05004308void Context::copySubTexture(GLuint sourceId,
4309 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004310 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004311 GLuint destId,
4312 GLint destLevel,
4313 GLint xoffset,
4314 GLint yoffset,
4315 GLint x,
4316 GLint y,
4317 GLsizei width,
4318 GLsizei height,
4319 GLboolean unpackFlipY,
4320 GLboolean unpackPremultiplyAlpha,
4321 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004322{
4323 // Zero sized copies are valid but no-ops
4324 if (width == 0 || height == 0)
4325 {
4326 return;
4327 }
4328
Jamie Madillbc918e72018-03-08 09:47:21 -05004329 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004330
4331 gl::Texture *sourceTexture = getTexture(sourceId);
4332 gl::Texture *destTexture = getTexture(destId);
4333 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004334 Box box(x, y, 0, width, height, 1);
4335 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4336 ConvertToBool(unpackFlipY),
4337 ConvertToBool(unpackPremultiplyAlpha),
4338 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4339}
4340
4341void Context::copyTexture3D(GLuint sourceId,
4342 GLint sourceLevel,
4343 TextureTarget destTarget,
4344 GLuint destId,
4345 GLint destLevel,
4346 GLint internalFormat,
4347 GLenum destType,
4348 GLboolean unpackFlipY,
4349 GLboolean unpackPremultiplyAlpha,
4350 GLboolean unpackUnmultiplyAlpha)
4351{
4352 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4353
4354 Texture *sourceTexture = getTexture(sourceId);
4355 Texture *destTexture = getTexture(destId);
4356 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4357 sourceLevel, ConvertToBool(unpackFlipY),
4358 ConvertToBool(unpackPremultiplyAlpha),
4359 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4360}
4361
4362void Context::copySubTexture3D(GLuint sourceId,
4363 GLint sourceLevel,
4364 TextureTarget destTarget,
4365 GLuint destId,
4366 GLint destLevel,
4367 GLint xoffset,
4368 GLint yoffset,
4369 GLint zoffset,
4370 GLint x,
4371 GLint y,
4372 GLint z,
4373 GLsizei width,
4374 GLsizei height,
4375 GLsizei depth,
4376 GLboolean unpackFlipY,
4377 GLboolean unpackPremultiplyAlpha,
4378 GLboolean unpackUnmultiplyAlpha)
4379{
4380 // Zero sized copies are valid but no-ops
4381 if (width == 0 || height == 0 || depth == 0)
4382 {
4383 return;
4384 }
4385
4386 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4387
4388 Texture *sourceTexture = getTexture(sourceId);
4389 Texture *destTexture = getTexture(destId);
4390 Offset offset(xoffset, yoffset, zoffset);
4391 Box box(x, y, z, width, height, depth);
4392 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004393 ConvertToBool(unpackFlipY),
4394 ConvertToBool(unpackPremultiplyAlpha),
4395 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004396}
4397
Jamie Madill007530e2017-12-28 14:27:04 -05004398void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004399{
Jamie Madillbc918e72018-03-08 09:47:21 -05004400 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004401
4402 gl::Texture *sourceTexture = getTexture(sourceId);
4403 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004404 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004405}
4406
Corentin Wallez336129f2017-10-17 15:55:40 -04004407void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004408{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004409 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004410 ASSERT(buffer);
4411
Geoff Lang496c02d2016-10-20 11:38:11 -07004412 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004413}
4414
Brandon Jones59770802018-04-02 13:18:42 -07004415void Context::getBufferPointervRobust(BufferBinding target,
4416 GLenum pname,
4417 GLsizei bufSize,
4418 GLsizei *length,
4419 void **params)
4420{
4421 getBufferPointerv(target, pname, params);
4422}
4423
Corentin Wallez336129f2017-10-17 15:55:40 -04004424void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004425{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004426 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004427 ASSERT(buffer);
4428
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004429 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004430 if (error.isError())
4431 {
Jamie Madill437fa652016-05-03 15:13:24 -04004432 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004433 return nullptr;
4434 }
4435
4436 return buffer->getMapPointer();
4437}
4438
Corentin Wallez336129f2017-10-17 15:55:40 -04004439GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004440{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004441 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004442 ASSERT(buffer);
4443
4444 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004445 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004446 if (error.isError())
4447 {
Jamie Madill437fa652016-05-03 15:13:24 -04004448 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004449 return GL_FALSE;
4450 }
4451
4452 return result;
4453}
4454
Corentin Wallez336129f2017-10-17 15:55:40 -04004455void *Context::mapBufferRange(BufferBinding target,
4456 GLintptr offset,
4457 GLsizeiptr length,
4458 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004459{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004460 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004461 ASSERT(buffer);
4462
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004463 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004464 if (error.isError())
4465 {
Jamie Madill437fa652016-05-03 15:13:24 -04004466 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004467 return nullptr;
4468 }
4469
4470 return buffer->getMapPointer();
4471}
4472
Corentin Wallez336129f2017-10-17 15:55:40 -04004473void Context::flushMappedBufferRange(BufferBinding /*target*/,
4474 GLintptr /*offset*/,
4475 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004476{
4477 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4478}
4479
Jamie Madillbc918e72018-03-08 09:47:21 -05004480Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004481{
Geoff Langa8cb2872018-03-09 16:09:40 -05004482 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004483}
4484
Jamie Madillbc918e72018-03-08 09:47:21 -05004485Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004486{
Geoff Langa8cb2872018-03-09 16:09:40 -05004487 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004488}
4489
Jamie Madillbc918e72018-03-08 09:47:21 -05004490Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004491{
Geoff Langa8cb2872018-03-09 16:09:40 -05004492 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004493}
4494
Geoff Lang9bf86f02018-07-26 11:46:34 -04004495Error Context::syncStateForPathOperation()
4496{
4497 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4498
4499 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4500 ANGLE_TRY(syncDirtyBits());
4501
4502 return NoError();
4503}
4504
Jiajia Qin5451d532017-11-16 17:16:34 +08004505void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4506{
4507 UNIMPLEMENTED();
4508}
4509
Jamie Madillc20ab272016-06-09 07:20:46 -07004510void Context::activeTexture(GLenum texture)
4511{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004512 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004513}
4514
Jamie Madill876429b2017-04-20 15:46:24 -04004515void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004516{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004517 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004518}
4519
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004520void Context::blendEquation(GLenum mode)
4521{
4522 mGLState.setBlendEquation(mode, mode);
4523}
4524
Jamie Madillc20ab272016-06-09 07:20:46 -07004525void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4526{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004527 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004528}
4529
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004530void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4531{
4532 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4533}
4534
Jamie Madillc20ab272016-06-09 07:20:46 -07004535void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4536{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004537 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004538}
4539
Jamie Madill876429b2017-04-20 15:46:24 -04004540void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004541{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004542 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004543}
4544
Jamie Madill876429b2017-04-20 15:46:24 -04004545void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004546{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004547 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07004548}
4549
4550void Context::clearStencil(GLint s)
4551{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004552 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004553}
4554
4555void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4556{
Geoff Lang92019432017-11-20 13:09:34 -05004557 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4558 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004559}
4560
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004561void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004562{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004563 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004564}
4565
4566void Context::depthFunc(GLenum func)
4567{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004568 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004569}
4570
4571void Context::depthMask(GLboolean flag)
4572{
Geoff Lang92019432017-11-20 13:09:34 -05004573 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004574}
4575
Jamie Madill876429b2017-04-20 15:46:24 -04004576void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004577{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004578 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07004579}
4580
4581void Context::disable(GLenum cap)
4582{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004583 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004584 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004585}
4586
4587void Context::disableVertexAttribArray(GLuint index)
4588{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004589 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004590 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004591}
4592
4593void Context::enable(GLenum cap)
4594{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004595 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004596 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004597}
4598
4599void Context::enableVertexAttribArray(GLuint index)
4600{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004601 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004602 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004603}
4604
4605void Context::frontFace(GLenum mode)
4606{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004607 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004608}
4609
4610void Context::hint(GLenum target, GLenum mode)
4611{
4612 switch (target)
4613 {
4614 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004615 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004616 break;
4617
4618 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004619 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004620 break;
4621
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004622 case GL_PERSPECTIVE_CORRECTION_HINT:
4623 case GL_POINT_SMOOTH_HINT:
4624 case GL_LINE_SMOOTH_HINT:
4625 case GL_FOG_HINT:
4626 mGLState.gles1().setHint(target, mode);
4627 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004628 default:
4629 UNREACHABLE();
4630 return;
4631 }
4632}
4633
4634void Context::lineWidth(GLfloat width)
4635{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004636 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004637}
4638
4639void Context::pixelStorei(GLenum pname, GLint param)
4640{
4641 switch (pname)
4642 {
4643 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004644 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004645 break;
4646
4647 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004648 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004649 break;
4650
4651 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004652 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004653 break;
4654
4655 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004656 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004657 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004658 break;
4659
4660 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004661 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004662 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004663 break;
4664
4665 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004666 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004667 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004668 break;
4669
4670 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004671 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004672 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004673 break;
4674
4675 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004676 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004677 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004678 break;
4679
4680 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004681 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004682 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004683 break;
4684
4685 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004686 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004687 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004688 break;
4689
4690 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004691 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004692 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004693 break;
4694
4695 default:
4696 UNREACHABLE();
4697 return;
4698 }
4699}
4700
4701void Context::polygonOffset(GLfloat factor, GLfloat units)
4702{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004703 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004704}
4705
Jamie Madill876429b2017-04-20 15:46:24 -04004706void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004707{
Geoff Lang92019432017-11-20 13:09:34 -05004708 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004709}
4710
Jiawei Shaodb342272017-09-27 10:21:45 +08004711void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4712{
4713 mGLState.setSampleMaskParams(maskNumber, mask);
4714}
4715
Jamie Madillc20ab272016-06-09 07:20:46 -07004716void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4717{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004718 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004719}
4720
4721void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4722{
4723 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4724 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004725 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004726 }
4727
4728 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4729 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004730 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004731 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004732
4733 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004734}
4735
4736void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4737{
4738 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4739 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004740 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004741 }
4742
4743 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4744 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004745 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004746 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004747
4748 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004749}
4750
4751void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4752{
4753 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4754 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004755 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004756 }
4757
4758 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4759 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004760 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004761 }
4762}
4763
4764void Context::vertexAttrib1f(GLuint index, GLfloat x)
4765{
4766 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004767 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004768 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004769}
4770
4771void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4772{
4773 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004774 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004775 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004776}
4777
4778void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4779{
4780 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004781 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004782 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004783}
4784
4785void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4786{
4787 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004788 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004789 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004790}
4791
4792void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4793{
4794 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004795 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004796 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004797}
4798
4799void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4800{
4801 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004802 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004803 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004804}
4805
4806void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4807{
4808 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004809 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004810 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004811}
4812
4813void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4814{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004815 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004816 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004817}
4818
4819void Context::vertexAttribPointer(GLuint index,
4820 GLint size,
4821 GLenum type,
4822 GLboolean normalized,
4823 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004824 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004825{
Corentin Wallez336129f2017-10-17 15:55:40 -04004826 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004827 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004828 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004829}
4830
Shao80957d92017-02-20 21:25:59 +08004831void Context::vertexAttribFormat(GLuint attribIndex,
4832 GLint size,
4833 GLenum type,
4834 GLboolean normalized,
4835 GLuint relativeOffset)
4836{
Geoff Lang92019432017-11-20 13:09:34 -05004837 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004838 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004839 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004840}
4841
4842void Context::vertexAttribIFormat(GLuint attribIndex,
4843 GLint size,
4844 GLenum type,
4845 GLuint relativeOffset)
4846{
4847 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004848 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004849}
4850
4851void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4852{
Shaodde78e82017-05-22 14:13:27 +08004853 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004854 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004855}
4856
Jiajia Qin5451d532017-11-16 17:16:34 +08004857void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004858{
4859 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004860 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004861}
4862
Jamie Madillc20ab272016-06-09 07:20:46 -07004863void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4864{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004865 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004866}
4867
4868void Context::vertexAttribIPointer(GLuint index,
4869 GLint size,
4870 GLenum type,
4871 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004872 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004873{
Corentin Wallez336129f2017-10-17 15:55:40 -04004874 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4875 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004876 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004877}
4878
4879void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4880{
4881 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004882 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004883 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004884}
4885
4886void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4887{
4888 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004889 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004890 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004891}
4892
4893void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4894{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004895 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004896 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004897}
4898
4899void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4900{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004901 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004902 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004903}
4904
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004905void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4906{
4907 const VertexAttribCurrentValueData &currentValues =
4908 getGLState().getVertexAttribCurrentValue(index);
4909 const VertexArray *vao = getGLState().getVertexArray();
4910 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4911 currentValues, pname, params);
4912}
4913
Brandon Jones59770802018-04-02 13:18:42 -07004914void Context::getVertexAttribivRobust(GLuint index,
4915 GLenum pname,
4916 GLsizei bufSize,
4917 GLsizei *length,
4918 GLint *params)
4919{
4920 getVertexAttribiv(index, pname, params);
4921}
4922
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004923void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4924{
4925 const VertexAttribCurrentValueData &currentValues =
4926 getGLState().getVertexAttribCurrentValue(index);
4927 const VertexArray *vao = getGLState().getVertexArray();
4928 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4929 currentValues, pname, params);
4930}
4931
Brandon Jones59770802018-04-02 13:18:42 -07004932void Context::getVertexAttribfvRobust(GLuint index,
4933 GLenum pname,
4934 GLsizei bufSize,
4935 GLsizei *length,
4936 GLfloat *params)
4937{
4938 getVertexAttribfv(index, pname, params);
4939}
4940
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004941void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4942{
4943 const VertexAttribCurrentValueData &currentValues =
4944 getGLState().getVertexAttribCurrentValue(index);
4945 const VertexArray *vao = getGLState().getVertexArray();
4946 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4947 currentValues, pname, params);
4948}
4949
Brandon Jones59770802018-04-02 13:18:42 -07004950void Context::getVertexAttribIivRobust(GLuint index,
4951 GLenum pname,
4952 GLsizei bufSize,
4953 GLsizei *length,
4954 GLint *params)
4955{
4956 getVertexAttribIiv(index, pname, params);
4957}
4958
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004959void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4960{
4961 const VertexAttribCurrentValueData &currentValues =
4962 getGLState().getVertexAttribCurrentValue(index);
4963 const VertexArray *vao = getGLState().getVertexArray();
4964 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4965 currentValues, pname, params);
4966}
4967
Brandon Jones59770802018-04-02 13:18:42 -07004968void Context::getVertexAttribIuivRobust(GLuint index,
4969 GLenum pname,
4970 GLsizei bufSize,
4971 GLsizei *length,
4972 GLuint *params)
4973{
4974 getVertexAttribIuiv(index, pname, params);
4975}
4976
Jamie Madill876429b2017-04-20 15:46:24 -04004977void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004978{
4979 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4980 QueryVertexAttribPointerv(attrib, pname, pointer);
4981}
4982
Brandon Jones59770802018-04-02 13:18:42 -07004983void Context::getVertexAttribPointervRobust(GLuint index,
4984 GLenum pname,
4985 GLsizei bufSize,
4986 GLsizei *length,
4987 void **pointer)
4988{
4989 getVertexAttribPointerv(index, pname, pointer);
4990}
4991
Jamie Madillc20ab272016-06-09 07:20:46 -07004992void Context::debugMessageControl(GLenum source,
4993 GLenum type,
4994 GLenum severity,
4995 GLsizei count,
4996 const GLuint *ids,
4997 GLboolean enabled)
4998{
4999 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005000 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05005001 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07005002}
5003
5004void Context::debugMessageInsert(GLenum source,
5005 GLenum type,
5006 GLuint id,
5007 GLenum severity,
5008 GLsizei length,
5009 const GLchar *buf)
5010{
5011 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005012 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005013}
5014
5015void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5016{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005017 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005018}
5019
5020GLuint Context::getDebugMessageLog(GLuint count,
5021 GLsizei bufSize,
5022 GLenum *sources,
5023 GLenum *types,
5024 GLuint *ids,
5025 GLenum *severities,
5026 GLsizei *lengths,
5027 GLchar *messageLog)
5028{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005029 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5030 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005031}
5032
5033void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5034{
5035 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005036 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005037 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005038}
5039
5040void Context::popDebugGroup()
5041{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005042 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005043 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005044}
5045
Corentin Wallez336129f2017-10-17 15:55:40 -04005046void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005047{
5048 Buffer *buffer = mGLState.getTargetBuffer(target);
5049 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005050 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005051}
5052
Corentin Wallez336129f2017-10-17 15:55:40 -04005053void Context::bufferSubData(BufferBinding target,
5054 GLintptr offset,
5055 GLsizeiptr size,
5056 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005057{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005058 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005059 {
5060 return;
5061 }
5062
5063 Buffer *buffer = mGLState.getTargetBuffer(target);
5064 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005065 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005066}
5067
Jamie Madillef300b12016-10-07 15:12:09 -04005068void Context::attachShader(GLuint program, GLuint shader)
5069{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005070 Program *programObject = mState.mShaderPrograms->getProgram(program);
5071 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005072 ASSERT(programObject && shaderObject);
5073 programObject->attachShader(shaderObject);
5074}
5075
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005076const Workarounds &Context::getWorkarounds() const
5077{
5078 return mWorkarounds;
5079}
5080
Corentin Wallez336129f2017-10-17 15:55:40 -04005081void Context::copyBufferSubData(BufferBinding readTarget,
5082 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005083 GLintptr readOffset,
5084 GLintptr writeOffset,
5085 GLsizeiptr size)
5086{
5087 // if size is zero, the copy is a successful no-op
5088 if (size == 0)
5089 {
5090 return;
5091 }
5092
5093 // TODO(jmadill): cache these.
5094 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5095 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5096
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005097 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005098}
5099
Jamie Madill01a80ee2016-11-07 12:06:18 -05005100void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5101{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005102 // Ideally we could share the program query with the validation layer if possible.
5103 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005104 ASSERT(programObject);
5105 programObject->bindAttributeLocation(index, name);
5106}
5107
Corentin Wallez336129f2017-10-17 15:55:40 -04005108void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005109{
Corentin Wallez336129f2017-10-17 15:55:40 -04005110 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5111 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005112 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005113}
5114
Corentin Wallez336129f2017-10-17 15:55:40 -04005115void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005116{
5117 bindBufferRange(target, index, buffer, 0, 0);
5118}
5119
Corentin Wallez336129f2017-10-17 15:55:40 -04005120void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005121 GLuint index,
5122 GLuint buffer,
5123 GLintptr offset,
5124 GLsizeiptr size)
5125{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005126 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5127 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5128 if (target == BufferBinding::Uniform)
5129 {
5130 mUniformBufferObserverBindings[index].bind(object ? object->getImplementation() : nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04005131 mStateCache.onUniformBufferStateChange(this);
5132 }
5133 else
5134 {
5135 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005136 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005137}
5138
Jamie Madill01a80ee2016-11-07 12:06:18 -05005139void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5140{
5141 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5142 {
5143 bindReadFramebuffer(framebuffer);
5144 }
5145
5146 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5147 {
5148 bindDrawFramebuffer(framebuffer);
5149 }
5150}
5151
5152void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5153{
5154 ASSERT(target == GL_RENDERBUFFER);
5155 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005156 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005157 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005158}
5159
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005160void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005161 GLsizei samples,
5162 GLenum internalformat,
5163 GLsizei width,
5164 GLsizei height,
5165 GLboolean fixedsamplelocations)
5166{
5167 Extents size(width, height, 1);
5168 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005169 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5170 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005171}
5172
Olli Etuaho89664842018-08-24 14:45:36 +03005173void Context::texStorage3DMultisample(TextureType target,
5174 GLsizei samples,
5175 GLenum internalformat,
5176 GLsizei width,
5177 GLsizei height,
5178 GLsizei depth,
5179 GLboolean fixedsamplelocations)
5180{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005181 Extents size(width, height, depth);
5182 Texture *texture = getTargetTexture(target);
5183 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5184 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005185}
5186
JiangYizhoubddc46b2016-12-09 09:50:51 +08005187void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5188{
JiangYizhou5b03f472017-01-09 10:22:53 +08005189 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5190 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005191 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005192 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005193
5194 switch (pname)
5195 {
5196 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005197 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005198 break;
5199 default:
5200 UNREACHABLE();
5201 }
5202}
5203
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005204void Context::getMultisamplefvRobust(GLenum pname,
5205 GLuint index,
5206 GLsizei bufSize,
5207 GLsizei *length,
5208 GLfloat *val)
5209{
5210 UNIMPLEMENTED();
5211}
5212
Jamie Madille8fb6402017-02-14 17:56:40 -05005213void Context::renderbufferStorage(GLenum target,
5214 GLenum internalformat,
5215 GLsizei width,
5216 GLsizei height)
5217{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005218 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5219 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5220
Jamie Madille8fb6402017-02-14 17:56:40 -05005221 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005222 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005223}
5224
5225void Context::renderbufferStorageMultisample(GLenum target,
5226 GLsizei samples,
5227 GLenum internalformat,
5228 GLsizei width,
5229 GLsizei height)
5230{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005231 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5232 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005233
5234 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005235 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005236 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005237}
5238
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005239void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5240{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005241 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005242 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005243}
5244
JiangYizhoue18e6392017-02-20 10:32:23 +08005245void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5246{
5247 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5248 QueryFramebufferParameteriv(framebuffer, pname, params);
5249}
5250
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005251void Context::getFramebufferParameterivRobust(GLenum target,
5252 GLenum pname,
5253 GLsizei bufSize,
5254 GLsizei *length,
5255 GLint *params)
5256{
5257 UNIMPLEMENTED();
5258}
5259
Jiajia Qin5451d532017-11-16 17:16:34 +08005260void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005261{
5262 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005263 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005264}
5265
Jamie Madilldec86232018-07-11 09:01:18 -04005266bool Context::getScratchBuffer(size_t requstedSizeBytes,
5267 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005268{
Jamie Madilldec86232018-07-11 09:01:18 -04005269 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005270}
5271
Jamie Madilldec86232018-07-11 09:01:18 -04005272bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5273 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005274{
Jamie Madilldec86232018-07-11 09:01:18 -04005275 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005276}
5277
Xinghua Cao10a4d432017-11-28 14:46:26 +08005278Error Context::prepareForDispatch()
5279{
Geoff Langa8cb2872018-03-09 16:09:40 -05005280 ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005281
5282 if (isRobustResourceInitEnabled())
5283 {
5284 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5285 }
5286
5287 return NoError();
5288}
5289
Xinghua Cao2b396592017-03-29 15:36:04 +08005290void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5291{
5292 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5293 {
5294 return;
5295 }
5296
Xinghua Cao10a4d432017-11-28 14:46:26 +08005297 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005298 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005299}
5300
Jiajia Qin5451d532017-11-16 17:16:34 +08005301void Context::dispatchComputeIndirect(GLintptr indirect)
5302{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005303 ANGLE_CONTEXT_TRY(prepareForDispatch());
5304 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005305}
5306
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005307void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005308 GLsizei levels,
5309 GLenum internalFormat,
5310 GLsizei width,
5311 GLsizei height)
5312{
5313 Extents size(width, height, 1);
5314 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005315 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005316}
5317
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005318void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005319 GLsizei levels,
5320 GLenum internalFormat,
5321 GLsizei width,
5322 GLsizei height,
5323 GLsizei depth)
5324{
5325 Extents size(width, height, depth);
5326 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005327 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005328}
5329
Jiajia Qin5451d532017-11-16 17:16:34 +08005330void Context::memoryBarrier(GLbitfield barriers)
5331{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005332 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005333}
5334
5335void Context::memoryBarrierByRegion(GLbitfield barriers)
5336{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005337 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005338}
5339
Jamie Madillc1d770e2017-04-13 17:31:24 -04005340GLenum Context::checkFramebufferStatus(GLenum target)
5341{
5342 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5343 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005344 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005345}
5346
5347void Context::compileShader(GLuint shader)
5348{
5349 Shader *shaderObject = GetValidShader(this, shader);
5350 if (!shaderObject)
5351 {
5352 return;
5353 }
5354 shaderObject->compile(this);
5355}
5356
5357void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5358{
5359 for (int i = 0; i < n; i++)
5360 {
5361 deleteBuffer(buffers[i]);
5362 }
5363}
5364
5365void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5366{
5367 for (int i = 0; i < n; i++)
5368 {
5369 if (framebuffers[i] != 0)
5370 {
5371 deleteFramebuffer(framebuffers[i]);
5372 }
5373 }
5374}
5375
5376void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5377{
5378 for (int i = 0; i < n; i++)
5379 {
5380 deleteRenderbuffer(renderbuffers[i]);
5381 }
5382}
5383
5384void Context::deleteTextures(GLsizei n, const GLuint *textures)
5385{
5386 for (int i = 0; i < n; i++)
5387 {
5388 if (textures[i] != 0)
5389 {
5390 deleteTexture(textures[i]);
5391 }
5392 }
5393}
5394
5395void Context::detachShader(GLuint program, GLuint shader)
5396{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005397 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005398 ASSERT(programObject);
5399
5400 Shader *shaderObject = getShader(shader);
5401 ASSERT(shaderObject);
5402
5403 programObject->detachShader(this, shaderObject);
5404}
5405
5406void Context::genBuffers(GLsizei n, GLuint *buffers)
5407{
5408 for (int i = 0; i < n; i++)
5409 {
5410 buffers[i] = createBuffer();
5411 }
5412}
5413
5414void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5415{
5416 for (int i = 0; i < n; i++)
5417 {
5418 framebuffers[i] = createFramebuffer();
5419 }
5420}
5421
5422void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5423{
5424 for (int i = 0; i < n; i++)
5425 {
5426 renderbuffers[i] = createRenderbuffer();
5427 }
5428}
5429
5430void Context::genTextures(GLsizei n, GLuint *textures)
5431{
5432 for (int i = 0; i < n; i++)
5433 {
5434 textures[i] = createTexture();
5435 }
5436}
5437
5438void Context::getActiveAttrib(GLuint program,
5439 GLuint index,
5440 GLsizei bufsize,
5441 GLsizei *length,
5442 GLint *size,
5443 GLenum *type,
5444 GLchar *name)
5445{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005446 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005447 ASSERT(programObject);
5448 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5449}
5450
5451void Context::getActiveUniform(GLuint program,
5452 GLuint index,
5453 GLsizei bufsize,
5454 GLsizei *length,
5455 GLint *size,
5456 GLenum *type,
5457 GLchar *name)
5458{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005459 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005460 ASSERT(programObject);
5461 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5462}
5463
5464void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5465{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005466 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005467 ASSERT(programObject);
5468 programObject->getAttachedShaders(maxcount, count, shaders);
5469}
5470
5471GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5472{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005473 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005474 ASSERT(programObject);
5475 return programObject->getAttributeLocation(name);
5476}
5477
5478void Context::getBooleanv(GLenum pname, GLboolean *params)
5479{
5480 GLenum nativeType;
5481 unsigned int numParams = 0;
5482 getQueryParameterInfo(pname, &nativeType, &numParams);
5483
5484 if (nativeType == GL_BOOL)
5485 {
5486 getBooleanvImpl(pname, params);
5487 }
5488 else
5489 {
5490 CastStateValues(this, nativeType, pname, numParams, params);
5491 }
5492}
5493
Brandon Jones59770802018-04-02 13:18:42 -07005494void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5495{
5496 getBooleanv(pname, params);
5497}
5498
Jamie Madillc1d770e2017-04-13 17:31:24 -04005499void Context::getFloatv(GLenum pname, GLfloat *params)
5500{
5501 GLenum nativeType;
5502 unsigned int numParams = 0;
5503 getQueryParameterInfo(pname, &nativeType, &numParams);
5504
5505 if (nativeType == GL_FLOAT)
5506 {
5507 getFloatvImpl(pname, params);
5508 }
5509 else
5510 {
5511 CastStateValues(this, nativeType, pname, numParams, params);
5512 }
5513}
5514
Brandon Jones59770802018-04-02 13:18:42 -07005515void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5516{
5517 getFloatv(pname, params);
5518}
5519
Jamie Madillc1d770e2017-04-13 17:31:24 -04005520void Context::getIntegerv(GLenum pname, GLint *params)
5521{
5522 GLenum nativeType;
5523 unsigned int numParams = 0;
5524 getQueryParameterInfo(pname, &nativeType, &numParams);
5525
5526 if (nativeType == GL_INT)
5527 {
5528 getIntegervImpl(pname, params);
5529 }
5530 else
5531 {
5532 CastStateValues(this, nativeType, pname, numParams, params);
5533 }
5534}
5535
Brandon Jones59770802018-04-02 13:18:42 -07005536void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5537{
5538 getIntegerv(pname, data);
5539}
5540
Jamie Madillc1d770e2017-04-13 17:31:24 -04005541void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5542{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005543 // Don't resolve link if checking the link completion status.
5544 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5545 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005546 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005547 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005548}
5549
Brandon Jones59770802018-04-02 13:18:42 -07005550void Context::getProgramivRobust(GLuint program,
5551 GLenum pname,
5552 GLsizei bufSize,
5553 GLsizei *length,
5554 GLint *params)
5555{
5556 getProgramiv(program, pname, params);
5557}
5558
Jiajia Qin5451d532017-11-16 17:16:34 +08005559void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5560{
5561 UNIMPLEMENTED();
5562}
5563
Jamie Madillbe849e42017-05-02 15:49:00 -04005564void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005565{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005566 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005567 ASSERT(programObject);
5568 programObject->getInfoLog(bufsize, length, infolog);
5569}
5570
Jiajia Qin5451d532017-11-16 17:16:34 +08005571void Context::getProgramPipelineInfoLog(GLuint pipeline,
5572 GLsizei bufSize,
5573 GLsizei *length,
5574 GLchar *infoLog)
5575{
5576 UNIMPLEMENTED();
5577}
5578
Jamie Madillc1d770e2017-04-13 17:31:24 -04005579void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5580{
5581 Shader *shaderObject = getShader(shader);
5582 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005583 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005584}
5585
Brandon Jones59770802018-04-02 13:18:42 -07005586void Context::getShaderivRobust(GLuint shader,
5587 GLenum pname,
5588 GLsizei bufSize,
5589 GLsizei *length,
5590 GLint *params)
5591{
5592 getShaderiv(shader, pname, params);
5593}
5594
Jamie Madillc1d770e2017-04-13 17:31:24 -04005595void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5596{
5597 Shader *shaderObject = getShader(shader);
5598 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005599 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005600}
5601
5602void Context::getShaderPrecisionFormat(GLenum shadertype,
5603 GLenum precisiontype,
5604 GLint *range,
5605 GLint *precision)
5606{
5607 // TODO(jmadill): Compute shaders.
5608
5609 switch (shadertype)
5610 {
5611 case GL_VERTEX_SHADER:
5612 switch (precisiontype)
5613 {
5614 case GL_LOW_FLOAT:
5615 mCaps.vertexLowpFloat.get(range, precision);
5616 break;
5617 case GL_MEDIUM_FLOAT:
5618 mCaps.vertexMediumpFloat.get(range, precision);
5619 break;
5620 case GL_HIGH_FLOAT:
5621 mCaps.vertexHighpFloat.get(range, precision);
5622 break;
5623
5624 case GL_LOW_INT:
5625 mCaps.vertexLowpInt.get(range, precision);
5626 break;
5627 case GL_MEDIUM_INT:
5628 mCaps.vertexMediumpInt.get(range, precision);
5629 break;
5630 case GL_HIGH_INT:
5631 mCaps.vertexHighpInt.get(range, precision);
5632 break;
5633
5634 default:
5635 UNREACHABLE();
5636 return;
5637 }
5638 break;
5639
5640 case GL_FRAGMENT_SHADER:
5641 switch (precisiontype)
5642 {
5643 case GL_LOW_FLOAT:
5644 mCaps.fragmentLowpFloat.get(range, precision);
5645 break;
5646 case GL_MEDIUM_FLOAT:
5647 mCaps.fragmentMediumpFloat.get(range, precision);
5648 break;
5649 case GL_HIGH_FLOAT:
5650 mCaps.fragmentHighpFloat.get(range, precision);
5651 break;
5652
5653 case GL_LOW_INT:
5654 mCaps.fragmentLowpInt.get(range, precision);
5655 break;
5656 case GL_MEDIUM_INT:
5657 mCaps.fragmentMediumpInt.get(range, precision);
5658 break;
5659 case GL_HIGH_INT:
5660 mCaps.fragmentHighpInt.get(range, precision);
5661 break;
5662
5663 default:
5664 UNREACHABLE();
5665 return;
5666 }
5667 break;
5668
5669 default:
5670 UNREACHABLE();
5671 return;
5672 }
5673}
5674
5675void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5676{
5677 Shader *shaderObject = getShader(shader);
5678 ASSERT(shaderObject);
5679 shaderObject->getSource(bufsize, length, source);
5680}
5681
5682void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5683{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005684 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005685 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005686 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005687}
5688
Brandon Jones59770802018-04-02 13:18:42 -07005689void Context::getUniformfvRobust(GLuint program,
5690 GLint location,
5691 GLsizei bufSize,
5692 GLsizei *length,
5693 GLfloat *params)
5694{
5695 getUniformfv(program, location, params);
5696}
5697
Jamie Madillc1d770e2017-04-13 17:31:24 -04005698void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5699{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005700 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005701 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005702 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005703}
5704
Brandon Jones59770802018-04-02 13:18:42 -07005705void Context::getUniformivRobust(GLuint program,
5706 GLint location,
5707 GLsizei bufSize,
5708 GLsizei *length,
5709 GLint *params)
5710{
5711 getUniformiv(program, location, params);
5712}
5713
Jamie Madillc1d770e2017-04-13 17:31:24 -04005714GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5715{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005716 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005717 ASSERT(programObject);
5718 return programObject->getUniformLocation(name);
5719}
5720
5721GLboolean Context::isBuffer(GLuint buffer)
5722{
5723 if (buffer == 0)
5724 {
5725 return GL_FALSE;
5726 }
5727
5728 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5729}
5730
5731GLboolean Context::isEnabled(GLenum cap)
5732{
5733 return mGLState.getEnableFeature(cap);
5734}
5735
5736GLboolean Context::isFramebuffer(GLuint framebuffer)
5737{
5738 if (framebuffer == 0)
5739 {
5740 return GL_FALSE;
5741 }
5742
5743 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5744}
5745
5746GLboolean Context::isProgram(GLuint program)
5747{
5748 if (program == 0)
5749 {
5750 return GL_FALSE;
5751 }
5752
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005753 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005754}
5755
5756GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5757{
5758 if (renderbuffer == 0)
5759 {
5760 return GL_FALSE;
5761 }
5762
5763 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5764}
5765
5766GLboolean Context::isShader(GLuint shader)
5767{
5768 if (shader == 0)
5769 {
5770 return GL_FALSE;
5771 }
5772
5773 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5774}
5775
5776GLboolean Context::isTexture(GLuint texture)
5777{
5778 if (texture == 0)
5779 {
5780 return GL_FALSE;
5781 }
5782
5783 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5784}
5785
5786void Context::linkProgram(GLuint program)
5787{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005788 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005789 ASSERT(programObject);
5790 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08005791
5792 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
5793 // don't need to worry that:
5794 // 1. Draw calls after link use the new executable code or the old one depending on the link
5795 // result.
5796 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
5797 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
5798 // ProgramD3D.
5799 if (programObject->isInUse())
5800 {
Jamie Madill785e8a02018-10-04 17:42:00 -04005801 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04005802 if (programObject->isLinked())
5803 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04005804 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04005805 }
jchen107ae70d82018-07-06 13:47:01 +08005806 mStateCache.onProgramExecutableChange(this);
5807 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005808}
5809
5810void Context::releaseShaderCompiler()
5811{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005812 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005813}
5814
5815void Context::shaderBinary(GLsizei n,
5816 const GLuint *shaders,
5817 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005818 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005819 GLsizei length)
5820{
5821 // No binary shader formats are supported.
5822 UNIMPLEMENTED();
5823}
5824
Olli Etuaho0ca09752018-09-24 11:00:50 +03005825void Context::bindFragDataLocationIndexed(GLuint program,
5826 GLuint colorNumber,
5827 GLuint index,
5828 const char *name)
5829{
5830 Program *programObject = getProgramNoResolveLink(program);
5831 programObject->bindFragmentOutputLocation(colorNumber, name);
5832 programObject->bindFragmentOutputIndex(index, name);
5833}
5834
5835void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
5836{
5837 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
5838}
5839
5840int Context::getFragDataIndex(GLuint program, const char *name)
5841{
5842 Program *programObject = getProgramResolveLink(program);
5843 return programObject->getFragDataIndex(name);
5844}
5845
5846int Context::getProgramResourceLocationIndex(GLuint program,
5847 GLenum programInterface,
5848 const char *name)
5849{
5850 Program *programObject = getProgramResolveLink(program);
5851 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
5852 return programObject->getFragDataIndex(name);
5853}
5854
Jamie Madillc1d770e2017-04-13 17:31:24 -04005855void Context::shaderSource(GLuint shader,
5856 GLsizei count,
5857 const GLchar *const *string,
5858 const GLint *length)
5859{
5860 Shader *shaderObject = getShader(shader);
5861 ASSERT(shaderObject);
5862 shaderObject->setSource(count, string, length);
5863}
5864
5865void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5866{
5867 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5868}
5869
5870void Context::stencilMask(GLuint mask)
5871{
5872 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5873}
5874
5875void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5876{
5877 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5878}
5879
5880void Context::uniform1f(GLint location, GLfloat x)
5881{
5882 Program *program = mGLState.getProgram();
5883 program->setUniform1fv(location, 1, &x);
5884}
5885
5886void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5887{
5888 Program *program = mGLState.getProgram();
5889 program->setUniform1fv(location, count, v);
5890}
5891
Jamie Madill7e4eff12018-08-08 15:49:26 -04005892void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005893{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005894 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04005895 {
5896 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04005897 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04005898 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005899}
5900
Jamie Madill7e4eff12018-08-08 15:49:26 -04005901void Context::uniform1i(GLint location, GLint x)
5902{
5903 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
5904}
5905
Jamie Madillc1d770e2017-04-13 17:31:24 -04005906void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5907{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005908 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005909}
5910
5911void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5912{
5913 GLfloat xy[2] = {x, y};
5914 Program *program = mGLState.getProgram();
5915 program->setUniform2fv(location, 1, xy);
5916}
5917
5918void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5919{
5920 Program *program = mGLState.getProgram();
5921 program->setUniform2fv(location, count, v);
5922}
5923
5924void Context::uniform2i(GLint location, GLint x, GLint y)
5925{
5926 GLint xy[2] = {x, y};
5927 Program *program = mGLState.getProgram();
5928 program->setUniform2iv(location, 1, xy);
5929}
5930
5931void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
5932{
5933 Program *program = mGLState.getProgram();
5934 program->setUniform2iv(location, count, v);
5935}
5936
5937void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5938{
5939 GLfloat xyz[3] = {x, y, z};
5940 Program *program = mGLState.getProgram();
5941 program->setUniform3fv(location, 1, xyz);
5942}
5943
5944void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
5945{
5946 Program *program = mGLState.getProgram();
5947 program->setUniform3fv(location, count, v);
5948}
5949
5950void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
5951{
5952 GLint xyz[3] = {x, y, z};
5953 Program *program = mGLState.getProgram();
5954 program->setUniform3iv(location, 1, xyz);
5955}
5956
5957void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
5958{
5959 Program *program = mGLState.getProgram();
5960 program->setUniform3iv(location, count, v);
5961}
5962
5963void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5964{
5965 GLfloat xyzw[4] = {x, y, z, w};
5966 Program *program = mGLState.getProgram();
5967 program->setUniform4fv(location, 1, xyzw);
5968}
5969
5970void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
5971{
5972 Program *program = mGLState.getProgram();
5973 program->setUniform4fv(location, count, v);
5974}
5975
5976void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5977{
5978 GLint xyzw[4] = {x, y, z, w};
5979 Program *program = mGLState.getProgram();
5980 program->setUniform4iv(location, 1, xyzw);
5981}
5982
5983void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
5984{
5985 Program *program = mGLState.getProgram();
5986 program->setUniform4iv(location, count, v);
5987}
5988
5989void Context::uniformMatrix2fv(GLint location,
5990 GLsizei count,
5991 GLboolean transpose,
5992 const GLfloat *value)
5993{
5994 Program *program = mGLState.getProgram();
5995 program->setUniformMatrix2fv(location, count, transpose, value);
5996}
5997
5998void Context::uniformMatrix3fv(GLint location,
5999 GLsizei count,
6000 GLboolean transpose,
6001 const GLfloat *value)
6002{
6003 Program *program = mGLState.getProgram();
6004 program->setUniformMatrix3fv(location, count, transpose, value);
6005}
6006
6007void Context::uniformMatrix4fv(GLint location,
6008 GLsizei count,
6009 GLboolean transpose,
6010 const GLfloat *value)
6011{
6012 Program *program = mGLState.getProgram();
6013 program->setUniformMatrix4fv(location, count, transpose, value);
6014}
6015
6016void Context::validateProgram(GLuint program)
6017{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006018 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006019 ASSERT(programObject);
6020 programObject->validate(mCaps);
6021}
6022
Jiajia Qin5451d532017-11-16 17:16:34 +08006023void Context::validateProgramPipeline(GLuint pipeline)
6024{
6025 UNIMPLEMENTED();
6026}
6027
Jamie Madilld04908b2017-06-09 14:15:35 -04006028void Context::getProgramBinary(GLuint program,
6029 GLsizei bufSize,
6030 GLsizei *length,
6031 GLenum *binaryFormat,
6032 void *binary)
6033{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006034 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006035 ASSERT(programObject != nullptr);
6036
6037 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
6038}
6039
6040void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6041{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006042 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006043 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006044
Jamie Madilld04908b2017-06-09 14:15:35 -04006045 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006046 if (programObject->isInUse())
6047 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006048 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006049 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006050 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006051}
6052
Jamie Madillff325f12017-08-26 15:06:05 -04006053void Context::uniform1ui(GLint location, GLuint v0)
6054{
6055 Program *program = mGLState.getProgram();
6056 program->setUniform1uiv(location, 1, &v0);
6057}
6058
6059void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6060{
6061 Program *program = mGLState.getProgram();
6062 const GLuint xy[] = {v0, v1};
6063 program->setUniform2uiv(location, 1, xy);
6064}
6065
6066void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6067{
6068 Program *program = mGLState.getProgram();
6069 const GLuint xyz[] = {v0, v1, v2};
6070 program->setUniform3uiv(location, 1, xyz);
6071}
6072
6073void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6074{
6075 Program *program = mGLState.getProgram();
6076 const GLuint xyzw[] = {v0, v1, v2, v3};
6077 program->setUniform4uiv(location, 1, xyzw);
6078}
6079
6080void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6081{
6082 Program *program = mGLState.getProgram();
6083 program->setUniform1uiv(location, count, value);
6084}
6085void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6086{
6087 Program *program = mGLState.getProgram();
6088 program->setUniform2uiv(location, count, value);
6089}
6090
6091void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6092{
6093 Program *program = mGLState.getProgram();
6094 program->setUniform3uiv(location, count, value);
6095}
6096
6097void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6098{
6099 Program *program = mGLState.getProgram();
6100 program->setUniform4uiv(location, count, value);
6101}
6102
Jamie Madillf0e04492017-08-26 15:28:42 -04006103void Context::genQueries(GLsizei n, GLuint *ids)
6104{
6105 for (GLsizei i = 0; i < n; i++)
6106 {
6107 GLuint handle = mQueryHandleAllocator.allocate();
6108 mQueryMap.assign(handle, nullptr);
6109 ids[i] = handle;
6110 }
6111}
6112
6113void Context::deleteQueries(GLsizei n, const GLuint *ids)
6114{
6115 for (int i = 0; i < n; i++)
6116 {
6117 GLuint query = ids[i];
6118
6119 Query *queryObject = nullptr;
6120 if (mQueryMap.erase(query, &queryObject))
6121 {
6122 mQueryHandleAllocator.release(query);
6123 if (queryObject)
6124 {
6125 queryObject->release(this);
6126 }
6127 }
6128 }
6129}
6130
6131GLboolean Context::isQuery(GLuint id)
6132{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006133 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006134}
6135
Jamie Madillc8c95812017-08-26 18:40:09 -04006136void Context::uniformMatrix2x3fv(GLint location,
6137 GLsizei count,
6138 GLboolean transpose,
6139 const GLfloat *value)
6140{
6141 Program *program = mGLState.getProgram();
6142 program->setUniformMatrix2x3fv(location, count, transpose, value);
6143}
6144
6145void Context::uniformMatrix3x2fv(GLint location,
6146 GLsizei count,
6147 GLboolean transpose,
6148 const GLfloat *value)
6149{
6150 Program *program = mGLState.getProgram();
6151 program->setUniformMatrix3x2fv(location, count, transpose, value);
6152}
6153
6154void Context::uniformMatrix2x4fv(GLint location,
6155 GLsizei count,
6156 GLboolean transpose,
6157 const GLfloat *value)
6158{
6159 Program *program = mGLState.getProgram();
6160 program->setUniformMatrix2x4fv(location, count, transpose, value);
6161}
6162
6163void Context::uniformMatrix4x2fv(GLint location,
6164 GLsizei count,
6165 GLboolean transpose,
6166 const GLfloat *value)
6167{
6168 Program *program = mGLState.getProgram();
6169 program->setUniformMatrix4x2fv(location, count, transpose, value);
6170}
6171
6172void Context::uniformMatrix3x4fv(GLint location,
6173 GLsizei count,
6174 GLboolean transpose,
6175 const GLfloat *value)
6176{
6177 Program *program = mGLState.getProgram();
6178 program->setUniformMatrix3x4fv(location, count, transpose, value);
6179}
6180
6181void Context::uniformMatrix4x3fv(GLint location,
6182 GLsizei count,
6183 GLboolean transpose,
6184 const GLfloat *value)
6185{
6186 Program *program = mGLState.getProgram();
6187 program->setUniformMatrix4x3fv(location, count, transpose, value);
6188}
6189
Jamie Madilld7576732017-08-26 18:49:50 -04006190void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6191{
6192 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6193 {
6194 GLuint vertexArray = arrays[arrayIndex];
6195
6196 if (arrays[arrayIndex] != 0)
6197 {
6198 VertexArray *vertexArrayObject = nullptr;
6199 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6200 {
6201 if (vertexArrayObject != nullptr)
6202 {
6203 detachVertexArray(vertexArray);
6204 vertexArrayObject->onDestroy(this);
6205 }
6206
6207 mVertexArrayHandleAllocator.release(vertexArray);
6208 }
6209 }
6210 }
6211}
6212
6213void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6214{
6215 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6216 {
6217 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6218 mVertexArrayMap.assign(vertexArray, nullptr);
6219 arrays[arrayIndex] = vertexArray;
6220 }
6221}
6222
6223bool Context::isVertexArray(GLuint array)
6224{
6225 if (array == 0)
6226 {
6227 return GL_FALSE;
6228 }
6229
6230 VertexArray *vao = getVertexArray(array);
6231 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6232}
6233
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006234void Context::endTransformFeedback()
6235{
6236 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6237 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006238 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006239}
6240
6241void Context::transformFeedbackVaryings(GLuint program,
6242 GLsizei count,
6243 const GLchar *const *varyings,
6244 GLenum bufferMode)
6245{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006246 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006247 ASSERT(programObject);
6248 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6249}
6250
6251void Context::getTransformFeedbackVarying(GLuint program,
6252 GLuint index,
6253 GLsizei bufSize,
6254 GLsizei *length,
6255 GLsizei *size,
6256 GLenum *type,
6257 GLchar *name)
6258{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006259 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006260 ASSERT(programObject);
6261 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6262}
6263
6264void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6265{
6266 for (int i = 0; i < n; i++)
6267 {
6268 GLuint transformFeedback = ids[i];
6269 if (transformFeedback == 0)
6270 {
6271 continue;
6272 }
6273
6274 TransformFeedback *transformFeedbackObject = nullptr;
6275 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6276 {
6277 if (transformFeedbackObject != nullptr)
6278 {
6279 detachTransformFeedback(transformFeedback);
6280 transformFeedbackObject->release(this);
6281 }
6282
6283 mTransformFeedbackHandleAllocator.release(transformFeedback);
6284 }
6285 }
6286}
6287
6288void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6289{
6290 for (int i = 0; i < n; i++)
6291 {
6292 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6293 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6294 ids[i] = transformFeedback;
6295 }
6296}
6297
6298bool Context::isTransformFeedback(GLuint id)
6299{
6300 if (id == 0)
6301 {
6302 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6303 // returns FALSE
6304 return GL_FALSE;
6305 }
6306
6307 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6308 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6309}
6310
6311void Context::pauseTransformFeedback()
6312{
6313 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6314 transformFeedback->pause();
6315}
6316
6317void Context::resumeTransformFeedback()
6318{
6319 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6320 transformFeedback->resume();
6321}
6322
Jamie Madill12e957f2017-08-26 21:42:26 -04006323void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6324{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006325 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006326 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006327}
6328
Brandon Jones59770802018-04-02 13:18:42 -07006329void Context::getUniformuivRobust(GLuint program,
6330 GLint location,
6331 GLsizei bufSize,
6332 GLsizei *length,
6333 GLuint *params)
6334{
6335 getUniformuiv(program, location, params);
6336}
6337
Jamie Madill12e957f2017-08-26 21:42:26 -04006338GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6339{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006340 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006341 return programObject->getFragDataLocation(name);
6342}
6343
6344void Context::getUniformIndices(GLuint program,
6345 GLsizei uniformCount,
6346 const GLchar *const *uniformNames,
6347 GLuint *uniformIndices)
6348{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006349 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006350 if (!programObject->isLinked())
6351 {
6352 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6353 {
6354 uniformIndices[uniformId] = GL_INVALID_INDEX;
6355 }
6356 }
6357 else
6358 {
6359 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6360 {
6361 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6362 }
6363 }
6364}
6365
6366void Context::getActiveUniformsiv(GLuint program,
6367 GLsizei uniformCount,
6368 const GLuint *uniformIndices,
6369 GLenum pname,
6370 GLint *params)
6371{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006372 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006373 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6374 {
6375 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006376 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006377 }
6378}
6379
6380GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6381{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006382 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006383 return programObject->getUniformBlockIndex(uniformBlockName);
6384}
6385
6386void Context::getActiveUniformBlockiv(GLuint program,
6387 GLuint uniformBlockIndex,
6388 GLenum pname,
6389 GLint *params)
6390{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006391 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006392 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6393}
6394
Brandon Jones59770802018-04-02 13:18:42 -07006395void Context::getActiveUniformBlockivRobust(GLuint program,
6396 GLuint uniformBlockIndex,
6397 GLenum pname,
6398 GLsizei bufSize,
6399 GLsizei *length,
6400 GLint *params)
6401{
6402 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6403}
6404
Jamie Madill12e957f2017-08-26 21:42:26 -04006405void Context::getActiveUniformBlockName(GLuint program,
6406 GLuint uniformBlockIndex,
6407 GLsizei bufSize,
6408 GLsizei *length,
6409 GLchar *uniformBlockName)
6410{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006411 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006412 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6413}
6414
6415void Context::uniformBlockBinding(GLuint program,
6416 GLuint uniformBlockIndex,
6417 GLuint uniformBlockBinding)
6418{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006419 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006420 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006421
6422 if (programObject->isInUse())
6423 {
6424 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006425 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006426 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006427}
6428
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006429GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6430{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006431 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6432 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006433
Jamie Madill70b5bb02017-08-28 13:32:37 -04006434 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006435 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006436 if (error.isError())
6437 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006438 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006439 handleError(error);
6440 return nullptr;
6441 }
6442
Jamie Madill70b5bb02017-08-28 13:32:37 -04006443 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006444}
6445
6446GLboolean Context::isSync(GLsync sync)
6447{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006448 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006449}
6450
6451GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6452{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006453 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006454
6455 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006456 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006457 return result;
6458}
6459
6460void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6461{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006462 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006463 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006464}
6465
6466void Context::getInteger64v(GLenum pname, GLint64 *params)
6467{
6468 GLenum nativeType = GL_NONE;
6469 unsigned int numParams = 0;
6470 getQueryParameterInfo(pname, &nativeType, &numParams);
6471
6472 if (nativeType == GL_INT_64_ANGLEX)
6473 {
6474 getInteger64vImpl(pname, params);
6475 }
6476 else
6477 {
6478 CastStateValues(this, nativeType, pname, numParams, params);
6479 }
6480}
6481
Brandon Jones59770802018-04-02 13:18:42 -07006482void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6483{
6484 getInteger64v(pname, data);
6485}
6486
Corentin Wallez336129f2017-10-17 15:55:40 -04006487void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006488{
6489 Buffer *buffer = mGLState.getTargetBuffer(target);
6490 QueryBufferParameteri64v(buffer, pname, params);
6491}
6492
Brandon Jones59770802018-04-02 13:18:42 -07006493void Context::getBufferParameteri64vRobust(BufferBinding target,
6494 GLenum pname,
6495 GLsizei bufSize,
6496 GLsizei *length,
6497 GLint64 *params)
6498{
6499 getBufferParameteri64v(target, pname, params);
6500}
6501
Jamie Madill3ef140a2017-08-26 23:11:21 -04006502void Context::genSamplers(GLsizei count, GLuint *samplers)
6503{
6504 for (int i = 0; i < count; i++)
6505 {
6506 samplers[i] = mState.mSamplers->createSampler();
6507 }
6508}
6509
6510void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6511{
6512 for (int i = 0; i < count; i++)
6513 {
6514 GLuint sampler = samplers[i];
6515
6516 if (mState.mSamplers->getSampler(sampler))
6517 {
6518 detachSampler(sampler);
6519 }
6520
6521 mState.mSamplers->deleteObject(this, sampler);
6522 }
6523}
6524
6525void Context::getInternalformativ(GLenum target,
6526 GLenum internalformat,
6527 GLenum pname,
6528 GLsizei bufSize,
6529 GLint *params)
6530{
6531 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6532 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6533}
6534
Brandon Jones59770802018-04-02 13:18:42 -07006535void Context::getInternalformativRobust(GLenum target,
6536 GLenum internalformat,
6537 GLenum pname,
6538 GLsizei bufSize,
6539 GLsizei *length,
6540 GLint *params)
6541{
6542 getInternalformativ(target, internalformat, pname, bufSize, params);
6543}
6544
Jiajia Qin5451d532017-11-16 17:16:34 +08006545void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6546{
6547 programUniform1iv(program, location, 1, &v0);
6548}
6549
6550void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6551{
6552 GLint xy[2] = {v0, v1};
6553 programUniform2iv(program, location, 1, xy);
6554}
6555
6556void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6557{
6558 GLint xyz[3] = {v0, v1, v2};
6559 programUniform3iv(program, location, 1, xyz);
6560}
6561
6562void Context::programUniform4i(GLuint program,
6563 GLint location,
6564 GLint v0,
6565 GLint v1,
6566 GLint v2,
6567 GLint v3)
6568{
6569 GLint xyzw[4] = {v0, v1, v2, v3};
6570 programUniform4iv(program, location, 1, xyzw);
6571}
6572
6573void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6574{
6575 programUniform1uiv(program, location, 1, &v0);
6576}
6577
6578void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6579{
6580 GLuint xy[2] = {v0, v1};
6581 programUniform2uiv(program, location, 1, xy);
6582}
6583
6584void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6585{
6586 GLuint xyz[3] = {v0, v1, v2};
6587 programUniform3uiv(program, location, 1, xyz);
6588}
6589
6590void Context::programUniform4ui(GLuint program,
6591 GLint location,
6592 GLuint v0,
6593 GLuint v1,
6594 GLuint v2,
6595 GLuint v3)
6596{
6597 GLuint xyzw[4] = {v0, v1, v2, v3};
6598 programUniform4uiv(program, location, 1, xyzw);
6599}
6600
6601void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6602{
6603 programUniform1fv(program, location, 1, &v0);
6604}
6605
6606void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6607{
6608 GLfloat xy[2] = {v0, v1};
6609 programUniform2fv(program, location, 1, xy);
6610}
6611
6612void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6613{
6614 GLfloat xyz[3] = {v0, v1, v2};
6615 programUniform3fv(program, location, 1, xyz);
6616}
6617
6618void Context::programUniform4f(GLuint program,
6619 GLint location,
6620 GLfloat v0,
6621 GLfloat v1,
6622 GLfloat v2,
6623 GLfloat v3)
6624{
6625 GLfloat xyzw[4] = {v0, v1, v2, v3};
6626 programUniform4fv(program, location, 1, xyzw);
6627}
6628
Jamie Madill81c2e252017-09-09 23:32:46 -04006629void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6630{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006631 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006632 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006633 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006634}
6635
Jiajia Qin5451d532017-11-16 17:16:34 +08006636void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6637{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006638 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006639 ASSERT(programObject);
6640 programObject->setUniform2iv(location, count, value);
6641}
6642
6643void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6644{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006645 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006646 ASSERT(programObject);
6647 programObject->setUniform3iv(location, count, value);
6648}
6649
6650void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6651{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006652 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006653 ASSERT(programObject);
6654 programObject->setUniform4iv(location, count, value);
6655}
6656
6657void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6658{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006659 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006660 ASSERT(programObject);
6661 programObject->setUniform1uiv(location, count, value);
6662}
6663
6664void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6665{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006666 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006667 ASSERT(programObject);
6668 programObject->setUniform2uiv(location, count, value);
6669}
6670
6671void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6672{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006673 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006674 ASSERT(programObject);
6675 programObject->setUniform3uiv(location, count, value);
6676}
6677
6678void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6679{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006680 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006681 ASSERT(programObject);
6682 programObject->setUniform4uiv(location, count, value);
6683}
6684
6685void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6686{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006687 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006688 ASSERT(programObject);
6689 programObject->setUniform1fv(location, count, value);
6690}
6691
6692void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6693{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006694 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006695 ASSERT(programObject);
6696 programObject->setUniform2fv(location, count, value);
6697}
6698
6699void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6700{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006701 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006702 ASSERT(programObject);
6703 programObject->setUniform3fv(location, count, value);
6704}
6705
6706void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6707{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006708 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006709 ASSERT(programObject);
6710 programObject->setUniform4fv(location, count, value);
6711}
6712
6713void Context::programUniformMatrix2fv(GLuint program,
6714 GLint location,
6715 GLsizei count,
6716 GLboolean transpose,
6717 const GLfloat *value)
6718{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006719 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006720 ASSERT(programObject);
6721 programObject->setUniformMatrix2fv(location, count, transpose, value);
6722}
6723
6724void Context::programUniformMatrix3fv(GLuint program,
6725 GLint location,
6726 GLsizei count,
6727 GLboolean transpose,
6728 const GLfloat *value)
6729{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006730 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006731 ASSERT(programObject);
6732 programObject->setUniformMatrix3fv(location, count, transpose, value);
6733}
6734
6735void Context::programUniformMatrix4fv(GLuint program,
6736 GLint location,
6737 GLsizei count,
6738 GLboolean transpose,
6739 const GLfloat *value)
6740{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006741 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006742 ASSERT(programObject);
6743 programObject->setUniformMatrix4fv(location, count, transpose, value);
6744}
6745
6746void Context::programUniformMatrix2x3fv(GLuint program,
6747 GLint location,
6748 GLsizei count,
6749 GLboolean transpose,
6750 const GLfloat *value)
6751{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006752 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006753 ASSERT(programObject);
6754 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6755}
6756
6757void Context::programUniformMatrix3x2fv(GLuint program,
6758 GLint location,
6759 GLsizei count,
6760 GLboolean transpose,
6761 const GLfloat *value)
6762{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006763 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006764 ASSERT(programObject);
6765 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6766}
6767
6768void Context::programUniformMatrix2x4fv(GLuint program,
6769 GLint location,
6770 GLsizei count,
6771 GLboolean transpose,
6772 const GLfloat *value)
6773{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006774 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006775 ASSERT(programObject);
6776 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6777}
6778
6779void Context::programUniformMatrix4x2fv(GLuint program,
6780 GLint location,
6781 GLsizei count,
6782 GLboolean transpose,
6783 const GLfloat *value)
6784{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006785 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006786 ASSERT(programObject);
6787 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6788}
6789
6790void Context::programUniformMatrix3x4fv(GLuint program,
6791 GLint location,
6792 GLsizei count,
6793 GLboolean transpose,
6794 const GLfloat *value)
6795{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006796 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006797 ASSERT(programObject);
6798 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6799}
6800
6801void Context::programUniformMatrix4x3fv(GLuint program,
6802 GLint location,
6803 GLsizei count,
6804 GLboolean transpose,
6805 const GLfloat *value)
6806{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006807 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006808 ASSERT(programObject);
6809 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6810}
6811
Jamie Madill81c2e252017-09-09 23:32:46 -04006812void Context::onTextureChange(const Texture *texture)
6813{
6814 // Conservatively assume all textures are dirty.
6815 // TODO(jmadill): More fine-grained update.
6816 mGLState.setObjectDirty(GL_TEXTURE);
6817}
6818
James Darpiniane8a93c62018-01-04 18:02:24 -08006819bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6820{
6821 return mGLState.isCurrentTransformFeedback(tf);
6822}
James Darpiniane8a93c62018-01-04 18:02:24 -08006823
Yunchao Hea336b902017-08-02 16:05:21 +08006824void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6825{
6826 for (int i = 0; i < count; i++)
6827 {
6828 pipelines[i] = createProgramPipeline();
6829 }
6830}
6831
6832void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6833{
6834 for (int i = 0; i < count; i++)
6835 {
6836 if (pipelines[i] != 0)
6837 {
6838 deleteProgramPipeline(pipelines[i]);
6839 }
6840 }
6841}
6842
6843GLboolean Context::isProgramPipeline(GLuint pipeline)
6844{
6845 if (pipeline == 0)
6846 {
6847 return GL_FALSE;
6848 }
6849
6850 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6851}
6852
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006853void Context::finishFenceNV(GLuint fence)
6854{
6855 FenceNV *fenceObject = getFenceNV(fence);
6856
6857 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04006858 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006859}
6860
6861void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6862{
6863 FenceNV *fenceObject = getFenceNV(fence);
6864
6865 ASSERT(fenceObject && fenceObject->isSet());
6866
6867 switch (pname)
6868 {
6869 case GL_FENCE_STATUS_NV:
6870 {
6871 // GL_NV_fence spec:
6872 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6873 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6874 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6875 GLboolean status = GL_TRUE;
6876 if (fenceObject->getStatus() != GL_TRUE)
6877 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006878 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006879 }
6880 *params = status;
6881 break;
6882 }
6883
6884 case GL_FENCE_CONDITION_NV:
6885 {
6886 *params = static_cast<GLint>(fenceObject->getCondition());
6887 break;
6888 }
6889
6890 default:
6891 UNREACHABLE();
6892 }
6893}
6894
6895void Context::getTranslatedShaderSource(GLuint shader,
6896 GLsizei bufsize,
6897 GLsizei *length,
6898 GLchar *source)
6899{
6900 Shader *shaderObject = getShader(shader);
6901 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08006902 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006903}
6904
6905void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6906{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006907 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006908 ASSERT(programObject);
6909
6910 programObject->getUniformfv(this, location, params);
6911}
6912
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006913void Context::getnUniformfvRobust(GLuint program,
6914 GLint location,
6915 GLsizei bufSize,
6916 GLsizei *length,
6917 GLfloat *params)
6918{
6919 UNIMPLEMENTED();
6920}
6921
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006922void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
6923{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006924 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006925 ASSERT(programObject);
6926
6927 programObject->getUniformiv(this, location, params);
6928}
6929
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006930void Context::getnUniformivRobust(GLuint program,
6931 GLint location,
6932 GLsizei bufSize,
6933 GLsizei *length,
6934 GLint *params)
6935{
6936 UNIMPLEMENTED();
6937}
6938
6939void Context::getnUniformuivRobust(GLuint program,
6940 GLint location,
6941 GLsizei bufSize,
6942 GLsizei *length,
6943 GLuint *params)
6944{
6945 UNIMPLEMENTED();
6946}
6947
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006948GLboolean Context::isFenceNV(GLuint fence)
6949{
6950 FenceNV *fenceObject = getFenceNV(fence);
6951
6952 if (fenceObject == nullptr)
6953 {
6954 return GL_FALSE;
6955 }
6956
6957 // GL_NV_fence spec:
6958 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
6959 // existing fence.
6960 return fenceObject->isSet();
6961}
6962
6963void Context::readnPixels(GLint x,
6964 GLint y,
6965 GLsizei width,
6966 GLsizei height,
6967 GLenum format,
6968 GLenum type,
6969 GLsizei bufSize,
6970 void *data)
6971{
6972 return readPixels(x, y, width, height, format, type, data);
6973}
6974
Jamie Madill007530e2017-12-28 14:27:04 -05006975void Context::setFenceNV(GLuint fence, GLenum condition)
6976{
6977 ASSERT(condition == GL_ALL_COMPLETED_NV);
6978
6979 FenceNV *fenceObject = getFenceNV(fence);
6980 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04006981 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05006982}
6983
6984GLboolean Context::testFenceNV(GLuint fence)
6985{
6986 FenceNV *fenceObject = getFenceNV(fence);
6987
6988 ASSERT(fenceObject != nullptr);
6989 ASSERT(fenceObject->isSet() == GL_TRUE);
6990
6991 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04006992 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05006993 if (error.isError())
6994 {
6995 handleError(error);
6996 return GL_TRUE;
6997 }
6998
6999 return result;
7000}
7001
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007002void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007003{
7004 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007005 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05007006 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007007}
7008
Jamie Madillfa920eb2018-01-04 11:45:50 -05007009void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007010{
7011 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007012 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05007013 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
7014}
7015
Jamie Madillfa920eb2018-01-04 11:45:50 -05007016void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7017{
7018 UNIMPLEMENTED();
7019}
7020
Jamie Madill5b772312018-03-08 20:28:32 -05007021bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7022{
7023 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7024 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7025 // to the fact that it is stored internally as a float, and so would require conversion
7026 // if returned from Context::getIntegerv. Since this conversion is already implemented
7027 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7028 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7029 // application.
7030 switch (pname)
7031 {
7032 case GL_COMPRESSED_TEXTURE_FORMATS:
7033 {
7034 *type = GL_INT;
7035 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7036 return true;
7037 }
7038 case GL_SHADER_BINARY_FORMATS:
7039 {
7040 *type = GL_INT;
7041 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7042 return true;
7043 }
7044
7045 case GL_MAX_VERTEX_ATTRIBS:
7046 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7047 case GL_MAX_VARYING_VECTORS:
7048 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7049 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7050 case GL_MAX_TEXTURE_IMAGE_UNITS:
7051 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7052 case GL_MAX_RENDERBUFFER_SIZE:
7053 case GL_NUM_SHADER_BINARY_FORMATS:
7054 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7055 case GL_ARRAY_BUFFER_BINDING:
7056 case GL_FRAMEBUFFER_BINDING:
7057 case GL_RENDERBUFFER_BINDING:
7058 case GL_CURRENT_PROGRAM:
7059 case GL_PACK_ALIGNMENT:
7060 case GL_UNPACK_ALIGNMENT:
7061 case GL_GENERATE_MIPMAP_HINT:
7062 case GL_RED_BITS:
7063 case GL_GREEN_BITS:
7064 case GL_BLUE_BITS:
7065 case GL_ALPHA_BITS:
7066 case GL_DEPTH_BITS:
7067 case GL_STENCIL_BITS:
7068 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7069 case GL_CULL_FACE_MODE:
7070 case GL_FRONT_FACE:
7071 case GL_ACTIVE_TEXTURE:
7072 case GL_STENCIL_FUNC:
7073 case GL_STENCIL_VALUE_MASK:
7074 case GL_STENCIL_REF:
7075 case GL_STENCIL_FAIL:
7076 case GL_STENCIL_PASS_DEPTH_FAIL:
7077 case GL_STENCIL_PASS_DEPTH_PASS:
7078 case GL_STENCIL_BACK_FUNC:
7079 case GL_STENCIL_BACK_VALUE_MASK:
7080 case GL_STENCIL_BACK_REF:
7081 case GL_STENCIL_BACK_FAIL:
7082 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7083 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7084 case GL_DEPTH_FUNC:
7085 case GL_BLEND_SRC_RGB:
7086 case GL_BLEND_SRC_ALPHA:
7087 case GL_BLEND_DST_RGB:
7088 case GL_BLEND_DST_ALPHA:
7089 case GL_BLEND_EQUATION_RGB:
7090 case GL_BLEND_EQUATION_ALPHA:
7091 case GL_STENCIL_WRITEMASK:
7092 case GL_STENCIL_BACK_WRITEMASK:
7093 case GL_STENCIL_CLEAR_VALUE:
7094 case GL_SUBPIXEL_BITS:
7095 case GL_MAX_TEXTURE_SIZE:
7096 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7097 case GL_SAMPLE_BUFFERS:
7098 case GL_SAMPLES:
7099 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7100 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7101 case GL_TEXTURE_BINDING_2D:
7102 case GL_TEXTURE_BINDING_CUBE_MAP:
7103 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7104 {
7105 *type = GL_INT;
7106 *numParams = 1;
7107 return true;
7108 }
7109 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7110 {
7111 if (!getExtensions().packReverseRowOrder)
7112 {
7113 return false;
7114 }
7115 *type = GL_INT;
7116 *numParams = 1;
7117 return true;
7118 }
7119 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7120 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7121 {
7122 if (!getExtensions().textureRectangle)
7123 {
7124 return false;
7125 }
7126 *type = GL_INT;
7127 *numParams = 1;
7128 return true;
7129 }
7130 case GL_MAX_DRAW_BUFFERS_EXT:
7131 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7132 {
7133 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7134 {
7135 return false;
7136 }
7137 *type = GL_INT;
7138 *numParams = 1;
7139 return true;
7140 }
7141 case GL_MAX_VIEWPORT_DIMS:
7142 {
7143 *type = GL_INT;
7144 *numParams = 2;
7145 return true;
7146 }
7147 case GL_VIEWPORT:
7148 case GL_SCISSOR_BOX:
7149 {
7150 *type = GL_INT;
7151 *numParams = 4;
7152 return true;
7153 }
7154 case GL_SHADER_COMPILER:
7155 case GL_SAMPLE_COVERAGE_INVERT:
7156 case GL_DEPTH_WRITEMASK:
7157 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7158 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7159 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7160 // bool-natural
7161 case GL_SAMPLE_COVERAGE:
7162 case GL_SCISSOR_TEST:
7163 case GL_STENCIL_TEST:
7164 case GL_DEPTH_TEST:
7165 case GL_BLEND:
7166 case GL_DITHER:
7167 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7168 {
7169 *type = GL_BOOL;
7170 *numParams = 1;
7171 return true;
7172 }
7173 case GL_COLOR_WRITEMASK:
7174 {
7175 *type = GL_BOOL;
7176 *numParams = 4;
7177 return true;
7178 }
7179 case GL_POLYGON_OFFSET_FACTOR:
7180 case GL_POLYGON_OFFSET_UNITS:
7181 case GL_SAMPLE_COVERAGE_VALUE:
7182 case GL_DEPTH_CLEAR_VALUE:
7183 case GL_LINE_WIDTH:
7184 {
7185 *type = GL_FLOAT;
7186 *numParams = 1;
7187 return true;
7188 }
7189 case GL_ALIASED_LINE_WIDTH_RANGE:
7190 case GL_ALIASED_POINT_SIZE_RANGE:
7191 case GL_DEPTH_RANGE:
7192 {
7193 *type = GL_FLOAT;
7194 *numParams = 2;
7195 return true;
7196 }
7197 case GL_COLOR_CLEAR_VALUE:
7198 case GL_BLEND_COLOR:
7199 {
7200 *type = GL_FLOAT;
7201 *numParams = 4;
7202 return true;
7203 }
7204 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7205 if (!getExtensions().textureFilterAnisotropic)
7206 {
7207 return false;
7208 }
7209 *type = GL_FLOAT;
7210 *numParams = 1;
7211 return true;
7212 case GL_TIMESTAMP_EXT:
7213 if (!getExtensions().disjointTimerQuery)
7214 {
7215 return false;
7216 }
7217 *type = GL_INT_64_ANGLEX;
7218 *numParams = 1;
7219 return true;
7220 case GL_GPU_DISJOINT_EXT:
7221 if (!getExtensions().disjointTimerQuery)
7222 {
7223 return false;
7224 }
7225 *type = GL_INT;
7226 *numParams = 1;
7227 return true;
7228 case GL_COVERAGE_MODULATION_CHROMIUM:
7229 if (!getExtensions().framebufferMixedSamples)
7230 {
7231 return false;
7232 }
7233 *type = GL_INT;
7234 *numParams = 1;
7235 return true;
7236 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7237 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7238 {
7239 return false;
7240 }
7241 *type = GL_INT;
7242 *numParams = 1;
7243 return true;
7244 }
7245
7246 if (getExtensions().debug)
7247 {
7248 switch (pname)
7249 {
7250 case GL_DEBUG_LOGGED_MESSAGES:
7251 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7252 case GL_DEBUG_GROUP_STACK_DEPTH:
7253 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7254 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7255 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7256 case GL_MAX_LABEL_LENGTH:
7257 *type = GL_INT;
7258 *numParams = 1;
7259 return true;
7260
7261 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7262 case GL_DEBUG_OUTPUT:
7263 *type = GL_BOOL;
7264 *numParams = 1;
7265 return true;
7266 }
7267 }
7268
7269 if (getExtensions().multisampleCompatibility)
7270 {
7271 switch (pname)
7272 {
7273 case GL_MULTISAMPLE_EXT:
7274 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7275 *type = GL_BOOL;
7276 *numParams = 1;
7277 return true;
7278 }
7279 }
7280
7281 if (getExtensions().pathRendering)
7282 {
7283 switch (pname)
7284 {
7285 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7286 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7287 *type = GL_FLOAT;
7288 *numParams = 16;
7289 return true;
7290 }
7291 }
7292
7293 if (getExtensions().bindGeneratesResource)
7294 {
7295 switch (pname)
7296 {
7297 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7298 *type = GL_BOOL;
7299 *numParams = 1;
7300 return true;
7301 }
7302 }
7303
7304 if (getExtensions().clientArrays)
7305 {
7306 switch (pname)
7307 {
7308 case GL_CLIENT_ARRAYS_ANGLE:
7309 *type = GL_BOOL;
7310 *numParams = 1;
7311 return true;
7312 }
7313 }
7314
7315 if (getExtensions().sRGBWriteControl)
7316 {
7317 switch (pname)
7318 {
7319 case GL_FRAMEBUFFER_SRGB_EXT:
7320 *type = GL_BOOL;
7321 *numParams = 1;
7322 return true;
7323 }
7324 }
7325
7326 if (getExtensions().robustResourceInitialization &&
7327 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7328 {
7329 *type = GL_BOOL;
7330 *numParams = 1;
7331 return true;
7332 }
7333
7334 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7335 {
7336 *type = GL_BOOL;
7337 *numParams = 1;
7338 return true;
7339 }
7340
jchen1082af6202018-06-22 10:59:52 +08007341 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7342 {
7343 *type = GL_INT;
7344 *numParams = 1;
7345 return true;
7346 }
7347
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007348 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7349 {
7350 *type = GL_INT;
7351 *numParams = 1;
7352 return true;
7353 }
7354
Jamie Madill5b772312018-03-08 20:28:32 -05007355 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7356 switch (pname)
7357 {
7358 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7359 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7360 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7361 {
7362 return false;
7363 }
7364 *type = GL_INT;
7365 *numParams = 1;
7366 return true;
7367
7368 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7369 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7370 {
7371 return false;
7372 }
7373 *type = GL_INT;
7374 *numParams = 1;
7375 return true;
7376
7377 case GL_PROGRAM_BINARY_FORMATS_OES:
7378 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7379 {
7380 return false;
7381 }
7382 *type = GL_INT;
7383 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7384 return true;
7385
7386 case GL_PACK_ROW_LENGTH:
7387 case GL_PACK_SKIP_ROWS:
7388 case GL_PACK_SKIP_PIXELS:
7389 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7390 {
7391 return false;
7392 }
7393 *type = GL_INT;
7394 *numParams = 1;
7395 return true;
7396 case GL_UNPACK_ROW_LENGTH:
7397 case GL_UNPACK_SKIP_ROWS:
7398 case GL_UNPACK_SKIP_PIXELS:
7399 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7400 {
7401 return false;
7402 }
7403 *type = GL_INT;
7404 *numParams = 1;
7405 return true;
7406 case GL_VERTEX_ARRAY_BINDING:
7407 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7408 {
7409 return false;
7410 }
7411 *type = GL_INT;
7412 *numParams = 1;
7413 return true;
7414 case GL_PIXEL_PACK_BUFFER_BINDING:
7415 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7416 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7417 {
7418 return false;
7419 }
7420 *type = GL_INT;
7421 *numParams = 1;
7422 return true;
7423 case GL_MAX_SAMPLES:
7424 {
7425 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7426 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7427 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7428 {
7429 return false;
7430 }
7431 *type = GL_INT;
7432 *numParams = 1;
7433 return true;
7434
7435 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7436 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7437 {
7438 return false;
7439 }
7440 *type = GL_INT;
7441 *numParams = 1;
7442 return true;
7443 }
7444 }
7445
7446 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7447 {
7448 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7449 {
7450 return false;
7451 }
7452 *type = GL_INT;
7453 *numParams = 1;
7454 return true;
7455 }
7456
7457 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7458 {
7459 *type = GL_INT;
7460 *numParams = 1;
7461 return true;
7462 }
7463
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007464 if (getClientVersion() < Version(2, 0))
7465 {
7466 switch (pname)
7467 {
7468 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007469 case GL_CLIENT_ACTIVE_TEXTURE:
7470 case GL_MATRIX_MODE:
7471 case GL_MAX_TEXTURE_UNITS:
7472 case GL_MAX_MODELVIEW_STACK_DEPTH:
7473 case GL_MAX_PROJECTION_STACK_DEPTH:
7474 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007475 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007476 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007477 case GL_VERTEX_ARRAY_STRIDE:
7478 case GL_NORMAL_ARRAY_STRIDE:
7479 case GL_COLOR_ARRAY_STRIDE:
7480 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7481 case GL_VERTEX_ARRAY_SIZE:
7482 case GL_COLOR_ARRAY_SIZE:
7483 case GL_TEXTURE_COORD_ARRAY_SIZE:
7484 case GL_VERTEX_ARRAY_TYPE:
7485 case GL_NORMAL_ARRAY_TYPE:
7486 case GL_COLOR_ARRAY_TYPE:
7487 case GL_TEXTURE_COORD_ARRAY_TYPE:
7488 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7489 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7490 case GL_COLOR_ARRAY_BUFFER_BINDING:
7491 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7492 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7493 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7494 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007495 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007496 case GL_MODELVIEW_STACK_DEPTH:
7497 case GL_PROJECTION_STACK_DEPTH:
7498 case GL_TEXTURE_STACK_DEPTH:
7499 case GL_LOGIC_OP_MODE:
7500 case GL_BLEND_SRC:
7501 case GL_BLEND_DST:
7502 case GL_PERSPECTIVE_CORRECTION_HINT:
7503 case GL_POINT_SMOOTH_HINT:
7504 case GL_LINE_SMOOTH_HINT:
7505 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007506 *type = GL_INT;
7507 *numParams = 1;
7508 return true;
7509 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007510 case GL_FOG_DENSITY:
7511 case GL_FOG_START:
7512 case GL_FOG_END:
7513 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007514 case GL_POINT_SIZE:
7515 case GL_POINT_SIZE_MIN:
7516 case GL_POINT_SIZE_MAX:
7517 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007518 *type = GL_FLOAT;
7519 *numParams = 1;
7520 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007521 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007522 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007523 *type = GL_FLOAT;
7524 *numParams = 2;
7525 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007526 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007527 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007528 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007529 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007530 *type = GL_FLOAT;
7531 *numParams = 4;
7532 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007533 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007534 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007535 *type = GL_FLOAT;
7536 *numParams = 3;
7537 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007538 case GL_MODELVIEW_MATRIX:
7539 case GL_PROJECTION_MATRIX:
7540 case GL_TEXTURE_MATRIX:
7541 *type = GL_FLOAT;
7542 *numParams = 16;
7543 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007544 case GL_LIGHT_MODEL_TWO_SIDE:
7545 *type = GL_BOOL;
7546 *numParams = 1;
7547 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007548 }
7549 }
7550
Jamie Madill5b772312018-03-08 20:28:32 -05007551 if (getClientVersion() < Version(3, 0))
7552 {
7553 return false;
7554 }
7555
7556 // Check for ES3.0+ parameter names
7557 switch (pname)
7558 {
7559 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7560 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7561 case GL_UNIFORM_BUFFER_BINDING:
7562 case GL_TRANSFORM_FEEDBACK_BINDING:
7563 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7564 case GL_COPY_READ_BUFFER_BINDING:
7565 case GL_COPY_WRITE_BUFFER_BINDING:
7566 case GL_SAMPLER_BINDING:
7567 case GL_READ_BUFFER:
7568 case GL_TEXTURE_BINDING_3D:
7569 case GL_TEXTURE_BINDING_2D_ARRAY:
7570 case GL_MAX_3D_TEXTURE_SIZE:
7571 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7572 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7573 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7574 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7575 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7576 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7577 case GL_MAX_VARYING_COMPONENTS:
7578 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7579 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7580 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7581 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7582 case GL_NUM_EXTENSIONS:
7583 case GL_MAJOR_VERSION:
7584 case GL_MINOR_VERSION:
7585 case GL_MAX_ELEMENTS_INDICES:
7586 case GL_MAX_ELEMENTS_VERTICES:
7587 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7588 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7589 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7590 case GL_UNPACK_IMAGE_HEIGHT:
7591 case GL_UNPACK_SKIP_IMAGES:
7592 {
7593 *type = GL_INT;
7594 *numParams = 1;
7595 return true;
7596 }
7597
7598 case GL_MAX_ELEMENT_INDEX:
7599 case GL_MAX_UNIFORM_BLOCK_SIZE:
7600 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7601 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7602 case GL_MAX_SERVER_WAIT_TIMEOUT:
7603 {
7604 *type = GL_INT_64_ANGLEX;
7605 *numParams = 1;
7606 return true;
7607 }
7608
7609 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7610 case GL_TRANSFORM_FEEDBACK_PAUSED:
7611 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7612 case GL_RASTERIZER_DISCARD:
7613 {
7614 *type = GL_BOOL;
7615 *numParams = 1;
7616 return true;
7617 }
7618
7619 case GL_MAX_TEXTURE_LOD_BIAS:
7620 {
7621 *type = GL_FLOAT;
7622 *numParams = 1;
7623 return true;
7624 }
7625 }
7626
7627 if (getExtensions().requestExtension)
7628 {
7629 switch (pname)
7630 {
7631 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7632 *type = GL_INT;
7633 *numParams = 1;
7634 return true;
7635 }
7636 }
7637
7638 if (getClientVersion() < Version(3, 1))
7639 {
7640 return false;
7641 }
7642
7643 switch (pname)
7644 {
7645 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7646 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7647 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7648 case GL_MAX_FRAMEBUFFER_WIDTH:
7649 case GL_MAX_FRAMEBUFFER_HEIGHT:
7650 case GL_MAX_FRAMEBUFFER_SAMPLES:
7651 case GL_MAX_SAMPLE_MASK_WORDS:
7652 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7653 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7654 case GL_MAX_INTEGER_SAMPLES:
7655 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7656 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7657 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7658 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7659 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7660 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7661 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7662 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7663 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7664 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7665 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7666 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7667 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7668 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7669 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7670 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7671 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7672 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7673 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7674 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7675 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7676 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7677 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7678 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7679 case GL_MAX_UNIFORM_LOCATIONS:
7680 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7681 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7682 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7683 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7684 case GL_MAX_IMAGE_UNITS:
7685 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7686 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7687 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7688 case GL_SHADER_STORAGE_BUFFER_BINDING:
7689 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7690 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007691 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007692 *type = GL_INT;
7693 *numParams = 1;
7694 return true;
7695 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7696 *type = GL_INT_64_ANGLEX;
7697 *numParams = 1;
7698 return true;
7699 case GL_SAMPLE_MASK:
7700 *type = GL_BOOL;
7701 *numParams = 1;
7702 return true;
7703 }
7704
7705 if (getExtensions().geometryShader)
7706 {
7707 switch (pname)
7708 {
7709 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7710 case GL_LAYER_PROVOKING_VERTEX_EXT:
7711 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7712 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7713 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7714 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7715 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7716 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7717 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7718 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7719 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7720 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7721 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7722 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7723 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7724 *type = GL_INT;
7725 *numParams = 1;
7726 return true;
7727 }
7728 }
7729
7730 return false;
7731}
7732
7733bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7734{
7735 if (getClientVersion() < Version(3, 0))
7736 {
7737 return false;
7738 }
7739
7740 switch (target)
7741 {
7742 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7743 case GL_UNIFORM_BUFFER_BINDING:
7744 {
7745 *type = GL_INT;
7746 *numParams = 1;
7747 return true;
7748 }
7749 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7750 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7751 case GL_UNIFORM_BUFFER_START:
7752 case GL_UNIFORM_BUFFER_SIZE:
7753 {
7754 *type = GL_INT_64_ANGLEX;
7755 *numParams = 1;
7756 return true;
7757 }
7758 }
7759
7760 if (getClientVersion() < Version(3, 1))
7761 {
7762 return false;
7763 }
7764
7765 switch (target)
7766 {
7767 case GL_IMAGE_BINDING_LAYERED:
7768 {
7769 *type = GL_BOOL;
7770 *numParams = 1;
7771 return true;
7772 }
7773 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7774 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7775 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7776 case GL_SHADER_STORAGE_BUFFER_BINDING:
7777 case GL_VERTEX_BINDING_BUFFER:
7778 case GL_VERTEX_BINDING_DIVISOR:
7779 case GL_VERTEX_BINDING_OFFSET:
7780 case GL_VERTEX_BINDING_STRIDE:
7781 case GL_SAMPLE_MASK_VALUE:
7782 case GL_IMAGE_BINDING_NAME:
7783 case GL_IMAGE_BINDING_LEVEL:
7784 case GL_IMAGE_BINDING_LAYER:
7785 case GL_IMAGE_BINDING_ACCESS:
7786 case GL_IMAGE_BINDING_FORMAT:
7787 {
7788 *type = GL_INT;
7789 *numParams = 1;
7790 return true;
7791 }
7792 case GL_ATOMIC_COUNTER_BUFFER_START:
7793 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7794 case GL_SHADER_STORAGE_BUFFER_START:
7795 case GL_SHADER_STORAGE_BUFFER_SIZE:
7796 {
7797 *type = GL_INT_64_ANGLEX;
7798 *numParams = 1;
7799 return true;
7800 }
7801 }
7802
7803 return false;
7804}
7805
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007806Program *Context::getProgramResolveLink(GLuint handle) const
7807{
7808 Program *program = mState.mShaderPrograms->getProgram(handle);
7809 if (program)
7810 {
Jamie Madill785e8a02018-10-04 17:42:00 -04007811 program->resolveLink(this);
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007812 }
7813 return program;
7814}
7815
7816Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05007817{
7818 return mState.mShaderPrograms->getProgram(handle);
7819}
7820
7821Shader *Context::getShader(GLuint handle) const
7822{
7823 return mState.mShaderPrograms->getShader(handle);
7824}
7825
7826bool Context::isTextureGenerated(GLuint texture) const
7827{
7828 return mState.mTextures->isHandleGenerated(texture);
7829}
7830
Jamie Madill5b772312018-03-08 20:28:32 -05007831bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7832{
7833 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7834}
7835
7836bool Context::isFramebufferGenerated(GLuint framebuffer) const
7837{
7838 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7839}
7840
7841bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7842{
7843 return mState.mPipelines->isHandleGenerated(pipeline);
7844}
7845
7846bool Context::usingDisplayTextureShareGroup() const
7847{
7848 return mDisplayTextureShareGroup;
7849}
7850
7851GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7852{
7853 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7854 internalformat == GL_DEPTH_STENCIL
7855 ? GL_DEPTH24_STENCIL8
7856 : internalformat;
7857}
7858
jchen1082af6202018-06-22 10:59:52 +08007859void Context::maxShaderCompilerThreads(GLuint count)
7860{
jchen107ae70d82018-07-06 13:47:01 +08007861 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08007862 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08007863 // A count of zero specifies a request for no parallel compiling or linking.
7864 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
7865 {
7866 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
7867 }
7868 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08007869}
7870
Jamie Madill2eb65032018-07-30 10:25:57 -04007871bool Context::isGLES1() const
7872{
7873 return mState.getClientVersion() < Version(2, 0);
7874}
7875
Jamie Madilla11819d2018-07-30 10:26:01 -04007876void Context::onSubjectStateChange(const Context *context,
7877 angle::SubjectIndex index,
7878 angle::SubjectMessage message)
7879{
Jamie Madilla11819d2018-07-30 10:26:01 -04007880 switch (index)
7881 {
7882 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007883 switch (message)
7884 {
7885 case angle::SubjectMessage::CONTENTS_CHANGED:
7886 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
7887 mStateCache.onVertexArrayBufferContentsChange(this);
7888 break;
7889 case angle::SubjectMessage::RESOURCE_MAPPED:
7890 case angle::SubjectMessage::RESOURCE_UNMAPPED:
7891 case angle::SubjectMessage::BINDING_CHANGED:
7892 mStateCache.onVertexArrayBufferStateChange(this);
7893 break;
7894 default:
7895 break;
7896 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007897 break;
7898
7899 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007900 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7901 {
7902 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
7903 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007904 break;
7905
7906 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007907 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7908 {
7909 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
7910 }
7911 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04007912 break;
7913
7914 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04007915 if (index < kTextureMaxSubjectIndex)
7916 {
7917 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04007918 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007919 }
Jamie Madille25b8002018-09-20 13:39:49 -04007920 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04007921 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04007922 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04007923 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007924 }
Jamie Madille25b8002018-09-20 13:39:49 -04007925 else
7926 {
7927 ASSERT(index < kSamplerMaxSubjectIndex);
7928 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
7929 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007930 break;
7931 }
7932}
7933
Jamie Madill6b873dd2018-07-12 23:56:30 -04007934// ErrorSet implementation.
7935ErrorSet::ErrorSet(Context *context) : mContext(context)
7936{
7937}
7938
7939ErrorSet::~ErrorSet() = default;
7940
Jamie Madill306b6c12018-07-27 08:12:49 -04007941void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04007942{
7943 // This internal enum is used to filter internal errors that are already handled.
7944 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
7945 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
7946 {
7947 return;
7948 }
7949
7950 if (ANGLE_UNLIKELY(error.isError()))
7951 {
7952 GLenum code = error.getCode();
7953 mErrors.insert(code);
Jamie Madill785e8a02018-10-04 17:42:00 -04007954
Jamie Madill6b873dd2018-07-12 23:56:30 -04007955 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
7956 {
7957 mContext->markContextLost();
7958 }
7959
7960 ASSERT(!error.getMessage().empty());
7961 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
7962 error.getID(), GL_DEBUG_SEVERITY_HIGH,
7963 error.getMessage());
7964 }
7965}
7966
Jamie Madillabfbc0f2018-10-09 12:48:52 -04007967void ErrorSet::handleError(GLenum errorCode,
7968 const char *message,
7969 const char *file,
7970 const char *function,
7971 unsigned int line)
7972{
7973 // TODO(jmadill): Handle error directly instead of creating object. http://anglebug.com/2491
7974 std::stringstream errorStream;
7975 errorStream << "Front-end Error: " << gl::FmtHex(errorCode) << ", in " << file << ", "
7976 << function << ":" << line << ". " << message;
7977
7978 handleError(gl::Error(errorCode, errorCode, errorStream.str()));
7979}
7980
Jamie Madill6b873dd2018-07-12 23:56:30 -04007981bool ErrorSet::empty() const
7982{
7983 return mErrors.empty();
7984}
7985
7986GLenum ErrorSet::popError()
7987{
7988 ASSERT(!empty());
7989 GLenum error = *mErrors.begin();
7990 mErrors.erase(mErrors.begin());
7991 return error;
7992}
Jamie Madilldc358af2018-07-31 11:22:13 -04007993
7994// StateCache implementation.
Jamie Madill16e28fd2018-09-12 11:03:05 -04007995StateCache::StateCache(Context *context)
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007996 : mCachedHasAnyEnabledClientAttrib(false),
7997 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04007998 mCachedInstancedVertexElementLimit(0),
7999 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madilldc358af2018-07-31 11:22:13 -04008000{
Jamie Madill16e28fd2018-09-12 11:03:05 -04008001 updateValidDrawModes(context);
Jamie Madilldc358af2018-07-31 11:22:13 -04008002}
8003
8004StateCache::~StateCache() = default;
8005
8006void StateCache::updateActiveAttribsMask(Context *context)
8007{
8008 bool isGLES1 = context->isGLES1();
8009 const State &glState = context->getGLState();
8010
8011 if (!isGLES1 && !glState.getProgram())
8012 {
8013 mCachedActiveBufferedAttribsMask = AttributesMask();
8014 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008015 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008016 return;
8017 }
8018
8019 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8020 : glState.getProgram()->getActiveAttribLocationsMask();
8021
8022 const VertexArray *vao = glState.getVertexArray();
8023 ASSERT(vao);
8024
8025 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8026 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008027 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008028
Jamie Madill0a17e482018-08-31 17:19:11 -04008029 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8030 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008031 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008032 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8033}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008034
8035void StateCache::updateVertexElementLimits(Context *context)
8036{
8037 const VertexArray *vao = context->getGLState().getVertexArray();
8038
8039 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8040 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8041
8042 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8043 // If there are no buffered attributes then we should not limit the draw call count.
8044 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8045 {
8046 return;
8047 }
8048
8049 const auto &vertexAttribs = vao->getVertexAttributes();
8050 const auto &vertexBindings = vao->getVertexBindings();
8051
8052 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8053 {
8054 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8055 ASSERT(attrib.enabled);
8056
8057 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8058 ASSERT(context->isGLES1() ||
8059 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8060
8061 GLint64 limit = attrib.getCachedElementLimit();
8062 if (binding.getDivisor() > 0)
8063 {
8064 mCachedInstancedVertexElementLimit =
8065 std::min(mCachedInstancedVertexElementLimit, limit);
8066 }
8067 else
8068 {
8069 mCachedNonInstancedVertexElementLimit =
8070 std::min(mCachedNonInstancedVertexElementLimit, limit);
8071 }
8072 }
8073}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008074
Jamie Madilld84b6732018-09-06 15:54:35 -04008075void StateCache::updateBasicDrawStatesError()
8076{
8077 mCachedBasicDrawStatesError = kInvalidPointer;
8078}
8079
8080intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8081{
8082 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8083 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8084 return mCachedBasicDrawStatesError;
8085}
8086
Jamie Madillc43cdad2018-08-08 15:49:25 -04008087void StateCache::onVertexArrayBindingChange(Context *context)
8088{
8089 updateActiveAttribsMask(context);
8090 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008091 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008092}
8093
8094void StateCache::onProgramExecutableChange(Context *context)
8095{
8096 updateActiveAttribsMask(context);
8097 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008098 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008099 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008100}
8101
Jamie Madilld84b6732018-09-06 15:54:35 -04008102void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008103{
8104 updateVertexElementLimits(context);
8105}
8106
Jamie Madilld84b6732018-09-06 15:54:35 -04008107void StateCache::onVertexArrayBufferContentsChange(Context *context)
8108{
8109 updateVertexElementLimits(context);
8110 updateBasicDrawStatesError();
8111}
8112
Jamie Madillc43cdad2018-08-08 15:49:25 -04008113void StateCache::onVertexArrayStateChange(Context *context)
8114{
8115 updateActiveAttribsMask(context);
8116 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008117 updateBasicDrawStatesError();
8118}
8119
8120void StateCache::onVertexArrayBufferStateChange(Context *context)
8121{
8122 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008123}
8124
8125void StateCache::onGLES1ClientStateChange(Context *context)
8126{
8127 updateActiveAttribsMask(context);
8128}
Jamie Madilld84b6732018-09-06 15:54:35 -04008129
8130void StateCache::onDrawFramebufferChange(Context *context)
8131{
8132 updateBasicDrawStatesError();
8133}
8134
8135void StateCache::onContextCapChange(Context *context)
8136{
8137 updateBasicDrawStatesError();
8138}
8139
8140void StateCache::onStencilStateChange(Context *context)
8141{
8142 updateBasicDrawStatesError();
8143}
8144
8145void StateCache::onDefaultVertexAttributeChange(Context *context)
8146{
8147 updateBasicDrawStatesError();
8148}
8149
8150void StateCache::onActiveTextureChange(Context *context)
8151{
8152 updateBasicDrawStatesError();
8153}
8154
8155void StateCache::onQueryChange(Context *context)
8156{
8157 updateBasicDrawStatesError();
8158}
8159
8160void StateCache::onTransformFeedbackChange(Context *context)
8161{
8162 updateBasicDrawStatesError();
8163}
8164
8165void StateCache::onUniformBufferStateChange(Context *context)
8166{
8167 updateBasicDrawStatesError();
8168}
8169
8170void StateCache::onBufferBindingChange(Context *context)
8171{
8172 updateBasicDrawStatesError();
8173}
Jamie Madill526a6f62018-09-12 11:03:05 -04008174
8175void StateCache::updateValidDrawModes(Context *context)
8176{
8177 Program *program = context->getGLState().getProgram();
8178 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8179 {
8180 mCachedValidDrawModes = {{
8181 true, /* Points */
8182 true, /* Lines */
8183 true, /* LineLoop */
8184 true, /* LineStrip */
8185 true, /* Triangles */
8186 true, /* TriangleStrip */
8187 true, /* TriangleFan */
8188 false, /* LinesAdjacency */
8189 false, /* LineStripAdjacency */
8190 false, /* TrianglesAdjacency */
8191 false, /* TriangleStripAdjacency */
8192 false, /* InvalidEnum */
8193 }};
8194 }
8195 else
8196 {
8197 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8198
8199 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8200
8201 mCachedValidDrawModes = {{
8202 gsMode == PrimitiveMode::Points, /* Points */
8203 gsMode == PrimitiveMode::Lines, /* Lines */
8204 gsMode == PrimitiveMode::Lines, /* LineLoop */
8205 gsMode == PrimitiveMode::Lines, /* LineStrip */
8206 gsMode == PrimitiveMode::Triangles, /* Triangles */
8207 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8208 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8209 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8210 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8211 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8212 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8213 false, /* InvalidEnum */
8214 }};
8215 }
8216}
Jamie Madillc29968b2016-01-20 11:17:23 -05008217} // namespace gl