blob: 098b4c8b1289faaf1e4a6164185c4dcbb4c1fe0f [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 Madill956ab4d2018-10-10 16:13:03 -0400138ANGLE_INLINE void MarkTransformFeedbackBufferUsage(const gl::Context *context,
139 gl::TransformFeedback *transformFeedback,
140 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),
Geoff Lang3cacf692018-06-20 16:49:57 -0400339 mImplementation(implFactory->createContext(mState, config, shareContext, attribs)),
Geoff Lang75359662018-04-11 01:42:27 -0400340 mLabel(nullptr),
Jamie Madill2f348d22017-06-05 10:50:59 -0400341 mCompiler(),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400342 mGLState(GetDebug(attribs),
343 GetBindGeneratesResource(attribs),
344 GetClientArraysEnabled(attribs),
345 GetRobustResourceInit(attribs),
346 memoryProgramCache != nullptr),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400347 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500348 mClientType(EGL_OPENGL_ES_API),
Jamie Madill6b873dd2018-07-12 23:56:30 -0400349 mErrors(this),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500350 mHasBeenCurrent(false),
351 mContextLost(false),
352 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700353 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500354 mResetStrategy(GetResetStrategy(attribs)),
355 mRobustAccess(GetRobustAccess(attribs)),
Geoff Lang33f11fb2018-05-07 13:42:47 -0400356 mSurfacelessSupported(displayExtensions.surfacelessContext),
357 mExplicitContextAvailable(clientExtensions.explicitContext),
Jamie Madill61e16b42017-06-19 11:13:23 -0400358 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
359 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madille14951e2017-03-09 18:55:16 -0500360 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400361 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400362 mMemoryProgramCache(memoryProgramCache),
Jamie Madilla11819d2018-07-30 10:26:01 -0400363 mVertexArrayObserverBinding(this, kVertexArraySubjectIndex),
364 mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex),
365 mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400366 mScratchBuffer(1000u),
jchen107ae70d82018-07-06 13:47:01 +0800367 mZeroFilledBuffer(1000u),
368 mThreadPool(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000369{
Jamie Madill6d32cef2018-08-14 02:34:28 -0400370 for (angle::SubjectIndex uboIndex = kUniformBuffer0SubjectIndex;
371 uboIndex < kUniformBufferMaxSubjectIndex; ++uboIndex)
372 {
373 mUniformBufferObserverBindings.emplace_back(this, uboIndex);
374 }
Jamie Madille25b8002018-09-20 13:39:49 -0400375
376 for (angle::SubjectIndex samplerIndex = kSampler0SubjectIndex;
377 samplerIndex < kSamplerMaxSubjectIndex; ++samplerIndex)
378 {
379 mSamplerObserverBindings.emplace_back(this, samplerIndex);
380 }
Geoff Lang33f11fb2018-05-07 13:42:47 -0400381}
Jamie Madill5b772312018-03-08 20:28:32 -0500382
Geoff Lang33f11fb2018-05-07 13:42:47 -0400383void Context::initialize()
384{
385 mImplementation->setMemoryProgramCache(mMemoryProgramCache);
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400386
Geoff Lang33f11fb2018-05-07 13:42:47 -0400387 initCaps();
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700388 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400389
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400390 mGLState.initialize(this);
Régis Fénéon83107972015-02-05 12:57:44 +0100391
Shannon Woods53a94a82014-06-24 15:20:36 -0400392 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400393
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000394 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400395 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000396 // and cube map texture state vectors respectively associated with them.
397 // In order that access to these initial textures not be lost, they are treated as texture
398 // objects all of whose names are 0.
399
Corentin Wallez99d492c2018-02-27 15:17:10 -0500400 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800401 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500402
Corentin Wallez99d492c2018-02-27 15:17:10 -0500403 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800404 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400405
Geoff Langeb66a6e2016-10-31 13:06:12 -0400406 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400407 {
408 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500409 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800410 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400411
Corentin Wallez99d492c2018-02-27 15:17:10 -0500412 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800413 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400414 }
Yizhou Jiang7818a852018-09-06 15:02:04 +0800415 if (getClientVersion() >= Version(3, 1) || mSupportedExtensions.textureMultisample)
Geoff Lang3b573612016-10-31 14:08:10 -0400416 {
417 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500418 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800419 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Yizhou Jiang7818a852018-09-06 15:02:04 +0800420 }
421 if (getClientVersion() >= Version(3, 1))
422 {
Olli Etuahod310a432018-08-24 15:40:23 +0300423 Texture *zeroTexture2DMultisampleArray =
424 new Texture(mImplementation.get(), 0, TextureType::_2DMultisampleArray);
425 mZeroTextures[TextureType::_2DMultisampleArray].set(this, zeroTexture2DMultisampleArray);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800426
Jiajia Qin6eafb042016-12-27 17:04:07 +0800427 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
428 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800429 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800430 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800431
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800432 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
433 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400434 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800435 }
Geoff Lang3b573612016-10-31 14:08:10 -0400436 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000437
Geoff Langb0f917f2017-12-05 13:41:54 -0500438 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400439 {
440 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500441 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800442 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400443 }
444
Geoff Langb0f917f2017-12-05 13:41:54 -0500445 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400446 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500447 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800448 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400449 }
450
Jamie Madill4928b7c2017-06-20 12:57:39 -0400451 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500452
Jamie Madill57a89722013-07-02 11:57:03 -0400453 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000454
Geoff Langeb66a6e2016-10-31 13:06:12 -0400455 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400456 {
457 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
458 // In the initial state, a default transform feedback object is bound and treated as
459 // a transform feedback object with a name of zero. That object is bound any time
460 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400461 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400462 }
Geoff Langc8058452014-02-03 12:04:11 -0500463
Corentin Wallez336129f2017-10-17 15:55:40 -0400464 for (auto type : angle::AllEnums<BufferBinding>())
465 {
466 bindBuffer(type, 0);
467 }
468
469 bindRenderbuffer(GL_RENDERBUFFER, 0);
470
471 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
472 {
473 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
474 }
475
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700476 // Initialize GLES1 renderer if appropriate.
477 if (getClientVersion() < Version(2, 0))
478 {
479 mGLES1Renderer.reset(new GLES1Renderer());
480 }
481
Jamie Madillad9f24e2016-02-12 09:27:24 -0500482 // Initialize dirty bit masks
Jamie Madill9d0bb3d2018-10-09 20:29:13 -0400483 mAllDirtyBits.set();
484
Geoff Lang9bf86f02018-07-26 11:46:34 -0400485 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
486 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
487 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400488 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400489 mDrawDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400490
491 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
492 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
493 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madille25b8002018-09-20 13:39:49 -0400494 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400495
Jamie Madillc67323a2017-11-02 23:11:41 -0400496 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500497 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500498 // No dirty objects.
499
500 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400501 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500502 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400503 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500504 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
505
506 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
507 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
508 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
509 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
510 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
511 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
512 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
513 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
514 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
515 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
516 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400517 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500518 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
519
520 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
521 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700522 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400523 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
524 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500525 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
526 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400527
Xinghua Cao10a4d432017-11-28 14:46:26 +0800528 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
jchen1099118c12018-09-10 16:28:51 +0800529 mComputeDirtyBits.set(State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
530 mComputeDirtyBits.set(State::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800531 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
532 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
533 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
534 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
jchen1099118c12018-09-10 16:28:51 +0800535 mComputeDirtyBits.set(State::DIRTY_BIT_IMAGE_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800536 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800537 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400538 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400539 mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800540
Jamie Madillb4927eb2018-07-16 11:39:46 -0400541 mImplementation->setErrorSet(&mErrors);
542
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400543 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000544}
545
Jamie Madill4928b7c2017-06-20 12:57:39 -0400546egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000547{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700548 if (mGLES1Renderer)
549 {
550 mGLES1Renderer->onDestroy(this, &mGLState);
551 }
552
Jamie Madille7b3fe22018-04-05 09:42:46 -0400553 // Delete the Surface first to trigger a finish() in Vulkan.
Jamie Madille7b3fe22018-04-05 09:42:46 -0400554 ANGLE_TRY(releaseSurface(display));
555
Corentin Wallez80b24112015-08-25 16:41:57 -0400556 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000557 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400558 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000559 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400560 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000561
Corentin Wallez80b24112015-08-25 16:41:57 -0400562 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000563 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400564 if (query.second != nullptr)
565 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400566 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400567 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000568 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400569 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000570
Corentin Wallez80b24112015-08-25 16:41:57 -0400571 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400572 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400573 if (vertexArray.second)
574 {
575 vertexArray.second->onDestroy(this);
576 }
Jamie Madill57a89722013-07-02 11:57:03 -0400577 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400578 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400579
Corentin Wallez80b24112015-08-25 16:41:57 -0400580 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500581 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500582 if (transformFeedback.second != nullptr)
583 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500584 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500585 }
Geoff Langc8058452014-02-03 12:04:11 -0500586 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400587 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500588
Jamie Madill5b772312018-03-08 20:28:32 -0500589 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400590 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800591 if (zeroTexture.get() != nullptr)
592 {
Jamie Madill1c7f08c2018-10-10 16:13:02 -0400593 zeroTexture->onDestroy(this);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800594 zeroTexture.set(this, nullptr);
595 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400596 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000597
Jamie Madill2f348d22017-06-05 10:50:59 -0400598 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500599
Jamie Madill4928b7c2017-06-20 12:57:39 -0400600 mGLState.reset(this);
601
Jamie Madill6c1f6712017-02-14 19:08:04 -0500602 mState.mBuffers->release(this);
603 mState.mShaderPrograms->release(this);
604 mState.mTextures->release(this);
605 mState.mRenderbuffers->release(this);
606 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400607 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500608 mState.mPaths->release(this);
609 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800610 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400611
jchen107ae70d82018-07-06 13:47:01 +0800612 mThreadPool.reset();
613
Jamie Madill76e471e2017-10-21 09:56:01 -0400614 mImplementation->onDestroy(this);
615
Jamie Madill4928b7c2017-06-20 12:57:39 -0400616 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000617}
618
Jamie Madill70ee0f62017-02-06 16:04:20 -0500619Context::~Context()
620{
621}
622
Geoff Lang75359662018-04-11 01:42:27 -0400623void Context::setLabel(EGLLabelKHR label)
624{
625 mLabel = label;
626}
627
628EGLLabelKHR Context::getLabel() const
629{
630 return mLabel;
631}
632
Jamie Madill4928b7c2017-06-20 12:57:39 -0400633egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000634{
Jamie Madill61e16b42017-06-19 11:13:23 -0400635 mCurrentDisplay = display;
636
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000637 if (!mHasBeenCurrent)
638 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400639 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000640 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500641 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400642 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000643
Corentin Wallezc295e512017-01-27 17:47:50 -0500644 int width = 0;
645 int height = 0;
646 if (surface != nullptr)
647 {
648 width = surface->getWidth();
649 height = surface->getHeight();
650 }
651
652 mGLState.setViewportParams(0, 0, width, height);
653 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000654
655 mHasBeenCurrent = true;
656 }
657
Jamie Madill1b94d432015-08-07 13:23:23 -0400658 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700659 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400660 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400661
Jamie Madill4928b7c2017-06-20 12:57:39 -0400662 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500663
664 Framebuffer *newDefault = nullptr;
665 if (surface != nullptr)
666 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400667 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500668 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400669 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500670 }
671 else
672 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400673 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500674 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000675
Corentin Wallez37c39792015-08-20 14:19:46 -0400676 // Update default framebuffer, the binding of the previous default
677 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400678 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400679 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700680 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400681 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400682 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400683 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700684 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400685 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400686 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400687 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400688 }
Ian Ewell292f0052016-02-04 10:37:32 -0500689
Jamie Madill32643ce2018-10-19 11:38:03 -0400690 // Notify the renderer of a context switch.
691 // TODO(jmadill): Fix this error handling. http://anglebug.com/2491
692 (void)(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400693 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000694}
695
Jamie Madill4928b7c2017-06-20 12:57:39 -0400696egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400697{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400698 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400699
Geoff Langbf7b95d2018-05-01 16:48:21 -0400700 // Remove the default framebuffer
701 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500702 {
703 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400704 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500705 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400706
707 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500708 {
709 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400710 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500711 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400712
713 if (defaultFramebuffer)
714 {
715 defaultFramebuffer->onDestroy(this);
716 delete defaultFramebuffer;
717 }
718
Corentin Wallezc295e512017-01-27 17:47:50 -0500719 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
720
721 if (mCurrentSurface)
722 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400723 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500724 mCurrentSurface = nullptr;
725 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400726
727 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400728}
729
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000730GLuint Context::createBuffer()
731{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500732 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000733}
734
735GLuint Context::createProgram()
736{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500737 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000738}
739
Jiawei Shao385b3e02018-03-21 09:43:28 +0800740GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000741{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500742 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000743}
744
745GLuint Context::createTexture()
746{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500747 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000748}
749
750GLuint Context::createRenderbuffer()
751{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500752 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000753}
754
Jamie Madill13951342018-09-30 15:24:28 -0400755void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
756{
757 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(mImplementation.get(), range, createdOut));
758}
759
Brandon Jones59770802018-04-02 13:18:42 -0700760GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300761{
Jamie Madill13951342018-09-30 15:24:28 -0400762 GLuint created = 0;
763 tryGenPaths(range, &created);
764 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300765}
766
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000767// Returns an unused framebuffer name
768GLuint Context::createFramebuffer()
769{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500770 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000771}
772
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500773void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000774{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500775 for (int i = 0; i < n; i++)
776 {
777 GLuint handle = mFenceNVHandleAllocator.allocate();
778 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
779 fences[i] = handle;
780 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000781}
782
Yunchao Hea336b902017-08-02 16:05:21 +0800783GLuint Context::createProgramPipeline()
784{
785 return mState.mPipelines->createProgramPipeline();
786}
787
Jiawei Shao385b3e02018-03-21 09:43:28 +0800788GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800789{
790 UNIMPLEMENTED();
791 return 0u;
792}
793
James Darpinian4d9d4832018-03-13 12:43:28 -0700794void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000795{
James Darpinian4d9d4832018-03-13 12:43:28 -0700796 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
797 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000798 {
799 detachBuffer(buffer);
800 }
Jamie Madill893ab082014-05-16 16:56:10 -0400801
James Darpinian4d9d4832018-03-13 12:43:28 -0700802 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000803}
804
805void Context::deleteShader(GLuint shader)
806{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500807 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000808}
809
810void Context::deleteProgram(GLuint program)
811{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500812 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000813}
814
815void Context::deleteTexture(GLuint texture)
816{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500817 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000818 {
819 detachTexture(texture);
820 }
821
Jamie Madill6c1f6712017-02-14 19:08:04 -0500822 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000823}
824
825void Context::deleteRenderbuffer(GLuint renderbuffer)
826{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500827 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000828 {
829 detachRenderbuffer(renderbuffer);
830 }
Jamie Madill893ab082014-05-16 16:56:10 -0400831
Jamie Madill6c1f6712017-02-14 19:08:04 -0500832 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000833}
834
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400835void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400836{
837 // The spec specifies the underlying Fence object is not deleted until all current
838 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
839 // and since our API is currently designed for being called from a single thread, we can delete
840 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400841 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400842}
843
Yunchao Hea336b902017-08-02 16:05:21 +0800844void Context::deleteProgramPipeline(GLuint pipeline)
845{
846 if (mState.mPipelines->getProgramPipeline(pipeline))
847 {
848 detachProgramPipeline(pipeline);
849 }
850
851 mState.mPipelines->deleteObject(this, pipeline);
852}
853
Sami Väisänene45e53b2016-05-25 10:36:04 +0300854void Context::deletePaths(GLuint first, GLsizei range)
855{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500856 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300857}
858
Brandon Jones59770802018-04-02 13:18:42 -0700859bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300860{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500861 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300862 if (pathObj == nullptr)
863 return false;
864
865 return pathObj->hasPathData();
866}
867
Brandon Jones59770802018-04-02 13:18:42 -0700868bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300869{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500870 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300871}
872
Brandon Jones59770802018-04-02 13:18:42 -0700873void Context::pathCommands(GLuint path,
874 GLsizei numCommands,
875 const GLubyte *commands,
876 GLsizei numCoords,
877 GLenum coordType,
878 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300879{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500880 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300881
882 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
883}
884
Jamie Madill007530e2017-12-28 14:27:04 -0500885void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300886{
Jamie Madill007530e2017-12-28 14:27:04 -0500887 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300888
889 switch (pname)
890 {
891 case GL_PATH_STROKE_WIDTH_CHROMIUM:
892 pathObj->setStrokeWidth(value);
893 break;
894 case GL_PATH_END_CAPS_CHROMIUM:
895 pathObj->setEndCaps(static_cast<GLenum>(value));
896 break;
897 case GL_PATH_JOIN_STYLE_CHROMIUM:
898 pathObj->setJoinStyle(static_cast<GLenum>(value));
899 break;
900 case GL_PATH_MITER_LIMIT_CHROMIUM:
901 pathObj->setMiterLimit(value);
902 break;
903 case GL_PATH_STROKE_BOUND_CHROMIUM:
904 pathObj->setStrokeBound(value);
905 break;
906 default:
907 UNREACHABLE();
908 break;
909 }
910}
911
Jamie Madill007530e2017-12-28 14:27:04 -0500912void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300913{
Jamie Madill007530e2017-12-28 14:27:04 -0500914 // TODO(jmadill): Should use proper clamping/casting.
915 pathParameterf(path, pname, static_cast<GLfloat>(value));
916}
917
918void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
919{
920 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300921
922 switch (pname)
923 {
924 case GL_PATH_STROKE_WIDTH_CHROMIUM:
925 *value = pathObj->getStrokeWidth();
926 break;
927 case GL_PATH_END_CAPS_CHROMIUM:
928 *value = static_cast<GLfloat>(pathObj->getEndCaps());
929 break;
930 case GL_PATH_JOIN_STYLE_CHROMIUM:
931 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
932 break;
933 case GL_PATH_MITER_LIMIT_CHROMIUM:
934 *value = pathObj->getMiterLimit();
935 break;
936 case GL_PATH_STROKE_BOUND_CHROMIUM:
937 *value = pathObj->getStrokeBound();
938 break;
939 default:
940 UNREACHABLE();
941 break;
942 }
943}
944
Jamie Madill007530e2017-12-28 14:27:04 -0500945void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
946{
947 GLfloat val = 0.0f;
948 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
949 if (value)
950 *value = static_cast<GLint>(val);
951}
952
Brandon Jones59770802018-04-02 13:18:42 -0700953void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300954{
955 mGLState.setPathStencilFunc(func, ref, mask);
956}
957
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000958void Context::deleteFramebuffer(GLuint framebuffer)
959{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500960 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000961 {
962 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000963 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500964
Jamie Madill6c1f6712017-02-14 19:08:04 -0500965 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000966}
967
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500968void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000969{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500970 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000971 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500972 GLuint fence = fences[i];
973
974 FenceNV *fenceObject = nullptr;
975 if (mFenceNVMap.erase(fence, &fenceObject))
976 {
977 mFenceNVHandleAllocator.release(fence);
978 delete fenceObject;
979 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000980 }
981}
982
Geoff Lang70d0f492015-12-10 17:45:46 -0500983Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000984{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500985 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000986}
987
Geoff Lang70d0f492015-12-10 17:45:46 -0500988Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000989{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500990 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000991}
992
Jamie Madill70b5bb02017-08-28 13:32:37 -0400993Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400994{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400995 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400996}
997
Jamie Madill57a89722013-07-02 11:57:03 -0400998VertexArray *Context::getVertexArray(GLuint handle) const
999{
Jamie Madill96a483b2017-06-27 16:49:21 -04001000 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -04001001}
1002
Jamie Madilldc356042013-07-19 16:36:57 -04001003Sampler *Context::getSampler(GLuint handle) const
1004{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001005 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -04001006}
1007
Geoff Langc8058452014-02-03 12:04:11 -05001008TransformFeedback *Context::getTransformFeedback(GLuint handle) const
1009{
Jamie Madill96a483b2017-06-27 16:49:21 -04001010 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -05001011}
1012
Yunchao Hea336b902017-08-02 16:05:21 +08001013ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
1014{
1015 return mState.mPipelines->getProgramPipeline(handle);
1016}
1017
Geoff Lang75359662018-04-11 01:42:27 -04001018gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001019{
1020 switch (identifier)
1021 {
1022 case GL_BUFFER:
1023 return getBuffer(name);
1024 case GL_SHADER:
1025 return getShader(name);
1026 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04001027 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -05001028 case GL_VERTEX_ARRAY:
1029 return getVertexArray(name);
1030 case GL_QUERY:
1031 return getQuery(name);
1032 case GL_TRANSFORM_FEEDBACK:
1033 return getTransformFeedback(name);
1034 case GL_SAMPLER:
1035 return getSampler(name);
1036 case GL_TEXTURE:
1037 return getTexture(name);
1038 case GL_RENDERBUFFER:
1039 return getRenderbuffer(name);
1040 case GL_FRAMEBUFFER:
1041 return getFramebuffer(name);
1042 default:
1043 UNREACHABLE();
1044 return nullptr;
1045 }
1046}
1047
Geoff Lang75359662018-04-11 01:42:27 -04001048gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001049{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001050 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001051}
1052
Martin Radev9d901792016-07-15 15:58:58 +03001053void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1054{
Geoff Lang75359662018-04-11 01:42:27 -04001055 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001056 ASSERT(object != nullptr);
1057
1058 std::string labelName = GetObjectLabelFromPointer(length, label);
1059 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001060
1061 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1062 // specified object is active until we do this.
1063 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001064}
1065
1066void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1067{
Geoff Lang75359662018-04-11 01:42:27 -04001068 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001069 ASSERT(object != nullptr);
1070
1071 std::string labelName = GetObjectLabelFromPointer(length, label);
1072 object->setLabel(labelName);
1073}
1074
1075void Context::getObjectLabel(GLenum identifier,
1076 GLuint name,
1077 GLsizei bufSize,
1078 GLsizei *length,
1079 GLchar *label) const
1080{
Geoff Lang75359662018-04-11 01:42:27 -04001081 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001082 ASSERT(object != nullptr);
1083
1084 const std::string &objectLabel = object->getLabel();
1085 GetObjectLabelBase(objectLabel, bufSize, length, label);
1086}
1087
1088void Context::getObjectPtrLabel(const void *ptr,
1089 GLsizei bufSize,
1090 GLsizei *length,
1091 GLchar *label) const
1092{
Geoff Lang75359662018-04-11 01:42:27 -04001093 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001094 ASSERT(object != nullptr);
1095
1096 const std::string &objectLabel = object->getLabel();
1097 GetObjectLabelBase(objectLabel, bufSize, length, label);
1098}
1099
Jamie Madilldc356042013-07-19 16:36:57 -04001100bool Context::isSampler(GLuint samplerName) const
1101{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001102 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001103}
1104
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001105void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001106{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001107 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001108
Jamie Madilldedd7b92014-11-05 16:30:36 -05001109 if (handle == 0)
1110 {
1111 texture = mZeroTextures[target].get();
1112 }
1113 else
1114 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001115 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001116 }
1117
1118 ASSERT(texture);
Jamie Madill14246812018-10-03 17:51:16 -04001119 ANGLE_CONTEXT_TRY(mGLState.setSamplerTexture(this, target, texture));
Jamie Madilld84b6732018-09-06 15:54:35 -04001120 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001121}
1122
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001123void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001124{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001125 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1126 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001127 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001128 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001129}
1130
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001131void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001132{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001133 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1134 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001135 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001136 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001137 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001138}
1139
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001140void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001141{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001142 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001143 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001144 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001145 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001146}
1147
Shao80957d92017-02-20 21:25:59 +08001148void Context::bindVertexBuffer(GLuint bindingIndex,
1149 GLuint bufferHandle,
1150 GLintptr offset,
1151 GLsizei stride)
1152{
1153 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001154 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001155 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001156}
1157
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001158void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001159{
Geoff Lang76b10c92014-09-05 16:28:14 -04001160 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001161 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001162 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001163 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001164 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001165}
1166
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001167void Context::bindImageTexture(GLuint unit,
1168 GLuint texture,
1169 GLint level,
1170 GLboolean layered,
1171 GLint layer,
1172 GLenum access,
1173 GLenum format)
1174{
1175 Texture *tex = mState.mTextures->getTexture(texture);
1176 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1177}
1178
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001179void Context::useProgram(GLuint program)
1180{
Jamie Madille3bb6b72018-10-03 17:51:15 -04001181 ANGLE_CONTEXT_TRY(mGLState.setProgram(this, getProgramResolveLink(program)));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001182 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001183}
1184
Jiajia Qin5451d532017-11-16 17:16:34 +08001185void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1186{
1187 UNIMPLEMENTED();
1188}
1189
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001190void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001191{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001192 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001193 TransformFeedback *transformFeedback =
1194 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001195 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Jamie Madilld84b6732018-09-06 15:54:35 -04001196 mStateCache.onTransformFeedbackChange(this);
Geoff Langc8058452014-02-03 12:04:11 -05001197}
1198
Yunchao Hea336b902017-08-02 16:05:21 +08001199void Context::bindProgramPipeline(GLuint pipelineHandle)
1200{
1201 ProgramPipeline *pipeline =
1202 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1203 mGLState.setProgramPipelineBinding(this, pipeline);
1204}
1205
Corentin Wallezad3ae902018-03-09 13:40:42 -05001206void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001207{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001208 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001209 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001210
Geoff Lang5aad9672014-09-08 11:10:42 -04001211 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001212 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001213
1214 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001215 mGLState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001216 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001217}
1218
Corentin Wallezad3ae902018-03-09 13:40:42 -05001219void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001220{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001221 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001222 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001223
Jamie Madill5188a272018-07-25 10:53:56 -04001224 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001225
Geoff Lang5aad9672014-09-08 11:10:42 -04001226 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001227 mGLState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001228 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001229}
1230
Corentin Wallezad3ae902018-03-09 13:40:42 -05001231void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001232{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001233 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001234
1235 Query *queryObject = getQuery(id, true, target);
1236 ASSERT(queryObject);
1237
Jamie Madill5188a272018-07-25 10:53:56 -04001238 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001239}
1240
Corentin Wallezad3ae902018-03-09 13:40:42 -05001241void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001242{
1243 switch (pname)
1244 {
1245 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001246 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001247 break;
1248 case GL_QUERY_COUNTER_BITS_EXT:
1249 switch (target)
1250 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001251 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001252 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1253 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001254 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001255 params[0] = getExtensions().queryCounterBitsTimestamp;
1256 break;
1257 default:
1258 UNREACHABLE();
1259 params[0] = 0;
1260 break;
1261 }
1262 break;
1263 default:
1264 UNREACHABLE();
1265 return;
1266 }
1267}
1268
Corentin Wallezad3ae902018-03-09 13:40:42 -05001269void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001270 GLenum pname,
1271 GLsizei bufSize,
1272 GLsizei *length,
1273 GLint *params)
1274{
1275 getQueryiv(target, pname, params);
1276}
1277
Geoff Lang2186c382016-10-14 10:54:54 -04001278void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001279{
Jamie Madill5188a272018-07-25 10:53:56 -04001280 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001281}
1282
Brandon Jones59770802018-04-02 13:18:42 -07001283void Context::getQueryObjectivRobust(GLuint id,
1284 GLenum pname,
1285 GLsizei bufSize,
1286 GLsizei *length,
1287 GLint *params)
1288{
1289 getQueryObjectiv(id, pname, params);
1290}
1291
Geoff Lang2186c382016-10-14 10:54:54 -04001292void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001293{
Jamie Madill5188a272018-07-25 10:53:56 -04001294 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001295}
1296
Brandon Jones59770802018-04-02 13:18:42 -07001297void Context::getQueryObjectuivRobust(GLuint id,
1298 GLenum pname,
1299 GLsizei bufSize,
1300 GLsizei *length,
1301 GLuint *params)
1302{
1303 getQueryObjectuiv(id, pname, params);
1304}
1305
Geoff Lang2186c382016-10-14 10:54:54 -04001306void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001307{
Jamie Madill5188a272018-07-25 10:53:56 -04001308 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001309}
1310
Brandon Jones59770802018-04-02 13:18:42 -07001311void Context::getQueryObjecti64vRobust(GLuint id,
1312 GLenum pname,
1313 GLsizei bufSize,
1314 GLsizei *length,
1315 GLint64 *params)
1316{
1317 getQueryObjecti64v(id, pname, params);
1318}
1319
Geoff Lang2186c382016-10-14 10:54:54 -04001320void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001321{
Jamie Madill5188a272018-07-25 10:53:56 -04001322 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001323}
1324
Brandon Jones59770802018-04-02 13:18:42 -07001325void Context::getQueryObjectui64vRobust(GLuint id,
1326 GLenum pname,
1327 GLsizei bufSize,
1328 GLsizei *length,
1329 GLuint64 *params)
1330{
1331 getQueryObjectui64v(id, pname, params);
1332}
1333
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001334Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001335{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001336 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001337}
1338
Jamie Madill2f348d22017-06-05 10:50:59 -04001339FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001340{
Jamie Madill96a483b2017-06-27 16:49:21 -04001341 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001342}
1343
Corentin Wallezad3ae902018-03-09 13:40:42 -05001344Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001345{
Jamie Madill96a483b2017-06-27 16:49:21 -04001346 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001347 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001348 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001349 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001350
1351 Query *query = mQueryMap.query(handle);
1352 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001353 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001354 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001355 query = new Query(mImplementation->createQuery(type), handle);
1356 query->addRef();
1357 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001358 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001359 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001360}
1361
Geoff Lang70d0f492015-12-10 17:45:46 -05001362Query *Context::getQuery(GLuint handle) const
1363{
Jamie Madill96a483b2017-06-27 16:49:21 -04001364 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001365}
1366
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001367Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001368{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001369 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1370 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001371}
1372
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001373Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001374{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001375 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001376}
1377
Geoff Lang492a7e42014-11-05 13:27:06 -05001378Compiler *Context::getCompiler() const
1379{
Jamie Madill2f348d22017-06-05 10:50:59 -04001380 if (mCompiler.get() == nullptr)
1381 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001382 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001383 }
1384 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001385}
1386
Jamie Madillc1d770e2017-04-13 17:31:24 -04001387void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001388{
1389 switch (pname)
1390 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001391 case GL_SHADER_COMPILER:
1392 *params = GL_TRUE;
1393 break;
1394 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1395 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1396 break;
1397 default:
1398 mGLState.getBooleanv(pname, params);
1399 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001400 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001401}
1402
Jamie Madillc1d770e2017-04-13 17:31:24 -04001403void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001404{
Shannon Woods53a94a82014-06-24 15:20:36 -04001405 // Queries about context capabilities and maximums are answered by Context.
1406 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001407 switch (pname)
1408 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001409 case GL_ALIASED_LINE_WIDTH_RANGE:
1410 params[0] = mCaps.minAliasedLineWidth;
1411 params[1] = mCaps.maxAliasedLineWidth;
1412 break;
1413 case GL_ALIASED_POINT_SIZE_RANGE:
1414 params[0] = mCaps.minAliasedPointSize;
1415 params[1] = mCaps.maxAliasedPointSize;
1416 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001417 case GL_SMOOTH_POINT_SIZE_RANGE:
1418 params[0] = mCaps.minSmoothPointSize;
1419 params[1] = mCaps.maxSmoothPointSize;
1420 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001421 case GL_SMOOTH_LINE_WIDTH_RANGE:
1422 params[0] = mCaps.minSmoothLineWidth;
1423 params[1] = mCaps.maxSmoothLineWidth;
1424 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001425 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1426 ASSERT(mExtensions.textureFilterAnisotropic);
1427 *params = mExtensions.maxTextureAnisotropy;
1428 break;
1429 case GL_MAX_TEXTURE_LOD_BIAS:
1430 *params = mCaps.maxLODBias;
1431 break;
1432
1433 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1434 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1435 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001436 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1437 // GLES1 constants for modelview/projection matrix.
1438 if (getClientVersion() < Version(2, 0))
1439 {
1440 mGLState.getFloatv(pname, params);
1441 }
1442 else
1443 {
1444 ASSERT(mExtensions.pathRendering);
1445 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1446 memcpy(params, m, 16 * sizeof(GLfloat));
1447 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001448 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001449 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001450
Jamie Madill231c7f52017-04-26 13:45:37 -04001451 default:
1452 mGLState.getFloatv(pname, params);
1453 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001454 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001455}
1456
Jamie Madillc1d770e2017-04-13 17:31:24 -04001457void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001458{
Shannon Woods53a94a82014-06-24 15:20:36 -04001459 // Queries about context capabilities and maximums are answered by Context.
1460 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001461
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001462 switch (pname)
1463 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001464 case GL_MAX_VERTEX_ATTRIBS:
1465 *params = mCaps.maxVertexAttributes;
1466 break;
1467 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1468 *params = mCaps.maxVertexUniformVectors;
1469 break;
1470 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001471 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001472 break;
1473 case GL_MAX_VARYING_VECTORS:
1474 *params = mCaps.maxVaryingVectors;
1475 break;
1476 case GL_MAX_VARYING_COMPONENTS:
1477 *params = mCaps.maxVertexOutputComponents;
1478 break;
1479 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1480 *params = mCaps.maxCombinedTextureImageUnits;
1481 break;
1482 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001483 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001484 break;
1485 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001486 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001487 break;
1488 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1489 *params = mCaps.maxFragmentUniformVectors;
1490 break;
1491 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001492 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001493 break;
1494 case GL_MAX_RENDERBUFFER_SIZE:
1495 *params = mCaps.maxRenderbufferSize;
1496 break;
1497 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1498 *params = mCaps.maxColorAttachments;
1499 break;
1500 case GL_MAX_DRAW_BUFFERS_EXT:
1501 *params = mCaps.maxDrawBuffers;
1502 break;
1503 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1504 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1505 case GL_SUBPIXEL_BITS:
1506 *params = 4;
1507 break;
1508 case GL_MAX_TEXTURE_SIZE:
1509 *params = mCaps.max2DTextureSize;
1510 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001511 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1512 *params = mCaps.maxRectangleTextureSize;
1513 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001514 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1515 *params = mCaps.maxCubeMapTextureSize;
1516 break;
1517 case GL_MAX_3D_TEXTURE_SIZE:
1518 *params = mCaps.max3DTextureSize;
1519 break;
1520 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1521 *params = mCaps.maxArrayTextureLayers;
1522 break;
1523 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1524 *params = mCaps.uniformBufferOffsetAlignment;
1525 break;
1526 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1527 *params = mCaps.maxUniformBufferBindings;
1528 break;
1529 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001530 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001531 break;
1532 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001533 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001534 break;
1535 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1536 *params = mCaps.maxCombinedTextureImageUnits;
1537 break;
1538 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1539 *params = mCaps.maxVertexOutputComponents;
1540 break;
1541 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1542 *params = mCaps.maxFragmentInputComponents;
1543 break;
1544 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1545 *params = mCaps.minProgramTexelOffset;
1546 break;
1547 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1548 *params = mCaps.maxProgramTexelOffset;
1549 break;
1550 case GL_MAJOR_VERSION:
1551 *params = getClientVersion().major;
1552 break;
1553 case GL_MINOR_VERSION:
1554 *params = getClientVersion().minor;
1555 break;
1556 case GL_MAX_ELEMENTS_INDICES:
1557 *params = mCaps.maxElementsIndices;
1558 break;
1559 case GL_MAX_ELEMENTS_VERTICES:
1560 *params = mCaps.maxElementsVertices;
1561 break;
1562 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1563 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1564 break;
1565 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1566 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1567 break;
1568 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1569 *params = mCaps.maxTransformFeedbackSeparateComponents;
1570 break;
1571 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1572 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1573 break;
1574 case GL_MAX_SAMPLES_ANGLE:
1575 *params = mCaps.maxSamples;
1576 break;
1577 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001578 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001579 params[0] = mCaps.maxViewportWidth;
1580 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001581 }
1582 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001583 case GL_COMPRESSED_TEXTURE_FORMATS:
1584 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1585 params);
1586 break;
1587 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1588 *params = mResetStrategy;
1589 break;
1590 case GL_NUM_SHADER_BINARY_FORMATS:
1591 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1592 break;
1593 case GL_SHADER_BINARY_FORMATS:
1594 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1595 break;
1596 case GL_NUM_PROGRAM_BINARY_FORMATS:
1597 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1598 break;
1599 case GL_PROGRAM_BINARY_FORMATS:
1600 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1601 break;
1602 case GL_NUM_EXTENSIONS:
1603 *params = static_cast<GLint>(mExtensionStrings.size());
1604 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001605
Geoff Lang38f24ee2018-10-01 13:04:59 -04001606 // GL_ANGLE_request_extension
1607 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1608 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1609 break;
1610
Jamie Madill231c7f52017-04-26 13:45:37 -04001611 // GL_KHR_debug
1612 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1613 *params = mExtensions.maxDebugMessageLength;
1614 break;
1615 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1616 *params = mExtensions.maxDebugLoggedMessages;
1617 break;
1618 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1619 *params = mExtensions.maxDebugGroupStackDepth;
1620 break;
1621 case GL_MAX_LABEL_LENGTH:
1622 *params = mExtensions.maxLabelLength;
1623 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001624
Martin Radeve5285d22017-07-14 16:23:53 +03001625 // GL_ANGLE_multiview
1626 case GL_MAX_VIEWS_ANGLE:
1627 *params = mExtensions.maxViews;
1628 break;
1629
Jamie Madill231c7f52017-04-26 13:45:37 -04001630 // GL_EXT_disjoint_timer_query
1631 case GL_GPU_DISJOINT_EXT:
1632 *params = mImplementation->getGPUDisjoint();
1633 break;
1634 case GL_MAX_FRAMEBUFFER_WIDTH:
1635 *params = mCaps.maxFramebufferWidth;
1636 break;
1637 case GL_MAX_FRAMEBUFFER_HEIGHT:
1638 *params = mCaps.maxFramebufferHeight;
1639 break;
1640 case GL_MAX_FRAMEBUFFER_SAMPLES:
1641 *params = mCaps.maxFramebufferSamples;
1642 break;
1643 case GL_MAX_SAMPLE_MASK_WORDS:
1644 *params = mCaps.maxSampleMaskWords;
1645 break;
1646 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1647 *params = mCaps.maxColorTextureSamples;
1648 break;
1649 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1650 *params = mCaps.maxDepthTextureSamples;
1651 break;
1652 case GL_MAX_INTEGER_SAMPLES:
1653 *params = mCaps.maxIntegerSamples;
1654 break;
1655 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1656 *params = mCaps.maxVertexAttribRelativeOffset;
1657 break;
1658 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1659 *params = mCaps.maxVertexAttribBindings;
1660 break;
1661 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1662 *params = mCaps.maxVertexAttribStride;
1663 break;
1664 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001665 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001666 break;
1667 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001668 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001669 break;
1670 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001671 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001672 break;
1673 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001674 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001675 break;
1676 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001677 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001678 break;
1679 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001680 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001681 break;
1682 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001683 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001684 break;
1685 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001686 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001687 break;
1688 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1689 *params = mCaps.minProgramTextureGatherOffset;
1690 break;
1691 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1692 *params = mCaps.maxProgramTextureGatherOffset;
1693 break;
1694 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1695 *params = mCaps.maxComputeWorkGroupInvocations;
1696 break;
1697 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001698 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001699 break;
1700 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001701 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001702 break;
1703 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1704 *params = mCaps.maxComputeSharedMemorySize;
1705 break;
1706 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001707 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001708 break;
1709 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001710 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001711 break;
1712 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001713 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001714 break;
1715 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001716 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001717 break;
1718 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001719 *params =
1720 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001721 break;
1722 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001723 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001724 break;
1725 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1726 *params = mCaps.maxCombinedShaderOutputResources;
1727 break;
1728 case GL_MAX_UNIFORM_LOCATIONS:
1729 *params = mCaps.maxUniformLocations;
1730 break;
1731 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1732 *params = mCaps.maxAtomicCounterBufferBindings;
1733 break;
1734 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1735 *params = mCaps.maxAtomicCounterBufferSize;
1736 break;
1737 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1738 *params = mCaps.maxCombinedAtomicCounterBuffers;
1739 break;
1740 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1741 *params = mCaps.maxCombinedAtomicCounters;
1742 break;
1743 case GL_MAX_IMAGE_UNITS:
1744 *params = mCaps.maxImageUnits;
1745 break;
1746 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1747 *params = mCaps.maxCombinedImageUniforms;
1748 break;
1749 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1750 *params = mCaps.maxShaderStorageBufferBindings;
1751 break;
1752 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1753 *params = mCaps.maxCombinedShaderStorageBlocks;
1754 break;
1755 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1756 *params = mCaps.shaderStorageBufferOffsetAlignment;
1757 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001758
1759 // GL_EXT_geometry_shader
1760 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1761 *params = mCaps.maxFramebufferLayers;
1762 break;
1763 case GL_LAYER_PROVOKING_VERTEX_EXT:
1764 *params = mCaps.layerProvokingVertex;
1765 break;
1766 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001767 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001768 break;
1769 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001770 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001771 break;
1772 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001773 *params =
1774 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001775 break;
1776 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1777 *params = mCaps.maxGeometryInputComponents;
1778 break;
1779 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1780 *params = mCaps.maxGeometryOutputComponents;
1781 break;
1782 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1783 *params = mCaps.maxGeometryOutputVertices;
1784 break;
1785 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1786 *params = mCaps.maxGeometryTotalOutputComponents;
1787 break;
1788 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1789 *params = mCaps.maxGeometryShaderInvocations;
1790 break;
1791 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001792 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001793 break;
1794 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001795 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001796 break;
1797 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001798 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001799 break;
1800 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001801 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001802 break;
1803 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001804 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001805 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001806 // GLES1 emulation: Caps queries
1807 case GL_MAX_TEXTURE_UNITS:
1808 *params = mCaps.maxMultitextureUnits;
1809 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001810 case GL_MAX_MODELVIEW_STACK_DEPTH:
1811 *params = mCaps.maxModelviewMatrixStackDepth;
1812 break;
1813 case GL_MAX_PROJECTION_STACK_DEPTH:
1814 *params = mCaps.maxProjectionMatrixStackDepth;
1815 break;
1816 case GL_MAX_TEXTURE_STACK_DEPTH:
1817 *params = mCaps.maxTextureMatrixStackDepth;
1818 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001819 case GL_MAX_LIGHTS:
1820 *params = mCaps.maxLights;
1821 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001822 case GL_MAX_CLIP_PLANES:
1823 *params = mCaps.maxClipPlanes;
1824 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001825 // GLES1 emulation: Vertex attribute queries
1826 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1827 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1828 case GL_COLOR_ARRAY_BUFFER_BINDING:
1829 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1830 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1831 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1832 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1833 break;
1834 case GL_VERTEX_ARRAY_STRIDE:
1835 case GL_NORMAL_ARRAY_STRIDE:
1836 case GL_COLOR_ARRAY_STRIDE:
1837 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1838 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1839 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1840 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1841 break;
1842 case GL_VERTEX_ARRAY_SIZE:
1843 case GL_COLOR_ARRAY_SIZE:
1844 case GL_TEXTURE_COORD_ARRAY_SIZE:
1845 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1846 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1847 break;
1848 case GL_VERTEX_ARRAY_TYPE:
1849 case GL_COLOR_ARRAY_TYPE:
1850 case GL_NORMAL_ARRAY_TYPE:
1851 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1852 case GL_TEXTURE_COORD_ARRAY_TYPE:
1853 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1854 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1855 break;
1856
jchen1082af6202018-06-22 10:59:52 +08001857 // GL_KHR_parallel_shader_compile
1858 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1859 *params = mGLState.getMaxShaderCompilerThreads();
1860 break;
1861
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001862 // GL_EXT_blend_func_extended
1863 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
1864 *params = mExtensions.maxDualSourceDrawBuffers;
1865 break;
1866
Jamie Madill231c7f52017-04-26 13:45:37 -04001867 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001868 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001869 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001870 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001871}
1872
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001873void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001874{
Shannon Woods53a94a82014-06-24 15:20:36 -04001875 // Queries about context capabilities and maximums are answered by Context.
1876 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001877 switch (pname)
1878 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001879 case GL_MAX_ELEMENT_INDEX:
1880 *params = mCaps.maxElementIndex;
1881 break;
1882 case GL_MAX_UNIFORM_BLOCK_SIZE:
1883 *params = mCaps.maxUniformBlockSize;
1884 break;
1885 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001886 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001887 break;
1888 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001889 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001890 break;
1891 case GL_MAX_SERVER_WAIT_TIMEOUT:
1892 *params = mCaps.maxServerWaitTimeout;
1893 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001894
Jamie Madill231c7f52017-04-26 13:45:37 -04001895 // GL_EXT_disjoint_timer_query
1896 case GL_TIMESTAMP_EXT:
1897 *params = mImplementation->getTimestamp();
1898 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001899
Jamie Madill231c7f52017-04-26 13:45:37 -04001900 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1901 *params = mCaps.maxShaderStorageBlockSize;
1902 break;
1903 default:
1904 UNREACHABLE();
1905 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001906 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001907}
1908
Geoff Lang70d0f492015-12-10 17:45:46 -05001909void Context::getPointerv(GLenum pname, void **params) const
1910{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001911 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001912}
1913
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001914void Context::getPointervRobustANGLERobust(GLenum pname,
1915 GLsizei bufSize,
1916 GLsizei *length,
1917 void **params)
1918{
1919 UNIMPLEMENTED();
1920}
1921
Martin Radev66fb8202016-07-28 11:45:20 +03001922void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001923{
Shannon Woods53a94a82014-06-24 15:20:36 -04001924 // Queries about context capabilities and maximums are answered by Context.
1925 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001926
1927 GLenum nativeType;
1928 unsigned int numParams;
1929 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1930 ASSERT(queryStatus);
1931
1932 if (nativeType == GL_INT)
1933 {
1934 switch (target)
1935 {
1936 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1937 ASSERT(index < 3u);
1938 *data = mCaps.maxComputeWorkGroupCount[index];
1939 break;
1940 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1941 ASSERT(index < 3u);
1942 *data = mCaps.maxComputeWorkGroupSize[index];
1943 break;
1944 default:
1945 mGLState.getIntegeri_v(target, index, data);
1946 }
1947 }
1948 else
1949 {
1950 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1951 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001952}
1953
Brandon Jones59770802018-04-02 13:18:42 -07001954void Context::getIntegeri_vRobust(GLenum target,
1955 GLuint index,
1956 GLsizei bufSize,
1957 GLsizei *length,
1958 GLint *data)
1959{
1960 getIntegeri_v(target, index, data);
1961}
1962
Martin Radev66fb8202016-07-28 11:45:20 +03001963void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001964{
Shannon Woods53a94a82014-06-24 15:20:36 -04001965 // Queries about context capabilities and maximums are answered by Context.
1966 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001967
1968 GLenum nativeType;
1969 unsigned int numParams;
1970 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1971 ASSERT(queryStatus);
1972
1973 if (nativeType == GL_INT_64_ANGLEX)
1974 {
1975 mGLState.getInteger64i_v(target, index, data);
1976 }
1977 else
1978 {
1979 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1980 }
1981}
1982
Brandon Jones59770802018-04-02 13:18:42 -07001983void Context::getInteger64i_vRobust(GLenum target,
1984 GLuint index,
1985 GLsizei bufSize,
1986 GLsizei *length,
1987 GLint64 *data)
1988{
1989 getInteger64i_v(target, index, data);
1990}
1991
Martin Radev66fb8202016-07-28 11:45:20 +03001992void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1993{
1994 // Queries about context capabilities and maximums are answered by Context.
1995 // Queries about current GL state values are answered by State.
1996
1997 GLenum nativeType;
1998 unsigned int numParams;
1999 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
2000 ASSERT(queryStatus);
2001
2002 if (nativeType == GL_BOOL)
2003 {
2004 mGLState.getBooleani_v(target, index, data);
2005 }
2006 else
2007 {
2008 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
2009 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04002010}
2011
Brandon Jones59770802018-04-02 13:18:42 -07002012void Context::getBooleani_vRobust(GLenum target,
2013 GLuint index,
2014 GLsizei bufSize,
2015 GLsizei *length,
2016 GLboolean *data)
2017{
2018 getBooleani_v(target, index, data);
2019}
2020
Corentin Wallez336129f2017-10-17 15:55:40 -04002021void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002022{
2023 Buffer *buffer = mGLState.getTargetBuffer(target);
2024 QueryBufferParameteriv(buffer, pname, params);
2025}
2026
Brandon Jones59770802018-04-02 13:18:42 -07002027void Context::getBufferParameterivRobust(BufferBinding target,
2028 GLenum pname,
2029 GLsizei bufSize,
2030 GLsizei *length,
2031 GLint *params)
2032{
2033 getBufferParameteriv(target, pname, params);
2034}
2035
He Yunchao010e4db2017-03-03 14:22:06 +08002036void Context::getFramebufferAttachmentParameteriv(GLenum target,
2037 GLenum attachment,
2038 GLenum pname,
2039 GLint *params)
2040{
2041 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002042 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002043}
2044
Brandon Jones59770802018-04-02 13:18:42 -07002045void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2046 GLenum attachment,
2047 GLenum pname,
2048 GLsizei bufSize,
2049 GLsizei *length,
2050 GLint *params)
2051{
2052 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2053}
2054
He Yunchao010e4db2017-03-03 14:22:06 +08002055void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2056{
2057 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2058 QueryRenderbufferiv(this, renderbuffer, pname, params);
2059}
2060
Brandon Jones59770802018-04-02 13:18:42 -07002061void Context::getRenderbufferParameterivRobust(GLenum target,
2062 GLenum pname,
2063 GLsizei bufSize,
2064 GLsizei *length,
2065 GLint *params)
2066{
2067 getRenderbufferParameteriv(target, pname, params);
2068}
2069
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002070void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002071{
Till Rathmannb8543632018-10-02 19:46:14 +02002072 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002073 QueryTexParameterfv(texture, pname, params);
2074}
2075
Brandon Jones59770802018-04-02 13:18:42 -07002076void Context::getTexParameterfvRobust(TextureType target,
2077 GLenum pname,
2078 GLsizei bufSize,
2079 GLsizei *length,
2080 GLfloat *params)
2081{
2082 getTexParameterfv(target, pname, params);
2083}
2084
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002085void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002086{
Till Rathmannb8543632018-10-02 19:46:14 +02002087 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002088 QueryTexParameteriv(texture, pname, params);
2089}
Jiajia Qin5451d532017-11-16 17:16:34 +08002090
Till Rathmannb8543632018-10-02 19:46:14 +02002091void Context::getTexParameterIiv(TextureType target, GLenum pname, GLint *params)
2092{
2093 const Texture *const texture = getTargetTexture(target);
2094 QueryTexParameterIiv(texture, pname, params);
2095}
2096
2097void Context::getTexParameterIuiv(TextureType target, GLenum pname, GLuint *params)
2098{
2099 const Texture *const texture = getTargetTexture(target);
2100 QueryTexParameterIuiv(texture, pname, params);
2101}
2102
Brandon Jones59770802018-04-02 13:18:42 -07002103void Context::getTexParameterivRobust(TextureType target,
2104 GLenum pname,
2105 GLsizei bufSize,
2106 GLsizei *length,
2107 GLint *params)
2108{
2109 getTexParameteriv(target, pname, params);
2110}
2111
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002112void Context::getTexParameterIivRobust(TextureType target,
2113 GLenum pname,
2114 GLsizei bufSize,
2115 GLsizei *length,
2116 GLint *params)
2117{
2118 UNIMPLEMENTED();
2119}
2120
2121void Context::getTexParameterIuivRobust(TextureType target,
2122 GLenum pname,
2123 GLsizei bufSize,
2124 GLsizei *length,
2125 GLuint *params)
2126{
2127 UNIMPLEMENTED();
2128}
2129
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002130void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002131{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002132 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002133 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002134}
2135
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002136void Context::getTexLevelParameterivRobust(TextureTarget target,
2137 GLint level,
2138 GLenum pname,
2139 GLsizei bufSize,
2140 GLsizei *length,
2141 GLint *params)
2142{
2143 UNIMPLEMENTED();
2144}
2145
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002146void Context::getTexLevelParameterfv(TextureTarget target,
2147 GLint level,
2148 GLenum pname,
2149 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002150{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002151 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002152 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002153}
2154
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002155void Context::getTexLevelParameterfvRobust(TextureTarget target,
2156 GLint level,
2157 GLenum pname,
2158 GLsizei bufSize,
2159 GLsizei *length,
2160 GLfloat *params)
2161{
2162 UNIMPLEMENTED();
2163}
2164
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002165void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002166{
Till Rathmannb8543632018-10-02 19:46:14 +02002167 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002168 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002169 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002170}
2171
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002172void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002173{
Till Rathmannb8543632018-10-02 19:46:14 +02002174 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002175 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002176 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002177}
2178
Brandon Jones59770802018-04-02 13:18:42 -07002179void Context::texParameterfvRobust(TextureType target,
2180 GLenum pname,
2181 GLsizei bufSize,
2182 const GLfloat *params)
2183{
2184 texParameterfv(target, pname, params);
2185}
2186
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002187void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002188{
Till Rathmannb8543632018-10-02 19:46:14 +02002189 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002190 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002191 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002192}
2193
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002194void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002195{
Till Rathmannb8543632018-10-02 19:46:14 +02002196 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002197 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002198 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002199}
2200
Till Rathmannb8543632018-10-02 19:46:14 +02002201void Context::texParameterIiv(TextureType target, GLenum pname, const GLint *params)
2202{
2203 Texture *const texture = getTargetTexture(target);
2204 SetTexParameterIiv(this, texture, pname, params);
2205 onTextureChange(texture);
2206}
2207
2208void Context::texParameterIuiv(TextureType target, GLenum pname, const GLuint *params)
2209{
2210 Texture *const texture = getTargetTexture(target);
2211 SetTexParameterIuiv(this, texture, pname, params);
2212 onTextureChange(texture);
2213}
2214
Brandon Jones59770802018-04-02 13:18:42 -07002215void Context::texParameterivRobust(TextureType target,
2216 GLenum pname,
2217 GLsizei bufSize,
2218 const GLint *params)
2219{
2220 texParameteriv(target, pname, params);
2221}
2222
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002223void Context::texParameterIivRobust(TextureType target,
2224 GLenum pname,
2225 GLsizei bufSize,
2226 const GLint *params)
2227{
2228 UNIMPLEMENTED();
2229}
2230
2231void Context::texParameterIuivRobust(TextureType target,
2232 GLenum pname,
2233 GLsizei bufSize,
2234 const GLuint *params)
2235{
2236 UNIMPLEMENTED();
2237}
2238
Jamie Madill493f9572018-05-24 19:52:15 -04002239void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002240{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002241 // No-op if count draws no primitives for given mode
2242 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002243 {
2244 return;
2245 }
2246
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002247 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002248 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002249 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002250}
2251
Jamie Madill493f9572018-05-24 19:52:15 -04002252void Context::drawArraysInstanced(PrimitiveMode mode,
2253 GLint first,
2254 GLsizei count,
2255 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002256{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002257 // No-op if count draws no primitives for given mode
2258 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002259 {
2260 return;
2261 }
2262
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002263 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002264 ANGLE_CONTEXT_TRY(
2265 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002266 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2267 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002268}
2269
Jamie Madill493f9572018-05-24 19:52:15 -04002270void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002271{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002272 // No-op if count draws no primitives for given mode
2273 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002274 {
2275 return;
2276 }
2277
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002278 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002279 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002280}
2281
Jamie Madill493f9572018-05-24 19:52:15 -04002282void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002283 GLsizei count,
2284 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002285 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002286 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002287{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002288 // No-op if count draws no primitives for given mode
2289 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002290 {
2291 return;
2292 }
2293
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002294 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002295 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002296 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002297}
2298
Jamie Madill493f9572018-05-24 19:52:15 -04002299void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002300 GLuint start,
2301 GLuint end,
2302 GLsizei count,
2303 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002304 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002305{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002306 // No-op if count draws no primitives for given mode
2307 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002308 {
2309 return;
2310 }
2311
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002312 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002313 ANGLE_CONTEXT_TRY(
2314 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002315}
2316
Jamie Madill493f9572018-05-24 19:52:15 -04002317void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002318{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002319 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002320 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002321}
2322
Jamie Madill493f9572018-05-24 19:52:15 -04002323void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002324{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002325 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002326 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002327}
2328
Jamie Madill675fe712016-12-19 13:07:54 -05002329void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002330{
Jamie Madillafa02a22017-11-23 12:57:38 -05002331 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002332}
2333
Jamie Madill675fe712016-12-19 13:07:54 -05002334void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002335{
Jamie Madillafa02a22017-11-23 12:57:38 -05002336 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002337}
2338
Austin Kinross6ee1e782015-05-29 17:05:37 -07002339void Context::insertEventMarker(GLsizei length, const char *marker)
2340{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002341 ASSERT(mImplementation);
2342 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002343}
2344
2345void Context::pushGroupMarker(GLsizei length, const char *marker)
2346{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002347 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002348
2349 if (marker == nullptr)
2350 {
2351 // From the EXT_debug_marker spec,
2352 // "If <marker> is null then an empty string is pushed on the stack."
2353 mImplementation->pushGroupMarker(length, "");
2354 }
2355 else
2356 {
2357 mImplementation->pushGroupMarker(length, marker);
2358 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002359}
2360
2361void Context::popGroupMarker()
2362{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002363 ASSERT(mImplementation);
2364 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002365}
2366
Geoff Langd8605522016-04-13 10:19:12 -04002367void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2368{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002369 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002370 ASSERT(programObject);
2371
2372 programObject->bindUniformLocation(location, name);
2373}
2374
Brandon Jones59770802018-04-02 13:18:42 -07002375void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002376{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002377 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002378}
2379
Brandon Jones59770802018-04-02 13:18:42 -07002380void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002381{
2382 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2383}
2384
Brandon Jones59770802018-04-02 13:18:42 -07002385void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002386{
2387 GLfloat I[16];
2388 angle::Matrix<GLfloat>::setToIdentity(I);
2389
2390 mGLState.loadPathRenderingMatrix(matrixMode, I);
2391}
2392
2393void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2394{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002395 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002396 if (!pathObj)
2397 return;
2398
Geoff Lang9bf86f02018-07-26 11:46:34 -04002399 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002400
2401 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2402}
2403
2404void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2405{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002406 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002407 if (!pathObj)
2408 return;
2409
Geoff Lang9bf86f02018-07-26 11:46:34 -04002410 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002411
2412 mImplementation->stencilStrokePath(pathObj, reference, mask);
2413}
2414
2415void Context::coverFillPath(GLuint path, GLenum coverMode)
2416{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002417 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002418 if (!pathObj)
2419 return;
2420
Geoff Lang9bf86f02018-07-26 11:46:34 -04002421 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002422
2423 mImplementation->coverFillPath(pathObj, coverMode);
2424}
2425
2426void Context::coverStrokePath(GLuint path, 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->coverStrokePath(pathObj, coverMode);
2435}
2436
2437void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2438{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002439 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002440 if (!pathObj)
2441 return;
2442
Geoff Lang9bf86f02018-07-26 11:46:34 -04002443 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002444
2445 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2446}
2447
2448void Context::stencilThenCoverStrokePath(GLuint path,
2449 GLint reference,
2450 GLuint mask,
2451 GLenum coverMode)
2452{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002453 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002454 if (!pathObj)
2455 return;
2456
Geoff Lang9bf86f02018-07-26 11:46:34 -04002457 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002458
2459 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2460}
2461
Sami Väisänend59ca052016-06-21 16:10:00 +03002462void Context::coverFillPathInstanced(GLsizei numPaths,
2463 GLenum pathNameType,
2464 const void *paths,
2465 GLuint pathBase,
2466 GLenum coverMode,
2467 GLenum transformType,
2468 const GLfloat *transformValues)
2469{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002470 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002471
Geoff Lang9bf86f02018-07-26 11:46:34 -04002472 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002473
2474 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2475}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002476
Sami Väisänend59ca052016-06-21 16:10:00 +03002477void Context::coverStrokePathInstanced(GLsizei numPaths,
2478 GLenum pathNameType,
2479 const void *paths,
2480 GLuint pathBase,
2481 GLenum coverMode,
2482 GLenum transformType,
2483 const GLfloat *transformValues)
2484{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002485 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002486
2487 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002488 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002489
2490 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2491 transformValues);
2492}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002493
Sami Väisänend59ca052016-06-21 16:10:00 +03002494void Context::stencilFillPathInstanced(GLsizei numPaths,
2495 GLenum pathNameType,
2496 const void *paths,
2497 GLuint pathBase,
2498 GLenum fillMode,
2499 GLuint mask,
2500 GLenum transformType,
2501 const GLfloat *transformValues)
2502{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002503 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002504
2505 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002506 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002507
2508 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2509 transformValues);
2510}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002511
Sami Väisänend59ca052016-06-21 16:10:00 +03002512void Context::stencilStrokePathInstanced(GLsizei numPaths,
2513 GLenum pathNameType,
2514 const void *paths,
2515 GLuint pathBase,
2516 GLint reference,
2517 GLuint mask,
2518 GLenum transformType,
2519 const GLfloat *transformValues)
2520{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002521 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002522
Geoff Lang9bf86f02018-07-26 11:46:34 -04002523 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002524
2525 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2526 transformValues);
2527}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002528
Sami Väisänend59ca052016-06-21 16:10:00 +03002529void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2530 GLenum pathNameType,
2531 const void *paths,
2532 GLuint pathBase,
2533 GLenum fillMode,
2534 GLuint mask,
2535 GLenum coverMode,
2536 GLenum transformType,
2537 const GLfloat *transformValues)
2538{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002539 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002540
Geoff Lang9bf86f02018-07-26 11:46:34 -04002541 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002542
2543 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2544 transformType, transformValues);
2545}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002546
Sami Väisänend59ca052016-06-21 16:10:00 +03002547void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2548 GLenum pathNameType,
2549 const void *paths,
2550 GLuint pathBase,
2551 GLint reference,
2552 GLuint mask,
2553 GLenum coverMode,
2554 GLenum transformType,
2555 const GLfloat *transformValues)
2556{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002557 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002558
Geoff Lang9bf86f02018-07-26 11:46:34 -04002559 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002560
2561 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2562 transformType, transformValues);
2563}
2564
Sami Väisänen46eaa942016-06-29 10:26:37 +03002565void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2566{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002567 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002568
2569 programObject->bindFragmentInputLocation(location, name);
2570}
2571
2572void Context::programPathFragmentInputGen(GLuint program,
2573 GLint location,
2574 GLenum genMode,
2575 GLint components,
2576 const GLfloat *coeffs)
2577{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002578 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002579
jchen103fd614d2018-08-13 12:21:58 +08002580 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002581}
2582
jchen1015015f72017-03-16 13:54:21 +08002583GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2584{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002585 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002586 return QueryProgramResourceIndex(programObject, programInterface, name);
2587}
2588
jchen10fd7c3b52017-03-21 15:36:03 +08002589void Context::getProgramResourceName(GLuint program,
2590 GLenum programInterface,
2591 GLuint index,
2592 GLsizei bufSize,
2593 GLsizei *length,
2594 GLchar *name)
2595{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002596 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002597 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2598}
2599
jchen10191381f2017-04-11 13:59:04 +08002600GLint Context::getProgramResourceLocation(GLuint program,
2601 GLenum programInterface,
2602 const GLchar *name)
2603{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002604 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002605 return QueryProgramResourceLocation(programObject, programInterface, name);
2606}
2607
jchen10880683b2017-04-12 16:21:55 +08002608void Context::getProgramResourceiv(GLuint program,
2609 GLenum programInterface,
2610 GLuint index,
2611 GLsizei propCount,
2612 const GLenum *props,
2613 GLsizei bufSize,
2614 GLsizei *length,
2615 GLint *params)
2616{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002617 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002618 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2619 length, params);
2620}
2621
jchen10d9cd7b72017-08-30 15:04:25 +08002622void Context::getProgramInterfaceiv(GLuint program,
2623 GLenum programInterface,
2624 GLenum pname,
2625 GLint *params)
2626{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002627 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002628 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2629}
2630
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002631void Context::getProgramInterfaceivRobust(GLuint program,
2632 GLenum programInterface,
2633 GLenum pname,
2634 GLsizei bufSize,
2635 GLsizei *length,
2636 GLint *params)
2637{
2638 UNIMPLEMENTED();
2639}
2640
Jamie Madill306b6c12018-07-27 08:12:49 -04002641void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002642{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002643 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002644}
2645
Jamie Madillabfbc0f2018-10-09 12:48:52 -04002646void Context::handleError(GLenum errorCode,
2647 const char *message,
2648 const char *file,
2649 const char *function,
2650 unsigned int line)
2651{
2652 mErrors.handleError(errorCode, message, file, function, line);
2653}
2654
Jamie Madilla139f012018-10-10 16:13:03 -04002655void Context::validationError(GLenum errorCode, const char *message)
2656{
2657 mErrors.validationError(errorCode, message);
2658}
2659
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002660// Get one of the recorded errors and clear its flag, if any.
2661// [OpenGL ES 2.0.24] section 2.5 page 13.
2662GLenum Context::getError()
2663{
Geoff Langda5777c2014-07-11 09:52:58 -04002664 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002665 {
Geoff Langda5777c2014-07-11 09:52:58 -04002666 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002667 }
Geoff Langda5777c2014-07-11 09:52:58 -04002668 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002669 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002670 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002671 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002672}
2673
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002674// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002675void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002676{
2677 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002678 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002679 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002680 mContextLostForced = true;
2681 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002682 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002683}
2684
Jamie Madillfa920eb2018-01-04 11:45:50 -05002685GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002686{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002687 // Even if the application doesn't want to know about resets, we want to know
2688 // as it will allow us to skip all the calls.
2689 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002690 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002691 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002692 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002693 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002694 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002695
2696 // EXT_robustness, section 2.6: If the reset notification behavior is
2697 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2698 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2699 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002700 }
2701
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002702 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2703 // status should be returned at least once, and GL_NO_ERROR should be returned
2704 // once the device has finished resetting.
2705 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002706 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002707 ASSERT(mResetStatus == GL_NO_ERROR);
2708 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002709
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002710 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002711 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002712 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002713 }
2714 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002715 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002716 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002717 // If markContextLost was used to mark the context lost then
2718 // assume that is not recoverable, and continue to report the
2719 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002720 mResetStatus = mImplementation->getResetStatus();
2721 }
Jamie Madill893ab082014-05-16 16:56:10 -04002722
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002723 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002724}
2725
2726bool Context::isResetNotificationEnabled()
2727{
2728 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2729}
2730
Corentin Walleze3b10e82015-05-20 11:06:25 -04002731const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002732{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002733 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002734}
2735
2736EGLenum Context::getClientType() const
2737{
2738 return mClientType;
2739}
2740
2741EGLenum Context::getRenderBuffer() const
2742{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002743 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2744 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002745 {
2746 return EGL_NONE;
2747 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002748
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002749 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002750 ASSERT(backAttachment != nullptr);
2751 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002752}
2753
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002754VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002755{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002756 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002757 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2758 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002759 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002760 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2761 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002762
Jamie Madill96a483b2017-06-27 16:49:21 -04002763 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002764 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002765
2766 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002767}
2768
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002769TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002770{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002771 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002772 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2773 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002774 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002775 transformFeedback =
2776 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002777 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002778 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002779 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002780
2781 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002782}
2783
2784bool Context::isVertexArrayGenerated(GLuint vertexArray)
2785{
Jamie Madill96a483b2017-06-27 16:49:21 -04002786 ASSERT(mVertexArrayMap.contains(0));
2787 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002788}
2789
2790bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2791{
Jamie Madill96a483b2017-06-27 16:49:21 -04002792 ASSERT(mTransformFeedbackMap.contains(0));
2793 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002794}
2795
Shannon Woods53a94a82014-06-24 15:20:36 -04002796void Context::detachTexture(GLuint texture)
2797{
2798 // Simple pass-through to State's detachTexture method, as textures do not require
2799 // allocation map management either here or in the resource manager at detach time.
2800 // Zero textures are held by the Context, and we don't attempt to request them from
2801 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002802 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002803}
2804
James Darpinian4d9d4832018-03-13 12:43:28 -07002805void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002806{
Yuly Novikov5807a532015-12-03 13:01:22 -05002807 // Simple pass-through to State's detachBuffer method, since
2808 // only buffer attachments to container objects that are bound to the current context
2809 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002810
Yuly Novikov5807a532015-12-03 13:01:22 -05002811 // [OpenGL ES 3.2] section 5.1.2 page 45:
2812 // Attachments to unbound container objects, such as
2813 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2814 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002815 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002816}
2817
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002818void Context::detachFramebuffer(GLuint framebuffer)
2819{
Shannon Woods53a94a82014-06-24 15:20:36 -04002820 // Framebuffer detachment is handled by Context, because 0 is a valid
2821 // Framebuffer object, and a pointer to it must be passed from Context
2822 // to State at binding time.
2823
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002824 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002825 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2826 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2827 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002828
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002829 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002830 {
2831 bindReadFramebuffer(0);
2832 }
2833
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002834 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002835 {
2836 bindDrawFramebuffer(0);
2837 }
2838}
2839
2840void Context::detachRenderbuffer(GLuint renderbuffer)
2841{
Jamie Madilla02315b2017-02-23 14:14:47 -05002842 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002843}
2844
Jamie Madill57a89722013-07-02 11:57:03 -04002845void Context::detachVertexArray(GLuint vertexArray)
2846{
Jamie Madill77a72f62015-04-14 11:18:32 -04002847 // Vertex array detachment is handled by Context, because 0 is a valid
2848 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002849 // binding time.
2850
Jamie Madill57a89722013-07-02 11:57:03 -04002851 // [OpenGL ES 3.0.2] section 2.10 page 43:
2852 // If a vertex array object that is currently bound is deleted, the binding
2853 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002854 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002855 {
2856 bindVertexArray(0);
2857 }
2858}
2859
Geoff Langc8058452014-02-03 12:04:11 -05002860void Context::detachTransformFeedback(GLuint transformFeedback)
2861{
Corentin Walleza2257da2016-04-19 16:43:12 -04002862 // Transform feedback detachment is handled by Context, because 0 is a valid
2863 // transform feedback, and a pointer to it must be passed from Context to State at
2864 // binding time.
2865
2866 // The OpenGL specification doesn't mention what should happen when the currently bound
2867 // transform feedback object is deleted. Since it is a container object, we treat it like
2868 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002869 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002870 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002871 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002872 }
Geoff Langc8058452014-02-03 12:04:11 -05002873}
2874
Jamie Madilldc356042013-07-19 16:36:57 -04002875void Context::detachSampler(GLuint sampler)
2876{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002877 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002878}
2879
Yunchao Hea336b902017-08-02 16:05:21 +08002880void Context::detachProgramPipeline(GLuint pipeline)
2881{
2882 mGLState.detachProgramPipeline(this, pipeline);
2883}
2884
Jamie Madill3ef140a2017-08-26 23:11:21 -04002885void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002886{
Shaodde78e82017-05-22 14:13:27 +08002887 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002888 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002889}
2890
Jamie Madille29d1672013-07-19 16:36:57 -04002891void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2892{
Till Rathmannb8543632018-10-02 19:46:14 +02002893 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002894 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002895 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002896}
Jamie Madille29d1672013-07-19 16:36:57 -04002897
Geoff Langc1984ed2016-10-07 12:41:00 -04002898void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2899{
Till Rathmannb8543632018-10-02 19:46:14 +02002900 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002901 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002902 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002903}
2904
Till Rathmannb8543632018-10-02 19:46:14 +02002905void Context::samplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
2906{
2907 Sampler *const samplerObject =
2908 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2909 SetSamplerParameterIiv(this, samplerObject, pname, param);
2910}
2911
2912void Context::samplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
2913{
2914 Sampler *const samplerObject =
2915 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2916 SetSamplerParameterIuiv(this, samplerObject, pname, param);
2917}
2918
Brandon Jones59770802018-04-02 13:18:42 -07002919void Context::samplerParameterivRobust(GLuint sampler,
2920 GLenum pname,
2921 GLsizei bufSize,
2922 const GLint *param)
2923{
2924 samplerParameteriv(sampler, pname, param);
2925}
2926
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002927void Context::samplerParameterIivRobust(GLuint sampler,
2928 GLenum pname,
2929 GLsizei bufSize,
2930 const GLint *param)
2931{
2932 UNIMPLEMENTED();
2933}
2934
2935void Context::samplerParameterIuivRobust(GLuint sampler,
2936 GLenum pname,
2937 GLsizei bufSize,
2938 const GLuint *param)
2939{
2940 UNIMPLEMENTED();
2941}
2942
Jamie Madille29d1672013-07-19 16:36:57 -04002943void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2944{
Till Rathmannb8543632018-10-02 19:46:14 +02002945 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002946 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002947 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002948}
2949
Geoff Langc1984ed2016-10-07 12:41:00 -04002950void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002951{
Till Rathmannb8543632018-10-02 19:46:14 +02002952 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002953 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002954 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002955}
2956
Brandon Jones59770802018-04-02 13:18:42 -07002957void Context::samplerParameterfvRobust(GLuint sampler,
2958 GLenum pname,
2959 GLsizei bufSize,
2960 const GLfloat *param)
2961{
2962 samplerParameterfv(sampler, pname, param);
2963}
2964
Geoff Langc1984ed2016-10-07 12:41:00 -04002965void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002966{
Till Rathmannb8543632018-10-02 19:46:14 +02002967 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002968 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002969 QuerySamplerParameteriv(samplerObject, pname, params);
2970}
Jamie Madill9675b802013-07-19 16:36:59 -04002971
Till Rathmannb8543632018-10-02 19:46:14 +02002972void Context::getSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
2973{
2974 const Sampler *const samplerObject =
2975 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2976 QuerySamplerParameterIiv(samplerObject, pname, params);
2977}
2978
2979void Context::getSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
2980{
2981 const Sampler *const samplerObject =
2982 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2983 QuerySamplerParameterIuiv(samplerObject, pname, params);
2984}
2985
Brandon Jones59770802018-04-02 13:18:42 -07002986void Context::getSamplerParameterivRobust(GLuint sampler,
2987 GLenum pname,
2988 GLsizei bufSize,
2989 GLsizei *length,
2990 GLint *params)
2991{
2992 getSamplerParameteriv(sampler, pname, params);
2993}
2994
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002995void Context::getSamplerParameterIivRobust(GLuint sampler,
2996 GLenum pname,
2997 GLsizei bufSize,
2998 GLsizei *length,
2999 GLint *params)
3000{
3001 UNIMPLEMENTED();
3002}
3003
3004void Context::getSamplerParameterIuivRobust(GLuint sampler,
3005 GLenum pname,
3006 GLsizei bufSize,
3007 GLsizei *length,
3008 GLuint *params)
3009{
3010 UNIMPLEMENTED();
3011}
3012
Geoff Langc1984ed2016-10-07 12:41:00 -04003013void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
3014{
Till Rathmannb8543632018-10-02 19:46:14 +02003015 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05003016 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04003017 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04003018}
3019
Brandon Jones59770802018-04-02 13:18:42 -07003020void Context::getSamplerParameterfvRobust(GLuint sampler,
3021 GLenum pname,
3022 GLsizei bufSize,
3023 GLsizei *length,
3024 GLfloat *params)
3025{
3026 getSamplerParameterfv(sampler, pname, params);
3027}
3028
Olli Etuahof0fee072016-03-30 15:11:58 +03003029void Context::programParameteri(GLuint program, GLenum pname, GLint value)
3030{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04003031 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08003032 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03003033}
3034
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003035void Context::initRendererString()
3036{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003037 std::ostringstream rendererString;
3038 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003039 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003040 rendererString << ")";
3041
Geoff Langcec35902014-04-16 10:52:36 -04003042 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003043}
3044
Geoff Langc339c4e2016-11-29 10:37:36 -05003045void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003046{
Geoff Langc339c4e2016-11-29 10:37:36 -05003047 const Version &clientVersion = getClientVersion();
3048
3049 std::ostringstream versionString;
3050 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
3051 << ANGLE_VERSION_STRING << ")";
3052 mVersionString = MakeStaticString(versionString.str());
3053
3054 std::ostringstream shadingLanguageVersionString;
3055 shadingLanguageVersionString << "OpenGL ES GLSL ES "
3056 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
3057 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
3058 << ")";
3059 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003060}
3061
Geoff Langcec35902014-04-16 10:52:36 -04003062void Context::initExtensionStrings()
3063{
Geoff Langc339c4e2016-11-29 10:37:36 -05003064 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
3065 std::ostringstream combinedStringStream;
3066 std::copy(strings.begin(), strings.end(),
3067 std::ostream_iterator<const char *>(combinedStringStream, " "));
3068 return MakeStaticString(combinedStringStream.str());
3069 };
3070
3071 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003072 for (const auto &extensionString : mExtensions.getStrings())
3073 {
3074 mExtensionStrings.push_back(MakeStaticString(extensionString));
3075 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003076 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003077
Geoff Langc339c4e2016-11-29 10:37:36 -05003078 mRequestableExtensionStrings.clear();
3079 for (const auto &extensionInfo : GetExtensionInfoMap())
3080 {
3081 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003082 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003083 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003084 {
3085 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3086 }
3087 }
3088 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003089}
3090
Geoff Langc339c4e2016-11-29 10:37:36 -05003091const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003092{
Geoff Langc339c4e2016-11-29 10:37:36 -05003093 switch (name)
3094 {
3095 case GL_VENDOR:
3096 return reinterpret_cast<const GLubyte *>("Google Inc.");
3097
3098 case GL_RENDERER:
3099 return reinterpret_cast<const GLubyte *>(mRendererString);
3100
3101 case GL_VERSION:
3102 return reinterpret_cast<const GLubyte *>(mVersionString);
3103
3104 case GL_SHADING_LANGUAGE_VERSION:
3105 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3106
3107 case GL_EXTENSIONS:
3108 return reinterpret_cast<const GLubyte *>(mExtensionString);
3109
3110 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3111 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3112
3113 default:
3114 UNREACHABLE();
3115 return nullptr;
3116 }
Geoff Langcec35902014-04-16 10:52:36 -04003117}
3118
Geoff Langc339c4e2016-11-29 10:37:36 -05003119const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003120{
Geoff Langc339c4e2016-11-29 10:37:36 -05003121 switch (name)
3122 {
3123 case GL_EXTENSIONS:
3124 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3125
3126 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3127 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3128
3129 default:
3130 UNREACHABLE();
3131 return nullptr;
3132 }
Geoff Langcec35902014-04-16 10:52:36 -04003133}
3134
3135size_t Context::getExtensionStringCount() const
3136{
3137 return mExtensionStrings.size();
3138}
3139
Geoff Lang111a99e2017-10-17 10:58:41 -04003140bool Context::isExtensionRequestable(const char *name)
3141{
3142 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3143 auto extension = extensionInfos.find(name);
3144
Geoff Lang111a99e2017-10-17 10:58:41 -04003145 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003146 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003147}
3148
Geoff Langc339c4e2016-11-29 10:37:36 -05003149void Context::requestExtension(const char *name)
3150{
3151 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3152 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3153 const auto &extension = extensionInfos.at(name);
3154 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003155 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003156
3157 if (mExtensions.*(extension.ExtensionsMember))
3158 {
3159 // Extension already enabled
3160 return;
3161 }
3162
3163 mExtensions.*(extension.ExtensionsMember) = true;
3164 updateCaps();
3165 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003166
Jamie Madill2f348d22017-06-05 10:50:59 -04003167 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3168 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003169
Jamie Madill81c2e252017-09-09 23:32:46 -04003170 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3171 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003172 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003173 for (auto &zeroTexture : mZeroTextures)
3174 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003175 if (zeroTexture.get() != nullptr)
3176 {
3177 zeroTexture->signalDirty(this, InitState::Initialized);
3178 }
Geoff Lang9aded172017-04-05 11:07:56 -04003179 }
3180
Jamie Madillb983a4b2018-08-01 11:34:51 -04003181 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003182}
3183
3184size_t Context::getRequestableExtensionStringCount() const
3185{
3186 return mRequestableExtensionStrings.size();
3187}
3188
Jamie Madill493f9572018-05-24 19:52:15 -04003189void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003190{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003191 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003192 ASSERT(transformFeedback != nullptr);
3193 ASSERT(!transformFeedback->isPaused());
3194
Jamie Madill6c1f6712017-02-14 19:08:04 -05003195 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003196 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003197}
3198
3199bool Context::hasActiveTransformFeedback(GLuint program) const
3200{
3201 for (auto pair : mTransformFeedbackMap)
3202 {
3203 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3204 {
3205 return true;
3206 }
3207 }
3208 return false;
3209}
3210
Geoff Lang33f11fb2018-05-07 13:42:47 -04003211Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003212{
3213 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3214
jchen1082af6202018-06-22 10:59:52 +08003215 // Explicitly enable GL_KHR_parallel_shader_compile
3216 supportedExtensions.parallelShaderCompile = true;
3217
Geoff Langb0f917f2017-12-05 13:41:54 -05003218 if (getClientVersion() < ES_2_0)
3219 {
3220 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003221 supportedExtensions.pointSizeArray = true;
3222 supportedExtensions.textureCubeMap = true;
3223 supportedExtensions.pointSprite = true;
3224 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003225 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003226 }
3227
3228 if (getClientVersion() < ES_3_0)
3229 {
3230 // Disable ES3+ extensions
3231 supportedExtensions.colorBufferFloat = false;
3232 supportedExtensions.eglImageExternalEssl3 = false;
3233 supportedExtensions.textureNorm16 = false;
3234 supportedExtensions.multiview = false;
3235 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003236 supportedExtensions.copyTexture3d = false;
Yizhou Jiang7818a852018-09-06 15:02:04 +08003237 supportedExtensions.textureMultisample = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003238 }
3239
3240 if (getClientVersion() < ES_3_1)
3241 {
3242 // Disable ES3.1+ extensions
3243 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003244
3245 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3246 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003247 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003248 }
3249
3250 if (getClientVersion() > ES_2_0)
3251 {
3252 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3253 // supportedExtensions.sRGB = false;
3254 }
3255
3256 // Some extensions are always available because they are implemented in the GL layer.
3257 supportedExtensions.bindUniformLocation = true;
3258 supportedExtensions.vertexArrayObject = true;
3259 supportedExtensions.bindGeneratesResource = true;
3260 supportedExtensions.clientArrays = true;
3261 supportedExtensions.requestExtension = true;
Austin Eng7cf9cd22018-10-09 15:27:32 -07003262 supportedExtensions.multiDraw = true;
Geoff Langb0f917f2017-12-05 13:41:54 -05003263
3264 // Enable the no error extension if the context was created with the flag.
3265 supportedExtensions.noError = mSkipValidation;
3266
3267 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003268 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003269
3270 // Explicitly enable GL_KHR_debug
3271 supportedExtensions.debug = true;
3272 supportedExtensions.maxDebugMessageLength = 1024;
3273 supportedExtensions.maxDebugLoggedMessages = 1024;
3274 supportedExtensions.maxDebugGroupStackDepth = 1024;
3275 supportedExtensions.maxLabelLength = 1024;
3276
3277 // Explicitly enable GL_ANGLE_robust_client_memory
3278 supportedExtensions.robustClientMemory = true;
3279
3280 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003281 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003282
3283 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3284 // supports it.
3285 supportedExtensions.robustBufferAccessBehavior =
3286 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3287
3288 // Enable the cache control query unconditionally.
3289 supportedExtensions.programCacheControl = true;
3290
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003291 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003292 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003293 {
3294 // GL_ANGLE_explicit_context_gles1
3295 supportedExtensions.explicitContextGles1 = true;
3296 // GL_ANGLE_explicit_context
3297 supportedExtensions.explicitContext = true;
3298 }
3299
Geoff Lang79b91402018-10-04 15:11:30 -04003300 supportedExtensions.memorySize = true;
3301
Geoff Langb0f917f2017-12-05 13:41:54 -05003302 return supportedExtensions;
3303}
3304
Geoff Lang33f11fb2018-05-07 13:42:47 -04003305void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003306{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003307 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003308
Geoff Lang33f11fb2018-05-07 13:42:47 -04003309 mSupportedExtensions = generateSupportedExtensions();
3310 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003311
3312 mLimitations = mImplementation->getNativeLimitations();
3313
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003314 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3315 if (getClientVersion() < Version(2, 0))
3316 {
3317 mCaps.maxMultitextureUnits = 4;
3318 mCaps.maxClipPlanes = 6;
3319 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003320 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3321 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3322 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003323 mCaps.minSmoothPointSize = 1.0f;
3324 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003325 mCaps.minSmoothLineWidth = 1.0f;
3326 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003327 }
3328
Luc Ferronad2ae932018-06-11 15:31:17 -04003329 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003330 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003331
Luc Ferronad2ae932018-06-11 15:31:17 -04003332 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3333
Jamie Madill0f80ed82017-09-19 00:24:56 -04003334 if (getClientVersion() < ES_3_1)
3335 {
3336 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3337 }
3338 else
3339 {
3340 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3341 }
Geoff Lang301d1612014-07-09 10:34:37 -04003342
Jiawei Shao54aafe52018-04-27 14:54:57 +08003343 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3344 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003345 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3346
Jamie Madill0f80ed82017-09-19 00:24:56 -04003347 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3348 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3349
3350 // Limit textures as well, so we can use fast bitsets with texture bindings.
3351 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003352 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3353 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3354 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3355 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003356
Jiawei Shaodb342272017-09-27 10:21:45 +08003357 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3358
Geoff Langc287ea62016-09-16 14:46:51 -04003359 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003360 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003361 for (const auto &extensionInfo : GetExtensionInfoMap())
3362 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003363 // If the user has requested that extensions start disabled and they are requestable,
3364 // disable them.
3365 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003366 {
3367 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3368 }
3369 }
3370
3371 // Generate texture caps
3372 updateCaps();
3373}
3374
3375void Context::updateCaps()
3376{
Geoff Lang900013c2014-07-07 11:32:19 -04003377 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003378 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003379
Jamie Madill7b62cf92017-11-02 15:20:49 -04003380 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003381 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003382 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003383 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003384
Geoff Lang0d8b7242015-09-09 14:56:53 -04003385 // Update the format caps based on the client version and extensions.
3386 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3387 // ES3.
3388 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003389 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003390 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003391 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003392 formatCaps.textureAttachment =
3393 formatCaps.textureAttachment &&
3394 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3395 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3396 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003397
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003398 // OpenGL ES does not support multisampling with non-rendererable formats
3399 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003400 if (!formatCaps.renderbuffer ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003401 (getClientVersion() < ES_3_1 &&
3402 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003403 {
Geoff Langd87878e2014-09-19 15:42:59 -04003404 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003405 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003406 else
3407 {
3408 // We may have limited the max samples for some required renderbuffer formats due to
3409 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3410 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3411
3412 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3413 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3414 // exception of signed and unsigned integer formats."
3415 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3416 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3417 {
3418 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3419 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3420 }
3421
3422 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3423 if (getClientVersion() >= ES_3_1)
3424 {
3425 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3426 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3427 // the exception that the signed and unsigned integer formats are required only to
3428 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3429 // multisamples, which must be at least one."
3430 if (formatInfo.componentType == GL_INT ||
3431 formatInfo.componentType == GL_UNSIGNED_INT)
3432 {
3433 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3434 }
3435
3436 // GLES 3.1 section 19.3.1.
3437 if (formatCaps.texturable)
3438 {
3439 if (formatInfo.depthBits > 0)
3440 {
3441 mCaps.maxDepthTextureSamples =
3442 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3443 }
3444 else if (formatInfo.redBits > 0)
3445 {
3446 mCaps.maxColorTextureSamples =
3447 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3448 }
3449 }
3450 }
3451 }
Geoff Langd87878e2014-09-19 15:42:59 -04003452
3453 if (formatCaps.texturable && formatInfo.compressed)
3454 {
Geoff Langca271392017-04-05 12:30:00 -04003455 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003456 }
3457
Geoff Langca271392017-04-05 12:30:00 -04003458 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003459 }
Jamie Madill32447362017-06-28 14:53:52 -04003460
3461 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003462 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003463 {
3464 mMemoryProgramCache = nullptr;
3465 }
Corentin Walleze4477002017-12-01 14:39:58 -05003466
3467 // Compute which buffer types are allowed
3468 mValidBufferBindings.reset();
3469 mValidBufferBindings.set(BufferBinding::ElementArray);
3470 mValidBufferBindings.set(BufferBinding::Array);
3471
3472 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3473 {
3474 mValidBufferBindings.set(BufferBinding::PixelPack);
3475 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3476 }
3477
3478 if (getClientVersion() >= ES_3_0)
3479 {
3480 mValidBufferBindings.set(BufferBinding::CopyRead);
3481 mValidBufferBindings.set(BufferBinding::CopyWrite);
3482 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3483 mValidBufferBindings.set(BufferBinding::Uniform);
3484 }
3485
3486 if (getClientVersion() >= ES_3_1)
3487 {
3488 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3489 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3490 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3491 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3492 }
jchen107ae70d82018-07-06 13:47:01 +08003493
3494 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003495
3496 // Reinitialize state cache after extension changes.
3497 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003498}
3499
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003500void Context::initWorkarounds()
3501{
Jamie Madill761b02c2017-06-23 16:27:06 -04003502 // Apply back-end workarounds.
3503 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3504
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003505 // Lose the context upon out of memory error if the application is
3506 // expecting to watch for those events.
3507 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
Jamie Madilld4f07762018-10-19 19:24:07 -04003508
3509 if (mWorkarounds.syncFramebufferBindingsOnTexImage)
3510 {
3511 // Update the Framebuffer bindings on TexImage to work around an Intel bug.
3512 mTexImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
3513 mTexImageDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
3514 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003515}
3516
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003517// Return true if the draw is a no-op, else return false.
3518// A no-op draw occurs if the count of vertices is less than the minimum required to
3519// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3520bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3521{
3522 return count < kMinimumPrimitiveCounts[mode];
3523}
3524
3525bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3526{
3527 return (instanceCount == 0) || noopDraw(mode, count);
3528}
3529
Jamie Madill6f755b22018-10-09 12:48:54 -04003530angle::Result Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003531{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003532 if (mGLES1Renderer)
3533 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003534 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003535 }
3536
Geoff Lang9bf86f02018-07-26 11:46:34 -04003537 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003538
3539 if (isRobustResourceInitEnabled())
3540 {
3541 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3542 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3543 }
3544
Geoff Langa8cb2872018-03-09 16:09:40 -05003545 ANGLE_TRY(syncDirtyBits());
Jamie Madill6f755b22018-10-09 12:48:54 -04003546 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003547}
3548
3549Error Context::prepareForClear(GLbitfield mask)
3550{
Geoff Langa8cb2872018-03-09 16:09:40 -05003551 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003552 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003553 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003554 return NoError();
3555}
3556
3557Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3558{
Geoff Langa8cb2872018-03-09 16:09:40 -05003559 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003560 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3561 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003562 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003563 return NoError();
3564}
3565
Geoff Langa8cb2872018-03-09 16:09:40 -05003566Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003567{
Geoff Langa8cb2872018-03-09 16:09:40 -05003568 ANGLE_TRY(syncDirtyObjects(objectMask));
3569 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003570 return NoError();
3571}
3572
Jamie Madill6f755b22018-10-09 12:48:54 -04003573angle::Result Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003574{
3575 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003576 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003577 mGLState.clearDirtyBits();
Jamie Madill6f755b22018-10-09 12:48:54 -04003578 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003579}
3580
Jamie Madill6f755b22018-10-09 12:48:54 -04003581angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003582{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003583 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003584 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003585 mGLState.clearDirtyBits(dirtyBits);
Jamie Madill6f755b22018-10-09 12:48:54 -04003586 return angle::Result::Continue();
Jamie Madill1b94d432015-08-07 13:23:23 -04003587}
Jamie Madillc29968b2016-01-20 11:17:23 -05003588
Jamie Madill6f755b22018-10-09 12:48:54 -04003589angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003590{
3591 return mGLState.syncDirtyObjects(this, objectMask);
3592}
3593
Jamie Madillc29968b2016-01-20 11:17:23 -05003594void Context::blitFramebuffer(GLint srcX0,
3595 GLint srcY0,
3596 GLint srcX1,
3597 GLint srcY1,
3598 GLint dstX0,
3599 GLint dstY0,
3600 GLint dstX1,
3601 GLint dstY1,
3602 GLbitfield mask,
3603 GLenum filter)
3604{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003605 if (mask == 0)
3606 {
3607 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3608 // buffers are copied.
3609 return;
3610 }
3611
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003612 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003613 ASSERT(drawFramebuffer);
3614
3615 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3616 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3617
Jamie Madillbc918e72018-03-08 09:47:21 -05003618 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003619
Jamie Madillc564c072017-06-01 12:45:42 -04003620 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003621}
Jamie Madillc29968b2016-01-20 11:17:23 -05003622
3623void Context::clear(GLbitfield mask)
3624{
Geoff Langd4fff502017-09-22 11:28:28 -04003625 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3626 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003627}
3628
3629void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3630{
Olli Etuaho78df3362018-10-05 16:43:27 +03003631 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3632 const FramebufferAttachment *attachment = nullptr;
3633 if (buffer == GL_DEPTH)
3634 {
3635 attachment = framebufferObject->getDepthbuffer();
3636 }
3637 if (buffer == GL_COLOR &&
3638 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3639 {
3640 attachment = framebufferObject->getColorbuffer(drawbuffer);
3641 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003642 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3643 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003644 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003645 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003646 return;
3647 }
Geoff Langd4fff502017-09-22 11:28:28 -04003648 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003649 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003650}
3651
3652void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3653{
Olli Etuaho78df3362018-10-05 16:43:27 +03003654 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3655 const FramebufferAttachment *attachment = nullptr;
3656 if (buffer == GL_COLOR &&
3657 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3658 {
3659 attachment = framebufferObject->getColorbuffer(drawbuffer);
3660 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003661 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3662 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003663 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003664 {
3665 return;
3666 }
Geoff Langd4fff502017-09-22 11:28:28 -04003667 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003668 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003669}
3670
3671void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3672{
Olli Etuaho78df3362018-10-05 16:43:27 +03003673 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3674 const FramebufferAttachment *attachment = nullptr;
3675 if (buffer == GL_STENCIL)
3676 {
3677 attachment = framebufferObject->getStencilbuffer();
3678 }
3679 if (buffer == GL_COLOR &&
3680 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3681 {
3682 attachment = framebufferObject->getColorbuffer(drawbuffer);
3683 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003684 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3685 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003686 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003687 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003688 return;
3689 }
Geoff Langd4fff502017-09-22 11:28:28 -04003690 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003691 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003692}
3693
3694void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3695{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003696 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003697 ASSERT(framebufferObject);
3698
3699 // If a buffer is not present, the clear has no effect
3700 if (framebufferObject->getDepthbuffer() == nullptr &&
3701 framebufferObject->getStencilbuffer() == nullptr)
3702 {
3703 return;
3704 }
3705
Geoff Langd4fff502017-09-22 11:28:28 -04003706 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3707 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003708}
3709
3710void Context::readPixels(GLint x,
3711 GLint y,
3712 GLsizei width,
3713 GLsizei height,
3714 GLenum format,
3715 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003716 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003717{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003718 if (width == 0 || height == 0)
3719 {
3720 return;
3721 }
3722
Jamie Madillbc918e72018-03-08 09:47:21 -05003723 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003724
Jamie Madillb6664922017-07-25 12:55:04 -04003725 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3726 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003727
3728 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003729 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003730}
3731
Brandon Jones59770802018-04-02 13:18:42 -07003732void Context::readPixelsRobust(GLint x,
3733 GLint y,
3734 GLsizei width,
3735 GLsizei height,
3736 GLenum format,
3737 GLenum type,
3738 GLsizei bufSize,
3739 GLsizei *length,
3740 GLsizei *columns,
3741 GLsizei *rows,
3742 void *pixels)
3743{
3744 readPixels(x, y, width, height, format, type, pixels);
3745}
3746
3747void Context::readnPixelsRobust(GLint x,
3748 GLint y,
3749 GLsizei width,
3750 GLsizei height,
3751 GLenum format,
3752 GLenum type,
3753 GLsizei bufSize,
3754 GLsizei *length,
3755 GLsizei *columns,
3756 GLsizei *rows,
3757 void *data)
3758{
3759 readPixels(x, y, width, height, format, type, data);
3760}
3761
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003762void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003763 GLint level,
3764 GLenum internalformat,
3765 GLint x,
3766 GLint y,
3767 GLsizei width,
3768 GLsizei height,
3769 GLint border)
3770{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003771 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003772 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003773
Jamie Madillc29968b2016-01-20 11:17:23 -05003774 Rectangle sourceArea(x, y, width, height);
3775
Jamie Madill05b35b22017-10-03 09:01:44 -04003776 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003777 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003778 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003779}
3780
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003781void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003782 GLint level,
3783 GLint xoffset,
3784 GLint yoffset,
3785 GLint x,
3786 GLint y,
3787 GLsizei width,
3788 GLsizei height)
3789{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003790 if (width == 0 || height == 0)
3791 {
3792 return;
3793 }
3794
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003795 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003796 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003797
Jamie Madillc29968b2016-01-20 11:17:23 -05003798 Offset destOffset(xoffset, yoffset, 0);
3799 Rectangle sourceArea(x, y, width, height);
3800
Jamie Madill05b35b22017-10-03 09:01:44 -04003801 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003802 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003803 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003804}
3805
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003806void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003807 GLint level,
3808 GLint xoffset,
3809 GLint yoffset,
3810 GLint zoffset,
3811 GLint x,
3812 GLint y,
3813 GLsizei width,
3814 GLsizei height)
3815{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003816 if (width == 0 || height == 0)
3817 {
3818 return;
3819 }
3820
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003821 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003822 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003823
Jamie Madillc29968b2016-01-20 11:17:23 -05003824 Offset destOffset(xoffset, yoffset, zoffset);
3825 Rectangle sourceArea(x, y, width, height);
3826
Jamie Madill05b35b22017-10-03 09:01:44 -04003827 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3828 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003829 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3830 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003831}
3832
3833void Context::framebufferTexture2D(GLenum target,
3834 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003835 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003836 GLuint texture,
3837 GLint level)
3838{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003839 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003840 ASSERT(framebuffer);
3841
3842 if (texture != 0)
3843 {
3844 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003845 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003846 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003847 }
3848 else
3849 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003850 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003851 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003852
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003853 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003854}
3855
3856void Context::framebufferRenderbuffer(GLenum target,
3857 GLenum attachment,
3858 GLenum renderbuffertarget,
3859 GLuint renderbuffer)
3860{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003861 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003862 ASSERT(framebuffer);
3863
3864 if (renderbuffer != 0)
3865 {
3866 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003867
Jamie Madillcc129372018-04-12 09:13:18 -04003868 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003869 renderbufferObject);
3870 }
3871 else
3872 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003873 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003874 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003875
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003876 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003877}
3878
3879void Context::framebufferTextureLayer(GLenum target,
3880 GLenum attachment,
3881 GLuint texture,
3882 GLint level,
3883 GLint layer)
3884{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003885 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003886 ASSERT(framebuffer);
3887
3888 if (texture != 0)
3889 {
3890 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003891 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003892 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003893 }
3894 else
3895 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003896 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003897 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003898
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003899 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003900}
3901
Brandon Jones59770802018-04-02 13:18:42 -07003902void Context::framebufferTextureMultiviewLayered(GLenum target,
3903 GLenum attachment,
3904 GLuint texture,
3905 GLint level,
3906 GLint baseViewIndex,
3907 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003908{
Martin Radev82ef7742017-08-08 17:44:58 +03003909 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3910 ASSERT(framebuffer);
3911
3912 if (texture != 0)
3913 {
3914 Texture *textureObj = getTexture(texture);
3915
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003916 ImageIndex index;
3917 if (textureObj->getType() == TextureType::_2DArray)
3918 {
3919 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3920 }
3921 else
3922 {
3923 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3924 ASSERT(level == 0);
3925 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3926 }
Martin Radev82ef7742017-08-08 17:44:58 +03003927 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3928 numViews, baseViewIndex);
3929 }
3930 else
3931 {
3932 framebuffer->resetAttachment(this, attachment);
3933 }
3934
3935 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003936}
3937
Brandon Jones59770802018-04-02 13:18:42 -07003938void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3939 GLenum attachment,
3940 GLuint texture,
3941 GLint level,
3942 GLsizei numViews,
3943 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003944{
Martin Radev5dae57b2017-07-14 16:15:55 +03003945 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3946 ASSERT(framebuffer);
3947
3948 if (texture != 0)
3949 {
3950 Texture *textureObj = getTexture(texture);
3951
3952 ImageIndex index = ImageIndex::Make2D(level);
3953 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3954 textureObj, numViews, viewportOffsets);
3955 }
3956 else
3957 {
3958 framebuffer->resetAttachment(this, attachment);
3959 }
3960
3961 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003962}
3963
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003964void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3965{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003966 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3967 ASSERT(framebuffer);
3968
3969 if (texture != 0)
3970 {
3971 Texture *textureObj = getTexture(texture);
3972
3973 ImageIndex index = ImageIndex::MakeFromType(
3974 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3975 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3976 }
3977 else
3978 {
3979 framebuffer->resetAttachment(this, attachment);
3980 }
3981
3982 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003983}
3984
Jamie Madillc29968b2016-01-20 11:17:23 -05003985void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3986{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003987 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003988 ASSERT(framebuffer);
3989 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003990 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003991 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003992}
3993
3994void Context::readBuffer(GLenum mode)
3995{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003996 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003997 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003998 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003999}
4000
4001void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
4002{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004003 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004004 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004005
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004006 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004007 ASSERT(framebuffer);
4008
4009 // The specification isn't clear what should be done when the framebuffer isn't complete.
4010 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04004011 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004012}
4013
4014void Context::invalidateFramebuffer(GLenum target,
4015 GLsizei numAttachments,
4016 const GLenum *attachments)
4017{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004018 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004019 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004020
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004021 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004022 ASSERT(framebuffer);
4023
Jamie Madill427064d2018-04-13 16:20:34 -04004024 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004025 {
Jamie Madill437fa652016-05-03 15:13:24 -04004026 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004027 }
Jamie Madill437fa652016-05-03 15:13:24 -04004028
Jamie Madill4928b7c2017-06-20 12:57:39 -04004029 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004030}
4031
4032void Context::invalidateSubFramebuffer(GLenum target,
4033 GLsizei numAttachments,
4034 const GLenum *attachments,
4035 GLint x,
4036 GLint y,
4037 GLsizei width,
4038 GLsizei height)
4039{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004040 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004041 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004042
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004043 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004044 ASSERT(framebuffer);
4045
Jamie Madill427064d2018-04-13 16:20:34 -04004046 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004047 {
Jamie Madill437fa652016-05-03 15:13:24 -04004048 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004049 }
Jamie Madill437fa652016-05-03 15:13:24 -04004050
4051 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004052 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05004053}
4054
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004055void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004056 GLint level,
4057 GLint internalformat,
4058 GLsizei width,
4059 GLsizei height,
4060 GLint border,
4061 GLenum format,
4062 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004063 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004064{
Jamie Madillbc918e72018-03-08 09:47:21 -05004065 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004066
4067 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004068 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004069 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004070 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004071}
4072
Brandon Jones59770802018-04-02 13:18:42 -07004073void Context::texImage2DRobust(TextureTarget target,
4074 GLint level,
4075 GLint internalformat,
4076 GLsizei width,
4077 GLsizei height,
4078 GLint border,
4079 GLenum format,
4080 GLenum type,
4081 GLsizei bufSize,
4082 const void *pixels)
4083{
4084 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4085}
4086
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004087void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004088 GLint level,
4089 GLint internalformat,
4090 GLsizei width,
4091 GLsizei height,
4092 GLsizei depth,
4093 GLint border,
4094 GLenum format,
4095 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004096 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004097{
Jamie Madillbc918e72018-03-08 09:47:21 -05004098 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004099
4100 Extents size(width, height, depth);
4101 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004102 handleError(texture->setImage(this, mGLState.getUnpackState(),
4103 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004104 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004105}
4106
Brandon Jones59770802018-04-02 13:18:42 -07004107void Context::texImage3DRobust(TextureType target,
4108 GLint level,
4109 GLint internalformat,
4110 GLsizei width,
4111 GLsizei height,
4112 GLsizei depth,
4113 GLint border,
4114 GLenum format,
4115 GLenum type,
4116 GLsizei bufSize,
4117 const void *pixels)
4118{
4119 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4120}
4121
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004122void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004123 GLint level,
4124 GLint xoffset,
4125 GLint yoffset,
4126 GLsizei width,
4127 GLsizei height,
4128 GLenum format,
4129 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004130 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004131{
4132 // Zero sized uploads are valid but no-ops
4133 if (width == 0 || height == 0)
4134 {
4135 return;
4136 }
4137
Jamie Madillbc918e72018-03-08 09:47:21 -05004138 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004139
4140 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004141 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004142
4143 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4144
4145 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4146 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004147}
4148
Brandon Jones59770802018-04-02 13:18:42 -07004149void Context::texSubImage2DRobust(TextureTarget target,
4150 GLint level,
4151 GLint xoffset,
4152 GLint yoffset,
4153 GLsizei width,
4154 GLsizei height,
4155 GLenum format,
4156 GLenum type,
4157 GLsizei bufSize,
4158 const void *pixels)
4159{
4160 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4161}
4162
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004163void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004164 GLint level,
4165 GLint xoffset,
4166 GLint yoffset,
4167 GLint zoffset,
4168 GLsizei width,
4169 GLsizei height,
4170 GLsizei depth,
4171 GLenum format,
4172 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004173 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004174{
4175 // Zero sized uploads are valid but no-ops
4176 if (width == 0 || height == 0 || depth == 0)
4177 {
4178 return;
4179 }
4180
Jamie Madillbc918e72018-03-08 09:47:21 -05004181 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004182
4183 Box area(xoffset, yoffset, zoffset, width, height, depth);
4184 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004185
4186 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4187
4188 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004189 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004190 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004191}
4192
Brandon Jones59770802018-04-02 13:18:42 -07004193void Context::texSubImage3DRobust(TextureType target,
4194 GLint level,
4195 GLint xoffset,
4196 GLint yoffset,
4197 GLint zoffset,
4198 GLsizei width,
4199 GLsizei height,
4200 GLsizei depth,
4201 GLenum format,
4202 GLenum type,
4203 GLsizei bufSize,
4204 const void *pixels)
4205{
4206 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4207 pixels);
4208}
4209
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004210void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004211 GLint level,
4212 GLenum internalformat,
4213 GLsizei width,
4214 GLsizei height,
4215 GLint border,
4216 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004217 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004218{
Jamie Madillbc918e72018-03-08 09:47:21 -05004219 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004220
4221 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004222 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004223 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4224 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004225 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004226}
4227
Brandon Jones59770802018-04-02 13:18:42 -07004228void Context::compressedTexImage2DRobust(TextureTarget target,
4229 GLint level,
4230 GLenum internalformat,
4231 GLsizei width,
4232 GLsizei height,
4233 GLint border,
4234 GLsizei imageSize,
4235 GLsizei dataSize,
4236 const GLvoid *data)
4237{
4238 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4239}
4240
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004241void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004242 GLint level,
4243 GLenum internalformat,
4244 GLsizei width,
4245 GLsizei height,
4246 GLsizei depth,
4247 GLint border,
4248 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004249 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004250{
Jamie Madillbc918e72018-03-08 09:47:21 -05004251 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004252
4253 Extents size(width, height, depth);
4254 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004255 handleError(texture->setCompressedImage(
4256 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004257 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004258}
4259
Brandon Jones59770802018-04-02 13:18:42 -07004260void Context::compressedTexImage3DRobust(TextureType target,
4261 GLint level,
4262 GLenum internalformat,
4263 GLsizei width,
4264 GLsizei height,
4265 GLsizei depth,
4266 GLint border,
4267 GLsizei imageSize,
4268 GLsizei dataSize,
4269 const GLvoid *data)
4270{
4271 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4272 data);
4273}
4274
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004275void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004276 GLint level,
4277 GLint xoffset,
4278 GLint yoffset,
4279 GLsizei width,
4280 GLsizei height,
4281 GLenum format,
4282 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004283 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004284{
Jamie Madillbc918e72018-03-08 09:47:21 -05004285 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004286
4287 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004288 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004289 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4290 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004291 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004292}
4293
Brandon Jones59770802018-04-02 13:18:42 -07004294void Context::compressedTexSubImage2DRobust(TextureTarget target,
4295 GLint level,
4296 GLint xoffset,
4297 GLint yoffset,
4298 GLsizei width,
4299 GLsizei height,
4300 GLenum format,
4301 GLsizei imageSize,
4302 GLsizei dataSize,
4303 const GLvoid *data)
4304{
4305 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4306 data);
4307}
4308
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004309void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004310 GLint level,
4311 GLint xoffset,
4312 GLint yoffset,
4313 GLint zoffset,
4314 GLsizei width,
4315 GLsizei height,
4316 GLsizei depth,
4317 GLenum format,
4318 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004319 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004320{
4321 // Zero sized uploads are valid but no-ops
4322 if (width == 0 || height == 0)
4323 {
4324 return;
4325 }
4326
Jamie Madillbc918e72018-03-08 09:47:21 -05004327 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004328
4329 Box area(xoffset, yoffset, zoffset, width, height, depth);
4330 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004331 handleError(texture->setCompressedSubImage(
4332 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004333 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004334}
4335
Brandon Jones59770802018-04-02 13:18:42 -07004336void Context::compressedTexSubImage3DRobust(TextureType target,
4337 GLint level,
4338 GLint xoffset,
4339 GLint yoffset,
4340 GLint zoffset,
4341 GLsizei width,
4342 GLsizei height,
4343 GLsizei depth,
4344 GLenum format,
4345 GLsizei imageSize,
4346 GLsizei dataSize,
4347 const GLvoid *data)
4348{
4349 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4350 imageSize, data);
4351}
4352
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004353void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004354{
4355 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004356 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004357}
4358
Jamie Madill007530e2017-12-28 14:27:04 -05004359void Context::copyTexture(GLuint sourceId,
4360 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004361 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004362 GLuint destId,
4363 GLint destLevel,
4364 GLint internalFormat,
4365 GLenum destType,
4366 GLboolean unpackFlipY,
4367 GLboolean unpackPremultiplyAlpha,
4368 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004369{
Jamie Madillbc918e72018-03-08 09:47:21 -05004370 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004371
4372 gl::Texture *sourceTexture = getTexture(sourceId);
4373 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004374 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4375 sourceLevel, ConvertToBool(unpackFlipY),
4376 ConvertToBool(unpackPremultiplyAlpha),
4377 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004378}
4379
Jamie Madill007530e2017-12-28 14:27:04 -05004380void Context::copySubTexture(GLuint sourceId,
4381 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004382 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004383 GLuint destId,
4384 GLint destLevel,
4385 GLint xoffset,
4386 GLint yoffset,
4387 GLint x,
4388 GLint y,
4389 GLsizei width,
4390 GLsizei height,
4391 GLboolean unpackFlipY,
4392 GLboolean unpackPremultiplyAlpha,
4393 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004394{
4395 // Zero sized copies are valid but no-ops
4396 if (width == 0 || height == 0)
4397 {
4398 return;
4399 }
4400
Jamie Madillbc918e72018-03-08 09:47:21 -05004401 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004402
4403 gl::Texture *sourceTexture = getTexture(sourceId);
4404 gl::Texture *destTexture = getTexture(destId);
4405 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004406 Box box(x, y, 0, width, height, 1);
4407 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4408 ConvertToBool(unpackFlipY),
4409 ConvertToBool(unpackPremultiplyAlpha),
4410 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4411}
4412
4413void Context::copyTexture3D(GLuint sourceId,
4414 GLint sourceLevel,
4415 TextureTarget destTarget,
4416 GLuint destId,
4417 GLint destLevel,
4418 GLint internalFormat,
4419 GLenum destType,
4420 GLboolean unpackFlipY,
4421 GLboolean unpackPremultiplyAlpha,
4422 GLboolean unpackUnmultiplyAlpha)
4423{
4424 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4425
4426 Texture *sourceTexture = getTexture(sourceId);
4427 Texture *destTexture = getTexture(destId);
4428 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4429 sourceLevel, ConvertToBool(unpackFlipY),
4430 ConvertToBool(unpackPremultiplyAlpha),
4431 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4432}
4433
4434void Context::copySubTexture3D(GLuint sourceId,
4435 GLint sourceLevel,
4436 TextureTarget destTarget,
4437 GLuint destId,
4438 GLint destLevel,
4439 GLint xoffset,
4440 GLint yoffset,
4441 GLint zoffset,
4442 GLint x,
4443 GLint y,
4444 GLint z,
4445 GLsizei width,
4446 GLsizei height,
4447 GLsizei depth,
4448 GLboolean unpackFlipY,
4449 GLboolean unpackPremultiplyAlpha,
4450 GLboolean unpackUnmultiplyAlpha)
4451{
4452 // Zero sized copies are valid but no-ops
4453 if (width == 0 || height == 0 || depth == 0)
4454 {
4455 return;
4456 }
4457
4458 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4459
4460 Texture *sourceTexture = getTexture(sourceId);
4461 Texture *destTexture = getTexture(destId);
4462 Offset offset(xoffset, yoffset, zoffset);
4463 Box box(x, y, z, width, height, depth);
4464 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004465 ConvertToBool(unpackFlipY),
4466 ConvertToBool(unpackPremultiplyAlpha),
4467 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004468}
4469
Jamie Madill007530e2017-12-28 14:27:04 -05004470void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004471{
Jamie Madillbc918e72018-03-08 09:47:21 -05004472 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004473
4474 gl::Texture *sourceTexture = getTexture(sourceId);
4475 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004476 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004477}
4478
Corentin Wallez336129f2017-10-17 15:55:40 -04004479void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004480{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004481 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004482 ASSERT(buffer);
4483
Geoff Lang496c02d2016-10-20 11:38:11 -07004484 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004485}
4486
Brandon Jones59770802018-04-02 13:18:42 -07004487void Context::getBufferPointervRobust(BufferBinding target,
4488 GLenum pname,
4489 GLsizei bufSize,
4490 GLsizei *length,
4491 void **params)
4492{
4493 getBufferPointerv(target, pname, params);
4494}
4495
Corentin Wallez336129f2017-10-17 15:55:40 -04004496void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004497{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004498 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004499 ASSERT(buffer);
4500
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004501 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004502 if (error.isError())
4503 {
Jamie Madill437fa652016-05-03 15:13:24 -04004504 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004505 return nullptr;
4506 }
4507
4508 return buffer->getMapPointer();
4509}
4510
Corentin Wallez336129f2017-10-17 15:55:40 -04004511GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004512{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004513 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004514 ASSERT(buffer);
4515
4516 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004517 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004518 if (error.isError())
4519 {
Jamie Madill437fa652016-05-03 15:13:24 -04004520 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004521 return GL_FALSE;
4522 }
4523
4524 return result;
4525}
4526
Corentin Wallez336129f2017-10-17 15:55:40 -04004527void *Context::mapBufferRange(BufferBinding target,
4528 GLintptr offset,
4529 GLsizeiptr length,
4530 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004531{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004532 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004533 ASSERT(buffer);
4534
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004535 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004536 if (error.isError())
4537 {
Jamie Madill437fa652016-05-03 15:13:24 -04004538 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004539 return nullptr;
4540 }
4541
4542 return buffer->getMapPointer();
4543}
4544
Corentin Wallez336129f2017-10-17 15:55:40 -04004545void Context::flushMappedBufferRange(BufferBinding /*target*/,
4546 GLintptr /*offset*/,
4547 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004548{
4549 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4550}
4551
Jamie Madillbc918e72018-03-08 09:47:21 -05004552Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004553{
Geoff Langa8cb2872018-03-09 16:09:40 -05004554 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004555}
4556
Jamie Madillbc918e72018-03-08 09:47:21 -05004557Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004558{
Geoff Langa8cb2872018-03-09 16:09:40 -05004559 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004560}
4561
Jamie Madillbc918e72018-03-08 09:47:21 -05004562Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004563{
Geoff Langa8cb2872018-03-09 16:09:40 -05004564 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004565}
4566
Geoff Lang9bf86f02018-07-26 11:46:34 -04004567Error Context::syncStateForPathOperation()
4568{
4569 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4570
4571 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4572 ANGLE_TRY(syncDirtyBits());
4573
4574 return NoError();
4575}
4576
Jiajia Qin5451d532017-11-16 17:16:34 +08004577void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4578{
4579 UNIMPLEMENTED();
4580}
4581
Jamie Madillc20ab272016-06-09 07:20:46 -07004582void Context::activeTexture(GLenum texture)
4583{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004584 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004585}
4586
Jamie Madill876429b2017-04-20 15:46:24 -04004587void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004588{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004589 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004590}
4591
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004592void Context::blendEquation(GLenum mode)
4593{
4594 mGLState.setBlendEquation(mode, mode);
4595}
4596
Jamie Madillc20ab272016-06-09 07:20:46 -07004597void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4598{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004599 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004600}
4601
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004602void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4603{
4604 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4605}
4606
Jamie Madillc20ab272016-06-09 07:20:46 -07004607void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4608{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004609 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004610}
4611
Jamie Madill876429b2017-04-20 15:46:24 -04004612void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004613{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004614 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004615}
4616
Jamie Madill876429b2017-04-20 15:46:24 -04004617void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004618{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004619 mGLState.setDepthClearValue(clamp01(depth));
Jamie Madillc20ab272016-06-09 07:20:46 -07004620}
4621
4622void Context::clearStencil(GLint s)
4623{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004624 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004625}
4626
4627void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4628{
Geoff Lang92019432017-11-20 13:09:34 -05004629 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4630 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004631}
4632
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004633void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004634{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004635 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004636}
4637
4638void Context::depthFunc(GLenum func)
4639{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004640 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004641}
4642
4643void Context::depthMask(GLboolean flag)
4644{
Geoff Lang92019432017-11-20 13:09:34 -05004645 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004646}
4647
Jamie Madill876429b2017-04-20 15:46:24 -04004648void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004649{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004650 mGLState.setDepthRange(clamp01(zNear), clamp01(zFar));
Jamie Madillc20ab272016-06-09 07:20:46 -07004651}
4652
4653void Context::disable(GLenum cap)
4654{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004655 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004656 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004657}
4658
4659void Context::disableVertexAttribArray(GLuint index)
4660{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004661 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004662 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004663}
4664
4665void Context::enable(GLenum cap)
4666{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004667 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004668 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004669}
4670
4671void Context::enableVertexAttribArray(GLuint index)
4672{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004673 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004674 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004675}
4676
4677void Context::frontFace(GLenum mode)
4678{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004679 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004680}
4681
4682void Context::hint(GLenum target, GLenum mode)
4683{
4684 switch (target)
4685 {
4686 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004687 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004688 break;
4689
4690 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004691 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004692 break;
4693
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004694 case GL_PERSPECTIVE_CORRECTION_HINT:
4695 case GL_POINT_SMOOTH_HINT:
4696 case GL_LINE_SMOOTH_HINT:
4697 case GL_FOG_HINT:
4698 mGLState.gles1().setHint(target, mode);
4699 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004700 default:
4701 UNREACHABLE();
4702 return;
4703 }
4704}
4705
4706void Context::lineWidth(GLfloat width)
4707{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004708 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004709}
4710
4711void Context::pixelStorei(GLenum pname, GLint param)
4712{
4713 switch (pname)
4714 {
4715 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004716 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004717 break;
4718
4719 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004720 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004721 break;
4722
4723 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004724 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004725 break;
4726
4727 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004728 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004729 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004730 break;
4731
4732 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004733 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004734 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004735 break;
4736
4737 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004738 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004739 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004740 break;
4741
4742 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004743 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004744 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004745 break;
4746
4747 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004748 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004749 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004750 break;
4751
4752 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004753 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004754 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004755 break;
4756
4757 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004758 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004759 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004760 break;
4761
4762 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004763 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004764 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004765 break;
4766
4767 default:
4768 UNREACHABLE();
4769 return;
4770 }
4771}
4772
4773void Context::polygonOffset(GLfloat factor, GLfloat units)
4774{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004775 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004776}
4777
Jamie Madill876429b2017-04-20 15:46:24 -04004778void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004779{
Geoff Lang92019432017-11-20 13:09:34 -05004780 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004781}
4782
Jiawei Shaodb342272017-09-27 10:21:45 +08004783void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4784{
4785 mGLState.setSampleMaskParams(maskNumber, mask);
4786}
4787
Jamie Madillc20ab272016-06-09 07:20:46 -07004788void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4789{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004790 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004791}
4792
4793void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4794{
4795 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4796 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004797 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004798 }
4799
4800 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4801 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004802 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004803 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004804
4805 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004806}
4807
4808void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4809{
4810 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4811 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004812 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004813 }
4814
4815 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4816 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004817 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004818 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004819
4820 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004821}
4822
4823void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4824{
4825 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4826 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004827 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004828 }
4829
4830 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4831 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004832 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004833 }
4834}
4835
4836void Context::vertexAttrib1f(GLuint index, GLfloat x)
4837{
4838 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004839 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004840 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004841}
4842
4843void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4844{
4845 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004846 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004847 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004848}
4849
4850void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4851{
4852 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004853 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004854 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004855}
4856
4857void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4858{
4859 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004860 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004861 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004862}
4863
4864void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4865{
4866 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004867 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004868 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004869}
4870
4871void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4872{
4873 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004874 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004875 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004876}
4877
4878void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4879{
4880 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004881 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004882 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004883}
4884
4885void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4886{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004887 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004888 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004889}
4890
4891void Context::vertexAttribPointer(GLuint index,
4892 GLint size,
4893 GLenum type,
4894 GLboolean normalized,
4895 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004896 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004897{
Corentin Wallez336129f2017-10-17 15:55:40 -04004898 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004899 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004900 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004901}
4902
Shao80957d92017-02-20 21:25:59 +08004903void Context::vertexAttribFormat(GLuint attribIndex,
4904 GLint size,
4905 GLenum type,
4906 GLboolean normalized,
4907 GLuint relativeOffset)
4908{
Geoff Lang92019432017-11-20 13:09:34 -05004909 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004910 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004911 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004912}
4913
4914void Context::vertexAttribIFormat(GLuint attribIndex,
4915 GLint size,
4916 GLenum type,
4917 GLuint relativeOffset)
4918{
4919 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004920 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004921}
4922
4923void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4924{
Shaodde78e82017-05-22 14:13:27 +08004925 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004926 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004927}
4928
Jiajia Qin5451d532017-11-16 17:16:34 +08004929void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004930{
4931 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004932 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004933}
4934
Jamie Madillc20ab272016-06-09 07:20:46 -07004935void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4936{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004937 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004938}
4939
4940void Context::vertexAttribIPointer(GLuint index,
4941 GLint size,
4942 GLenum type,
4943 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004944 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004945{
Corentin Wallez336129f2017-10-17 15:55:40 -04004946 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4947 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004948 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004949}
4950
4951void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4952{
4953 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004954 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004955 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004956}
4957
4958void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4959{
4960 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004961 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004962 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004963}
4964
4965void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4966{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004967 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004968 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004969}
4970
4971void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4972{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004973 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004974 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004975}
4976
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004977void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4978{
4979 const VertexAttribCurrentValueData &currentValues =
4980 getGLState().getVertexAttribCurrentValue(index);
4981 const VertexArray *vao = getGLState().getVertexArray();
4982 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4983 currentValues, pname, params);
4984}
4985
Brandon Jones59770802018-04-02 13:18:42 -07004986void Context::getVertexAttribivRobust(GLuint index,
4987 GLenum pname,
4988 GLsizei bufSize,
4989 GLsizei *length,
4990 GLint *params)
4991{
4992 getVertexAttribiv(index, pname, params);
4993}
4994
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004995void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4996{
4997 const VertexAttribCurrentValueData &currentValues =
4998 getGLState().getVertexAttribCurrentValue(index);
4999 const VertexArray *vao = getGLState().getVertexArray();
5000 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5001 currentValues, pname, params);
5002}
5003
Brandon Jones59770802018-04-02 13:18:42 -07005004void Context::getVertexAttribfvRobust(GLuint index,
5005 GLenum pname,
5006 GLsizei bufSize,
5007 GLsizei *length,
5008 GLfloat *params)
5009{
5010 getVertexAttribfv(index, pname, params);
5011}
5012
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005013void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
5014{
5015 const VertexAttribCurrentValueData &currentValues =
5016 getGLState().getVertexAttribCurrentValue(index);
5017 const VertexArray *vao = getGLState().getVertexArray();
5018 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5019 currentValues, pname, params);
5020}
5021
Brandon Jones59770802018-04-02 13:18:42 -07005022void Context::getVertexAttribIivRobust(GLuint index,
5023 GLenum pname,
5024 GLsizei bufSize,
5025 GLsizei *length,
5026 GLint *params)
5027{
5028 getVertexAttribIiv(index, pname, params);
5029}
5030
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005031void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
5032{
5033 const VertexAttribCurrentValueData &currentValues =
5034 getGLState().getVertexAttribCurrentValue(index);
5035 const VertexArray *vao = getGLState().getVertexArray();
5036 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5037 currentValues, pname, params);
5038}
5039
Brandon Jones59770802018-04-02 13:18:42 -07005040void Context::getVertexAttribIuivRobust(GLuint index,
5041 GLenum pname,
5042 GLsizei bufSize,
5043 GLsizei *length,
5044 GLuint *params)
5045{
5046 getVertexAttribIuiv(index, pname, params);
5047}
5048
Jamie Madill876429b2017-04-20 15:46:24 -04005049void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005050{
5051 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
5052 QueryVertexAttribPointerv(attrib, pname, pointer);
5053}
5054
Brandon Jones59770802018-04-02 13:18:42 -07005055void Context::getVertexAttribPointervRobust(GLuint index,
5056 GLenum pname,
5057 GLsizei bufSize,
5058 GLsizei *length,
5059 void **pointer)
5060{
5061 getVertexAttribPointerv(index, pname, pointer);
5062}
5063
Jamie Madillc20ab272016-06-09 07:20:46 -07005064void Context::debugMessageControl(GLenum source,
5065 GLenum type,
5066 GLenum severity,
5067 GLsizei count,
5068 const GLuint *ids,
5069 GLboolean enabled)
5070{
5071 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005072 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05005073 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07005074}
5075
5076void Context::debugMessageInsert(GLenum source,
5077 GLenum type,
5078 GLuint id,
5079 GLenum severity,
5080 GLsizei length,
5081 const GLchar *buf)
5082{
5083 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005084 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005085}
5086
5087void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5088{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005089 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005090}
5091
5092GLuint Context::getDebugMessageLog(GLuint count,
5093 GLsizei bufSize,
5094 GLenum *sources,
5095 GLenum *types,
5096 GLuint *ids,
5097 GLenum *severities,
5098 GLsizei *lengths,
5099 GLchar *messageLog)
5100{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005101 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5102 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005103}
5104
5105void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5106{
5107 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005108 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005109 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005110}
5111
5112void Context::popDebugGroup()
5113{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005114 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005115 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005116}
5117
Corentin Wallez336129f2017-10-17 15:55:40 -04005118void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005119{
5120 Buffer *buffer = mGLState.getTargetBuffer(target);
5121 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005122 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005123}
5124
Corentin Wallez336129f2017-10-17 15:55:40 -04005125void Context::bufferSubData(BufferBinding target,
5126 GLintptr offset,
5127 GLsizeiptr size,
5128 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005129{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005130 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005131 {
5132 return;
5133 }
5134
5135 Buffer *buffer = mGLState.getTargetBuffer(target);
5136 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005137 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005138}
5139
Jamie Madillef300b12016-10-07 15:12:09 -04005140void Context::attachShader(GLuint program, GLuint shader)
5141{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005142 Program *programObject = mState.mShaderPrograms->getProgram(program);
5143 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005144 ASSERT(programObject && shaderObject);
5145 programObject->attachShader(shaderObject);
5146}
5147
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005148const Workarounds &Context::getWorkarounds() const
5149{
5150 return mWorkarounds;
5151}
5152
Corentin Wallez336129f2017-10-17 15:55:40 -04005153void Context::copyBufferSubData(BufferBinding readTarget,
5154 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005155 GLintptr readOffset,
5156 GLintptr writeOffset,
5157 GLsizeiptr size)
5158{
5159 // if size is zero, the copy is a successful no-op
5160 if (size == 0)
5161 {
5162 return;
5163 }
5164
5165 // TODO(jmadill): cache these.
5166 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5167 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5168
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005169 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005170}
5171
Jamie Madill01a80ee2016-11-07 12:06:18 -05005172void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5173{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005174 // Ideally we could share the program query with the validation layer if possible.
5175 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005176 ASSERT(programObject);
5177 programObject->bindAttributeLocation(index, name);
5178}
5179
Corentin Wallez336129f2017-10-17 15:55:40 -04005180void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005181{
Corentin Wallez336129f2017-10-17 15:55:40 -04005182 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5183 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005184 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005185}
5186
Corentin Wallez336129f2017-10-17 15:55:40 -04005187void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005188{
5189 bindBufferRange(target, index, buffer, 0, 0);
5190}
5191
Corentin Wallez336129f2017-10-17 15:55:40 -04005192void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005193 GLuint index,
5194 GLuint buffer,
5195 GLintptr offset,
5196 GLsizeiptr size)
5197{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005198 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5199 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5200 if (target == BufferBinding::Uniform)
5201 {
Jamie Madill472ddc82018-10-18 18:41:56 -04005202 mUniformBufferObserverBindings[index].bind(object);
Jamie Madilld84b6732018-09-06 15:54:35 -04005203 mStateCache.onUniformBufferStateChange(this);
5204 }
5205 else
5206 {
5207 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005208 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005209}
5210
Jamie Madill01a80ee2016-11-07 12:06:18 -05005211void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5212{
5213 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5214 {
5215 bindReadFramebuffer(framebuffer);
5216 }
5217
5218 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5219 {
5220 bindDrawFramebuffer(framebuffer);
5221 }
5222}
5223
5224void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5225{
5226 ASSERT(target == GL_RENDERBUFFER);
5227 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005228 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005229 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005230}
5231
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005232void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005233 GLsizei samples,
5234 GLenum internalformat,
5235 GLsizei width,
5236 GLsizei height,
5237 GLboolean fixedsamplelocations)
5238{
5239 Extents size(width, height, 1);
5240 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005241 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5242 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005243}
5244
Olli Etuaho89664842018-08-24 14:45:36 +03005245void Context::texStorage3DMultisample(TextureType target,
5246 GLsizei samples,
5247 GLenum internalformat,
5248 GLsizei width,
5249 GLsizei height,
5250 GLsizei depth,
5251 GLboolean fixedsamplelocations)
5252{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005253 Extents size(width, height, depth);
5254 Texture *texture = getTargetTexture(target);
5255 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5256 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005257}
5258
JiangYizhoubddc46b2016-12-09 09:50:51 +08005259void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5260{
JiangYizhou5b03f472017-01-09 10:22:53 +08005261 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5262 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005263 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005264 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005265
5266 switch (pname)
5267 {
5268 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005269 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005270 break;
5271 default:
5272 UNREACHABLE();
5273 }
5274}
5275
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005276void Context::getMultisamplefvRobust(GLenum pname,
5277 GLuint index,
5278 GLsizei bufSize,
5279 GLsizei *length,
5280 GLfloat *val)
5281{
5282 UNIMPLEMENTED();
5283}
5284
Jamie Madille8fb6402017-02-14 17:56:40 -05005285void Context::renderbufferStorage(GLenum target,
5286 GLenum internalformat,
5287 GLsizei width,
5288 GLsizei height)
5289{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005290 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5291 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5292
Jamie Madille8fb6402017-02-14 17:56:40 -05005293 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005294 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005295}
5296
5297void Context::renderbufferStorageMultisample(GLenum target,
5298 GLsizei samples,
5299 GLenum internalformat,
5300 GLsizei width,
5301 GLsizei height)
5302{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005303 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5304 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005305
5306 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005307 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005308 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005309}
5310
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005311void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5312{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005313 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005314 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005315}
5316
JiangYizhoue18e6392017-02-20 10:32:23 +08005317void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5318{
5319 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5320 QueryFramebufferParameteriv(framebuffer, pname, params);
5321}
5322
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005323void Context::getFramebufferParameterivRobust(GLenum target,
5324 GLenum pname,
5325 GLsizei bufSize,
5326 GLsizei *length,
5327 GLint *params)
5328{
5329 UNIMPLEMENTED();
5330}
5331
Jiajia Qin5451d532017-11-16 17:16:34 +08005332void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005333{
5334 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005335 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005336}
5337
Jamie Madilldec86232018-07-11 09:01:18 -04005338bool Context::getScratchBuffer(size_t requstedSizeBytes,
5339 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005340{
Jamie Madilldec86232018-07-11 09:01:18 -04005341 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005342}
5343
Jamie Madilldec86232018-07-11 09:01:18 -04005344bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5345 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005346{
Jamie Madilldec86232018-07-11 09:01:18 -04005347 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005348}
5349
Xinghua Cao10a4d432017-11-28 14:46:26 +08005350Error Context::prepareForDispatch()
5351{
Jamie Madill0cc11c62018-10-12 18:07:18 -04005352 ANGLE_TRY(syncDirtyObjects(mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005353
5354 if (isRobustResourceInitEnabled())
5355 {
5356 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5357 }
5358
Jamie Madill0cc11c62018-10-12 18:07:18 -04005359 return syncDirtyBits(mComputeDirtyBits);
Xinghua Cao10a4d432017-11-28 14:46:26 +08005360}
5361
Xinghua Cao2b396592017-03-29 15:36:04 +08005362void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5363{
5364 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5365 {
5366 return;
5367 }
5368
Xinghua Cao10a4d432017-11-28 14:46:26 +08005369 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005370 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005371}
5372
Jiajia Qin5451d532017-11-16 17:16:34 +08005373void Context::dispatchComputeIndirect(GLintptr indirect)
5374{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005375 ANGLE_CONTEXT_TRY(prepareForDispatch());
5376 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005377}
5378
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005379void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005380 GLsizei levels,
5381 GLenum internalFormat,
5382 GLsizei width,
5383 GLsizei height)
5384{
5385 Extents size(width, height, 1);
5386 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005387 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005388}
5389
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005390void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005391 GLsizei levels,
5392 GLenum internalFormat,
5393 GLsizei width,
5394 GLsizei height,
5395 GLsizei depth)
5396{
5397 Extents size(width, height, depth);
5398 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005399 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005400}
5401
Jiajia Qin5451d532017-11-16 17:16:34 +08005402void Context::memoryBarrier(GLbitfield barriers)
5403{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005404 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005405}
5406
5407void Context::memoryBarrierByRegion(GLbitfield barriers)
5408{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005409 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005410}
5411
Jamie Madillc1d770e2017-04-13 17:31:24 -04005412GLenum Context::checkFramebufferStatus(GLenum target)
5413{
5414 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5415 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005416 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005417}
5418
5419void Context::compileShader(GLuint shader)
5420{
5421 Shader *shaderObject = GetValidShader(this, shader);
5422 if (!shaderObject)
5423 {
5424 return;
5425 }
5426 shaderObject->compile(this);
5427}
5428
5429void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5430{
5431 for (int i = 0; i < n; i++)
5432 {
5433 deleteBuffer(buffers[i]);
5434 }
5435}
5436
5437void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5438{
5439 for (int i = 0; i < n; i++)
5440 {
5441 if (framebuffers[i] != 0)
5442 {
5443 deleteFramebuffer(framebuffers[i]);
5444 }
5445 }
5446}
5447
5448void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5449{
5450 for (int i = 0; i < n; i++)
5451 {
5452 deleteRenderbuffer(renderbuffers[i]);
5453 }
5454}
5455
5456void Context::deleteTextures(GLsizei n, const GLuint *textures)
5457{
5458 for (int i = 0; i < n; i++)
5459 {
5460 if (textures[i] != 0)
5461 {
5462 deleteTexture(textures[i]);
5463 }
5464 }
5465}
5466
5467void Context::detachShader(GLuint program, GLuint shader)
5468{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005469 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005470 ASSERT(programObject);
5471
5472 Shader *shaderObject = getShader(shader);
5473 ASSERT(shaderObject);
5474
5475 programObject->detachShader(this, shaderObject);
5476}
5477
5478void Context::genBuffers(GLsizei n, GLuint *buffers)
5479{
5480 for (int i = 0; i < n; i++)
5481 {
5482 buffers[i] = createBuffer();
5483 }
5484}
5485
5486void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5487{
5488 for (int i = 0; i < n; i++)
5489 {
5490 framebuffers[i] = createFramebuffer();
5491 }
5492}
5493
5494void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5495{
5496 for (int i = 0; i < n; i++)
5497 {
5498 renderbuffers[i] = createRenderbuffer();
5499 }
5500}
5501
5502void Context::genTextures(GLsizei n, GLuint *textures)
5503{
5504 for (int i = 0; i < n; i++)
5505 {
5506 textures[i] = createTexture();
5507 }
5508}
5509
5510void Context::getActiveAttrib(GLuint program,
5511 GLuint index,
5512 GLsizei bufsize,
5513 GLsizei *length,
5514 GLint *size,
5515 GLenum *type,
5516 GLchar *name)
5517{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005518 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005519 ASSERT(programObject);
5520 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5521}
5522
5523void Context::getActiveUniform(GLuint program,
5524 GLuint index,
5525 GLsizei bufsize,
5526 GLsizei *length,
5527 GLint *size,
5528 GLenum *type,
5529 GLchar *name)
5530{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005531 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005532 ASSERT(programObject);
5533 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5534}
5535
5536void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5537{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005538 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005539 ASSERT(programObject);
5540 programObject->getAttachedShaders(maxcount, count, shaders);
5541}
5542
5543GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5544{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005545 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005546 ASSERT(programObject);
5547 return programObject->getAttributeLocation(name);
5548}
5549
5550void Context::getBooleanv(GLenum pname, GLboolean *params)
5551{
5552 GLenum nativeType;
5553 unsigned int numParams = 0;
5554 getQueryParameterInfo(pname, &nativeType, &numParams);
5555
5556 if (nativeType == GL_BOOL)
5557 {
5558 getBooleanvImpl(pname, params);
5559 }
5560 else
5561 {
5562 CastStateValues(this, nativeType, pname, numParams, params);
5563 }
5564}
5565
Brandon Jones59770802018-04-02 13:18:42 -07005566void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5567{
5568 getBooleanv(pname, params);
5569}
5570
Jamie Madillc1d770e2017-04-13 17:31:24 -04005571void Context::getFloatv(GLenum pname, GLfloat *params)
5572{
5573 GLenum nativeType;
5574 unsigned int numParams = 0;
5575 getQueryParameterInfo(pname, &nativeType, &numParams);
5576
5577 if (nativeType == GL_FLOAT)
5578 {
5579 getFloatvImpl(pname, params);
5580 }
5581 else
5582 {
5583 CastStateValues(this, nativeType, pname, numParams, params);
5584 }
5585}
5586
Brandon Jones59770802018-04-02 13:18:42 -07005587void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5588{
5589 getFloatv(pname, params);
5590}
5591
Jamie Madillc1d770e2017-04-13 17:31:24 -04005592void Context::getIntegerv(GLenum pname, GLint *params)
5593{
5594 GLenum nativeType;
5595 unsigned int numParams = 0;
5596 getQueryParameterInfo(pname, &nativeType, &numParams);
5597
5598 if (nativeType == GL_INT)
5599 {
5600 getIntegervImpl(pname, params);
5601 }
5602 else
5603 {
5604 CastStateValues(this, nativeType, pname, numParams, params);
5605 }
5606}
5607
Brandon Jones59770802018-04-02 13:18:42 -07005608void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5609{
5610 getIntegerv(pname, data);
5611}
5612
Jamie Madillc1d770e2017-04-13 17:31:24 -04005613void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5614{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005615 // Don't resolve link if checking the link completion status.
5616 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5617 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005618 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005619 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005620}
5621
Brandon Jones59770802018-04-02 13:18:42 -07005622void Context::getProgramivRobust(GLuint program,
5623 GLenum pname,
5624 GLsizei bufSize,
5625 GLsizei *length,
5626 GLint *params)
5627{
5628 getProgramiv(program, pname, params);
5629}
5630
Jiajia Qin5451d532017-11-16 17:16:34 +08005631void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5632{
5633 UNIMPLEMENTED();
5634}
5635
Jamie Madillbe849e42017-05-02 15:49:00 -04005636void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005637{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005638 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005639 ASSERT(programObject);
5640 programObject->getInfoLog(bufsize, length, infolog);
5641}
5642
Jiajia Qin5451d532017-11-16 17:16:34 +08005643void Context::getProgramPipelineInfoLog(GLuint pipeline,
5644 GLsizei bufSize,
5645 GLsizei *length,
5646 GLchar *infoLog)
5647{
5648 UNIMPLEMENTED();
5649}
5650
Jamie Madillc1d770e2017-04-13 17:31:24 -04005651void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5652{
5653 Shader *shaderObject = getShader(shader);
5654 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005655 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005656}
5657
Brandon Jones59770802018-04-02 13:18:42 -07005658void Context::getShaderivRobust(GLuint shader,
5659 GLenum pname,
5660 GLsizei bufSize,
5661 GLsizei *length,
5662 GLint *params)
5663{
5664 getShaderiv(shader, pname, params);
5665}
5666
Jamie Madillc1d770e2017-04-13 17:31:24 -04005667void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5668{
5669 Shader *shaderObject = getShader(shader);
5670 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005671 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005672}
5673
5674void Context::getShaderPrecisionFormat(GLenum shadertype,
5675 GLenum precisiontype,
5676 GLint *range,
5677 GLint *precision)
5678{
5679 // TODO(jmadill): Compute shaders.
5680
5681 switch (shadertype)
5682 {
5683 case GL_VERTEX_SHADER:
5684 switch (precisiontype)
5685 {
5686 case GL_LOW_FLOAT:
5687 mCaps.vertexLowpFloat.get(range, precision);
5688 break;
5689 case GL_MEDIUM_FLOAT:
5690 mCaps.vertexMediumpFloat.get(range, precision);
5691 break;
5692 case GL_HIGH_FLOAT:
5693 mCaps.vertexHighpFloat.get(range, precision);
5694 break;
5695
5696 case GL_LOW_INT:
5697 mCaps.vertexLowpInt.get(range, precision);
5698 break;
5699 case GL_MEDIUM_INT:
5700 mCaps.vertexMediumpInt.get(range, precision);
5701 break;
5702 case GL_HIGH_INT:
5703 mCaps.vertexHighpInt.get(range, precision);
5704 break;
5705
5706 default:
5707 UNREACHABLE();
5708 return;
5709 }
5710 break;
5711
5712 case GL_FRAGMENT_SHADER:
5713 switch (precisiontype)
5714 {
5715 case GL_LOW_FLOAT:
5716 mCaps.fragmentLowpFloat.get(range, precision);
5717 break;
5718 case GL_MEDIUM_FLOAT:
5719 mCaps.fragmentMediumpFloat.get(range, precision);
5720 break;
5721 case GL_HIGH_FLOAT:
5722 mCaps.fragmentHighpFloat.get(range, precision);
5723 break;
5724
5725 case GL_LOW_INT:
5726 mCaps.fragmentLowpInt.get(range, precision);
5727 break;
5728 case GL_MEDIUM_INT:
5729 mCaps.fragmentMediumpInt.get(range, precision);
5730 break;
5731 case GL_HIGH_INT:
5732 mCaps.fragmentHighpInt.get(range, precision);
5733 break;
5734
5735 default:
5736 UNREACHABLE();
5737 return;
5738 }
5739 break;
5740
5741 default:
5742 UNREACHABLE();
5743 return;
5744 }
5745}
5746
5747void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5748{
5749 Shader *shaderObject = getShader(shader);
5750 ASSERT(shaderObject);
5751 shaderObject->getSource(bufsize, length, source);
5752}
5753
5754void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5755{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005756 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005757 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005758 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005759}
5760
Brandon Jones59770802018-04-02 13:18:42 -07005761void Context::getUniformfvRobust(GLuint program,
5762 GLint location,
5763 GLsizei bufSize,
5764 GLsizei *length,
5765 GLfloat *params)
5766{
5767 getUniformfv(program, location, params);
5768}
5769
Jamie Madillc1d770e2017-04-13 17:31:24 -04005770void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5771{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005772 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005773 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005774 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005775}
5776
Brandon Jones59770802018-04-02 13:18:42 -07005777void Context::getUniformivRobust(GLuint program,
5778 GLint location,
5779 GLsizei bufSize,
5780 GLsizei *length,
5781 GLint *params)
5782{
5783 getUniformiv(program, location, params);
5784}
5785
Jamie Madillc1d770e2017-04-13 17:31:24 -04005786GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5787{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005788 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005789 ASSERT(programObject);
5790 return programObject->getUniformLocation(name);
5791}
5792
5793GLboolean Context::isBuffer(GLuint buffer)
5794{
5795 if (buffer == 0)
5796 {
5797 return GL_FALSE;
5798 }
5799
5800 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5801}
5802
5803GLboolean Context::isEnabled(GLenum cap)
5804{
5805 return mGLState.getEnableFeature(cap);
5806}
5807
5808GLboolean Context::isFramebuffer(GLuint framebuffer)
5809{
5810 if (framebuffer == 0)
5811 {
5812 return GL_FALSE;
5813 }
5814
5815 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5816}
5817
5818GLboolean Context::isProgram(GLuint program)
5819{
5820 if (program == 0)
5821 {
5822 return GL_FALSE;
5823 }
5824
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005825 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005826}
5827
5828GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5829{
5830 if (renderbuffer == 0)
5831 {
5832 return GL_FALSE;
5833 }
5834
5835 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5836}
5837
5838GLboolean Context::isShader(GLuint shader)
5839{
5840 if (shader == 0)
5841 {
5842 return GL_FALSE;
5843 }
5844
5845 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5846}
5847
5848GLboolean Context::isTexture(GLuint texture)
5849{
5850 if (texture == 0)
5851 {
5852 return GL_FALSE;
5853 }
5854
5855 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5856}
5857
5858void Context::linkProgram(GLuint program)
5859{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005860 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005861 ASSERT(programObject);
5862 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08005863
5864 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
5865 // don't need to worry that:
5866 // 1. Draw calls after link use the new executable code or the old one depending on the link
5867 // result.
5868 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
5869 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
5870 // ProgramD3D.
5871 if (programObject->isInUse())
5872 {
Jamie Madill785e8a02018-10-04 17:42:00 -04005873 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04005874 if (programObject->isLinked())
5875 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04005876 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04005877 }
jchen107ae70d82018-07-06 13:47:01 +08005878 mStateCache.onProgramExecutableChange(this);
5879 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005880}
5881
5882void Context::releaseShaderCompiler()
5883{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005884 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005885}
5886
5887void Context::shaderBinary(GLsizei n,
5888 const GLuint *shaders,
5889 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005890 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005891 GLsizei length)
5892{
5893 // No binary shader formats are supported.
5894 UNIMPLEMENTED();
5895}
5896
Olli Etuaho0ca09752018-09-24 11:00:50 +03005897void Context::bindFragDataLocationIndexed(GLuint program,
5898 GLuint colorNumber,
5899 GLuint index,
5900 const char *name)
5901{
5902 Program *programObject = getProgramNoResolveLink(program);
5903 programObject->bindFragmentOutputLocation(colorNumber, name);
5904 programObject->bindFragmentOutputIndex(index, name);
5905}
5906
5907void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
5908{
5909 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
5910}
5911
5912int Context::getFragDataIndex(GLuint program, const char *name)
5913{
5914 Program *programObject = getProgramResolveLink(program);
5915 return programObject->getFragDataIndex(name);
5916}
5917
5918int Context::getProgramResourceLocationIndex(GLuint program,
5919 GLenum programInterface,
5920 const char *name)
5921{
5922 Program *programObject = getProgramResolveLink(program);
5923 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
5924 return programObject->getFragDataIndex(name);
5925}
5926
Jamie Madillc1d770e2017-04-13 17:31:24 -04005927void Context::shaderSource(GLuint shader,
5928 GLsizei count,
5929 const GLchar *const *string,
5930 const GLint *length)
5931{
5932 Shader *shaderObject = getShader(shader);
5933 ASSERT(shaderObject);
5934 shaderObject->setSource(count, string, length);
5935}
5936
5937void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5938{
5939 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5940}
5941
5942void Context::stencilMask(GLuint mask)
5943{
5944 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5945}
5946
5947void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5948{
5949 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5950}
5951
5952void Context::uniform1f(GLint location, GLfloat x)
5953{
5954 Program *program = mGLState.getProgram();
5955 program->setUniform1fv(location, 1, &x);
5956}
5957
5958void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5959{
5960 Program *program = mGLState.getProgram();
5961 program->setUniform1fv(location, count, v);
5962}
5963
Jamie Madill7e4eff12018-08-08 15:49:26 -04005964void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005965{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005966 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04005967 {
5968 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04005969 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04005970 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005971}
5972
Jamie Madill7e4eff12018-08-08 15:49:26 -04005973void Context::uniform1i(GLint location, GLint x)
5974{
5975 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
5976}
5977
Jamie Madillc1d770e2017-04-13 17:31:24 -04005978void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5979{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005980 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005981}
5982
5983void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5984{
5985 GLfloat xy[2] = {x, y};
5986 Program *program = mGLState.getProgram();
5987 program->setUniform2fv(location, 1, xy);
5988}
5989
5990void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5991{
5992 Program *program = mGLState.getProgram();
5993 program->setUniform2fv(location, count, v);
5994}
5995
5996void Context::uniform2i(GLint location, GLint x, GLint y)
5997{
5998 GLint xy[2] = {x, y};
5999 Program *program = mGLState.getProgram();
6000 program->setUniform2iv(location, 1, xy);
6001}
6002
6003void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
6004{
6005 Program *program = mGLState.getProgram();
6006 program->setUniform2iv(location, count, v);
6007}
6008
6009void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6010{
6011 GLfloat xyz[3] = {x, y, z};
6012 Program *program = mGLState.getProgram();
6013 program->setUniform3fv(location, 1, xyz);
6014}
6015
6016void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
6017{
6018 Program *program = mGLState.getProgram();
6019 program->setUniform3fv(location, count, v);
6020}
6021
6022void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
6023{
6024 GLint xyz[3] = {x, y, z};
6025 Program *program = mGLState.getProgram();
6026 program->setUniform3iv(location, 1, xyz);
6027}
6028
6029void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
6030{
6031 Program *program = mGLState.getProgram();
6032 program->setUniform3iv(location, count, v);
6033}
6034
6035void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6036{
6037 GLfloat xyzw[4] = {x, y, z, w};
6038 Program *program = mGLState.getProgram();
6039 program->setUniform4fv(location, 1, xyzw);
6040}
6041
6042void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
6043{
6044 Program *program = mGLState.getProgram();
6045 program->setUniform4fv(location, count, v);
6046}
6047
6048void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6049{
6050 GLint xyzw[4] = {x, y, z, w};
6051 Program *program = mGLState.getProgram();
6052 program->setUniform4iv(location, 1, xyzw);
6053}
6054
6055void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
6056{
6057 Program *program = mGLState.getProgram();
6058 program->setUniform4iv(location, count, v);
6059}
6060
6061void Context::uniformMatrix2fv(GLint location,
6062 GLsizei count,
6063 GLboolean transpose,
6064 const GLfloat *value)
6065{
6066 Program *program = mGLState.getProgram();
6067 program->setUniformMatrix2fv(location, count, transpose, value);
6068}
6069
6070void Context::uniformMatrix3fv(GLint location,
6071 GLsizei count,
6072 GLboolean transpose,
6073 const GLfloat *value)
6074{
6075 Program *program = mGLState.getProgram();
6076 program->setUniformMatrix3fv(location, count, transpose, value);
6077}
6078
6079void Context::uniformMatrix4fv(GLint location,
6080 GLsizei count,
6081 GLboolean transpose,
6082 const GLfloat *value)
6083{
6084 Program *program = mGLState.getProgram();
6085 program->setUniformMatrix4fv(location, count, transpose, value);
6086}
6087
6088void Context::validateProgram(GLuint program)
6089{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006090 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006091 ASSERT(programObject);
6092 programObject->validate(mCaps);
6093}
6094
Jiajia Qin5451d532017-11-16 17:16:34 +08006095void Context::validateProgramPipeline(GLuint pipeline)
6096{
6097 UNIMPLEMENTED();
6098}
6099
Jamie Madilld04908b2017-06-09 14:15:35 -04006100void Context::getProgramBinary(GLuint program,
6101 GLsizei bufSize,
6102 GLsizei *length,
6103 GLenum *binaryFormat,
6104 void *binary)
6105{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006106 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006107 ASSERT(programObject != nullptr);
6108
6109 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
6110}
6111
6112void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6113{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006114 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006115 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006116
Jamie Madilld04908b2017-06-09 14:15:35 -04006117 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006118 if (programObject->isInUse())
6119 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006120 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006121 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006122 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006123}
6124
Jamie Madillff325f12017-08-26 15:06:05 -04006125void Context::uniform1ui(GLint location, GLuint v0)
6126{
6127 Program *program = mGLState.getProgram();
6128 program->setUniform1uiv(location, 1, &v0);
6129}
6130
6131void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6132{
6133 Program *program = mGLState.getProgram();
6134 const GLuint xy[] = {v0, v1};
6135 program->setUniform2uiv(location, 1, xy);
6136}
6137
6138void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6139{
6140 Program *program = mGLState.getProgram();
6141 const GLuint xyz[] = {v0, v1, v2};
6142 program->setUniform3uiv(location, 1, xyz);
6143}
6144
6145void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6146{
6147 Program *program = mGLState.getProgram();
6148 const GLuint xyzw[] = {v0, v1, v2, v3};
6149 program->setUniform4uiv(location, 1, xyzw);
6150}
6151
6152void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6153{
6154 Program *program = mGLState.getProgram();
6155 program->setUniform1uiv(location, count, value);
6156}
6157void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6158{
6159 Program *program = mGLState.getProgram();
6160 program->setUniform2uiv(location, count, value);
6161}
6162
6163void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6164{
6165 Program *program = mGLState.getProgram();
6166 program->setUniform3uiv(location, count, value);
6167}
6168
6169void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6170{
6171 Program *program = mGLState.getProgram();
6172 program->setUniform4uiv(location, count, value);
6173}
6174
Jamie Madillf0e04492017-08-26 15:28:42 -04006175void Context::genQueries(GLsizei n, GLuint *ids)
6176{
6177 for (GLsizei i = 0; i < n; i++)
6178 {
6179 GLuint handle = mQueryHandleAllocator.allocate();
6180 mQueryMap.assign(handle, nullptr);
6181 ids[i] = handle;
6182 }
6183}
6184
6185void Context::deleteQueries(GLsizei n, const GLuint *ids)
6186{
6187 for (int i = 0; i < n; i++)
6188 {
6189 GLuint query = ids[i];
6190
6191 Query *queryObject = nullptr;
6192 if (mQueryMap.erase(query, &queryObject))
6193 {
6194 mQueryHandleAllocator.release(query);
6195 if (queryObject)
6196 {
6197 queryObject->release(this);
6198 }
6199 }
6200 }
6201}
6202
6203GLboolean Context::isQuery(GLuint id)
6204{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006205 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006206}
6207
Jamie Madillc8c95812017-08-26 18:40:09 -04006208void Context::uniformMatrix2x3fv(GLint location,
6209 GLsizei count,
6210 GLboolean transpose,
6211 const GLfloat *value)
6212{
6213 Program *program = mGLState.getProgram();
6214 program->setUniformMatrix2x3fv(location, count, transpose, value);
6215}
6216
6217void Context::uniformMatrix3x2fv(GLint location,
6218 GLsizei count,
6219 GLboolean transpose,
6220 const GLfloat *value)
6221{
6222 Program *program = mGLState.getProgram();
6223 program->setUniformMatrix3x2fv(location, count, transpose, value);
6224}
6225
6226void Context::uniformMatrix2x4fv(GLint location,
6227 GLsizei count,
6228 GLboolean transpose,
6229 const GLfloat *value)
6230{
6231 Program *program = mGLState.getProgram();
6232 program->setUniformMatrix2x4fv(location, count, transpose, value);
6233}
6234
6235void Context::uniformMatrix4x2fv(GLint location,
6236 GLsizei count,
6237 GLboolean transpose,
6238 const GLfloat *value)
6239{
6240 Program *program = mGLState.getProgram();
6241 program->setUniformMatrix4x2fv(location, count, transpose, value);
6242}
6243
6244void Context::uniformMatrix3x4fv(GLint location,
6245 GLsizei count,
6246 GLboolean transpose,
6247 const GLfloat *value)
6248{
6249 Program *program = mGLState.getProgram();
6250 program->setUniformMatrix3x4fv(location, count, transpose, value);
6251}
6252
6253void Context::uniformMatrix4x3fv(GLint location,
6254 GLsizei count,
6255 GLboolean transpose,
6256 const GLfloat *value)
6257{
6258 Program *program = mGLState.getProgram();
6259 program->setUniformMatrix4x3fv(location, count, transpose, value);
6260}
6261
Jamie Madilld7576732017-08-26 18:49:50 -04006262void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6263{
6264 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6265 {
6266 GLuint vertexArray = arrays[arrayIndex];
6267
6268 if (arrays[arrayIndex] != 0)
6269 {
6270 VertexArray *vertexArrayObject = nullptr;
6271 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6272 {
6273 if (vertexArrayObject != nullptr)
6274 {
6275 detachVertexArray(vertexArray);
6276 vertexArrayObject->onDestroy(this);
6277 }
6278
6279 mVertexArrayHandleAllocator.release(vertexArray);
6280 }
6281 }
6282 }
6283}
6284
6285void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6286{
6287 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6288 {
6289 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6290 mVertexArrayMap.assign(vertexArray, nullptr);
6291 arrays[arrayIndex] = vertexArray;
6292 }
6293}
6294
6295bool Context::isVertexArray(GLuint array)
6296{
6297 if (array == 0)
6298 {
6299 return GL_FALSE;
6300 }
6301
6302 VertexArray *vao = getVertexArray(array);
6303 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6304}
6305
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006306void Context::endTransformFeedback()
6307{
6308 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6309 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006310 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006311}
6312
6313void Context::transformFeedbackVaryings(GLuint program,
6314 GLsizei count,
6315 const GLchar *const *varyings,
6316 GLenum bufferMode)
6317{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006318 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006319 ASSERT(programObject);
6320 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6321}
6322
6323void Context::getTransformFeedbackVarying(GLuint program,
6324 GLuint index,
6325 GLsizei bufSize,
6326 GLsizei *length,
6327 GLsizei *size,
6328 GLenum *type,
6329 GLchar *name)
6330{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006331 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006332 ASSERT(programObject);
6333 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6334}
6335
6336void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6337{
6338 for (int i = 0; i < n; i++)
6339 {
6340 GLuint transformFeedback = ids[i];
6341 if (transformFeedback == 0)
6342 {
6343 continue;
6344 }
6345
6346 TransformFeedback *transformFeedbackObject = nullptr;
6347 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6348 {
6349 if (transformFeedbackObject != nullptr)
6350 {
6351 detachTransformFeedback(transformFeedback);
6352 transformFeedbackObject->release(this);
6353 }
6354
6355 mTransformFeedbackHandleAllocator.release(transformFeedback);
6356 }
6357 }
6358}
6359
6360void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6361{
6362 for (int i = 0; i < n; i++)
6363 {
6364 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6365 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6366 ids[i] = transformFeedback;
6367 }
6368}
6369
6370bool Context::isTransformFeedback(GLuint id)
6371{
6372 if (id == 0)
6373 {
6374 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6375 // returns FALSE
6376 return GL_FALSE;
6377 }
6378
6379 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6380 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6381}
6382
6383void Context::pauseTransformFeedback()
6384{
6385 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6386 transformFeedback->pause();
6387}
6388
6389void Context::resumeTransformFeedback()
6390{
6391 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6392 transformFeedback->resume();
6393}
6394
Jamie Madill12e957f2017-08-26 21:42:26 -04006395void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6396{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006397 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006398 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006399}
6400
Brandon Jones59770802018-04-02 13:18:42 -07006401void Context::getUniformuivRobust(GLuint program,
6402 GLint location,
6403 GLsizei bufSize,
6404 GLsizei *length,
6405 GLuint *params)
6406{
6407 getUniformuiv(program, location, params);
6408}
6409
Jamie Madill12e957f2017-08-26 21:42:26 -04006410GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6411{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006412 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006413 return programObject->getFragDataLocation(name);
6414}
6415
6416void Context::getUniformIndices(GLuint program,
6417 GLsizei uniformCount,
6418 const GLchar *const *uniformNames,
6419 GLuint *uniformIndices)
6420{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006421 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006422 if (!programObject->isLinked())
6423 {
6424 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6425 {
6426 uniformIndices[uniformId] = GL_INVALID_INDEX;
6427 }
6428 }
6429 else
6430 {
6431 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6432 {
6433 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6434 }
6435 }
6436}
6437
6438void Context::getActiveUniformsiv(GLuint program,
6439 GLsizei uniformCount,
6440 const GLuint *uniformIndices,
6441 GLenum pname,
6442 GLint *params)
6443{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006444 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006445 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6446 {
6447 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006448 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006449 }
6450}
6451
6452GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6453{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006454 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006455 return programObject->getUniformBlockIndex(uniformBlockName);
6456}
6457
6458void Context::getActiveUniformBlockiv(GLuint program,
6459 GLuint uniformBlockIndex,
6460 GLenum pname,
6461 GLint *params)
6462{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006463 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006464 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6465}
6466
Brandon Jones59770802018-04-02 13:18:42 -07006467void Context::getActiveUniformBlockivRobust(GLuint program,
6468 GLuint uniformBlockIndex,
6469 GLenum pname,
6470 GLsizei bufSize,
6471 GLsizei *length,
6472 GLint *params)
6473{
6474 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6475}
6476
Jamie Madill12e957f2017-08-26 21:42:26 -04006477void Context::getActiveUniformBlockName(GLuint program,
6478 GLuint uniformBlockIndex,
6479 GLsizei bufSize,
6480 GLsizei *length,
6481 GLchar *uniformBlockName)
6482{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006483 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006484 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6485}
6486
6487void Context::uniformBlockBinding(GLuint program,
6488 GLuint uniformBlockIndex,
6489 GLuint uniformBlockBinding)
6490{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006491 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006492 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006493
Jamie Madill956ab4d2018-10-10 16:13:03 -04006494 // Note: If the Program is shared between Contexts we would be better using Observer/Subject.
Jamie Madill70aeda42018-08-20 12:17:40 -04006495 if (programObject->isInUse())
6496 {
6497 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006498 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006499 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006500}
6501
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006502GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6503{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006504 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6505 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006506
Jamie Madill70b5bb02017-08-28 13:32:37 -04006507 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006508 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006509 if (error.isError())
6510 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006511 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006512 handleError(error);
6513 return nullptr;
6514 }
6515
Jamie Madill70b5bb02017-08-28 13:32:37 -04006516 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006517}
6518
6519GLboolean Context::isSync(GLsync sync)
6520{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006521 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006522}
6523
6524GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6525{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006526 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006527
6528 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006529 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006530 return result;
6531}
6532
6533void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6534{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006535 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006536 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006537}
6538
6539void Context::getInteger64v(GLenum pname, GLint64 *params)
6540{
6541 GLenum nativeType = GL_NONE;
6542 unsigned int numParams = 0;
6543 getQueryParameterInfo(pname, &nativeType, &numParams);
6544
6545 if (nativeType == GL_INT_64_ANGLEX)
6546 {
6547 getInteger64vImpl(pname, params);
6548 }
6549 else
6550 {
6551 CastStateValues(this, nativeType, pname, numParams, params);
6552 }
6553}
6554
Brandon Jones59770802018-04-02 13:18:42 -07006555void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6556{
6557 getInteger64v(pname, data);
6558}
6559
Corentin Wallez336129f2017-10-17 15:55:40 -04006560void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006561{
6562 Buffer *buffer = mGLState.getTargetBuffer(target);
6563 QueryBufferParameteri64v(buffer, pname, params);
6564}
6565
Brandon Jones59770802018-04-02 13:18:42 -07006566void Context::getBufferParameteri64vRobust(BufferBinding target,
6567 GLenum pname,
6568 GLsizei bufSize,
6569 GLsizei *length,
6570 GLint64 *params)
6571{
6572 getBufferParameteri64v(target, pname, params);
6573}
6574
Jamie Madill3ef140a2017-08-26 23:11:21 -04006575void Context::genSamplers(GLsizei count, GLuint *samplers)
6576{
6577 for (int i = 0; i < count; i++)
6578 {
6579 samplers[i] = mState.mSamplers->createSampler();
6580 }
6581}
6582
6583void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6584{
6585 for (int i = 0; i < count; i++)
6586 {
6587 GLuint sampler = samplers[i];
6588
6589 if (mState.mSamplers->getSampler(sampler))
6590 {
6591 detachSampler(sampler);
6592 }
6593
6594 mState.mSamplers->deleteObject(this, sampler);
6595 }
6596}
6597
6598void Context::getInternalformativ(GLenum target,
6599 GLenum internalformat,
6600 GLenum pname,
6601 GLsizei bufSize,
6602 GLint *params)
6603{
6604 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6605 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6606}
6607
Brandon Jones59770802018-04-02 13:18:42 -07006608void Context::getInternalformativRobust(GLenum target,
6609 GLenum internalformat,
6610 GLenum pname,
6611 GLsizei bufSize,
6612 GLsizei *length,
6613 GLint *params)
6614{
6615 getInternalformativ(target, internalformat, pname, bufSize, params);
6616}
6617
Jiajia Qin5451d532017-11-16 17:16:34 +08006618void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6619{
6620 programUniform1iv(program, location, 1, &v0);
6621}
6622
6623void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6624{
6625 GLint xy[2] = {v0, v1};
6626 programUniform2iv(program, location, 1, xy);
6627}
6628
6629void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6630{
6631 GLint xyz[3] = {v0, v1, v2};
6632 programUniform3iv(program, location, 1, xyz);
6633}
6634
6635void Context::programUniform4i(GLuint program,
6636 GLint location,
6637 GLint v0,
6638 GLint v1,
6639 GLint v2,
6640 GLint v3)
6641{
6642 GLint xyzw[4] = {v0, v1, v2, v3};
6643 programUniform4iv(program, location, 1, xyzw);
6644}
6645
6646void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6647{
6648 programUniform1uiv(program, location, 1, &v0);
6649}
6650
6651void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6652{
6653 GLuint xy[2] = {v0, v1};
6654 programUniform2uiv(program, location, 1, xy);
6655}
6656
6657void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6658{
6659 GLuint xyz[3] = {v0, v1, v2};
6660 programUniform3uiv(program, location, 1, xyz);
6661}
6662
6663void Context::programUniform4ui(GLuint program,
6664 GLint location,
6665 GLuint v0,
6666 GLuint v1,
6667 GLuint v2,
6668 GLuint v3)
6669{
6670 GLuint xyzw[4] = {v0, v1, v2, v3};
6671 programUniform4uiv(program, location, 1, xyzw);
6672}
6673
6674void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6675{
6676 programUniform1fv(program, location, 1, &v0);
6677}
6678
6679void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6680{
6681 GLfloat xy[2] = {v0, v1};
6682 programUniform2fv(program, location, 1, xy);
6683}
6684
6685void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6686{
6687 GLfloat xyz[3] = {v0, v1, v2};
6688 programUniform3fv(program, location, 1, xyz);
6689}
6690
6691void Context::programUniform4f(GLuint program,
6692 GLint location,
6693 GLfloat v0,
6694 GLfloat v1,
6695 GLfloat v2,
6696 GLfloat v3)
6697{
6698 GLfloat xyzw[4] = {v0, v1, v2, v3};
6699 programUniform4fv(program, location, 1, xyzw);
6700}
6701
Jamie Madill81c2e252017-09-09 23:32:46 -04006702void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6703{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006704 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006705 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006706 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006707}
6708
Jiajia Qin5451d532017-11-16 17:16:34 +08006709void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6710{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006711 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006712 ASSERT(programObject);
6713 programObject->setUniform2iv(location, count, value);
6714}
6715
6716void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6717{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006718 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006719 ASSERT(programObject);
6720 programObject->setUniform3iv(location, count, value);
6721}
6722
6723void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6724{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006725 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006726 ASSERT(programObject);
6727 programObject->setUniform4iv(location, count, value);
6728}
6729
6730void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6731{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006732 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006733 ASSERT(programObject);
6734 programObject->setUniform1uiv(location, count, value);
6735}
6736
6737void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6738{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006739 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006740 ASSERT(programObject);
6741 programObject->setUniform2uiv(location, count, value);
6742}
6743
6744void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6745{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006746 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006747 ASSERT(programObject);
6748 programObject->setUniform3uiv(location, count, value);
6749}
6750
6751void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6752{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006753 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006754 ASSERT(programObject);
6755 programObject->setUniform4uiv(location, count, value);
6756}
6757
6758void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6759{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006760 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006761 ASSERT(programObject);
6762 programObject->setUniform1fv(location, count, value);
6763}
6764
6765void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6766{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006767 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006768 ASSERT(programObject);
6769 programObject->setUniform2fv(location, count, value);
6770}
6771
6772void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, 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->setUniform3fv(location, count, value);
6777}
6778
6779void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6780{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006781 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006782 ASSERT(programObject);
6783 programObject->setUniform4fv(location, count, value);
6784}
6785
6786void Context::programUniformMatrix2fv(GLuint program,
6787 GLint location,
6788 GLsizei count,
6789 GLboolean transpose,
6790 const GLfloat *value)
6791{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006792 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006793 ASSERT(programObject);
6794 programObject->setUniformMatrix2fv(location, count, transpose, value);
6795}
6796
6797void Context::programUniformMatrix3fv(GLuint program,
6798 GLint location,
6799 GLsizei count,
6800 GLboolean transpose,
6801 const GLfloat *value)
6802{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006803 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006804 ASSERT(programObject);
6805 programObject->setUniformMatrix3fv(location, count, transpose, value);
6806}
6807
6808void Context::programUniformMatrix4fv(GLuint program,
6809 GLint location,
6810 GLsizei count,
6811 GLboolean transpose,
6812 const GLfloat *value)
6813{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006814 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006815 ASSERT(programObject);
6816 programObject->setUniformMatrix4fv(location, count, transpose, value);
6817}
6818
6819void Context::programUniformMatrix2x3fv(GLuint program,
6820 GLint location,
6821 GLsizei count,
6822 GLboolean transpose,
6823 const GLfloat *value)
6824{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006825 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006826 ASSERT(programObject);
6827 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6828}
6829
6830void Context::programUniformMatrix3x2fv(GLuint program,
6831 GLint location,
6832 GLsizei count,
6833 GLboolean transpose,
6834 const GLfloat *value)
6835{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006836 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006837 ASSERT(programObject);
6838 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6839}
6840
6841void Context::programUniformMatrix2x4fv(GLuint program,
6842 GLint location,
6843 GLsizei count,
6844 GLboolean transpose,
6845 const GLfloat *value)
6846{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006847 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006848 ASSERT(programObject);
6849 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6850}
6851
6852void Context::programUniformMatrix4x2fv(GLuint program,
6853 GLint location,
6854 GLsizei count,
6855 GLboolean transpose,
6856 const GLfloat *value)
6857{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006858 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006859 ASSERT(programObject);
6860 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6861}
6862
6863void Context::programUniformMatrix3x4fv(GLuint program,
6864 GLint location,
6865 GLsizei count,
6866 GLboolean transpose,
6867 const GLfloat *value)
6868{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006869 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006870 ASSERT(programObject);
6871 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6872}
6873
6874void Context::programUniformMatrix4x3fv(GLuint program,
6875 GLint location,
6876 GLsizei count,
6877 GLboolean transpose,
6878 const GLfloat *value)
6879{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006880 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006881 ASSERT(programObject);
6882 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6883}
6884
Jamie Madill81c2e252017-09-09 23:32:46 -04006885void Context::onTextureChange(const Texture *texture)
6886{
6887 // Conservatively assume all textures are dirty.
6888 // TODO(jmadill): More fine-grained update.
6889 mGLState.setObjectDirty(GL_TEXTURE);
6890}
6891
James Darpiniane8a93c62018-01-04 18:02:24 -08006892bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6893{
6894 return mGLState.isCurrentTransformFeedback(tf);
6895}
James Darpiniane8a93c62018-01-04 18:02:24 -08006896
Yunchao Hea336b902017-08-02 16:05:21 +08006897void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6898{
6899 for (int i = 0; i < count; i++)
6900 {
6901 pipelines[i] = createProgramPipeline();
6902 }
6903}
6904
6905void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6906{
6907 for (int i = 0; i < count; i++)
6908 {
6909 if (pipelines[i] != 0)
6910 {
6911 deleteProgramPipeline(pipelines[i]);
6912 }
6913 }
6914}
6915
6916GLboolean Context::isProgramPipeline(GLuint pipeline)
6917{
6918 if (pipeline == 0)
6919 {
6920 return GL_FALSE;
6921 }
6922
6923 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6924}
6925
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006926void Context::finishFenceNV(GLuint fence)
6927{
6928 FenceNV *fenceObject = getFenceNV(fence);
6929
6930 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04006931 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006932}
6933
6934void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6935{
6936 FenceNV *fenceObject = getFenceNV(fence);
6937
6938 ASSERT(fenceObject && fenceObject->isSet());
6939
6940 switch (pname)
6941 {
6942 case GL_FENCE_STATUS_NV:
6943 {
6944 // GL_NV_fence spec:
6945 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6946 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6947 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6948 GLboolean status = GL_TRUE;
6949 if (fenceObject->getStatus() != GL_TRUE)
6950 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006951 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006952 }
6953 *params = status;
6954 break;
6955 }
6956
6957 case GL_FENCE_CONDITION_NV:
6958 {
6959 *params = static_cast<GLint>(fenceObject->getCondition());
6960 break;
6961 }
6962
6963 default:
6964 UNREACHABLE();
6965 }
6966}
6967
6968void Context::getTranslatedShaderSource(GLuint shader,
6969 GLsizei bufsize,
6970 GLsizei *length,
6971 GLchar *source)
6972{
6973 Shader *shaderObject = getShader(shader);
6974 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08006975 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006976}
6977
6978void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6979{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006980 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006981 ASSERT(programObject);
6982
6983 programObject->getUniformfv(this, location, params);
6984}
6985
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006986void Context::getnUniformfvRobust(GLuint program,
6987 GLint location,
6988 GLsizei bufSize,
6989 GLsizei *length,
6990 GLfloat *params)
6991{
6992 UNIMPLEMENTED();
6993}
6994
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006995void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
6996{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006997 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006998 ASSERT(programObject);
6999
7000 programObject->getUniformiv(this, location, params);
7001}
7002
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007003void Context::getnUniformivRobust(GLuint program,
7004 GLint location,
7005 GLsizei bufSize,
7006 GLsizei *length,
7007 GLint *params)
7008{
7009 UNIMPLEMENTED();
7010}
7011
7012void Context::getnUniformuivRobust(GLuint program,
7013 GLint location,
7014 GLsizei bufSize,
7015 GLsizei *length,
7016 GLuint *params)
7017{
7018 UNIMPLEMENTED();
7019}
7020
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007021GLboolean Context::isFenceNV(GLuint fence)
7022{
7023 FenceNV *fenceObject = getFenceNV(fence);
7024
7025 if (fenceObject == nullptr)
7026 {
7027 return GL_FALSE;
7028 }
7029
7030 // GL_NV_fence spec:
7031 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
7032 // existing fence.
7033 return fenceObject->isSet();
7034}
7035
7036void Context::readnPixels(GLint x,
7037 GLint y,
7038 GLsizei width,
7039 GLsizei height,
7040 GLenum format,
7041 GLenum type,
7042 GLsizei bufSize,
7043 void *data)
7044{
7045 return readPixels(x, y, width, height, format, type, data);
7046}
7047
Jamie Madill007530e2017-12-28 14:27:04 -05007048void Context::setFenceNV(GLuint fence, GLenum condition)
7049{
7050 ASSERT(condition == GL_ALL_COMPLETED_NV);
7051
7052 FenceNV *fenceObject = getFenceNV(fence);
7053 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04007054 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05007055}
7056
7057GLboolean Context::testFenceNV(GLuint fence)
7058{
7059 FenceNV *fenceObject = getFenceNV(fence);
7060
7061 ASSERT(fenceObject != nullptr);
7062 ASSERT(fenceObject->isSet() == GL_TRUE);
7063
7064 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04007065 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05007066 if (error.isError())
7067 {
7068 handleError(error);
7069 return GL_TRUE;
7070 }
7071
7072 return result;
7073}
7074
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007075void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007076{
7077 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007078 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05007079 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007080}
7081
Jamie Madillfa920eb2018-01-04 11:45:50 -05007082void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007083{
7084 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007085 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05007086 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
7087}
7088
Jamie Madillfa920eb2018-01-04 11:45:50 -05007089void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7090{
7091 UNIMPLEMENTED();
7092}
7093
Jamie Madill5b772312018-03-08 20:28:32 -05007094bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7095{
7096 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7097 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7098 // to the fact that it is stored internally as a float, and so would require conversion
7099 // if returned from Context::getIntegerv. Since this conversion is already implemented
7100 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7101 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7102 // application.
7103 switch (pname)
7104 {
7105 case GL_COMPRESSED_TEXTURE_FORMATS:
7106 {
7107 *type = GL_INT;
7108 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7109 return true;
7110 }
7111 case GL_SHADER_BINARY_FORMATS:
7112 {
7113 *type = GL_INT;
7114 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7115 return true;
7116 }
7117
7118 case GL_MAX_VERTEX_ATTRIBS:
7119 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7120 case GL_MAX_VARYING_VECTORS:
7121 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7122 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7123 case GL_MAX_TEXTURE_IMAGE_UNITS:
7124 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7125 case GL_MAX_RENDERBUFFER_SIZE:
7126 case GL_NUM_SHADER_BINARY_FORMATS:
7127 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7128 case GL_ARRAY_BUFFER_BINDING:
7129 case GL_FRAMEBUFFER_BINDING:
7130 case GL_RENDERBUFFER_BINDING:
7131 case GL_CURRENT_PROGRAM:
7132 case GL_PACK_ALIGNMENT:
7133 case GL_UNPACK_ALIGNMENT:
7134 case GL_GENERATE_MIPMAP_HINT:
7135 case GL_RED_BITS:
7136 case GL_GREEN_BITS:
7137 case GL_BLUE_BITS:
7138 case GL_ALPHA_BITS:
7139 case GL_DEPTH_BITS:
7140 case GL_STENCIL_BITS:
7141 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7142 case GL_CULL_FACE_MODE:
7143 case GL_FRONT_FACE:
7144 case GL_ACTIVE_TEXTURE:
7145 case GL_STENCIL_FUNC:
7146 case GL_STENCIL_VALUE_MASK:
7147 case GL_STENCIL_REF:
7148 case GL_STENCIL_FAIL:
7149 case GL_STENCIL_PASS_DEPTH_FAIL:
7150 case GL_STENCIL_PASS_DEPTH_PASS:
7151 case GL_STENCIL_BACK_FUNC:
7152 case GL_STENCIL_BACK_VALUE_MASK:
7153 case GL_STENCIL_BACK_REF:
7154 case GL_STENCIL_BACK_FAIL:
7155 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7156 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7157 case GL_DEPTH_FUNC:
7158 case GL_BLEND_SRC_RGB:
7159 case GL_BLEND_SRC_ALPHA:
7160 case GL_BLEND_DST_RGB:
7161 case GL_BLEND_DST_ALPHA:
7162 case GL_BLEND_EQUATION_RGB:
7163 case GL_BLEND_EQUATION_ALPHA:
7164 case GL_STENCIL_WRITEMASK:
7165 case GL_STENCIL_BACK_WRITEMASK:
7166 case GL_STENCIL_CLEAR_VALUE:
7167 case GL_SUBPIXEL_BITS:
7168 case GL_MAX_TEXTURE_SIZE:
7169 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7170 case GL_SAMPLE_BUFFERS:
7171 case GL_SAMPLES:
7172 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7173 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7174 case GL_TEXTURE_BINDING_2D:
7175 case GL_TEXTURE_BINDING_CUBE_MAP:
7176 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7177 {
7178 *type = GL_INT;
7179 *numParams = 1;
7180 return true;
7181 }
7182 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7183 {
7184 if (!getExtensions().packReverseRowOrder)
7185 {
7186 return false;
7187 }
7188 *type = GL_INT;
7189 *numParams = 1;
7190 return true;
7191 }
7192 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7193 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7194 {
7195 if (!getExtensions().textureRectangle)
7196 {
7197 return false;
7198 }
7199 *type = GL_INT;
7200 *numParams = 1;
7201 return true;
7202 }
7203 case GL_MAX_DRAW_BUFFERS_EXT:
7204 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7205 {
7206 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7207 {
7208 return false;
7209 }
7210 *type = GL_INT;
7211 *numParams = 1;
7212 return true;
7213 }
7214 case GL_MAX_VIEWPORT_DIMS:
7215 {
7216 *type = GL_INT;
7217 *numParams = 2;
7218 return true;
7219 }
7220 case GL_VIEWPORT:
7221 case GL_SCISSOR_BOX:
7222 {
7223 *type = GL_INT;
7224 *numParams = 4;
7225 return true;
7226 }
7227 case GL_SHADER_COMPILER:
7228 case GL_SAMPLE_COVERAGE_INVERT:
7229 case GL_DEPTH_WRITEMASK:
7230 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7231 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7232 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7233 // bool-natural
7234 case GL_SAMPLE_COVERAGE:
7235 case GL_SCISSOR_TEST:
7236 case GL_STENCIL_TEST:
7237 case GL_DEPTH_TEST:
7238 case GL_BLEND:
7239 case GL_DITHER:
7240 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7241 {
7242 *type = GL_BOOL;
7243 *numParams = 1;
7244 return true;
7245 }
7246 case GL_COLOR_WRITEMASK:
7247 {
7248 *type = GL_BOOL;
7249 *numParams = 4;
7250 return true;
7251 }
7252 case GL_POLYGON_OFFSET_FACTOR:
7253 case GL_POLYGON_OFFSET_UNITS:
7254 case GL_SAMPLE_COVERAGE_VALUE:
7255 case GL_DEPTH_CLEAR_VALUE:
7256 case GL_LINE_WIDTH:
7257 {
7258 *type = GL_FLOAT;
7259 *numParams = 1;
7260 return true;
7261 }
7262 case GL_ALIASED_LINE_WIDTH_RANGE:
7263 case GL_ALIASED_POINT_SIZE_RANGE:
7264 case GL_DEPTH_RANGE:
7265 {
7266 *type = GL_FLOAT;
7267 *numParams = 2;
7268 return true;
7269 }
7270 case GL_COLOR_CLEAR_VALUE:
7271 case GL_BLEND_COLOR:
7272 {
7273 *type = GL_FLOAT;
7274 *numParams = 4;
7275 return true;
7276 }
7277 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7278 if (!getExtensions().textureFilterAnisotropic)
7279 {
7280 return false;
7281 }
7282 *type = GL_FLOAT;
7283 *numParams = 1;
7284 return true;
7285 case GL_TIMESTAMP_EXT:
7286 if (!getExtensions().disjointTimerQuery)
7287 {
7288 return false;
7289 }
7290 *type = GL_INT_64_ANGLEX;
7291 *numParams = 1;
7292 return true;
7293 case GL_GPU_DISJOINT_EXT:
7294 if (!getExtensions().disjointTimerQuery)
7295 {
7296 return false;
7297 }
7298 *type = GL_INT;
7299 *numParams = 1;
7300 return true;
7301 case GL_COVERAGE_MODULATION_CHROMIUM:
7302 if (!getExtensions().framebufferMixedSamples)
7303 {
7304 return false;
7305 }
7306 *type = GL_INT;
7307 *numParams = 1;
7308 return true;
7309 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7310 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7311 {
7312 return false;
7313 }
7314 *type = GL_INT;
7315 *numParams = 1;
7316 return true;
7317 }
7318
7319 if (getExtensions().debug)
7320 {
7321 switch (pname)
7322 {
7323 case GL_DEBUG_LOGGED_MESSAGES:
7324 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7325 case GL_DEBUG_GROUP_STACK_DEPTH:
7326 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7327 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7328 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7329 case GL_MAX_LABEL_LENGTH:
7330 *type = GL_INT;
7331 *numParams = 1;
7332 return true;
7333
7334 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7335 case GL_DEBUG_OUTPUT:
7336 *type = GL_BOOL;
7337 *numParams = 1;
7338 return true;
7339 }
7340 }
7341
7342 if (getExtensions().multisampleCompatibility)
7343 {
7344 switch (pname)
7345 {
7346 case GL_MULTISAMPLE_EXT:
7347 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7348 *type = GL_BOOL;
7349 *numParams = 1;
7350 return true;
7351 }
7352 }
7353
7354 if (getExtensions().pathRendering)
7355 {
7356 switch (pname)
7357 {
7358 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7359 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7360 *type = GL_FLOAT;
7361 *numParams = 16;
7362 return true;
7363 }
7364 }
7365
7366 if (getExtensions().bindGeneratesResource)
7367 {
7368 switch (pname)
7369 {
7370 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7371 *type = GL_BOOL;
7372 *numParams = 1;
7373 return true;
7374 }
7375 }
7376
7377 if (getExtensions().clientArrays)
7378 {
7379 switch (pname)
7380 {
7381 case GL_CLIENT_ARRAYS_ANGLE:
7382 *type = GL_BOOL;
7383 *numParams = 1;
7384 return true;
7385 }
7386 }
7387
7388 if (getExtensions().sRGBWriteControl)
7389 {
7390 switch (pname)
7391 {
7392 case GL_FRAMEBUFFER_SRGB_EXT:
7393 *type = GL_BOOL;
7394 *numParams = 1;
7395 return true;
7396 }
7397 }
7398
7399 if (getExtensions().robustResourceInitialization &&
7400 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7401 {
7402 *type = GL_BOOL;
7403 *numParams = 1;
7404 return true;
7405 }
7406
7407 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7408 {
7409 *type = GL_BOOL;
7410 *numParams = 1;
7411 return true;
7412 }
7413
jchen1082af6202018-06-22 10:59:52 +08007414 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7415 {
7416 *type = GL_INT;
7417 *numParams = 1;
7418 return true;
7419 }
7420
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007421 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7422 {
7423 *type = GL_INT;
7424 *numParams = 1;
7425 return true;
7426 }
7427
Jamie Madill5b772312018-03-08 20:28:32 -05007428 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7429 switch (pname)
7430 {
7431 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7432 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7433 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7434 {
7435 return false;
7436 }
7437 *type = GL_INT;
7438 *numParams = 1;
7439 return true;
7440
7441 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7442 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7443 {
7444 return false;
7445 }
7446 *type = GL_INT;
7447 *numParams = 1;
7448 return true;
7449
7450 case GL_PROGRAM_BINARY_FORMATS_OES:
7451 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7452 {
7453 return false;
7454 }
7455 *type = GL_INT;
7456 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7457 return true;
7458
7459 case GL_PACK_ROW_LENGTH:
7460 case GL_PACK_SKIP_ROWS:
7461 case GL_PACK_SKIP_PIXELS:
7462 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7463 {
7464 return false;
7465 }
7466 *type = GL_INT;
7467 *numParams = 1;
7468 return true;
7469 case GL_UNPACK_ROW_LENGTH:
7470 case GL_UNPACK_SKIP_ROWS:
7471 case GL_UNPACK_SKIP_PIXELS:
7472 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7473 {
7474 return false;
7475 }
7476 *type = GL_INT;
7477 *numParams = 1;
7478 return true;
7479 case GL_VERTEX_ARRAY_BINDING:
7480 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7481 {
7482 return false;
7483 }
7484 *type = GL_INT;
7485 *numParams = 1;
7486 return true;
7487 case GL_PIXEL_PACK_BUFFER_BINDING:
7488 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7489 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7490 {
7491 return false;
7492 }
7493 *type = GL_INT;
7494 *numParams = 1;
7495 return true;
7496 case GL_MAX_SAMPLES:
7497 {
7498 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7499 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7500 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7501 {
7502 return false;
7503 }
7504 *type = GL_INT;
7505 *numParams = 1;
7506 return true;
7507
7508 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7509 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7510 {
7511 return false;
7512 }
7513 *type = GL_INT;
7514 *numParams = 1;
7515 return true;
7516 }
7517 }
7518
7519 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7520 {
7521 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7522 {
7523 return false;
7524 }
7525 *type = GL_INT;
7526 *numParams = 1;
7527 return true;
7528 }
7529
7530 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7531 {
7532 *type = GL_INT;
7533 *numParams = 1;
7534 return true;
7535 }
7536
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007537 if (getClientVersion() < Version(2, 0))
7538 {
7539 switch (pname)
7540 {
7541 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007542 case GL_CLIENT_ACTIVE_TEXTURE:
7543 case GL_MATRIX_MODE:
7544 case GL_MAX_TEXTURE_UNITS:
7545 case GL_MAX_MODELVIEW_STACK_DEPTH:
7546 case GL_MAX_PROJECTION_STACK_DEPTH:
7547 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007548 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007549 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007550 case GL_VERTEX_ARRAY_STRIDE:
7551 case GL_NORMAL_ARRAY_STRIDE:
7552 case GL_COLOR_ARRAY_STRIDE:
7553 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7554 case GL_VERTEX_ARRAY_SIZE:
7555 case GL_COLOR_ARRAY_SIZE:
7556 case GL_TEXTURE_COORD_ARRAY_SIZE:
7557 case GL_VERTEX_ARRAY_TYPE:
7558 case GL_NORMAL_ARRAY_TYPE:
7559 case GL_COLOR_ARRAY_TYPE:
7560 case GL_TEXTURE_COORD_ARRAY_TYPE:
7561 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7562 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7563 case GL_COLOR_ARRAY_BUFFER_BINDING:
7564 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7565 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7566 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7567 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007568 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007569 case GL_MODELVIEW_STACK_DEPTH:
7570 case GL_PROJECTION_STACK_DEPTH:
7571 case GL_TEXTURE_STACK_DEPTH:
7572 case GL_LOGIC_OP_MODE:
7573 case GL_BLEND_SRC:
7574 case GL_BLEND_DST:
7575 case GL_PERSPECTIVE_CORRECTION_HINT:
7576 case GL_POINT_SMOOTH_HINT:
7577 case GL_LINE_SMOOTH_HINT:
7578 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007579 *type = GL_INT;
7580 *numParams = 1;
7581 return true;
7582 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007583 case GL_FOG_DENSITY:
7584 case GL_FOG_START:
7585 case GL_FOG_END:
7586 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007587 case GL_POINT_SIZE:
7588 case GL_POINT_SIZE_MIN:
7589 case GL_POINT_SIZE_MAX:
7590 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007591 *type = GL_FLOAT;
7592 *numParams = 1;
7593 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007594 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007595 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007596 *type = GL_FLOAT;
7597 *numParams = 2;
7598 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007599 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007600 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007601 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007602 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007603 *type = GL_FLOAT;
7604 *numParams = 4;
7605 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007606 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007607 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007608 *type = GL_FLOAT;
7609 *numParams = 3;
7610 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007611 case GL_MODELVIEW_MATRIX:
7612 case GL_PROJECTION_MATRIX:
7613 case GL_TEXTURE_MATRIX:
7614 *type = GL_FLOAT;
7615 *numParams = 16;
7616 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007617 case GL_LIGHT_MODEL_TWO_SIDE:
7618 *type = GL_BOOL;
7619 *numParams = 1;
7620 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007621 }
7622 }
7623
Jamie Madill5b772312018-03-08 20:28:32 -05007624 if (getClientVersion() < Version(3, 0))
7625 {
7626 return false;
7627 }
7628
7629 // Check for ES3.0+ parameter names
7630 switch (pname)
7631 {
7632 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7633 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7634 case GL_UNIFORM_BUFFER_BINDING:
7635 case GL_TRANSFORM_FEEDBACK_BINDING:
7636 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7637 case GL_COPY_READ_BUFFER_BINDING:
7638 case GL_COPY_WRITE_BUFFER_BINDING:
7639 case GL_SAMPLER_BINDING:
7640 case GL_READ_BUFFER:
7641 case GL_TEXTURE_BINDING_3D:
7642 case GL_TEXTURE_BINDING_2D_ARRAY:
7643 case GL_MAX_3D_TEXTURE_SIZE:
7644 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7645 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7646 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7647 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7648 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7649 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7650 case GL_MAX_VARYING_COMPONENTS:
7651 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7652 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7653 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7654 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7655 case GL_NUM_EXTENSIONS:
7656 case GL_MAJOR_VERSION:
7657 case GL_MINOR_VERSION:
7658 case GL_MAX_ELEMENTS_INDICES:
7659 case GL_MAX_ELEMENTS_VERTICES:
7660 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7661 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7662 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7663 case GL_UNPACK_IMAGE_HEIGHT:
7664 case GL_UNPACK_SKIP_IMAGES:
7665 {
7666 *type = GL_INT;
7667 *numParams = 1;
7668 return true;
7669 }
7670
7671 case GL_MAX_ELEMENT_INDEX:
7672 case GL_MAX_UNIFORM_BLOCK_SIZE:
7673 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7674 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7675 case GL_MAX_SERVER_WAIT_TIMEOUT:
7676 {
7677 *type = GL_INT_64_ANGLEX;
7678 *numParams = 1;
7679 return true;
7680 }
7681
7682 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7683 case GL_TRANSFORM_FEEDBACK_PAUSED:
7684 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7685 case GL_RASTERIZER_DISCARD:
7686 {
7687 *type = GL_BOOL;
7688 *numParams = 1;
7689 return true;
7690 }
7691
7692 case GL_MAX_TEXTURE_LOD_BIAS:
7693 {
7694 *type = GL_FLOAT;
7695 *numParams = 1;
7696 return true;
7697 }
7698 }
7699
7700 if (getExtensions().requestExtension)
7701 {
7702 switch (pname)
7703 {
7704 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7705 *type = GL_INT;
7706 *numParams = 1;
7707 return true;
7708 }
7709 }
7710
Yizhou Jiang7818a852018-09-06 15:02:04 +08007711 if (getExtensions().textureMultisample)
7712 {
7713 switch (pname)
7714 {
7715 case GL_MAX_COLOR_TEXTURE_SAMPLES_ANGLE:
7716 case GL_MAX_INTEGER_SAMPLES_ANGLE:
7717 case GL_MAX_DEPTH_TEXTURE_SAMPLES_ANGLE:
7718 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE:
7719 *type = GL_INT;
7720 *numParams = 1;
7721 return true;
7722 }
7723 }
7724
Jamie Madill5b772312018-03-08 20:28:32 -05007725 if (getClientVersion() < Version(3, 1))
7726 {
7727 return false;
7728 }
7729
7730 switch (pname)
7731 {
7732 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7733 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7734 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7735 case GL_MAX_FRAMEBUFFER_WIDTH:
7736 case GL_MAX_FRAMEBUFFER_HEIGHT:
7737 case GL_MAX_FRAMEBUFFER_SAMPLES:
7738 case GL_MAX_SAMPLE_MASK_WORDS:
7739 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7740 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7741 case GL_MAX_INTEGER_SAMPLES:
7742 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7743 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7744 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7745 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7746 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7747 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7748 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7749 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7750 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7751 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7752 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7753 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7754 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7755 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7756 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7757 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7758 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7759 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7760 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7761 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7762 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7763 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7764 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7765 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7766 case GL_MAX_UNIFORM_LOCATIONS:
7767 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7768 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7769 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7770 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7771 case GL_MAX_IMAGE_UNITS:
7772 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7773 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7774 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7775 case GL_SHADER_STORAGE_BUFFER_BINDING:
7776 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7777 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007778 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007779 *type = GL_INT;
7780 *numParams = 1;
7781 return true;
7782 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7783 *type = GL_INT_64_ANGLEX;
7784 *numParams = 1;
7785 return true;
7786 case GL_SAMPLE_MASK:
7787 *type = GL_BOOL;
7788 *numParams = 1;
7789 return true;
7790 }
7791
7792 if (getExtensions().geometryShader)
7793 {
7794 switch (pname)
7795 {
7796 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7797 case GL_LAYER_PROVOKING_VERTEX_EXT:
7798 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7799 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7800 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7801 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7802 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7803 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7804 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7805 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7806 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7807 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7808 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7809 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7810 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7811 *type = GL_INT;
7812 *numParams = 1;
7813 return true;
7814 }
7815 }
7816
7817 return false;
7818}
7819
7820bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7821{
7822 if (getClientVersion() < Version(3, 0))
7823 {
7824 return false;
7825 }
7826
7827 switch (target)
7828 {
7829 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7830 case GL_UNIFORM_BUFFER_BINDING:
7831 {
7832 *type = GL_INT;
7833 *numParams = 1;
7834 return true;
7835 }
7836 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7837 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7838 case GL_UNIFORM_BUFFER_START:
7839 case GL_UNIFORM_BUFFER_SIZE:
7840 {
7841 *type = GL_INT_64_ANGLEX;
7842 *numParams = 1;
7843 return true;
7844 }
7845 }
7846
7847 if (getClientVersion() < Version(3, 1))
7848 {
7849 return false;
7850 }
7851
7852 switch (target)
7853 {
7854 case GL_IMAGE_BINDING_LAYERED:
7855 {
7856 *type = GL_BOOL;
7857 *numParams = 1;
7858 return true;
7859 }
7860 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7861 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7862 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7863 case GL_SHADER_STORAGE_BUFFER_BINDING:
7864 case GL_VERTEX_BINDING_BUFFER:
7865 case GL_VERTEX_BINDING_DIVISOR:
7866 case GL_VERTEX_BINDING_OFFSET:
7867 case GL_VERTEX_BINDING_STRIDE:
7868 case GL_SAMPLE_MASK_VALUE:
7869 case GL_IMAGE_BINDING_NAME:
7870 case GL_IMAGE_BINDING_LEVEL:
7871 case GL_IMAGE_BINDING_LAYER:
7872 case GL_IMAGE_BINDING_ACCESS:
7873 case GL_IMAGE_BINDING_FORMAT:
7874 {
7875 *type = GL_INT;
7876 *numParams = 1;
7877 return true;
7878 }
7879 case GL_ATOMIC_COUNTER_BUFFER_START:
7880 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7881 case GL_SHADER_STORAGE_BUFFER_START:
7882 case GL_SHADER_STORAGE_BUFFER_SIZE:
7883 {
7884 *type = GL_INT_64_ANGLEX;
7885 *numParams = 1;
7886 return true;
7887 }
7888 }
7889
7890 return false;
7891}
7892
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007893Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05007894{
7895 return mState.mShaderPrograms->getProgram(handle);
7896}
7897
7898Shader *Context::getShader(GLuint handle) const
7899{
7900 return mState.mShaderPrograms->getShader(handle);
7901}
7902
Jamie Madill5b772312018-03-08 20:28:32 -05007903bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7904{
7905 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7906}
7907
7908bool Context::isFramebufferGenerated(GLuint framebuffer) const
7909{
7910 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7911}
7912
7913bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7914{
7915 return mState.mPipelines->isHandleGenerated(pipeline);
7916}
7917
7918bool Context::usingDisplayTextureShareGroup() const
7919{
7920 return mDisplayTextureShareGroup;
7921}
7922
7923GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7924{
7925 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7926 internalformat == GL_DEPTH_STENCIL
7927 ? GL_DEPTH24_STENCIL8
7928 : internalformat;
7929}
7930
jchen1082af6202018-06-22 10:59:52 +08007931void Context::maxShaderCompilerThreads(GLuint count)
7932{
jchen107ae70d82018-07-06 13:47:01 +08007933 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08007934 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08007935 // A count of zero specifies a request for no parallel compiling or linking.
7936 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
7937 {
7938 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
7939 }
7940 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08007941}
7942
Jamie Madill2eb65032018-07-30 10:25:57 -04007943bool Context::isGLES1() const
7944{
7945 return mState.getClientVersion() < Version(2, 0);
7946}
7947
Jamie Madilla11819d2018-07-30 10:26:01 -04007948void Context::onSubjectStateChange(const Context *context,
7949 angle::SubjectIndex index,
7950 angle::SubjectMessage message)
7951{
Jamie Madilla11819d2018-07-30 10:26:01 -04007952 switch (index)
7953 {
7954 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007955 switch (message)
7956 {
7957 case angle::SubjectMessage::CONTENTS_CHANGED:
7958 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
7959 mStateCache.onVertexArrayBufferContentsChange(this);
7960 break;
7961 case angle::SubjectMessage::RESOURCE_MAPPED:
7962 case angle::SubjectMessage::RESOURCE_UNMAPPED:
7963 case angle::SubjectMessage::BINDING_CHANGED:
7964 mStateCache.onVertexArrayBufferStateChange(this);
7965 break;
7966 default:
7967 break;
7968 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007969 break;
7970
7971 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007972 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7973 {
7974 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
7975 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007976 break;
7977
7978 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007979 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7980 {
7981 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
7982 }
7983 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04007984 break;
7985
7986 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04007987 if (index < kTextureMaxSubjectIndex)
7988 {
7989 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04007990 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007991 }
Jamie Madille25b8002018-09-20 13:39:49 -04007992 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04007993 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04007994 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04007995 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007996 }
Jamie Madille25b8002018-09-20 13:39:49 -04007997 else
7998 {
7999 ASSERT(index < kSamplerMaxSubjectIndex);
8000 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
8001 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008002 break;
8003 }
8004}
8005
Jamie Madill6b873dd2018-07-12 23:56:30 -04008006// ErrorSet implementation.
8007ErrorSet::ErrorSet(Context *context) : mContext(context)
8008{
8009}
8010
8011ErrorSet::~ErrorSet() = default;
8012
Jamie Madill306b6c12018-07-27 08:12:49 -04008013void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04008014{
8015 // This internal enum is used to filter internal errors that are already handled.
8016 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
8017 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
8018 {
8019 return;
8020 }
8021
8022 if (ANGLE_UNLIKELY(error.isError()))
8023 {
8024 GLenum code = error.getCode();
8025 mErrors.insert(code);
Jamie Madill785e8a02018-10-04 17:42:00 -04008026
Jamie Madill6b873dd2018-07-12 23:56:30 -04008027 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
8028 {
8029 mContext->markContextLost();
8030 }
8031
8032 ASSERT(!error.getMessage().empty());
8033 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
8034 error.getID(), GL_DEBUG_SEVERITY_HIGH,
8035 error.getMessage());
8036 }
8037}
8038
Jamie Madillabfbc0f2018-10-09 12:48:52 -04008039void ErrorSet::handleError(GLenum errorCode,
8040 const char *message,
8041 const char *file,
8042 const char *function,
8043 unsigned int line)
8044{
8045 // TODO(jmadill): Handle error directly instead of creating object. http://anglebug.com/2491
8046 std::stringstream errorStream;
8047 errorStream << "Front-end Error: " << gl::FmtHex(errorCode) << ", in " << file << ", "
8048 << function << ":" << line << ". " << message;
8049
8050 handleError(gl::Error(errorCode, errorCode, errorStream.str()));
8051}
8052
Jamie Madilla139f012018-10-10 16:13:03 -04008053void ErrorSet::validationError(GLenum errorCode, const char *message)
8054{
8055 handleError(gl::Error(errorCode, message));
8056}
8057
Jamie Madill6b873dd2018-07-12 23:56:30 -04008058bool ErrorSet::empty() const
8059{
8060 return mErrors.empty();
8061}
8062
8063GLenum ErrorSet::popError()
8064{
8065 ASSERT(!empty());
8066 GLenum error = *mErrors.begin();
8067 mErrors.erase(mErrors.begin());
8068 return error;
8069}
Jamie Madilldc358af2018-07-31 11:22:13 -04008070
8071// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04008072StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008073 : mCachedHasAnyEnabledClientAttrib(false),
8074 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04008075 mCachedInstancedVertexElementLimit(0),
8076 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madilldc358af2018-07-31 11:22:13 -04008077{
8078}
8079
8080StateCache::~StateCache() = default;
8081
Jamie Madillac66f982018-10-09 18:30:01 -04008082void StateCache::initialize(Context *context)
8083{
8084 updateValidDrawModes(context);
8085 updateValidBindTextureTypes(context);
8086}
8087
Jamie Madilldc358af2018-07-31 11:22:13 -04008088void StateCache::updateActiveAttribsMask(Context *context)
8089{
8090 bool isGLES1 = context->isGLES1();
8091 const State &glState = context->getGLState();
8092
8093 if (!isGLES1 && !glState.getProgram())
8094 {
8095 mCachedActiveBufferedAttribsMask = AttributesMask();
8096 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008097 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008098 return;
8099 }
8100
8101 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8102 : glState.getProgram()->getActiveAttribLocationsMask();
8103
8104 const VertexArray *vao = glState.getVertexArray();
8105 ASSERT(vao);
8106
8107 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8108 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008109 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008110
Jamie Madill0a17e482018-08-31 17:19:11 -04008111 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8112 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008113 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008114 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8115}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008116
8117void StateCache::updateVertexElementLimits(Context *context)
8118{
8119 const VertexArray *vao = context->getGLState().getVertexArray();
8120
8121 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8122 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8123
8124 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8125 // If there are no buffered attributes then we should not limit the draw call count.
8126 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8127 {
8128 return;
8129 }
8130
8131 const auto &vertexAttribs = vao->getVertexAttributes();
8132 const auto &vertexBindings = vao->getVertexBindings();
8133
8134 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8135 {
8136 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8137 ASSERT(attrib.enabled);
8138
8139 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8140 ASSERT(context->isGLES1() ||
8141 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8142
8143 GLint64 limit = attrib.getCachedElementLimit();
8144 if (binding.getDivisor() > 0)
8145 {
8146 mCachedInstancedVertexElementLimit =
8147 std::min(mCachedInstancedVertexElementLimit, limit);
8148 }
8149 else
8150 {
8151 mCachedNonInstancedVertexElementLimit =
8152 std::min(mCachedNonInstancedVertexElementLimit, limit);
8153 }
8154 }
8155}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008156
Jamie Madilld84b6732018-09-06 15:54:35 -04008157void StateCache::updateBasicDrawStatesError()
8158{
8159 mCachedBasicDrawStatesError = kInvalidPointer;
8160}
8161
8162intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8163{
8164 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8165 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8166 return mCachedBasicDrawStatesError;
8167}
8168
Jamie Madillc43cdad2018-08-08 15:49:25 -04008169void StateCache::onVertexArrayBindingChange(Context *context)
8170{
8171 updateActiveAttribsMask(context);
8172 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008173 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008174}
8175
8176void StateCache::onProgramExecutableChange(Context *context)
8177{
8178 updateActiveAttribsMask(context);
8179 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008180 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008181 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008182}
8183
Jamie Madilld84b6732018-09-06 15:54:35 -04008184void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008185{
8186 updateVertexElementLimits(context);
8187}
8188
Jamie Madilld84b6732018-09-06 15:54:35 -04008189void StateCache::onVertexArrayBufferContentsChange(Context *context)
8190{
8191 updateVertexElementLimits(context);
8192 updateBasicDrawStatesError();
8193}
8194
Jamie Madillc43cdad2018-08-08 15:49:25 -04008195void StateCache::onVertexArrayStateChange(Context *context)
8196{
8197 updateActiveAttribsMask(context);
8198 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008199 updateBasicDrawStatesError();
8200}
8201
8202void StateCache::onVertexArrayBufferStateChange(Context *context)
8203{
8204 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008205}
8206
8207void StateCache::onGLES1ClientStateChange(Context *context)
8208{
8209 updateActiveAttribsMask(context);
8210}
Jamie Madilld84b6732018-09-06 15:54:35 -04008211
8212void StateCache::onDrawFramebufferChange(Context *context)
8213{
8214 updateBasicDrawStatesError();
8215}
8216
8217void StateCache::onContextCapChange(Context *context)
8218{
8219 updateBasicDrawStatesError();
8220}
8221
8222void StateCache::onStencilStateChange(Context *context)
8223{
8224 updateBasicDrawStatesError();
8225}
8226
8227void StateCache::onDefaultVertexAttributeChange(Context *context)
8228{
8229 updateBasicDrawStatesError();
8230}
8231
8232void StateCache::onActiveTextureChange(Context *context)
8233{
8234 updateBasicDrawStatesError();
8235}
8236
8237void StateCache::onQueryChange(Context *context)
8238{
8239 updateBasicDrawStatesError();
8240}
8241
8242void StateCache::onTransformFeedbackChange(Context *context)
8243{
8244 updateBasicDrawStatesError();
8245}
8246
8247void StateCache::onUniformBufferStateChange(Context *context)
8248{
8249 updateBasicDrawStatesError();
8250}
8251
8252void StateCache::onBufferBindingChange(Context *context)
8253{
8254 updateBasicDrawStatesError();
8255}
Jamie Madill526a6f62018-09-12 11:03:05 -04008256
8257void StateCache::updateValidDrawModes(Context *context)
8258{
8259 Program *program = context->getGLState().getProgram();
8260 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8261 {
8262 mCachedValidDrawModes = {{
8263 true, /* Points */
8264 true, /* Lines */
8265 true, /* LineLoop */
8266 true, /* LineStrip */
8267 true, /* Triangles */
8268 true, /* TriangleStrip */
8269 true, /* TriangleFan */
8270 false, /* LinesAdjacency */
8271 false, /* LineStripAdjacency */
8272 false, /* TrianglesAdjacency */
8273 false, /* TriangleStripAdjacency */
8274 false, /* InvalidEnum */
8275 }};
8276 }
8277 else
8278 {
8279 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8280
8281 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8282
8283 mCachedValidDrawModes = {{
8284 gsMode == PrimitiveMode::Points, /* Points */
8285 gsMode == PrimitiveMode::Lines, /* Lines */
8286 gsMode == PrimitiveMode::Lines, /* LineLoop */
8287 gsMode == PrimitiveMode::Lines, /* LineStrip */
8288 gsMode == PrimitiveMode::Triangles, /* Triangles */
8289 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8290 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8291 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8292 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8293 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8294 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8295 false, /* InvalidEnum */
8296 }};
8297 }
8298}
Jamie Madillac66f982018-10-09 18:30:01 -04008299
8300void StateCache::updateValidBindTextureTypes(Context *context)
8301{
8302 const Extensions &exts = context->getExtensions();
8303 bool isGLES3 = context->getClientMajorVersion() >= 3;
8304 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8305
8306 mCachedValidBindTextureTypes = {{
8307 true, /* _2D */
8308 isGLES3, /* _2DArray */
Yizhou Jiang7818a852018-09-06 15:02:04 +08008309 isGLES31 || exts.textureMultisample, /* _2DMultisample */
Jamie Madillac66f982018-10-09 18:30:01 -04008310 exts.textureStorageMultisample2DArray, /* _2DMultisampleArray */
8311 isGLES3, /* _3D */
8312 exts.eglImageExternal || exts.eglStreamConsumerExternal, /* External */
8313 exts.textureRectangle, /* Rectangle */
8314 true, /* CubeMap */
8315 false, /* InvalidEnum */
8316
8317 }};
8318}
Jamie Madillc29968b2016-01-20 11:17:23 -05008319} // namespace gl