blob: d16fc1ce56ad68535d3854078c6e8598e22fd861 [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),
339 mSavedArgsType(nullptr),
Geoff Lang3cacf692018-06-20 16:49:57 -0400340 mImplementation(implFactory->createContext(mState, config, shareContext, attribs)),
Geoff Lang75359662018-04-11 01:42:27 -0400341 mLabel(nullptr),
Jamie Madill2f348d22017-06-05 10:50:59 -0400342 mCompiler(),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400343 mGLState(GetDebug(attribs),
344 GetBindGeneratesResource(attribs),
345 GetClientArraysEnabled(attribs),
346 GetRobustResourceInit(attribs),
347 memoryProgramCache != nullptr),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400348 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500349 mClientType(EGL_OPENGL_ES_API),
Jamie Madill6b873dd2018-07-12 23:56:30 -0400350 mErrors(this),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500351 mHasBeenCurrent(false),
352 mContextLost(false),
353 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700354 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500355 mResetStrategy(GetResetStrategy(attribs)),
356 mRobustAccess(GetRobustAccess(attribs)),
Geoff Lang33f11fb2018-05-07 13:42:47 -0400357 mSurfacelessSupported(displayExtensions.surfacelessContext),
358 mExplicitContextAvailable(clientExtensions.explicitContext),
Jamie Madill61e16b42017-06-19 11:13:23 -0400359 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
360 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madille14951e2017-03-09 18:55:16 -0500361 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400362 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400363 mMemoryProgramCache(memoryProgramCache),
Jamie Madilla11819d2018-07-30 10:26:01 -0400364 mVertexArrayObserverBinding(this, kVertexArraySubjectIndex),
365 mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex),
366 mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400367 mScratchBuffer(1000u),
jchen107ae70d82018-07-06 13:47:01 +0800368 mZeroFilledBuffer(1000u),
369 mThreadPool(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000370{
Jamie Madill5b772312018-03-08 20:28:32 -0500371 // Needed to solve a Clang warning of unused variables.
Jamie Madillc6dbc252018-04-30 19:07:56 -0400372 ANGLE_UNUSED_VARIABLE(mSavedArgsType);
373 ANGLE_UNUSED_VARIABLE(mParamsBuffer);
Jamie Madill6d32cef2018-08-14 02:34:28 -0400374
375 for (angle::SubjectIndex uboIndex = kUniformBuffer0SubjectIndex;
376 uboIndex < kUniformBufferMaxSubjectIndex; ++uboIndex)
377 {
378 mUniformBufferObserverBindings.emplace_back(this, uboIndex);
379 }
Jamie Madille25b8002018-09-20 13:39:49 -0400380
381 for (angle::SubjectIndex samplerIndex = kSampler0SubjectIndex;
382 samplerIndex < kSamplerMaxSubjectIndex; ++samplerIndex)
383 {
384 mSamplerObserverBindings.emplace_back(this, samplerIndex);
385 }
Geoff Lang33f11fb2018-05-07 13:42:47 -0400386}
Jamie Madill5b772312018-03-08 20:28:32 -0500387
Geoff Lang33f11fb2018-05-07 13:42:47 -0400388void Context::initialize()
389{
390 mImplementation->setMemoryProgramCache(mMemoryProgramCache);
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400391
Geoff Lang33f11fb2018-05-07 13:42:47 -0400392 initCaps();
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700393 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400394
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400395 mGLState.initialize(this);
Régis Fénéon83107972015-02-05 12:57:44 +0100396
Shannon Woods53a94a82014-06-24 15:20:36 -0400397 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400398
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000399 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400400 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000401 // and cube map texture state vectors respectively associated with them.
402 // In order that access to these initial textures not be lost, they are treated as texture
403 // objects all of whose names are 0.
404
Corentin Wallez99d492c2018-02-27 15:17:10 -0500405 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800406 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500407
Corentin Wallez99d492c2018-02-27 15:17:10 -0500408 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800409 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400410
Geoff Langeb66a6e2016-10-31 13:06:12 -0400411 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400412 {
413 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500414 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800415 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400416
Corentin Wallez99d492c2018-02-27 15:17:10 -0500417 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800418 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400419 }
Yizhou Jiang7818a852018-09-06 15:02:04 +0800420 if (getClientVersion() >= Version(3, 1) || mSupportedExtensions.textureMultisample)
Geoff Lang3b573612016-10-31 14:08:10 -0400421 {
422 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500423 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800424 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Yizhou Jiang7818a852018-09-06 15:02:04 +0800425 }
426 if (getClientVersion() >= Version(3, 1))
427 {
Olli Etuahod310a432018-08-24 15:40:23 +0300428 Texture *zeroTexture2DMultisampleArray =
429 new Texture(mImplementation.get(), 0, TextureType::_2DMultisampleArray);
430 mZeroTextures[TextureType::_2DMultisampleArray].set(this, zeroTexture2DMultisampleArray);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800431
Jiajia Qin6eafb042016-12-27 17:04:07 +0800432 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
433 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800434 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800435 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800436
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800437 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
438 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400439 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800440 }
Geoff Lang3b573612016-10-31 14:08:10 -0400441 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000442
Geoff Langb0f917f2017-12-05 13:41:54 -0500443 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400444 {
445 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500446 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800447 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400448 }
449
Geoff Langb0f917f2017-12-05 13:41:54 -0500450 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400451 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500452 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800453 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400454 }
455
Jamie Madill4928b7c2017-06-20 12:57:39 -0400456 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500457
Jamie Madill57a89722013-07-02 11:57:03 -0400458 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000459
Geoff Langeb66a6e2016-10-31 13:06:12 -0400460 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400461 {
462 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
463 // In the initial state, a default transform feedback object is bound and treated as
464 // a transform feedback object with a name of zero. That object is bound any time
465 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400466 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400467 }
Geoff Langc8058452014-02-03 12:04:11 -0500468
Corentin Wallez336129f2017-10-17 15:55:40 -0400469 for (auto type : angle::AllEnums<BufferBinding>())
470 {
471 bindBuffer(type, 0);
472 }
473
474 bindRenderbuffer(GL_RENDERBUFFER, 0);
475
476 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
477 {
478 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
479 }
480
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700481 // Initialize GLES1 renderer if appropriate.
482 if (getClientVersion() < Version(2, 0))
483 {
484 mGLES1Renderer.reset(new GLES1Renderer());
485 }
486
Jamie Madillad9f24e2016-02-12 09:27:24 -0500487 // Initialize dirty bit masks
Jamie Madill9d0bb3d2018-10-09 20:29:13 -0400488 mAllDirtyBits.set();
489
Geoff Lang9bf86f02018-07-26 11:46:34 -0400490 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
491 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
492 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400493 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400494 mDrawDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400495
496 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
497 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
498 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madille25b8002018-09-20 13:39:49 -0400499 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400500
Jamie Madillc67323a2017-11-02 23:11:41 -0400501 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500502 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500503 // No dirty objects.
504
505 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400506 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500507 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400508 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500509 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
510
511 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
512 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
513 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
514 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
515 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
516 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
517 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
518 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
519 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
520 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
521 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400522 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500523 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
524
525 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
526 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700527 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400528 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
529 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500530 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
531 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400532
Xinghua Cao10a4d432017-11-28 14:46:26 +0800533 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
jchen1099118c12018-09-10 16:28:51 +0800534 mComputeDirtyBits.set(State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
535 mComputeDirtyBits.set(State::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800536 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
537 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
538 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
539 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
jchen1099118c12018-09-10 16:28:51 +0800540 mComputeDirtyBits.set(State::DIRTY_BIT_IMAGE_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800541 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800542 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400543 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400544 mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800545
Jamie Madillb4927eb2018-07-16 11:39:46 -0400546 mImplementation->setErrorSet(&mErrors);
547
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400548 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000549}
550
Jamie Madill4928b7c2017-06-20 12:57:39 -0400551egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000552{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700553 if (mGLES1Renderer)
554 {
555 mGLES1Renderer->onDestroy(this, &mGLState);
556 }
557
Jamie Madille7b3fe22018-04-05 09:42:46 -0400558 // Delete the Surface first to trigger a finish() in Vulkan.
Jamie Madille7b3fe22018-04-05 09:42:46 -0400559 ANGLE_TRY(releaseSurface(display));
560
Corentin Wallez80b24112015-08-25 16:41:57 -0400561 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000562 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400563 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000564 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400565 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000566
Corentin Wallez80b24112015-08-25 16:41:57 -0400567 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000568 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400569 if (query.second != nullptr)
570 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400571 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400572 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000573 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400574 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000575
Corentin Wallez80b24112015-08-25 16:41:57 -0400576 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400577 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400578 if (vertexArray.second)
579 {
580 vertexArray.second->onDestroy(this);
581 }
Jamie Madill57a89722013-07-02 11:57:03 -0400582 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400583 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400584
Corentin Wallez80b24112015-08-25 16:41:57 -0400585 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500586 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500587 if (transformFeedback.second != nullptr)
588 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500589 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500590 }
Geoff Langc8058452014-02-03 12:04:11 -0500591 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400592 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500593
Jamie Madill5b772312018-03-08 20:28:32 -0500594 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400595 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800596 if (zeroTexture.get() != nullptr)
597 {
Jamie Madill1c7f08c2018-10-10 16:13:02 -0400598 zeroTexture->onDestroy(this);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800599 zeroTexture.set(this, nullptr);
600 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400601 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000602
Jamie Madill2f348d22017-06-05 10:50:59 -0400603 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500604
Jamie Madill4928b7c2017-06-20 12:57:39 -0400605 mGLState.reset(this);
606
Jamie Madill6c1f6712017-02-14 19:08:04 -0500607 mState.mBuffers->release(this);
608 mState.mShaderPrograms->release(this);
609 mState.mTextures->release(this);
610 mState.mRenderbuffers->release(this);
611 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400612 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500613 mState.mPaths->release(this);
614 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800615 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400616
jchen107ae70d82018-07-06 13:47:01 +0800617 mThreadPool.reset();
618
Jamie Madill76e471e2017-10-21 09:56:01 -0400619 mImplementation->onDestroy(this);
620
Jamie Madill4928b7c2017-06-20 12:57:39 -0400621 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000622}
623
Jamie Madill70ee0f62017-02-06 16:04:20 -0500624Context::~Context()
625{
626}
627
Geoff Lang75359662018-04-11 01:42:27 -0400628void Context::setLabel(EGLLabelKHR label)
629{
630 mLabel = label;
631}
632
633EGLLabelKHR Context::getLabel() const
634{
635 return mLabel;
636}
637
Jamie Madill4928b7c2017-06-20 12:57:39 -0400638egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000639{
Jamie Madill61e16b42017-06-19 11:13:23 -0400640 mCurrentDisplay = display;
641
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000642 if (!mHasBeenCurrent)
643 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400644 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000645 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500646 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400647 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000648
Corentin Wallezc295e512017-01-27 17:47:50 -0500649 int width = 0;
650 int height = 0;
651 if (surface != nullptr)
652 {
653 width = surface->getWidth();
654 height = surface->getHeight();
655 }
656
657 mGLState.setViewportParams(0, 0, width, height);
658 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000659
660 mHasBeenCurrent = true;
661 }
662
Jamie Madill1b94d432015-08-07 13:23:23 -0400663 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700664 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400665 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400666
Jamie Madill4928b7c2017-06-20 12:57:39 -0400667 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500668
669 Framebuffer *newDefault = nullptr;
670 if (surface != nullptr)
671 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400672 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500673 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400674 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500675 }
676 else
677 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400678 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500679 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000680
Corentin Wallez37c39792015-08-20 14:19:46 -0400681 // Update default framebuffer, the binding of the previous default
682 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400683 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400684 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700685 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400686 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400687 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400688 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700689 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400690 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400691 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400692 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400693 }
Ian Ewell292f0052016-02-04 10:37:32 -0500694
Jamie Madill32643ce2018-10-19 11:38:03 -0400695 // Notify the renderer of a context switch.
696 // TODO(jmadill): Fix this error handling. http://anglebug.com/2491
697 (void)(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400698 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000699}
700
Jamie Madill4928b7c2017-06-20 12:57:39 -0400701egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400702{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400703 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400704
Geoff Langbf7b95d2018-05-01 16:48:21 -0400705 // Remove the default framebuffer
706 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500707 {
708 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400709 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500710 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400711
712 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500713 {
714 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400715 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500716 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400717
718 if (defaultFramebuffer)
719 {
720 defaultFramebuffer->onDestroy(this);
721 delete defaultFramebuffer;
722 }
723
Corentin Wallezc295e512017-01-27 17:47:50 -0500724 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
725
726 if (mCurrentSurface)
727 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400728 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500729 mCurrentSurface = nullptr;
730 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400731
732 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400733}
734
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000735GLuint Context::createBuffer()
736{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500737 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000738}
739
740GLuint Context::createProgram()
741{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500742 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000743}
744
Jiawei Shao385b3e02018-03-21 09:43:28 +0800745GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000746{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500747 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000748}
749
750GLuint Context::createTexture()
751{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500752 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000753}
754
755GLuint Context::createRenderbuffer()
756{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500757 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000758}
759
Jamie Madill13951342018-09-30 15:24:28 -0400760void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
761{
762 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(mImplementation.get(), range, createdOut));
763}
764
Brandon Jones59770802018-04-02 13:18:42 -0700765GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300766{
Jamie Madill13951342018-09-30 15:24:28 -0400767 GLuint created = 0;
768 tryGenPaths(range, &created);
769 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300770}
771
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000772// Returns an unused framebuffer name
773GLuint Context::createFramebuffer()
774{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500775 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000776}
777
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500778void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000779{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500780 for (int i = 0; i < n; i++)
781 {
782 GLuint handle = mFenceNVHandleAllocator.allocate();
783 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
784 fences[i] = handle;
785 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000786}
787
Yunchao Hea336b902017-08-02 16:05:21 +0800788GLuint Context::createProgramPipeline()
789{
790 return mState.mPipelines->createProgramPipeline();
791}
792
Jiawei Shao385b3e02018-03-21 09:43:28 +0800793GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800794{
795 UNIMPLEMENTED();
796 return 0u;
797}
798
James Darpinian4d9d4832018-03-13 12:43:28 -0700799void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000800{
James Darpinian4d9d4832018-03-13 12:43:28 -0700801 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
802 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000803 {
804 detachBuffer(buffer);
805 }
Jamie Madill893ab082014-05-16 16:56:10 -0400806
James Darpinian4d9d4832018-03-13 12:43:28 -0700807 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000808}
809
810void Context::deleteShader(GLuint shader)
811{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500812 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000813}
814
815void Context::deleteProgram(GLuint program)
816{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500817 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000818}
819
820void Context::deleteTexture(GLuint texture)
821{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500822 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000823 {
824 detachTexture(texture);
825 }
826
Jamie Madill6c1f6712017-02-14 19:08:04 -0500827 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000828}
829
830void Context::deleteRenderbuffer(GLuint renderbuffer)
831{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500832 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000833 {
834 detachRenderbuffer(renderbuffer);
835 }
Jamie Madill893ab082014-05-16 16:56:10 -0400836
Jamie Madill6c1f6712017-02-14 19:08:04 -0500837 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000838}
839
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400840void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400841{
842 // The spec specifies the underlying Fence object is not deleted until all current
843 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
844 // and since our API is currently designed for being called from a single thread, we can delete
845 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400846 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400847}
848
Yunchao Hea336b902017-08-02 16:05:21 +0800849void Context::deleteProgramPipeline(GLuint pipeline)
850{
851 if (mState.mPipelines->getProgramPipeline(pipeline))
852 {
853 detachProgramPipeline(pipeline);
854 }
855
856 mState.mPipelines->deleteObject(this, pipeline);
857}
858
Sami Väisänene45e53b2016-05-25 10:36:04 +0300859void Context::deletePaths(GLuint first, GLsizei range)
860{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500861 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300862}
863
Brandon Jones59770802018-04-02 13:18:42 -0700864bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300865{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500866 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300867 if (pathObj == nullptr)
868 return false;
869
870 return pathObj->hasPathData();
871}
872
Brandon Jones59770802018-04-02 13:18:42 -0700873bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300874{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500875 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300876}
877
Brandon Jones59770802018-04-02 13:18:42 -0700878void Context::pathCommands(GLuint path,
879 GLsizei numCommands,
880 const GLubyte *commands,
881 GLsizei numCoords,
882 GLenum coordType,
883 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300884{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500885 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300886
887 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
888}
889
Jamie Madill007530e2017-12-28 14:27:04 -0500890void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300891{
Jamie Madill007530e2017-12-28 14:27:04 -0500892 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300893
894 switch (pname)
895 {
896 case GL_PATH_STROKE_WIDTH_CHROMIUM:
897 pathObj->setStrokeWidth(value);
898 break;
899 case GL_PATH_END_CAPS_CHROMIUM:
900 pathObj->setEndCaps(static_cast<GLenum>(value));
901 break;
902 case GL_PATH_JOIN_STYLE_CHROMIUM:
903 pathObj->setJoinStyle(static_cast<GLenum>(value));
904 break;
905 case GL_PATH_MITER_LIMIT_CHROMIUM:
906 pathObj->setMiterLimit(value);
907 break;
908 case GL_PATH_STROKE_BOUND_CHROMIUM:
909 pathObj->setStrokeBound(value);
910 break;
911 default:
912 UNREACHABLE();
913 break;
914 }
915}
916
Jamie Madill007530e2017-12-28 14:27:04 -0500917void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300918{
Jamie Madill007530e2017-12-28 14:27:04 -0500919 // TODO(jmadill): Should use proper clamping/casting.
920 pathParameterf(path, pname, static_cast<GLfloat>(value));
921}
922
923void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
924{
925 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300926
927 switch (pname)
928 {
929 case GL_PATH_STROKE_WIDTH_CHROMIUM:
930 *value = pathObj->getStrokeWidth();
931 break;
932 case GL_PATH_END_CAPS_CHROMIUM:
933 *value = static_cast<GLfloat>(pathObj->getEndCaps());
934 break;
935 case GL_PATH_JOIN_STYLE_CHROMIUM:
936 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
937 break;
938 case GL_PATH_MITER_LIMIT_CHROMIUM:
939 *value = pathObj->getMiterLimit();
940 break;
941 case GL_PATH_STROKE_BOUND_CHROMIUM:
942 *value = pathObj->getStrokeBound();
943 break;
944 default:
945 UNREACHABLE();
946 break;
947 }
948}
949
Jamie Madill007530e2017-12-28 14:27:04 -0500950void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
951{
952 GLfloat val = 0.0f;
953 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
954 if (value)
955 *value = static_cast<GLint>(val);
956}
957
Brandon Jones59770802018-04-02 13:18:42 -0700958void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300959{
960 mGLState.setPathStencilFunc(func, ref, mask);
961}
962
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000963void Context::deleteFramebuffer(GLuint framebuffer)
964{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500965 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000966 {
967 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000968 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500969
Jamie Madill6c1f6712017-02-14 19:08:04 -0500970 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000971}
972
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500973void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000974{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500975 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000976 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500977 GLuint fence = fences[i];
978
979 FenceNV *fenceObject = nullptr;
980 if (mFenceNVMap.erase(fence, &fenceObject))
981 {
982 mFenceNVHandleAllocator.release(fence);
983 delete fenceObject;
984 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000985 }
986}
987
Geoff Lang70d0f492015-12-10 17:45:46 -0500988Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000989{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500990 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000991}
992
Geoff Lang70d0f492015-12-10 17:45:46 -0500993Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000994{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500995 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000996}
997
Jamie Madill70b5bb02017-08-28 13:32:37 -0400998Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400999{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001000 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -04001001}
1002
Jamie Madill57a89722013-07-02 11:57:03 -04001003VertexArray *Context::getVertexArray(GLuint handle) const
1004{
Jamie Madill96a483b2017-06-27 16:49:21 -04001005 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -04001006}
1007
Jamie Madilldc356042013-07-19 16:36:57 -04001008Sampler *Context::getSampler(GLuint handle) const
1009{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001010 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -04001011}
1012
Geoff Langc8058452014-02-03 12:04:11 -05001013TransformFeedback *Context::getTransformFeedback(GLuint handle) const
1014{
Jamie Madill96a483b2017-06-27 16:49:21 -04001015 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -05001016}
1017
Yunchao Hea336b902017-08-02 16:05:21 +08001018ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
1019{
1020 return mState.mPipelines->getProgramPipeline(handle);
1021}
1022
Geoff Lang75359662018-04-11 01:42:27 -04001023gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001024{
1025 switch (identifier)
1026 {
1027 case GL_BUFFER:
1028 return getBuffer(name);
1029 case GL_SHADER:
1030 return getShader(name);
1031 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04001032 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -05001033 case GL_VERTEX_ARRAY:
1034 return getVertexArray(name);
1035 case GL_QUERY:
1036 return getQuery(name);
1037 case GL_TRANSFORM_FEEDBACK:
1038 return getTransformFeedback(name);
1039 case GL_SAMPLER:
1040 return getSampler(name);
1041 case GL_TEXTURE:
1042 return getTexture(name);
1043 case GL_RENDERBUFFER:
1044 return getRenderbuffer(name);
1045 case GL_FRAMEBUFFER:
1046 return getFramebuffer(name);
1047 default:
1048 UNREACHABLE();
1049 return nullptr;
1050 }
1051}
1052
Geoff Lang75359662018-04-11 01:42:27 -04001053gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001054{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001055 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001056}
1057
Martin Radev9d901792016-07-15 15:58:58 +03001058void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1059{
Geoff Lang75359662018-04-11 01:42:27 -04001060 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001061 ASSERT(object != nullptr);
1062
1063 std::string labelName = GetObjectLabelFromPointer(length, label);
1064 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001065
1066 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1067 // specified object is active until we do this.
1068 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001069}
1070
1071void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1072{
Geoff Lang75359662018-04-11 01:42:27 -04001073 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001074 ASSERT(object != nullptr);
1075
1076 std::string labelName = GetObjectLabelFromPointer(length, label);
1077 object->setLabel(labelName);
1078}
1079
1080void Context::getObjectLabel(GLenum identifier,
1081 GLuint name,
1082 GLsizei bufSize,
1083 GLsizei *length,
1084 GLchar *label) const
1085{
Geoff Lang75359662018-04-11 01:42:27 -04001086 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001087 ASSERT(object != nullptr);
1088
1089 const std::string &objectLabel = object->getLabel();
1090 GetObjectLabelBase(objectLabel, bufSize, length, label);
1091}
1092
1093void Context::getObjectPtrLabel(const void *ptr,
1094 GLsizei bufSize,
1095 GLsizei *length,
1096 GLchar *label) const
1097{
Geoff Lang75359662018-04-11 01:42:27 -04001098 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001099 ASSERT(object != nullptr);
1100
1101 const std::string &objectLabel = object->getLabel();
1102 GetObjectLabelBase(objectLabel, bufSize, length, label);
1103}
1104
Jamie Madilldc356042013-07-19 16:36:57 -04001105bool Context::isSampler(GLuint samplerName) const
1106{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001107 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001108}
1109
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001110void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001111{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001112 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001113
Jamie Madilldedd7b92014-11-05 16:30:36 -05001114 if (handle == 0)
1115 {
1116 texture = mZeroTextures[target].get();
1117 }
1118 else
1119 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001120 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001121 }
1122
1123 ASSERT(texture);
Jamie Madill14246812018-10-03 17:51:16 -04001124 ANGLE_CONTEXT_TRY(mGLState.setSamplerTexture(this, target, texture));
Jamie Madilld84b6732018-09-06 15:54:35 -04001125 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001126}
1127
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001128void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001129{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001130 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1131 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001132 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001133 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001134}
1135
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001136void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001137{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001138 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1139 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001140 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001141 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001142 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001143}
1144
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001145void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001146{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001147 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001148 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001149 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001150 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001151}
1152
Shao80957d92017-02-20 21:25:59 +08001153void Context::bindVertexBuffer(GLuint bindingIndex,
1154 GLuint bufferHandle,
1155 GLintptr offset,
1156 GLsizei stride)
1157{
1158 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001159 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001160 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001161}
1162
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001163void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001164{
Geoff Lang76b10c92014-09-05 16:28:14 -04001165 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001166 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001167 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001168 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001169 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001170}
1171
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001172void Context::bindImageTexture(GLuint unit,
1173 GLuint texture,
1174 GLint level,
1175 GLboolean layered,
1176 GLint layer,
1177 GLenum access,
1178 GLenum format)
1179{
1180 Texture *tex = mState.mTextures->getTexture(texture);
1181 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1182}
1183
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001184void Context::useProgram(GLuint program)
1185{
Jamie Madille3bb6b72018-10-03 17:51:15 -04001186 ANGLE_CONTEXT_TRY(mGLState.setProgram(this, getProgramResolveLink(program)));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001187 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001188}
1189
Jiajia Qin5451d532017-11-16 17:16:34 +08001190void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1191{
1192 UNIMPLEMENTED();
1193}
1194
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001195void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001196{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001197 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001198 TransformFeedback *transformFeedback =
1199 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001200 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Jamie Madilld84b6732018-09-06 15:54:35 -04001201 mStateCache.onTransformFeedbackChange(this);
Geoff Langc8058452014-02-03 12:04:11 -05001202}
1203
Yunchao Hea336b902017-08-02 16:05:21 +08001204void Context::bindProgramPipeline(GLuint pipelineHandle)
1205{
1206 ProgramPipeline *pipeline =
1207 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1208 mGLState.setProgramPipelineBinding(this, pipeline);
1209}
1210
Corentin Wallezad3ae902018-03-09 13:40:42 -05001211void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001212{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001213 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001214 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001215
Geoff Lang5aad9672014-09-08 11:10:42 -04001216 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001217 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001218
1219 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001220 mGLState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001221 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001222}
1223
Corentin Wallezad3ae902018-03-09 13:40:42 -05001224void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001225{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001226 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001227 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001228
Jamie Madill5188a272018-07-25 10:53:56 -04001229 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001230
Geoff Lang5aad9672014-09-08 11:10:42 -04001231 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001232 mGLState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001233 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001234}
1235
Corentin Wallezad3ae902018-03-09 13:40:42 -05001236void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001237{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001238 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001239
1240 Query *queryObject = getQuery(id, true, target);
1241 ASSERT(queryObject);
1242
Jamie Madill5188a272018-07-25 10:53:56 -04001243 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001244}
1245
Corentin Wallezad3ae902018-03-09 13:40:42 -05001246void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001247{
1248 switch (pname)
1249 {
1250 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001251 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001252 break;
1253 case GL_QUERY_COUNTER_BITS_EXT:
1254 switch (target)
1255 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001256 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001257 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1258 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001259 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001260 params[0] = getExtensions().queryCounterBitsTimestamp;
1261 break;
1262 default:
1263 UNREACHABLE();
1264 params[0] = 0;
1265 break;
1266 }
1267 break;
1268 default:
1269 UNREACHABLE();
1270 return;
1271 }
1272}
1273
Corentin Wallezad3ae902018-03-09 13:40:42 -05001274void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001275 GLenum pname,
1276 GLsizei bufSize,
1277 GLsizei *length,
1278 GLint *params)
1279{
1280 getQueryiv(target, pname, params);
1281}
1282
Geoff Lang2186c382016-10-14 10:54:54 -04001283void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001284{
Jamie Madill5188a272018-07-25 10:53:56 -04001285 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001286}
1287
Brandon Jones59770802018-04-02 13:18:42 -07001288void Context::getQueryObjectivRobust(GLuint id,
1289 GLenum pname,
1290 GLsizei bufSize,
1291 GLsizei *length,
1292 GLint *params)
1293{
1294 getQueryObjectiv(id, pname, params);
1295}
1296
Geoff Lang2186c382016-10-14 10:54:54 -04001297void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001298{
Jamie Madill5188a272018-07-25 10:53:56 -04001299 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001300}
1301
Brandon Jones59770802018-04-02 13:18:42 -07001302void Context::getQueryObjectuivRobust(GLuint id,
1303 GLenum pname,
1304 GLsizei bufSize,
1305 GLsizei *length,
1306 GLuint *params)
1307{
1308 getQueryObjectuiv(id, pname, params);
1309}
1310
Geoff Lang2186c382016-10-14 10:54:54 -04001311void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001312{
Jamie Madill5188a272018-07-25 10:53:56 -04001313 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001314}
1315
Brandon Jones59770802018-04-02 13:18:42 -07001316void Context::getQueryObjecti64vRobust(GLuint id,
1317 GLenum pname,
1318 GLsizei bufSize,
1319 GLsizei *length,
1320 GLint64 *params)
1321{
1322 getQueryObjecti64v(id, pname, params);
1323}
1324
Geoff Lang2186c382016-10-14 10:54:54 -04001325void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001326{
Jamie Madill5188a272018-07-25 10:53:56 -04001327 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001328}
1329
Brandon Jones59770802018-04-02 13:18:42 -07001330void Context::getQueryObjectui64vRobust(GLuint id,
1331 GLenum pname,
1332 GLsizei bufSize,
1333 GLsizei *length,
1334 GLuint64 *params)
1335{
1336 getQueryObjectui64v(id, pname, params);
1337}
1338
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001339Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001340{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001341 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001342}
1343
Jamie Madill2f348d22017-06-05 10:50:59 -04001344FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001345{
Jamie Madill96a483b2017-06-27 16:49:21 -04001346 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001347}
1348
Corentin Wallezad3ae902018-03-09 13:40:42 -05001349Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001350{
Jamie Madill96a483b2017-06-27 16:49:21 -04001351 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001352 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001353 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001354 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001355
1356 Query *query = mQueryMap.query(handle);
1357 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001358 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001359 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001360 query = new Query(mImplementation->createQuery(type), handle);
1361 query->addRef();
1362 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001363 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001364 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001365}
1366
Geoff Lang70d0f492015-12-10 17:45:46 -05001367Query *Context::getQuery(GLuint handle) const
1368{
Jamie Madill96a483b2017-06-27 16:49:21 -04001369 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001370}
1371
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001372Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001373{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001374 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1375 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001376}
1377
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001378Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001379{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001380 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001381}
1382
Geoff Lang492a7e42014-11-05 13:27:06 -05001383Compiler *Context::getCompiler() const
1384{
Jamie Madill2f348d22017-06-05 10:50:59 -04001385 if (mCompiler.get() == nullptr)
1386 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001387 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001388 }
1389 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001390}
1391
Jamie Madillc1d770e2017-04-13 17:31:24 -04001392void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001393{
1394 switch (pname)
1395 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001396 case GL_SHADER_COMPILER:
1397 *params = GL_TRUE;
1398 break;
1399 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1400 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1401 break;
1402 default:
1403 mGLState.getBooleanv(pname, params);
1404 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001405 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001406}
1407
Jamie Madillc1d770e2017-04-13 17:31:24 -04001408void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001409{
Shannon Woods53a94a82014-06-24 15:20:36 -04001410 // Queries about context capabilities and maximums are answered by Context.
1411 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001412 switch (pname)
1413 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001414 case GL_ALIASED_LINE_WIDTH_RANGE:
1415 params[0] = mCaps.minAliasedLineWidth;
1416 params[1] = mCaps.maxAliasedLineWidth;
1417 break;
1418 case GL_ALIASED_POINT_SIZE_RANGE:
1419 params[0] = mCaps.minAliasedPointSize;
1420 params[1] = mCaps.maxAliasedPointSize;
1421 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001422 case GL_SMOOTH_POINT_SIZE_RANGE:
1423 params[0] = mCaps.minSmoothPointSize;
1424 params[1] = mCaps.maxSmoothPointSize;
1425 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001426 case GL_SMOOTH_LINE_WIDTH_RANGE:
1427 params[0] = mCaps.minSmoothLineWidth;
1428 params[1] = mCaps.maxSmoothLineWidth;
1429 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001430 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1431 ASSERT(mExtensions.textureFilterAnisotropic);
1432 *params = mExtensions.maxTextureAnisotropy;
1433 break;
1434 case GL_MAX_TEXTURE_LOD_BIAS:
1435 *params = mCaps.maxLODBias;
1436 break;
1437
1438 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1439 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1440 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001441 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1442 // GLES1 constants for modelview/projection matrix.
1443 if (getClientVersion() < Version(2, 0))
1444 {
1445 mGLState.getFloatv(pname, params);
1446 }
1447 else
1448 {
1449 ASSERT(mExtensions.pathRendering);
1450 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1451 memcpy(params, m, 16 * sizeof(GLfloat));
1452 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001453 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001454 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001455
Jamie Madill231c7f52017-04-26 13:45:37 -04001456 default:
1457 mGLState.getFloatv(pname, params);
1458 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001459 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001460}
1461
Jamie Madillc1d770e2017-04-13 17:31:24 -04001462void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001463{
Shannon Woods53a94a82014-06-24 15:20:36 -04001464 // Queries about context capabilities and maximums are answered by Context.
1465 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001466
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001467 switch (pname)
1468 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001469 case GL_MAX_VERTEX_ATTRIBS:
1470 *params = mCaps.maxVertexAttributes;
1471 break;
1472 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1473 *params = mCaps.maxVertexUniformVectors;
1474 break;
1475 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001476 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001477 break;
1478 case GL_MAX_VARYING_VECTORS:
1479 *params = mCaps.maxVaryingVectors;
1480 break;
1481 case GL_MAX_VARYING_COMPONENTS:
1482 *params = mCaps.maxVertexOutputComponents;
1483 break;
1484 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1485 *params = mCaps.maxCombinedTextureImageUnits;
1486 break;
1487 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001488 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001489 break;
1490 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001491 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001492 break;
1493 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1494 *params = mCaps.maxFragmentUniformVectors;
1495 break;
1496 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001497 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001498 break;
1499 case GL_MAX_RENDERBUFFER_SIZE:
1500 *params = mCaps.maxRenderbufferSize;
1501 break;
1502 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1503 *params = mCaps.maxColorAttachments;
1504 break;
1505 case GL_MAX_DRAW_BUFFERS_EXT:
1506 *params = mCaps.maxDrawBuffers;
1507 break;
1508 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1509 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1510 case GL_SUBPIXEL_BITS:
1511 *params = 4;
1512 break;
1513 case GL_MAX_TEXTURE_SIZE:
1514 *params = mCaps.max2DTextureSize;
1515 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001516 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1517 *params = mCaps.maxRectangleTextureSize;
1518 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001519 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1520 *params = mCaps.maxCubeMapTextureSize;
1521 break;
1522 case GL_MAX_3D_TEXTURE_SIZE:
1523 *params = mCaps.max3DTextureSize;
1524 break;
1525 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1526 *params = mCaps.maxArrayTextureLayers;
1527 break;
1528 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1529 *params = mCaps.uniformBufferOffsetAlignment;
1530 break;
1531 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1532 *params = mCaps.maxUniformBufferBindings;
1533 break;
1534 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001535 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001536 break;
1537 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001538 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001539 break;
1540 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1541 *params = mCaps.maxCombinedTextureImageUnits;
1542 break;
1543 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1544 *params = mCaps.maxVertexOutputComponents;
1545 break;
1546 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1547 *params = mCaps.maxFragmentInputComponents;
1548 break;
1549 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1550 *params = mCaps.minProgramTexelOffset;
1551 break;
1552 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1553 *params = mCaps.maxProgramTexelOffset;
1554 break;
1555 case GL_MAJOR_VERSION:
1556 *params = getClientVersion().major;
1557 break;
1558 case GL_MINOR_VERSION:
1559 *params = getClientVersion().minor;
1560 break;
1561 case GL_MAX_ELEMENTS_INDICES:
1562 *params = mCaps.maxElementsIndices;
1563 break;
1564 case GL_MAX_ELEMENTS_VERTICES:
1565 *params = mCaps.maxElementsVertices;
1566 break;
1567 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1568 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1569 break;
1570 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1571 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1572 break;
1573 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1574 *params = mCaps.maxTransformFeedbackSeparateComponents;
1575 break;
1576 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1577 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1578 break;
1579 case GL_MAX_SAMPLES_ANGLE:
1580 *params = mCaps.maxSamples;
1581 break;
1582 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001583 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001584 params[0] = mCaps.maxViewportWidth;
1585 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001586 }
1587 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001588 case GL_COMPRESSED_TEXTURE_FORMATS:
1589 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1590 params);
1591 break;
1592 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1593 *params = mResetStrategy;
1594 break;
1595 case GL_NUM_SHADER_BINARY_FORMATS:
1596 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1597 break;
1598 case GL_SHADER_BINARY_FORMATS:
1599 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1600 break;
1601 case GL_NUM_PROGRAM_BINARY_FORMATS:
1602 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1603 break;
1604 case GL_PROGRAM_BINARY_FORMATS:
1605 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1606 break;
1607 case GL_NUM_EXTENSIONS:
1608 *params = static_cast<GLint>(mExtensionStrings.size());
1609 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001610
Geoff Lang38f24ee2018-10-01 13:04:59 -04001611 // GL_ANGLE_request_extension
1612 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1613 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1614 break;
1615
Jamie Madill231c7f52017-04-26 13:45:37 -04001616 // GL_KHR_debug
1617 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1618 *params = mExtensions.maxDebugMessageLength;
1619 break;
1620 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1621 *params = mExtensions.maxDebugLoggedMessages;
1622 break;
1623 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1624 *params = mExtensions.maxDebugGroupStackDepth;
1625 break;
1626 case GL_MAX_LABEL_LENGTH:
1627 *params = mExtensions.maxLabelLength;
1628 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001629
Martin Radeve5285d22017-07-14 16:23:53 +03001630 // GL_ANGLE_multiview
1631 case GL_MAX_VIEWS_ANGLE:
1632 *params = mExtensions.maxViews;
1633 break;
1634
Jamie Madill231c7f52017-04-26 13:45:37 -04001635 // GL_EXT_disjoint_timer_query
1636 case GL_GPU_DISJOINT_EXT:
1637 *params = mImplementation->getGPUDisjoint();
1638 break;
1639 case GL_MAX_FRAMEBUFFER_WIDTH:
1640 *params = mCaps.maxFramebufferWidth;
1641 break;
1642 case GL_MAX_FRAMEBUFFER_HEIGHT:
1643 *params = mCaps.maxFramebufferHeight;
1644 break;
1645 case GL_MAX_FRAMEBUFFER_SAMPLES:
1646 *params = mCaps.maxFramebufferSamples;
1647 break;
1648 case GL_MAX_SAMPLE_MASK_WORDS:
1649 *params = mCaps.maxSampleMaskWords;
1650 break;
1651 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1652 *params = mCaps.maxColorTextureSamples;
1653 break;
1654 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1655 *params = mCaps.maxDepthTextureSamples;
1656 break;
1657 case GL_MAX_INTEGER_SAMPLES:
1658 *params = mCaps.maxIntegerSamples;
1659 break;
1660 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1661 *params = mCaps.maxVertexAttribRelativeOffset;
1662 break;
1663 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1664 *params = mCaps.maxVertexAttribBindings;
1665 break;
1666 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1667 *params = mCaps.maxVertexAttribStride;
1668 break;
1669 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001670 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001671 break;
1672 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001673 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001674 break;
1675 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001676 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001677 break;
1678 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001679 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001680 break;
1681 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001682 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001683 break;
1684 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001685 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001686 break;
1687 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001688 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001689 break;
1690 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001691 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001692 break;
1693 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1694 *params = mCaps.minProgramTextureGatherOffset;
1695 break;
1696 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1697 *params = mCaps.maxProgramTextureGatherOffset;
1698 break;
1699 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1700 *params = mCaps.maxComputeWorkGroupInvocations;
1701 break;
1702 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001703 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001704 break;
1705 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001706 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001707 break;
1708 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1709 *params = mCaps.maxComputeSharedMemorySize;
1710 break;
1711 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001712 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001713 break;
1714 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001715 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001716 break;
1717 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001718 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001719 break;
1720 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001721 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001722 break;
1723 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001724 *params =
1725 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001726 break;
1727 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001728 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001729 break;
1730 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1731 *params = mCaps.maxCombinedShaderOutputResources;
1732 break;
1733 case GL_MAX_UNIFORM_LOCATIONS:
1734 *params = mCaps.maxUniformLocations;
1735 break;
1736 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1737 *params = mCaps.maxAtomicCounterBufferBindings;
1738 break;
1739 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1740 *params = mCaps.maxAtomicCounterBufferSize;
1741 break;
1742 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1743 *params = mCaps.maxCombinedAtomicCounterBuffers;
1744 break;
1745 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1746 *params = mCaps.maxCombinedAtomicCounters;
1747 break;
1748 case GL_MAX_IMAGE_UNITS:
1749 *params = mCaps.maxImageUnits;
1750 break;
1751 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1752 *params = mCaps.maxCombinedImageUniforms;
1753 break;
1754 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1755 *params = mCaps.maxShaderStorageBufferBindings;
1756 break;
1757 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1758 *params = mCaps.maxCombinedShaderStorageBlocks;
1759 break;
1760 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1761 *params = mCaps.shaderStorageBufferOffsetAlignment;
1762 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001763
1764 // GL_EXT_geometry_shader
1765 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1766 *params = mCaps.maxFramebufferLayers;
1767 break;
1768 case GL_LAYER_PROVOKING_VERTEX_EXT:
1769 *params = mCaps.layerProvokingVertex;
1770 break;
1771 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001772 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001773 break;
1774 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001775 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001776 break;
1777 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001778 *params =
1779 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001780 break;
1781 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1782 *params = mCaps.maxGeometryInputComponents;
1783 break;
1784 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1785 *params = mCaps.maxGeometryOutputComponents;
1786 break;
1787 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1788 *params = mCaps.maxGeometryOutputVertices;
1789 break;
1790 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1791 *params = mCaps.maxGeometryTotalOutputComponents;
1792 break;
1793 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1794 *params = mCaps.maxGeometryShaderInvocations;
1795 break;
1796 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001797 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001798 break;
1799 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001800 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001801 break;
1802 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001803 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001804 break;
1805 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001806 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001807 break;
1808 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001809 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001810 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001811 // GLES1 emulation: Caps queries
1812 case GL_MAX_TEXTURE_UNITS:
1813 *params = mCaps.maxMultitextureUnits;
1814 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001815 case GL_MAX_MODELVIEW_STACK_DEPTH:
1816 *params = mCaps.maxModelviewMatrixStackDepth;
1817 break;
1818 case GL_MAX_PROJECTION_STACK_DEPTH:
1819 *params = mCaps.maxProjectionMatrixStackDepth;
1820 break;
1821 case GL_MAX_TEXTURE_STACK_DEPTH:
1822 *params = mCaps.maxTextureMatrixStackDepth;
1823 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001824 case GL_MAX_LIGHTS:
1825 *params = mCaps.maxLights;
1826 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001827 case GL_MAX_CLIP_PLANES:
1828 *params = mCaps.maxClipPlanes;
1829 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001830 // GLES1 emulation: Vertex attribute queries
1831 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1832 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1833 case GL_COLOR_ARRAY_BUFFER_BINDING:
1834 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1835 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1836 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1837 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1838 break;
1839 case GL_VERTEX_ARRAY_STRIDE:
1840 case GL_NORMAL_ARRAY_STRIDE:
1841 case GL_COLOR_ARRAY_STRIDE:
1842 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1843 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1844 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1845 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1846 break;
1847 case GL_VERTEX_ARRAY_SIZE:
1848 case GL_COLOR_ARRAY_SIZE:
1849 case GL_TEXTURE_COORD_ARRAY_SIZE:
1850 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1851 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1852 break;
1853 case GL_VERTEX_ARRAY_TYPE:
1854 case GL_COLOR_ARRAY_TYPE:
1855 case GL_NORMAL_ARRAY_TYPE:
1856 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1857 case GL_TEXTURE_COORD_ARRAY_TYPE:
1858 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1859 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1860 break;
1861
jchen1082af6202018-06-22 10:59:52 +08001862 // GL_KHR_parallel_shader_compile
1863 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1864 *params = mGLState.getMaxShaderCompilerThreads();
1865 break;
1866
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001867 // GL_EXT_blend_func_extended
1868 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
1869 *params = mExtensions.maxDualSourceDrawBuffers;
1870 break;
1871
Jamie Madill231c7f52017-04-26 13:45:37 -04001872 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001873 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001874 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001875 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001876}
1877
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001878void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001879{
Shannon Woods53a94a82014-06-24 15:20:36 -04001880 // Queries about context capabilities and maximums are answered by Context.
1881 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001882 switch (pname)
1883 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001884 case GL_MAX_ELEMENT_INDEX:
1885 *params = mCaps.maxElementIndex;
1886 break;
1887 case GL_MAX_UNIFORM_BLOCK_SIZE:
1888 *params = mCaps.maxUniformBlockSize;
1889 break;
1890 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001891 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001892 break;
1893 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001894 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001895 break;
1896 case GL_MAX_SERVER_WAIT_TIMEOUT:
1897 *params = mCaps.maxServerWaitTimeout;
1898 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001899
Jamie Madill231c7f52017-04-26 13:45:37 -04001900 // GL_EXT_disjoint_timer_query
1901 case GL_TIMESTAMP_EXT:
1902 *params = mImplementation->getTimestamp();
1903 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001904
Jamie Madill231c7f52017-04-26 13:45:37 -04001905 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1906 *params = mCaps.maxShaderStorageBlockSize;
1907 break;
1908 default:
1909 UNREACHABLE();
1910 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001911 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001912}
1913
Geoff Lang70d0f492015-12-10 17:45:46 -05001914void Context::getPointerv(GLenum pname, void **params) const
1915{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001916 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001917}
1918
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001919void Context::getPointervRobustANGLERobust(GLenum pname,
1920 GLsizei bufSize,
1921 GLsizei *length,
1922 void **params)
1923{
1924 UNIMPLEMENTED();
1925}
1926
Martin Radev66fb8202016-07-28 11:45:20 +03001927void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001928{
Shannon Woods53a94a82014-06-24 15:20:36 -04001929 // Queries about context capabilities and maximums are answered by Context.
1930 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001931
1932 GLenum nativeType;
1933 unsigned int numParams;
1934 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1935 ASSERT(queryStatus);
1936
1937 if (nativeType == GL_INT)
1938 {
1939 switch (target)
1940 {
1941 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1942 ASSERT(index < 3u);
1943 *data = mCaps.maxComputeWorkGroupCount[index];
1944 break;
1945 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1946 ASSERT(index < 3u);
1947 *data = mCaps.maxComputeWorkGroupSize[index];
1948 break;
1949 default:
1950 mGLState.getIntegeri_v(target, index, data);
1951 }
1952 }
1953 else
1954 {
1955 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1956 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001957}
1958
Brandon Jones59770802018-04-02 13:18:42 -07001959void Context::getIntegeri_vRobust(GLenum target,
1960 GLuint index,
1961 GLsizei bufSize,
1962 GLsizei *length,
1963 GLint *data)
1964{
1965 getIntegeri_v(target, index, data);
1966}
1967
Martin Radev66fb8202016-07-28 11:45:20 +03001968void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001969{
Shannon Woods53a94a82014-06-24 15:20:36 -04001970 // Queries about context capabilities and maximums are answered by Context.
1971 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001972
1973 GLenum nativeType;
1974 unsigned int numParams;
1975 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1976 ASSERT(queryStatus);
1977
1978 if (nativeType == GL_INT_64_ANGLEX)
1979 {
1980 mGLState.getInteger64i_v(target, index, data);
1981 }
1982 else
1983 {
1984 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1985 }
1986}
1987
Brandon Jones59770802018-04-02 13:18:42 -07001988void Context::getInteger64i_vRobust(GLenum target,
1989 GLuint index,
1990 GLsizei bufSize,
1991 GLsizei *length,
1992 GLint64 *data)
1993{
1994 getInteger64i_v(target, index, data);
1995}
1996
Martin Radev66fb8202016-07-28 11:45:20 +03001997void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1998{
1999 // Queries about context capabilities and maximums are answered by Context.
2000 // Queries about current GL state values are answered by State.
2001
2002 GLenum nativeType;
2003 unsigned int numParams;
2004 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
2005 ASSERT(queryStatus);
2006
2007 if (nativeType == GL_BOOL)
2008 {
2009 mGLState.getBooleani_v(target, index, data);
2010 }
2011 else
2012 {
2013 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
2014 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04002015}
2016
Brandon Jones59770802018-04-02 13:18:42 -07002017void Context::getBooleani_vRobust(GLenum target,
2018 GLuint index,
2019 GLsizei bufSize,
2020 GLsizei *length,
2021 GLboolean *data)
2022{
2023 getBooleani_v(target, index, data);
2024}
2025
Corentin Wallez336129f2017-10-17 15:55:40 -04002026void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002027{
2028 Buffer *buffer = mGLState.getTargetBuffer(target);
2029 QueryBufferParameteriv(buffer, pname, params);
2030}
2031
Brandon Jones59770802018-04-02 13:18:42 -07002032void Context::getBufferParameterivRobust(BufferBinding target,
2033 GLenum pname,
2034 GLsizei bufSize,
2035 GLsizei *length,
2036 GLint *params)
2037{
2038 getBufferParameteriv(target, pname, params);
2039}
2040
He Yunchao010e4db2017-03-03 14:22:06 +08002041void Context::getFramebufferAttachmentParameteriv(GLenum target,
2042 GLenum attachment,
2043 GLenum pname,
2044 GLint *params)
2045{
2046 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002047 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002048}
2049
Brandon Jones59770802018-04-02 13:18:42 -07002050void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2051 GLenum attachment,
2052 GLenum pname,
2053 GLsizei bufSize,
2054 GLsizei *length,
2055 GLint *params)
2056{
2057 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2058}
2059
He Yunchao010e4db2017-03-03 14:22:06 +08002060void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2061{
2062 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2063 QueryRenderbufferiv(this, renderbuffer, pname, params);
2064}
2065
Brandon Jones59770802018-04-02 13:18:42 -07002066void Context::getRenderbufferParameterivRobust(GLenum target,
2067 GLenum pname,
2068 GLsizei bufSize,
2069 GLsizei *length,
2070 GLint *params)
2071{
2072 getRenderbufferParameteriv(target, pname, params);
2073}
2074
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002075void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002076{
Till Rathmannb8543632018-10-02 19:46:14 +02002077 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002078 QueryTexParameterfv(texture, pname, params);
2079}
2080
Brandon Jones59770802018-04-02 13:18:42 -07002081void Context::getTexParameterfvRobust(TextureType target,
2082 GLenum pname,
2083 GLsizei bufSize,
2084 GLsizei *length,
2085 GLfloat *params)
2086{
2087 getTexParameterfv(target, pname, params);
2088}
2089
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002090void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002091{
Till Rathmannb8543632018-10-02 19:46:14 +02002092 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002093 QueryTexParameteriv(texture, pname, params);
2094}
Jiajia Qin5451d532017-11-16 17:16:34 +08002095
Till Rathmannb8543632018-10-02 19:46:14 +02002096void Context::getTexParameterIiv(TextureType target, GLenum pname, GLint *params)
2097{
2098 const Texture *const texture = getTargetTexture(target);
2099 QueryTexParameterIiv(texture, pname, params);
2100}
2101
2102void Context::getTexParameterIuiv(TextureType target, GLenum pname, GLuint *params)
2103{
2104 const Texture *const texture = getTargetTexture(target);
2105 QueryTexParameterIuiv(texture, pname, params);
2106}
2107
Brandon Jones59770802018-04-02 13:18:42 -07002108void Context::getTexParameterivRobust(TextureType target,
2109 GLenum pname,
2110 GLsizei bufSize,
2111 GLsizei *length,
2112 GLint *params)
2113{
2114 getTexParameteriv(target, pname, params);
2115}
2116
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002117void Context::getTexParameterIivRobust(TextureType target,
2118 GLenum pname,
2119 GLsizei bufSize,
2120 GLsizei *length,
2121 GLint *params)
2122{
2123 UNIMPLEMENTED();
2124}
2125
2126void Context::getTexParameterIuivRobust(TextureType target,
2127 GLenum pname,
2128 GLsizei bufSize,
2129 GLsizei *length,
2130 GLuint *params)
2131{
2132 UNIMPLEMENTED();
2133}
2134
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002135void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002136{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002137 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002138 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002139}
2140
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002141void Context::getTexLevelParameterivRobust(TextureTarget target,
2142 GLint level,
2143 GLenum pname,
2144 GLsizei bufSize,
2145 GLsizei *length,
2146 GLint *params)
2147{
2148 UNIMPLEMENTED();
2149}
2150
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002151void Context::getTexLevelParameterfv(TextureTarget target,
2152 GLint level,
2153 GLenum pname,
2154 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002155{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002156 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002157 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002158}
2159
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002160void Context::getTexLevelParameterfvRobust(TextureTarget target,
2161 GLint level,
2162 GLenum pname,
2163 GLsizei bufSize,
2164 GLsizei *length,
2165 GLfloat *params)
2166{
2167 UNIMPLEMENTED();
2168}
2169
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002170void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002171{
Till Rathmannb8543632018-10-02 19:46:14 +02002172 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002173 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002174 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002175}
2176
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002177void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002178{
Till Rathmannb8543632018-10-02 19:46:14 +02002179 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002180 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002181 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002182}
2183
Brandon Jones59770802018-04-02 13:18:42 -07002184void Context::texParameterfvRobust(TextureType target,
2185 GLenum pname,
2186 GLsizei bufSize,
2187 const GLfloat *params)
2188{
2189 texParameterfv(target, pname, params);
2190}
2191
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002192void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002193{
Till Rathmannb8543632018-10-02 19:46:14 +02002194 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002195 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002196 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002197}
2198
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002199void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002200{
Till Rathmannb8543632018-10-02 19:46:14 +02002201 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002202 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002203 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002204}
2205
Till Rathmannb8543632018-10-02 19:46:14 +02002206void Context::texParameterIiv(TextureType target, GLenum pname, const GLint *params)
2207{
2208 Texture *const texture = getTargetTexture(target);
2209 SetTexParameterIiv(this, texture, pname, params);
2210 onTextureChange(texture);
2211}
2212
2213void Context::texParameterIuiv(TextureType target, GLenum pname, const GLuint *params)
2214{
2215 Texture *const texture = getTargetTexture(target);
2216 SetTexParameterIuiv(this, texture, pname, params);
2217 onTextureChange(texture);
2218}
2219
Brandon Jones59770802018-04-02 13:18:42 -07002220void Context::texParameterivRobust(TextureType target,
2221 GLenum pname,
2222 GLsizei bufSize,
2223 const GLint *params)
2224{
2225 texParameteriv(target, pname, params);
2226}
2227
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002228void Context::texParameterIivRobust(TextureType target,
2229 GLenum pname,
2230 GLsizei bufSize,
2231 const GLint *params)
2232{
2233 UNIMPLEMENTED();
2234}
2235
2236void Context::texParameterIuivRobust(TextureType target,
2237 GLenum pname,
2238 GLsizei bufSize,
2239 const GLuint *params)
2240{
2241 UNIMPLEMENTED();
2242}
2243
Jamie Madill493f9572018-05-24 19:52:15 -04002244void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002245{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002246 // No-op if count draws no primitives for given mode
2247 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002248 {
2249 return;
2250 }
2251
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002252 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002253 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002254 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002255}
2256
Jamie Madill493f9572018-05-24 19:52:15 -04002257void Context::drawArraysInstanced(PrimitiveMode mode,
2258 GLint first,
2259 GLsizei count,
2260 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002261{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002262 // No-op if count draws no primitives for given mode
2263 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002264 {
2265 return;
2266 }
2267
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002268 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002269 ANGLE_CONTEXT_TRY(
2270 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002271 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2272 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002273}
2274
Jamie Madill493f9572018-05-24 19:52:15 -04002275void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002276{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002277 // No-op if count draws no primitives for given mode
2278 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002279 {
2280 return;
2281 }
2282
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002283 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002284 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002285}
2286
Jamie Madill493f9572018-05-24 19:52:15 -04002287void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002288 GLsizei count,
2289 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002290 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002291 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002292{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002293 // No-op if count draws no primitives for given mode
2294 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002295 {
2296 return;
2297 }
2298
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002299 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002300 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002301 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002302}
2303
Jamie Madill493f9572018-05-24 19:52:15 -04002304void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002305 GLuint start,
2306 GLuint end,
2307 GLsizei count,
2308 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002309 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002310{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002311 // No-op if count draws no primitives for given mode
2312 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002313 {
2314 return;
2315 }
2316
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002317 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002318 ANGLE_CONTEXT_TRY(
2319 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002320}
2321
Jamie Madill493f9572018-05-24 19:52:15 -04002322void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002323{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002324 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002325 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002326}
2327
Jamie Madill493f9572018-05-24 19:52:15 -04002328void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002329{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002330 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002331 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002332}
2333
Jamie Madill675fe712016-12-19 13:07:54 -05002334void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002335{
Jamie Madillafa02a22017-11-23 12:57:38 -05002336 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002337}
2338
Jamie Madill675fe712016-12-19 13:07:54 -05002339void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002340{
Jamie Madillafa02a22017-11-23 12:57:38 -05002341 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002342}
2343
Austin Kinross6ee1e782015-05-29 17:05:37 -07002344void Context::insertEventMarker(GLsizei length, const char *marker)
2345{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002346 ASSERT(mImplementation);
2347 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002348}
2349
2350void Context::pushGroupMarker(GLsizei length, const char *marker)
2351{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002352 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002353
2354 if (marker == nullptr)
2355 {
2356 // From the EXT_debug_marker spec,
2357 // "If <marker> is null then an empty string is pushed on the stack."
2358 mImplementation->pushGroupMarker(length, "");
2359 }
2360 else
2361 {
2362 mImplementation->pushGroupMarker(length, marker);
2363 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002364}
2365
2366void Context::popGroupMarker()
2367{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002368 ASSERT(mImplementation);
2369 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002370}
2371
Geoff Langd8605522016-04-13 10:19:12 -04002372void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2373{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002374 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002375 ASSERT(programObject);
2376
2377 programObject->bindUniformLocation(location, name);
2378}
2379
Brandon Jones59770802018-04-02 13:18:42 -07002380void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002381{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002382 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002383}
2384
Brandon Jones59770802018-04-02 13:18:42 -07002385void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002386{
2387 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2388}
2389
Brandon Jones59770802018-04-02 13:18:42 -07002390void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002391{
2392 GLfloat I[16];
2393 angle::Matrix<GLfloat>::setToIdentity(I);
2394
2395 mGLState.loadPathRenderingMatrix(matrixMode, I);
2396}
2397
2398void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2399{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002400 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002401 if (!pathObj)
2402 return;
2403
Geoff Lang9bf86f02018-07-26 11:46:34 -04002404 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002405
2406 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2407}
2408
2409void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2410{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002411 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002412 if (!pathObj)
2413 return;
2414
Geoff Lang9bf86f02018-07-26 11:46:34 -04002415 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002416
2417 mImplementation->stencilStrokePath(pathObj, reference, mask);
2418}
2419
2420void Context::coverFillPath(GLuint path, GLenum coverMode)
2421{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002422 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002423 if (!pathObj)
2424 return;
2425
Geoff Lang9bf86f02018-07-26 11:46:34 -04002426 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002427
2428 mImplementation->coverFillPath(pathObj, coverMode);
2429}
2430
2431void Context::coverStrokePath(GLuint path, GLenum coverMode)
2432{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002433 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002434 if (!pathObj)
2435 return;
2436
Geoff Lang9bf86f02018-07-26 11:46:34 -04002437 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002438
2439 mImplementation->coverStrokePath(pathObj, coverMode);
2440}
2441
2442void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2443{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002444 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002445 if (!pathObj)
2446 return;
2447
Geoff Lang9bf86f02018-07-26 11:46:34 -04002448 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002449
2450 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2451}
2452
2453void Context::stencilThenCoverStrokePath(GLuint path,
2454 GLint reference,
2455 GLuint mask,
2456 GLenum coverMode)
2457{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002458 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002459 if (!pathObj)
2460 return;
2461
Geoff Lang9bf86f02018-07-26 11:46:34 -04002462 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002463
2464 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2465}
2466
Sami Väisänend59ca052016-06-21 16:10:00 +03002467void Context::coverFillPathInstanced(GLsizei numPaths,
2468 GLenum pathNameType,
2469 const void *paths,
2470 GLuint pathBase,
2471 GLenum coverMode,
2472 GLenum transformType,
2473 const GLfloat *transformValues)
2474{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002475 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002476
Geoff Lang9bf86f02018-07-26 11:46:34 -04002477 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002478
2479 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2480}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002481
Sami Väisänend59ca052016-06-21 16:10:00 +03002482void Context::coverStrokePathInstanced(GLsizei numPaths,
2483 GLenum pathNameType,
2484 const void *paths,
2485 GLuint pathBase,
2486 GLenum coverMode,
2487 GLenum transformType,
2488 const GLfloat *transformValues)
2489{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002490 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002491
2492 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002493 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002494
2495 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2496 transformValues);
2497}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002498
Sami Väisänend59ca052016-06-21 16:10:00 +03002499void Context::stencilFillPathInstanced(GLsizei numPaths,
2500 GLenum pathNameType,
2501 const void *paths,
2502 GLuint pathBase,
2503 GLenum fillMode,
2504 GLuint mask,
2505 GLenum transformType,
2506 const GLfloat *transformValues)
2507{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002508 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002509
2510 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002511 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002512
2513 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2514 transformValues);
2515}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002516
Sami Väisänend59ca052016-06-21 16:10:00 +03002517void Context::stencilStrokePathInstanced(GLsizei numPaths,
2518 GLenum pathNameType,
2519 const void *paths,
2520 GLuint pathBase,
2521 GLint reference,
2522 GLuint mask,
2523 GLenum transformType,
2524 const GLfloat *transformValues)
2525{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002526 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002527
Geoff Lang9bf86f02018-07-26 11:46:34 -04002528 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002529
2530 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2531 transformValues);
2532}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002533
Sami Väisänend59ca052016-06-21 16:10:00 +03002534void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2535 GLenum pathNameType,
2536 const void *paths,
2537 GLuint pathBase,
2538 GLenum fillMode,
2539 GLuint mask,
2540 GLenum coverMode,
2541 GLenum transformType,
2542 const GLfloat *transformValues)
2543{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002544 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002545
Geoff Lang9bf86f02018-07-26 11:46:34 -04002546 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002547
2548 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2549 transformType, transformValues);
2550}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002551
Sami Väisänend59ca052016-06-21 16:10:00 +03002552void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2553 GLenum pathNameType,
2554 const void *paths,
2555 GLuint pathBase,
2556 GLint reference,
2557 GLuint mask,
2558 GLenum coverMode,
2559 GLenum transformType,
2560 const GLfloat *transformValues)
2561{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002562 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002563
Geoff Lang9bf86f02018-07-26 11:46:34 -04002564 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002565
2566 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2567 transformType, transformValues);
2568}
2569
Sami Väisänen46eaa942016-06-29 10:26:37 +03002570void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2571{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002572 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002573
2574 programObject->bindFragmentInputLocation(location, name);
2575}
2576
2577void Context::programPathFragmentInputGen(GLuint program,
2578 GLint location,
2579 GLenum genMode,
2580 GLint components,
2581 const GLfloat *coeffs)
2582{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002583 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002584
jchen103fd614d2018-08-13 12:21:58 +08002585 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002586}
2587
jchen1015015f72017-03-16 13:54:21 +08002588GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2589{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002590 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002591 return QueryProgramResourceIndex(programObject, programInterface, name);
2592}
2593
jchen10fd7c3b52017-03-21 15:36:03 +08002594void Context::getProgramResourceName(GLuint program,
2595 GLenum programInterface,
2596 GLuint index,
2597 GLsizei bufSize,
2598 GLsizei *length,
2599 GLchar *name)
2600{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002601 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002602 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2603}
2604
jchen10191381f2017-04-11 13:59:04 +08002605GLint Context::getProgramResourceLocation(GLuint program,
2606 GLenum programInterface,
2607 const GLchar *name)
2608{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002609 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002610 return QueryProgramResourceLocation(programObject, programInterface, name);
2611}
2612
jchen10880683b2017-04-12 16:21:55 +08002613void Context::getProgramResourceiv(GLuint program,
2614 GLenum programInterface,
2615 GLuint index,
2616 GLsizei propCount,
2617 const GLenum *props,
2618 GLsizei bufSize,
2619 GLsizei *length,
2620 GLint *params)
2621{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002622 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002623 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2624 length, params);
2625}
2626
jchen10d9cd7b72017-08-30 15:04:25 +08002627void Context::getProgramInterfaceiv(GLuint program,
2628 GLenum programInterface,
2629 GLenum pname,
2630 GLint *params)
2631{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002632 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002633 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2634}
2635
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002636void Context::getProgramInterfaceivRobust(GLuint program,
2637 GLenum programInterface,
2638 GLenum pname,
2639 GLsizei bufSize,
2640 GLsizei *length,
2641 GLint *params)
2642{
2643 UNIMPLEMENTED();
2644}
2645
Jamie Madill306b6c12018-07-27 08:12:49 -04002646void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002647{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002648 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002649}
2650
Jamie Madillabfbc0f2018-10-09 12:48:52 -04002651void Context::handleError(GLenum errorCode,
2652 const char *message,
2653 const char *file,
2654 const char *function,
2655 unsigned int line)
2656{
2657 mErrors.handleError(errorCode, message, file, function, line);
2658}
2659
Jamie Madilla139f012018-10-10 16:13:03 -04002660void Context::validationError(GLenum errorCode, const char *message)
2661{
2662 mErrors.validationError(errorCode, message);
2663}
2664
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002665// Get one of the recorded errors and clear its flag, if any.
2666// [OpenGL ES 2.0.24] section 2.5 page 13.
2667GLenum Context::getError()
2668{
Geoff Langda5777c2014-07-11 09:52:58 -04002669 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002670 {
Geoff Langda5777c2014-07-11 09:52:58 -04002671 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002672 }
Geoff Langda5777c2014-07-11 09:52:58 -04002673 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002674 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002675 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002676 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002677}
2678
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002679// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002680void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002681{
2682 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002683 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002684 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002685 mContextLostForced = true;
2686 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002687 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002688}
2689
Jamie Madillfa920eb2018-01-04 11:45:50 -05002690GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002691{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002692 // Even if the application doesn't want to know about resets, we want to know
2693 // as it will allow us to skip all the calls.
2694 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002695 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002696 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002697 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002698 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002699 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002700
2701 // EXT_robustness, section 2.6: If the reset notification behavior is
2702 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2703 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2704 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002705 }
2706
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002707 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2708 // status should be returned at least once, and GL_NO_ERROR should be returned
2709 // once the device has finished resetting.
2710 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002711 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002712 ASSERT(mResetStatus == GL_NO_ERROR);
2713 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002714
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002715 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002716 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002717 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002718 }
2719 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002720 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002721 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002722 // If markContextLost was used to mark the context lost then
2723 // assume that is not recoverable, and continue to report the
2724 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002725 mResetStatus = mImplementation->getResetStatus();
2726 }
Jamie Madill893ab082014-05-16 16:56:10 -04002727
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002728 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002729}
2730
2731bool Context::isResetNotificationEnabled()
2732{
2733 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2734}
2735
Corentin Walleze3b10e82015-05-20 11:06:25 -04002736const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002737{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002738 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002739}
2740
2741EGLenum Context::getClientType() const
2742{
2743 return mClientType;
2744}
2745
2746EGLenum Context::getRenderBuffer() const
2747{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002748 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2749 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002750 {
2751 return EGL_NONE;
2752 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002753
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002754 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002755 ASSERT(backAttachment != nullptr);
2756 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002757}
2758
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002759VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002760{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002761 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002762 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2763 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002764 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002765 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2766 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002767
Jamie Madill96a483b2017-06-27 16:49:21 -04002768 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002769 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002770
2771 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002772}
2773
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002774TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002775{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002776 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002777 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2778 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002779 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002780 transformFeedback =
2781 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002782 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002783 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002784 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002785
2786 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002787}
2788
2789bool Context::isVertexArrayGenerated(GLuint vertexArray)
2790{
Jamie Madill96a483b2017-06-27 16:49:21 -04002791 ASSERT(mVertexArrayMap.contains(0));
2792 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002793}
2794
2795bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2796{
Jamie Madill96a483b2017-06-27 16:49:21 -04002797 ASSERT(mTransformFeedbackMap.contains(0));
2798 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002799}
2800
Shannon Woods53a94a82014-06-24 15:20:36 -04002801void Context::detachTexture(GLuint texture)
2802{
2803 // Simple pass-through to State's detachTexture method, as textures do not require
2804 // allocation map management either here or in the resource manager at detach time.
2805 // Zero textures are held by the Context, and we don't attempt to request them from
2806 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002807 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002808}
2809
James Darpinian4d9d4832018-03-13 12:43:28 -07002810void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002811{
Yuly Novikov5807a532015-12-03 13:01:22 -05002812 // Simple pass-through to State's detachBuffer method, since
2813 // only buffer attachments to container objects that are bound to the current context
2814 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002815
Yuly Novikov5807a532015-12-03 13:01:22 -05002816 // [OpenGL ES 3.2] section 5.1.2 page 45:
2817 // Attachments to unbound container objects, such as
2818 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2819 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002820 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002821}
2822
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002823void Context::detachFramebuffer(GLuint framebuffer)
2824{
Shannon Woods53a94a82014-06-24 15:20:36 -04002825 // Framebuffer detachment is handled by Context, because 0 is a valid
2826 // Framebuffer object, and a pointer to it must be passed from Context
2827 // to State at binding time.
2828
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002829 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002830 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2831 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2832 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002833
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002834 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002835 {
2836 bindReadFramebuffer(0);
2837 }
2838
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002839 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002840 {
2841 bindDrawFramebuffer(0);
2842 }
2843}
2844
2845void Context::detachRenderbuffer(GLuint renderbuffer)
2846{
Jamie Madilla02315b2017-02-23 14:14:47 -05002847 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002848}
2849
Jamie Madill57a89722013-07-02 11:57:03 -04002850void Context::detachVertexArray(GLuint vertexArray)
2851{
Jamie Madill77a72f62015-04-14 11:18:32 -04002852 // Vertex array detachment is handled by Context, because 0 is a valid
2853 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002854 // binding time.
2855
Jamie Madill57a89722013-07-02 11:57:03 -04002856 // [OpenGL ES 3.0.2] section 2.10 page 43:
2857 // If a vertex array object that is currently bound is deleted, the binding
2858 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002859 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002860 {
2861 bindVertexArray(0);
2862 }
2863}
2864
Geoff Langc8058452014-02-03 12:04:11 -05002865void Context::detachTransformFeedback(GLuint transformFeedback)
2866{
Corentin Walleza2257da2016-04-19 16:43:12 -04002867 // Transform feedback detachment is handled by Context, because 0 is a valid
2868 // transform feedback, and a pointer to it must be passed from Context to State at
2869 // binding time.
2870
2871 // The OpenGL specification doesn't mention what should happen when the currently bound
2872 // transform feedback object is deleted. Since it is a container object, we treat it like
2873 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002874 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002875 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002876 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002877 }
Geoff Langc8058452014-02-03 12:04:11 -05002878}
2879
Jamie Madilldc356042013-07-19 16:36:57 -04002880void Context::detachSampler(GLuint sampler)
2881{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002882 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002883}
2884
Yunchao Hea336b902017-08-02 16:05:21 +08002885void Context::detachProgramPipeline(GLuint pipeline)
2886{
2887 mGLState.detachProgramPipeline(this, pipeline);
2888}
2889
Jamie Madill3ef140a2017-08-26 23:11:21 -04002890void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002891{
Shaodde78e82017-05-22 14:13:27 +08002892 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002893 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002894}
2895
Jamie Madille29d1672013-07-19 16:36:57 -04002896void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2897{
Till Rathmannb8543632018-10-02 19:46:14 +02002898 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002899 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002900 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002901}
Jamie Madille29d1672013-07-19 16:36:57 -04002902
Geoff Langc1984ed2016-10-07 12:41:00 -04002903void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2904{
Till Rathmannb8543632018-10-02 19:46:14 +02002905 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002906 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002907 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002908}
2909
Till Rathmannb8543632018-10-02 19:46:14 +02002910void Context::samplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
2911{
2912 Sampler *const samplerObject =
2913 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2914 SetSamplerParameterIiv(this, samplerObject, pname, param);
2915}
2916
2917void Context::samplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
2918{
2919 Sampler *const samplerObject =
2920 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2921 SetSamplerParameterIuiv(this, samplerObject, pname, param);
2922}
2923
Brandon Jones59770802018-04-02 13:18:42 -07002924void Context::samplerParameterivRobust(GLuint sampler,
2925 GLenum pname,
2926 GLsizei bufSize,
2927 const GLint *param)
2928{
2929 samplerParameteriv(sampler, pname, param);
2930}
2931
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002932void Context::samplerParameterIivRobust(GLuint sampler,
2933 GLenum pname,
2934 GLsizei bufSize,
2935 const GLint *param)
2936{
2937 UNIMPLEMENTED();
2938}
2939
2940void Context::samplerParameterIuivRobust(GLuint sampler,
2941 GLenum pname,
2942 GLsizei bufSize,
2943 const GLuint *param)
2944{
2945 UNIMPLEMENTED();
2946}
2947
Jamie Madille29d1672013-07-19 16:36:57 -04002948void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2949{
Till Rathmannb8543632018-10-02 19:46:14 +02002950 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002951 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002952 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002953}
2954
Geoff Langc1984ed2016-10-07 12:41:00 -04002955void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002956{
Till Rathmannb8543632018-10-02 19:46:14 +02002957 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002958 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002959 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002960}
2961
Brandon Jones59770802018-04-02 13:18:42 -07002962void Context::samplerParameterfvRobust(GLuint sampler,
2963 GLenum pname,
2964 GLsizei bufSize,
2965 const GLfloat *param)
2966{
2967 samplerParameterfv(sampler, pname, param);
2968}
2969
Geoff Langc1984ed2016-10-07 12:41:00 -04002970void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002971{
Till Rathmannb8543632018-10-02 19:46:14 +02002972 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002973 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002974 QuerySamplerParameteriv(samplerObject, pname, params);
2975}
Jamie Madill9675b802013-07-19 16:36:59 -04002976
Till Rathmannb8543632018-10-02 19:46:14 +02002977void Context::getSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
2978{
2979 const Sampler *const samplerObject =
2980 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2981 QuerySamplerParameterIiv(samplerObject, pname, params);
2982}
2983
2984void Context::getSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
2985{
2986 const Sampler *const samplerObject =
2987 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2988 QuerySamplerParameterIuiv(samplerObject, pname, params);
2989}
2990
Brandon Jones59770802018-04-02 13:18:42 -07002991void Context::getSamplerParameterivRobust(GLuint sampler,
2992 GLenum pname,
2993 GLsizei bufSize,
2994 GLsizei *length,
2995 GLint *params)
2996{
2997 getSamplerParameteriv(sampler, pname, params);
2998}
2999
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07003000void Context::getSamplerParameterIivRobust(GLuint sampler,
3001 GLenum pname,
3002 GLsizei bufSize,
3003 GLsizei *length,
3004 GLint *params)
3005{
3006 UNIMPLEMENTED();
3007}
3008
3009void Context::getSamplerParameterIuivRobust(GLuint sampler,
3010 GLenum pname,
3011 GLsizei bufSize,
3012 GLsizei *length,
3013 GLuint *params)
3014{
3015 UNIMPLEMENTED();
3016}
3017
Geoff Langc1984ed2016-10-07 12:41:00 -04003018void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
3019{
Till Rathmannb8543632018-10-02 19:46:14 +02003020 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05003021 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04003022 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04003023}
3024
Brandon Jones59770802018-04-02 13:18:42 -07003025void Context::getSamplerParameterfvRobust(GLuint sampler,
3026 GLenum pname,
3027 GLsizei bufSize,
3028 GLsizei *length,
3029 GLfloat *params)
3030{
3031 getSamplerParameterfv(sampler, pname, params);
3032}
3033
Olli Etuahof0fee072016-03-30 15:11:58 +03003034void Context::programParameteri(GLuint program, GLenum pname, GLint value)
3035{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04003036 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08003037 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03003038}
3039
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003040void Context::initRendererString()
3041{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003042 std::ostringstream rendererString;
3043 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003044 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003045 rendererString << ")";
3046
Geoff Langcec35902014-04-16 10:52:36 -04003047 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003048}
3049
Geoff Langc339c4e2016-11-29 10:37:36 -05003050void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003051{
Geoff Langc339c4e2016-11-29 10:37:36 -05003052 const Version &clientVersion = getClientVersion();
3053
3054 std::ostringstream versionString;
3055 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
3056 << ANGLE_VERSION_STRING << ")";
3057 mVersionString = MakeStaticString(versionString.str());
3058
3059 std::ostringstream shadingLanguageVersionString;
3060 shadingLanguageVersionString << "OpenGL ES GLSL ES "
3061 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
3062 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
3063 << ")";
3064 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003065}
3066
Geoff Langcec35902014-04-16 10:52:36 -04003067void Context::initExtensionStrings()
3068{
Geoff Langc339c4e2016-11-29 10:37:36 -05003069 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
3070 std::ostringstream combinedStringStream;
3071 std::copy(strings.begin(), strings.end(),
3072 std::ostream_iterator<const char *>(combinedStringStream, " "));
3073 return MakeStaticString(combinedStringStream.str());
3074 };
3075
3076 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003077 for (const auto &extensionString : mExtensions.getStrings())
3078 {
3079 mExtensionStrings.push_back(MakeStaticString(extensionString));
3080 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003081 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003082
Geoff Langc339c4e2016-11-29 10:37:36 -05003083 mRequestableExtensionStrings.clear();
3084 for (const auto &extensionInfo : GetExtensionInfoMap())
3085 {
3086 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003087 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003088 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003089 {
3090 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3091 }
3092 }
3093 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003094}
3095
Geoff Langc339c4e2016-11-29 10:37:36 -05003096const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003097{
Geoff Langc339c4e2016-11-29 10:37:36 -05003098 switch (name)
3099 {
3100 case GL_VENDOR:
3101 return reinterpret_cast<const GLubyte *>("Google Inc.");
3102
3103 case GL_RENDERER:
3104 return reinterpret_cast<const GLubyte *>(mRendererString);
3105
3106 case GL_VERSION:
3107 return reinterpret_cast<const GLubyte *>(mVersionString);
3108
3109 case GL_SHADING_LANGUAGE_VERSION:
3110 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3111
3112 case GL_EXTENSIONS:
3113 return reinterpret_cast<const GLubyte *>(mExtensionString);
3114
3115 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3116 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3117
3118 default:
3119 UNREACHABLE();
3120 return nullptr;
3121 }
Geoff Langcec35902014-04-16 10:52:36 -04003122}
3123
Geoff Langc339c4e2016-11-29 10:37:36 -05003124const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003125{
Geoff Langc339c4e2016-11-29 10:37:36 -05003126 switch (name)
3127 {
3128 case GL_EXTENSIONS:
3129 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3130
3131 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3132 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3133
3134 default:
3135 UNREACHABLE();
3136 return nullptr;
3137 }
Geoff Langcec35902014-04-16 10:52:36 -04003138}
3139
3140size_t Context::getExtensionStringCount() const
3141{
3142 return mExtensionStrings.size();
3143}
3144
Geoff Lang111a99e2017-10-17 10:58:41 -04003145bool Context::isExtensionRequestable(const char *name)
3146{
3147 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3148 auto extension = extensionInfos.find(name);
3149
Geoff Lang111a99e2017-10-17 10:58:41 -04003150 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003151 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003152}
3153
Geoff Langc339c4e2016-11-29 10:37:36 -05003154void Context::requestExtension(const char *name)
3155{
3156 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3157 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3158 const auto &extension = extensionInfos.at(name);
3159 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003160 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003161
3162 if (mExtensions.*(extension.ExtensionsMember))
3163 {
3164 // Extension already enabled
3165 return;
3166 }
3167
3168 mExtensions.*(extension.ExtensionsMember) = true;
3169 updateCaps();
3170 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003171
Jamie Madill2f348d22017-06-05 10:50:59 -04003172 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3173 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003174
Jamie Madill81c2e252017-09-09 23:32:46 -04003175 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3176 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003177 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003178 for (auto &zeroTexture : mZeroTextures)
3179 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003180 if (zeroTexture.get() != nullptr)
3181 {
3182 zeroTexture->signalDirty(this, InitState::Initialized);
3183 }
Geoff Lang9aded172017-04-05 11:07:56 -04003184 }
3185
Jamie Madillb983a4b2018-08-01 11:34:51 -04003186 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003187}
3188
3189size_t Context::getRequestableExtensionStringCount() const
3190{
3191 return mRequestableExtensionStrings.size();
3192}
3193
Jamie Madill493f9572018-05-24 19:52:15 -04003194void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003195{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003196 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003197 ASSERT(transformFeedback != nullptr);
3198 ASSERT(!transformFeedback->isPaused());
3199
Jamie Madill6c1f6712017-02-14 19:08:04 -05003200 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003201 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003202}
3203
3204bool Context::hasActiveTransformFeedback(GLuint program) const
3205{
3206 for (auto pair : mTransformFeedbackMap)
3207 {
3208 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3209 {
3210 return true;
3211 }
3212 }
3213 return false;
3214}
3215
Geoff Lang33f11fb2018-05-07 13:42:47 -04003216Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003217{
3218 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3219
jchen1082af6202018-06-22 10:59:52 +08003220 // Explicitly enable GL_KHR_parallel_shader_compile
3221 supportedExtensions.parallelShaderCompile = true;
3222
Geoff Langb0f917f2017-12-05 13:41:54 -05003223 if (getClientVersion() < ES_2_0)
3224 {
3225 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003226 supportedExtensions.pointSizeArray = true;
3227 supportedExtensions.textureCubeMap = true;
3228 supportedExtensions.pointSprite = true;
3229 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003230 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003231 }
3232
3233 if (getClientVersion() < ES_3_0)
3234 {
3235 // Disable ES3+ extensions
3236 supportedExtensions.colorBufferFloat = false;
3237 supportedExtensions.eglImageExternalEssl3 = false;
3238 supportedExtensions.textureNorm16 = false;
3239 supportedExtensions.multiview = false;
3240 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003241 supportedExtensions.copyTexture3d = false;
Yizhou Jiang7818a852018-09-06 15:02:04 +08003242 supportedExtensions.textureMultisample = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003243 }
3244
3245 if (getClientVersion() < ES_3_1)
3246 {
3247 // Disable ES3.1+ extensions
3248 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003249
3250 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3251 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003252 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003253 }
3254
3255 if (getClientVersion() > ES_2_0)
3256 {
3257 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3258 // supportedExtensions.sRGB = false;
3259 }
3260
3261 // Some extensions are always available because they are implemented in the GL layer.
3262 supportedExtensions.bindUniformLocation = true;
3263 supportedExtensions.vertexArrayObject = true;
3264 supportedExtensions.bindGeneratesResource = true;
3265 supportedExtensions.clientArrays = true;
3266 supportedExtensions.requestExtension = true;
Austin Eng7cf9cd22018-10-09 15:27:32 -07003267 supportedExtensions.multiDraw = true;
Geoff Langb0f917f2017-12-05 13:41:54 -05003268
3269 // Enable the no error extension if the context was created with the flag.
3270 supportedExtensions.noError = mSkipValidation;
3271
3272 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003273 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003274
3275 // Explicitly enable GL_KHR_debug
3276 supportedExtensions.debug = true;
3277 supportedExtensions.maxDebugMessageLength = 1024;
3278 supportedExtensions.maxDebugLoggedMessages = 1024;
3279 supportedExtensions.maxDebugGroupStackDepth = 1024;
3280 supportedExtensions.maxLabelLength = 1024;
3281
3282 // Explicitly enable GL_ANGLE_robust_client_memory
3283 supportedExtensions.robustClientMemory = true;
3284
3285 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003286 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003287
3288 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3289 // supports it.
3290 supportedExtensions.robustBufferAccessBehavior =
3291 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3292
3293 // Enable the cache control query unconditionally.
3294 supportedExtensions.programCacheControl = true;
3295
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003296 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003297 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003298 {
3299 // GL_ANGLE_explicit_context_gles1
3300 supportedExtensions.explicitContextGles1 = true;
3301 // GL_ANGLE_explicit_context
3302 supportedExtensions.explicitContext = true;
3303 }
3304
Geoff Lang79b91402018-10-04 15:11:30 -04003305 supportedExtensions.memorySize = true;
3306
Geoff Langb0f917f2017-12-05 13:41:54 -05003307 return supportedExtensions;
3308}
3309
Geoff Lang33f11fb2018-05-07 13:42:47 -04003310void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003311{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003312 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003313
Geoff Lang33f11fb2018-05-07 13:42:47 -04003314 mSupportedExtensions = generateSupportedExtensions();
3315 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003316
3317 mLimitations = mImplementation->getNativeLimitations();
3318
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003319 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3320 if (getClientVersion() < Version(2, 0))
3321 {
3322 mCaps.maxMultitextureUnits = 4;
3323 mCaps.maxClipPlanes = 6;
3324 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003325 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3326 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3327 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003328 mCaps.minSmoothPointSize = 1.0f;
3329 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003330 mCaps.minSmoothLineWidth = 1.0f;
3331 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003332 }
3333
Luc Ferronad2ae932018-06-11 15:31:17 -04003334 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003335 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003336
Luc Ferronad2ae932018-06-11 15:31:17 -04003337 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3338
Jamie Madill0f80ed82017-09-19 00:24:56 -04003339 if (getClientVersion() < ES_3_1)
3340 {
3341 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3342 }
3343 else
3344 {
3345 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3346 }
Geoff Lang301d1612014-07-09 10:34:37 -04003347
Jiawei Shao54aafe52018-04-27 14:54:57 +08003348 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3349 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003350 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3351
Jamie Madill0f80ed82017-09-19 00:24:56 -04003352 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3353 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3354
3355 // Limit textures as well, so we can use fast bitsets with texture bindings.
3356 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003357 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3358 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3359 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3360 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003361
Jiawei Shaodb342272017-09-27 10:21:45 +08003362 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3363
Geoff Langc287ea62016-09-16 14:46:51 -04003364 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003365 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003366 for (const auto &extensionInfo : GetExtensionInfoMap())
3367 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003368 // If the user has requested that extensions start disabled and they are requestable,
3369 // disable them.
3370 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003371 {
3372 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3373 }
3374 }
3375
3376 // Generate texture caps
3377 updateCaps();
3378}
3379
3380void Context::updateCaps()
3381{
Geoff Lang900013c2014-07-07 11:32:19 -04003382 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003383 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003384
Jamie Madill7b62cf92017-11-02 15:20:49 -04003385 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003386 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003387 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003388 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003389
Geoff Lang0d8b7242015-09-09 14:56:53 -04003390 // Update the format caps based on the client version and extensions.
3391 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3392 // ES3.
3393 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003394 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003395 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003396 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003397 formatCaps.textureAttachment =
3398 formatCaps.textureAttachment &&
3399 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3400 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3401 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003402
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003403 // OpenGL ES does not support multisampling with non-rendererable formats
3404 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003405 if (!formatCaps.renderbuffer ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003406 (getClientVersion() < ES_3_1 &&
3407 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003408 {
Geoff Langd87878e2014-09-19 15:42:59 -04003409 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003410 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003411 else
3412 {
3413 // We may have limited the max samples for some required renderbuffer formats due to
3414 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3415 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3416
3417 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3418 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3419 // exception of signed and unsigned integer formats."
3420 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3421 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3422 {
3423 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3424 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3425 }
3426
3427 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3428 if (getClientVersion() >= ES_3_1)
3429 {
3430 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3431 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3432 // the exception that the signed and unsigned integer formats are required only to
3433 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3434 // multisamples, which must be at least one."
3435 if (formatInfo.componentType == GL_INT ||
3436 formatInfo.componentType == GL_UNSIGNED_INT)
3437 {
3438 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3439 }
3440
3441 // GLES 3.1 section 19.3.1.
3442 if (formatCaps.texturable)
3443 {
3444 if (formatInfo.depthBits > 0)
3445 {
3446 mCaps.maxDepthTextureSamples =
3447 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3448 }
3449 else if (formatInfo.redBits > 0)
3450 {
3451 mCaps.maxColorTextureSamples =
3452 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3453 }
3454 }
3455 }
3456 }
Geoff Langd87878e2014-09-19 15:42:59 -04003457
3458 if (formatCaps.texturable && formatInfo.compressed)
3459 {
Geoff Langca271392017-04-05 12:30:00 -04003460 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003461 }
3462
Geoff Langca271392017-04-05 12:30:00 -04003463 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003464 }
Jamie Madill32447362017-06-28 14:53:52 -04003465
3466 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003467 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003468 {
3469 mMemoryProgramCache = nullptr;
3470 }
Corentin Walleze4477002017-12-01 14:39:58 -05003471
3472 // Compute which buffer types are allowed
3473 mValidBufferBindings.reset();
3474 mValidBufferBindings.set(BufferBinding::ElementArray);
3475 mValidBufferBindings.set(BufferBinding::Array);
3476
3477 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3478 {
3479 mValidBufferBindings.set(BufferBinding::PixelPack);
3480 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3481 }
3482
3483 if (getClientVersion() >= ES_3_0)
3484 {
3485 mValidBufferBindings.set(BufferBinding::CopyRead);
3486 mValidBufferBindings.set(BufferBinding::CopyWrite);
3487 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3488 mValidBufferBindings.set(BufferBinding::Uniform);
3489 }
3490
3491 if (getClientVersion() >= ES_3_1)
3492 {
3493 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3494 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3495 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3496 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3497 }
jchen107ae70d82018-07-06 13:47:01 +08003498
3499 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003500
3501 // Reinitialize state cache after extension changes.
3502 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003503}
3504
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003505void Context::initWorkarounds()
3506{
Jamie Madill761b02c2017-06-23 16:27:06 -04003507 // Apply back-end workarounds.
3508 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3509
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003510 // Lose the context upon out of memory error if the application is
3511 // expecting to watch for those events.
3512 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
Jamie Madilld4f07762018-10-19 19:24:07 -04003513
3514 if (mWorkarounds.syncFramebufferBindingsOnTexImage)
3515 {
3516 // Update the Framebuffer bindings on TexImage to work around an Intel bug.
3517 mTexImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
3518 mTexImageDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
3519 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003520}
3521
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003522// Return true if the draw is a no-op, else return false.
3523// A no-op draw occurs if the count of vertices is less than the minimum required to
3524// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3525bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3526{
3527 return count < kMinimumPrimitiveCounts[mode];
3528}
3529
3530bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3531{
3532 return (instanceCount == 0) || noopDraw(mode, count);
3533}
3534
Jamie Madill6f755b22018-10-09 12:48:54 -04003535angle::Result Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003536{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003537 if (mGLES1Renderer)
3538 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003539 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003540 }
3541
Geoff Lang9bf86f02018-07-26 11:46:34 -04003542 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003543
3544 if (isRobustResourceInitEnabled())
3545 {
3546 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3547 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3548 }
3549
Geoff Langa8cb2872018-03-09 16:09:40 -05003550 ANGLE_TRY(syncDirtyBits());
Jamie Madill6f755b22018-10-09 12:48:54 -04003551 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003552}
3553
3554Error Context::prepareForClear(GLbitfield mask)
3555{
Geoff Langa8cb2872018-03-09 16:09:40 -05003556 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003557 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003558 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003559 return NoError();
3560}
3561
3562Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3563{
Geoff Langa8cb2872018-03-09 16:09:40 -05003564 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003565 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3566 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003567 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003568 return NoError();
3569}
3570
Geoff Langa8cb2872018-03-09 16:09:40 -05003571Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003572{
Geoff Langa8cb2872018-03-09 16:09:40 -05003573 ANGLE_TRY(syncDirtyObjects(objectMask));
3574 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003575 return NoError();
3576}
3577
Jamie Madill6f755b22018-10-09 12:48:54 -04003578angle::Result Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003579{
3580 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003581 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003582 mGLState.clearDirtyBits();
Jamie Madill6f755b22018-10-09 12:48:54 -04003583 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003584}
3585
Jamie Madill6f755b22018-10-09 12:48:54 -04003586angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003587{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003588 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003589 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003590 mGLState.clearDirtyBits(dirtyBits);
Jamie Madill6f755b22018-10-09 12:48:54 -04003591 return angle::Result::Continue();
Jamie Madill1b94d432015-08-07 13:23:23 -04003592}
Jamie Madillc29968b2016-01-20 11:17:23 -05003593
Jamie Madill6f755b22018-10-09 12:48:54 -04003594angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003595{
3596 return mGLState.syncDirtyObjects(this, objectMask);
3597}
3598
Jamie Madillc29968b2016-01-20 11:17:23 -05003599void Context::blitFramebuffer(GLint srcX0,
3600 GLint srcY0,
3601 GLint srcX1,
3602 GLint srcY1,
3603 GLint dstX0,
3604 GLint dstY0,
3605 GLint dstX1,
3606 GLint dstY1,
3607 GLbitfield mask,
3608 GLenum filter)
3609{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003610 if (mask == 0)
3611 {
3612 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3613 // buffers are copied.
3614 return;
3615 }
3616
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003617 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003618 ASSERT(drawFramebuffer);
3619
3620 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3621 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3622
Jamie Madillbc918e72018-03-08 09:47:21 -05003623 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003624
Jamie Madillc564c072017-06-01 12:45:42 -04003625 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003626}
Jamie Madillc29968b2016-01-20 11:17:23 -05003627
3628void Context::clear(GLbitfield mask)
3629{
Geoff Langd4fff502017-09-22 11:28:28 -04003630 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3631 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003632}
3633
3634void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3635{
Olli Etuaho78df3362018-10-05 16:43:27 +03003636 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3637 const FramebufferAttachment *attachment = nullptr;
3638 if (buffer == GL_DEPTH)
3639 {
3640 attachment = framebufferObject->getDepthbuffer();
3641 }
3642 if (buffer == GL_COLOR &&
3643 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3644 {
3645 attachment = framebufferObject->getColorbuffer(drawbuffer);
3646 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003647 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3648 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003649 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003650 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003651 return;
3652 }
Geoff Langd4fff502017-09-22 11:28:28 -04003653 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003654 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003655}
3656
3657void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3658{
Olli Etuaho78df3362018-10-05 16:43:27 +03003659 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3660 const FramebufferAttachment *attachment = nullptr;
3661 if (buffer == GL_COLOR &&
3662 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3663 {
3664 attachment = framebufferObject->getColorbuffer(drawbuffer);
3665 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003666 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3667 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003668 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003669 {
3670 return;
3671 }
Geoff Langd4fff502017-09-22 11:28:28 -04003672 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003673 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003674}
3675
3676void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3677{
Olli Etuaho78df3362018-10-05 16:43:27 +03003678 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3679 const FramebufferAttachment *attachment = nullptr;
3680 if (buffer == GL_STENCIL)
3681 {
3682 attachment = framebufferObject->getStencilbuffer();
3683 }
3684 if (buffer == GL_COLOR &&
3685 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3686 {
3687 attachment = framebufferObject->getColorbuffer(drawbuffer);
3688 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003689 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3690 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003691 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003692 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003693 return;
3694 }
Geoff Langd4fff502017-09-22 11:28:28 -04003695 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003696 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003697}
3698
3699void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3700{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003701 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003702 ASSERT(framebufferObject);
3703
3704 // If a buffer is not present, the clear has no effect
3705 if (framebufferObject->getDepthbuffer() == nullptr &&
3706 framebufferObject->getStencilbuffer() == nullptr)
3707 {
3708 return;
3709 }
3710
Geoff Langd4fff502017-09-22 11:28:28 -04003711 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3712 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003713}
3714
3715void Context::readPixels(GLint x,
3716 GLint y,
3717 GLsizei width,
3718 GLsizei height,
3719 GLenum format,
3720 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003721 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003722{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003723 if (width == 0 || height == 0)
3724 {
3725 return;
3726 }
3727
Jamie Madillbc918e72018-03-08 09:47:21 -05003728 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003729
Jamie Madillb6664922017-07-25 12:55:04 -04003730 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3731 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003732
3733 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003734 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003735}
3736
Brandon Jones59770802018-04-02 13:18:42 -07003737void Context::readPixelsRobust(GLint x,
3738 GLint y,
3739 GLsizei width,
3740 GLsizei height,
3741 GLenum format,
3742 GLenum type,
3743 GLsizei bufSize,
3744 GLsizei *length,
3745 GLsizei *columns,
3746 GLsizei *rows,
3747 void *pixels)
3748{
3749 readPixels(x, y, width, height, format, type, pixels);
3750}
3751
3752void Context::readnPixelsRobust(GLint x,
3753 GLint y,
3754 GLsizei width,
3755 GLsizei height,
3756 GLenum format,
3757 GLenum type,
3758 GLsizei bufSize,
3759 GLsizei *length,
3760 GLsizei *columns,
3761 GLsizei *rows,
3762 void *data)
3763{
3764 readPixels(x, y, width, height, format, type, data);
3765}
3766
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003767void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003768 GLint level,
3769 GLenum internalformat,
3770 GLint x,
3771 GLint y,
3772 GLsizei width,
3773 GLsizei height,
3774 GLint border)
3775{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003776 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003777 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003778
Jamie Madillc29968b2016-01-20 11:17:23 -05003779 Rectangle sourceArea(x, y, width, height);
3780
Jamie Madill05b35b22017-10-03 09:01:44 -04003781 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003782 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003783 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003784}
3785
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003786void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003787 GLint level,
3788 GLint xoffset,
3789 GLint yoffset,
3790 GLint x,
3791 GLint y,
3792 GLsizei width,
3793 GLsizei height)
3794{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003795 if (width == 0 || height == 0)
3796 {
3797 return;
3798 }
3799
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003800 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003801 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003802
Jamie Madillc29968b2016-01-20 11:17:23 -05003803 Offset destOffset(xoffset, yoffset, 0);
3804 Rectangle sourceArea(x, y, width, height);
3805
Jamie Madill05b35b22017-10-03 09:01:44 -04003806 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003807 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003808 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003809}
3810
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003811void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003812 GLint level,
3813 GLint xoffset,
3814 GLint yoffset,
3815 GLint zoffset,
3816 GLint x,
3817 GLint y,
3818 GLsizei width,
3819 GLsizei height)
3820{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003821 if (width == 0 || height == 0)
3822 {
3823 return;
3824 }
3825
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003826 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003827 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003828
Jamie Madillc29968b2016-01-20 11:17:23 -05003829 Offset destOffset(xoffset, yoffset, zoffset);
3830 Rectangle sourceArea(x, y, width, height);
3831
Jamie Madill05b35b22017-10-03 09:01:44 -04003832 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3833 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003834 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3835 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003836}
3837
3838void Context::framebufferTexture2D(GLenum target,
3839 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003840 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003841 GLuint texture,
3842 GLint level)
3843{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003844 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003845 ASSERT(framebuffer);
3846
3847 if (texture != 0)
3848 {
3849 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003850 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003851 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003852 }
3853 else
3854 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003855 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003856 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003857
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003858 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003859}
3860
3861void Context::framebufferRenderbuffer(GLenum target,
3862 GLenum attachment,
3863 GLenum renderbuffertarget,
3864 GLuint renderbuffer)
3865{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003866 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003867 ASSERT(framebuffer);
3868
3869 if (renderbuffer != 0)
3870 {
3871 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003872
Jamie Madillcc129372018-04-12 09:13:18 -04003873 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003874 renderbufferObject);
3875 }
3876 else
3877 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003878 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003879 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003880
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003881 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003882}
3883
3884void Context::framebufferTextureLayer(GLenum target,
3885 GLenum attachment,
3886 GLuint texture,
3887 GLint level,
3888 GLint layer)
3889{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003890 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003891 ASSERT(framebuffer);
3892
3893 if (texture != 0)
3894 {
3895 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003896 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003897 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003898 }
3899 else
3900 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003901 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003902 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003903
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003904 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003905}
3906
Brandon Jones59770802018-04-02 13:18:42 -07003907void Context::framebufferTextureMultiviewLayered(GLenum target,
3908 GLenum attachment,
3909 GLuint texture,
3910 GLint level,
3911 GLint baseViewIndex,
3912 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003913{
Martin Radev82ef7742017-08-08 17:44:58 +03003914 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3915 ASSERT(framebuffer);
3916
3917 if (texture != 0)
3918 {
3919 Texture *textureObj = getTexture(texture);
3920
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003921 ImageIndex index;
3922 if (textureObj->getType() == TextureType::_2DArray)
3923 {
3924 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3925 }
3926 else
3927 {
3928 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3929 ASSERT(level == 0);
3930 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3931 }
Martin Radev82ef7742017-08-08 17:44:58 +03003932 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3933 numViews, baseViewIndex);
3934 }
3935 else
3936 {
3937 framebuffer->resetAttachment(this, attachment);
3938 }
3939
3940 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003941}
3942
Brandon Jones59770802018-04-02 13:18:42 -07003943void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3944 GLenum attachment,
3945 GLuint texture,
3946 GLint level,
3947 GLsizei numViews,
3948 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003949{
Martin Radev5dae57b2017-07-14 16:15:55 +03003950 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3951 ASSERT(framebuffer);
3952
3953 if (texture != 0)
3954 {
3955 Texture *textureObj = getTexture(texture);
3956
3957 ImageIndex index = ImageIndex::Make2D(level);
3958 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3959 textureObj, numViews, viewportOffsets);
3960 }
3961 else
3962 {
3963 framebuffer->resetAttachment(this, attachment);
3964 }
3965
3966 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003967}
3968
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003969void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3970{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003971 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3972 ASSERT(framebuffer);
3973
3974 if (texture != 0)
3975 {
3976 Texture *textureObj = getTexture(texture);
3977
3978 ImageIndex index = ImageIndex::MakeFromType(
3979 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3980 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3981 }
3982 else
3983 {
3984 framebuffer->resetAttachment(this, attachment);
3985 }
3986
3987 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003988}
3989
Jamie Madillc29968b2016-01-20 11:17:23 -05003990void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3991{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003992 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003993 ASSERT(framebuffer);
3994 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003995 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003996 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003997}
3998
3999void Context::readBuffer(GLenum mode)
4000{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004001 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05004002 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004003 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05004004}
4005
4006void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
4007{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004008 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004009 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004010
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004011 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004012 ASSERT(framebuffer);
4013
4014 // The specification isn't clear what should be done when the framebuffer isn't complete.
4015 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04004016 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004017}
4018
4019void Context::invalidateFramebuffer(GLenum target,
4020 GLsizei numAttachments,
4021 const GLenum *attachments)
4022{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004023 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004024 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004025
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004026 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004027 ASSERT(framebuffer);
4028
Jamie Madill427064d2018-04-13 16:20:34 -04004029 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004030 {
Jamie Madill437fa652016-05-03 15:13:24 -04004031 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004032 }
Jamie Madill437fa652016-05-03 15:13:24 -04004033
Jamie Madill4928b7c2017-06-20 12:57:39 -04004034 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004035}
4036
4037void Context::invalidateSubFramebuffer(GLenum target,
4038 GLsizei numAttachments,
4039 const GLenum *attachments,
4040 GLint x,
4041 GLint y,
4042 GLsizei width,
4043 GLsizei height)
4044{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004045 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004046 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004047
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004048 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004049 ASSERT(framebuffer);
4050
Jamie Madill427064d2018-04-13 16:20:34 -04004051 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004052 {
Jamie Madill437fa652016-05-03 15:13:24 -04004053 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004054 }
Jamie Madill437fa652016-05-03 15:13:24 -04004055
4056 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004057 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05004058}
4059
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004060void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004061 GLint level,
4062 GLint internalformat,
4063 GLsizei width,
4064 GLsizei height,
4065 GLint border,
4066 GLenum format,
4067 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004068 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004069{
Jamie Madillbc918e72018-03-08 09:47:21 -05004070 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004071
4072 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004073 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004074 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004075 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004076}
4077
Brandon Jones59770802018-04-02 13:18:42 -07004078void Context::texImage2DRobust(TextureTarget target,
4079 GLint level,
4080 GLint internalformat,
4081 GLsizei width,
4082 GLsizei height,
4083 GLint border,
4084 GLenum format,
4085 GLenum type,
4086 GLsizei bufSize,
4087 const void *pixels)
4088{
4089 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4090}
4091
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004092void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004093 GLint level,
4094 GLint internalformat,
4095 GLsizei width,
4096 GLsizei height,
4097 GLsizei depth,
4098 GLint border,
4099 GLenum format,
4100 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004101 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004102{
Jamie Madillbc918e72018-03-08 09:47:21 -05004103 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004104
4105 Extents size(width, height, depth);
4106 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004107 handleError(texture->setImage(this, mGLState.getUnpackState(),
4108 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004109 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004110}
4111
Brandon Jones59770802018-04-02 13:18:42 -07004112void Context::texImage3DRobust(TextureType target,
4113 GLint level,
4114 GLint internalformat,
4115 GLsizei width,
4116 GLsizei height,
4117 GLsizei depth,
4118 GLint border,
4119 GLenum format,
4120 GLenum type,
4121 GLsizei bufSize,
4122 const void *pixels)
4123{
4124 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4125}
4126
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004127void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004128 GLint level,
4129 GLint xoffset,
4130 GLint yoffset,
4131 GLsizei width,
4132 GLsizei height,
4133 GLenum format,
4134 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004135 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004136{
4137 // Zero sized uploads are valid but no-ops
4138 if (width == 0 || height == 0)
4139 {
4140 return;
4141 }
4142
Jamie Madillbc918e72018-03-08 09:47:21 -05004143 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004144
4145 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004146 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004147
4148 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4149
4150 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4151 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004152}
4153
Brandon Jones59770802018-04-02 13:18:42 -07004154void Context::texSubImage2DRobust(TextureTarget target,
4155 GLint level,
4156 GLint xoffset,
4157 GLint yoffset,
4158 GLsizei width,
4159 GLsizei height,
4160 GLenum format,
4161 GLenum type,
4162 GLsizei bufSize,
4163 const void *pixels)
4164{
4165 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4166}
4167
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004168void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004169 GLint level,
4170 GLint xoffset,
4171 GLint yoffset,
4172 GLint zoffset,
4173 GLsizei width,
4174 GLsizei height,
4175 GLsizei depth,
4176 GLenum format,
4177 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004178 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004179{
4180 // Zero sized uploads are valid but no-ops
4181 if (width == 0 || height == 0 || depth == 0)
4182 {
4183 return;
4184 }
4185
Jamie Madillbc918e72018-03-08 09:47:21 -05004186 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004187
4188 Box area(xoffset, yoffset, zoffset, width, height, depth);
4189 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004190
4191 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4192
4193 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004194 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004195 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004196}
4197
Brandon Jones59770802018-04-02 13:18:42 -07004198void Context::texSubImage3DRobust(TextureType target,
4199 GLint level,
4200 GLint xoffset,
4201 GLint yoffset,
4202 GLint zoffset,
4203 GLsizei width,
4204 GLsizei height,
4205 GLsizei depth,
4206 GLenum format,
4207 GLenum type,
4208 GLsizei bufSize,
4209 const void *pixels)
4210{
4211 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4212 pixels);
4213}
4214
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004215void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004216 GLint level,
4217 GLenum internalformat,
4218 GLsizei width,
4219 GLsizei height,
4220 GLint border,
4221 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004222 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004223{
Jamie Madillbc918e72018-03-08 09:47:21 -05004224 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004225
4226 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004227 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004228 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4229 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004230 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004231}
4232
Brandon Jones59770802018-04-02 13:18:42 -07004233void Context::compressedTexImage2DRobust(TextureTarget target,
4234 GLint level,
4235 GLenum internalformat,
4236 GLsizei width,
4237 GLsizei height,
4238 GLint border,
4239 GLsizei imageSize,
4240 GLsizei dataSize,
4241 const GLvoid *data)
4242{
4243 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4244}
4245
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004246void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004247 GLint level,
4248 GLenum internalformat,
4249 GLsizei width,
4250 GLsizei height,
4251 GLsizei depth,
4252 GLint border,
4253 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004254 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004255{
Jamie Madillbc918e72018-03-08 09:47:21 -05004256 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004257
4258 Extents size(width, height, depth);
4259 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004260 handleError(texture->setCompressedImage(
4261 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004262 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004263}
4264
Brandon Jones59770802018-04-02 13:18:42 -07004265void Context::compressedTexImage3DRobust(TextureType target,
4266 GLint level,
4267 GLenum internalformat,
4268 GLsizei width,
4269 GLsizei height,
4270 GLsizei depth,
4271 GLint border,
4272 GLsizei imageSize,
4273 GLsizei dataSize,
4274 const GLvoid *data)
4275{
4276 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4277 data);
4278}
4279
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004280void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004281 GLint level,
4282 GLint xoffset,
4283 GLint yoffset,
4284 GLsizei width,
4285 GLsizei height,
4286 GLenum format,
4287 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004288 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004289{
Jamie Madillbc918e72018-03-08 09:47:21 -05004290 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004291
4292 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004293 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004294 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4295 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004296 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004297}
4298
Brandon Jones59770802018-04-02 13:18:42 -07004299void Context::compressedTexSubImage2DRobust(TextureTarget target,
4300 GLint level,
4301 GLint xoffset,
4302 GLint yoffset,
4303 GLsizei width,
4304 GLsizei height,
4305 GLenum format,
4306 GLsizei imageSize,
4307 GLsizei dataSize,
4308 const GLvoid *data)
4309{
4310 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4311 data);
4312}
4313
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004314void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004315 GLint level,
4316 GLint xoffset,
4317 GLint yoffset,
4318 GLint zoffset,
4319 GLsizei width,
4320 GLsizei height,
4321 GLsizei depth,
4322 GLenum format,
4323 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004324 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004325{
4326 // Zero sized uploads are valid but no-ops
4327 if (width == 0 || height == 0)
4328 {
4329 return;
4330 }
4331
Jamie Madillbc918e72018-03-08 09:47:21 -05004332 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004333
4334 Box area(xoffset, yoffset, zoffset, width, height, depth);
4335 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004336 handleError(texture->setCompressedSubImage(
4337 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004338 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004339}
4340
Brandon Jones59770802018-04-02 13:18:42 -07004341void Context::compressedTexSubImage3DRobust(TextureType target,
4342 GLint level,
4343 GLint xoffset,
4344 GLint yoffset,
4345 GLint zoffset,
4346 GLsizei width,
4347 GLsizei height,
4348 GLsizei depth,
4349 GLenum format,
4350 GLsizei imageSize,
4351 GLsizei dataSize,
4352 const GLvoid *data)
4353{
4354 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4355 imageSize, data);
4356}
4357
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004358void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004359{
4360 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004361 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004362}
4363
Jamie Madill007530e2017-12-28 14:27:04 -05004364void Context::copyTexture(GLuint sourceId,
4365 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004366 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004367 GLuint destId,
4368 GLint destLevel,
4369 GLint internalFormat,
4370 GLenum destType,
4371 GLboolean unpackFlipY,
4372 GLboolean unpackPremultiplyAlpha,
4373 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004374{
Jamie Madillbc918e72018-03-08 09:47:21 -05004375 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004376
4377 gl::Texture *sourceTexture = getTexture(sourceId);
4378 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004379 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4380 sourceLevel, ConvertToBool(unpackFlipY),
4381 ConvertToBool(unpackPremultiplyAlpha),
4382 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004383}
4384
Jamie Madill007530e2017-12-28 14:27:04 -05004385void Context::copySubTexture(GLuint sourceId,
4386 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004387 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004388 GLuint destId,
4389 GLint destLevel,
4390 GLint xoffset,
4391 GLint yoffset,
4392 GLint x,
4393 GLint y,
4394 GLsizei width,
4395 GLsizei height,
4396 GLboolean unpackFlipY,
4397 GLboolean unpackPremultiplyAlpha,
4398 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004399{
4400 // Zero sized copies are valid but no-ops
4401 if (width == 0 || height == 0)
4402 {
4403 return;
4404 }
4405
Jamie Madillbc918e72018-03-08 09:47:21 -05004406 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004407
4408 gl::Texture *sourceTexture = getTexture(sourceId);
4409 gl::Texture *destTexture = getTexture(destId);
4410 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004411 Box box(x, y, 0, width, height, 1);
4412 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4413 ConvertToBool(unpackFlipY),
4414 ConvertToBool(unpackPremultiplyAlpha),
4415 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4416}
4417
4418void Context::copyTexture3D(GLuint sourceId,
4419 GLint sourceLevel,
4420 TextureTarget destTarget,
4421 GLuint destId,
4422 GLint destLevel,
4423 GLint internalFormat,
4424 GLenum destType,
4425 GLboolean unpackFlipY,
4426 GLboolean unpackPremultiplyAlpha,
4427 GLboolean unpackUnmultiplyAlpha)
4428{
4429 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4430
4431 Texture *sourceTexture = getTexture(sourceId);
4432 Texture *destTexture = getTexture(destId);
4433 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4434 sourceLevel, ConvertToBool(unpackFlipY),
4435 ConvertToBool(unpackPremultiplyAlpha),
4436 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4437}
4438
4439void Context::copySubTexture3D(GLuint sourceId,
4440 GLint sourceLevel,
4441 TextureTarget destTarget,
4442 GLuint destId,
4443 GLint destLevel,
4444 GLint xoffset,
4445 GLint yoffset,
4446 GLint zoffset,
4447 GLint x,
4448 GLint y,
4449 GLint z,
4450 GLsizei width,
4451 GLsizei height,
4452 GLsizei depth,
4453 GLboolean unpackFlipY,
4454 GLboolean unpackPremultiplyAlpha,
4455 GLboolean unpackUnmultiplyAlpha)
4456{
4457 // Zero sized copies are valid but no-ops
4458 if (width == 0 || height == 0 || depth == 0)
4459 {
4460 return;
4461 }
4462
4463 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4464
4465 Texture *sourceTexture = getTexture(sourceId);
4466 Texture *destTexture = getTexture(destId);
4467 Offset offset(xoffset, yoffset, zoffset);
4468 Box box(x, y, z, width, height, depth);
4469 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004470 ConvertToBool(unpackFlipY),
4471 ConvertToBool(unpackPremultiplyAlpha),
4472 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004473}
4474
Jamie Madill007530e2017-12-28 14:27:04 -05004475void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004476{
Jamie Madillbc918e72018-03-08 09:47:21 -05004477 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004478
4479 gl::Texture *sourceTexture = getTexture(sourceId);
4480 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004481 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004482}
4483
Corentin Wallez336129f2017-10-17 15:55:40 -04004484void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004485{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004486 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004487 ASSERT(buffer);
4488
Geoff Lang496c02d2016-10-20 11:38:11 -07004489 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004490}
4491
Brandon Jones59770802018-04-02 13:18:42 -07004492void Context::getBufferPointervRobust(BufferBinding target,
4493 GLenum pname,
4494 GLsizei bufSize,
4495 GLsizei *length,
4496 void **params)
4497{
4498 getBufferPointerv(target, pname, params);
4499}
4500
Corentin Wallez336129f2017-10-17 15:55:40 -04004501void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004502{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004503 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004504 ASSERT(buffer);
4505
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004506 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004507 if (error.isError())
4508 {
Jamie Madill437fa652016-05-03 15:13:24 -04004509 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004510 return nullptr;
4511 }
4512
4513 return buffer->getMapPointer();
4514}
4515
Corentin Wallez336129f2017-10-17 15:55:40 -04004516GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004517{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004518 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004519 ASSERT(buffer);
4520
4521 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004522 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004523 if (error.isError())
4524 {
Jamie Madill437fa652016-05-03 15:13:24 -04004525 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004526 return GL_FALSE;
4527 }
4528
4529 return result;
4530}
4531
Corentin Wallez336129f2017-10-17 15:55:40 -04004532void *Context::mapBufferRange(BufferBinding target,
4533 GLintptr offset,
4534 GLsizeiptr length,
4535 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004536{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004537 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004538 ASSERT(buffer);
4539
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004540 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004541 if (error.isError())
4542 {
Jamie Madill437fa652016-05-03 15:13:24 -04004543 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004544 return nullptr;
4545 }
4546
4547 return buffer->getMapPointer();
4548}
4549
Corentin Wallez336129f2017-10-17 15:55:40 -04004550void Context::flushMappedBufferRange(BufferBinding /*target*/,
4551 GLintptr /*offset*/,
4552 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004553{
4554 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4555}
4556
Jamie Madillbc918e72018-03-08 09:47:21 -05004557Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004558{
Geoff Langa8cb2872018-03-09 16:09:40 -05004559 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004560}
4561
Jamie Madillbc918e72018-03-08 09:47:21 -05004562Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004563{
Geoff Langa8cb2872018-03-09 16:09:40 -05004564 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004565}
4566
Jamie Madillbc918e72018-03-08 09:47:21 -05004567Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004568{
Geoff Langa8cb2872018-03-09 16:09:40 -05004569 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004570}
4571
Geoff Lang9bf86f02018-07-26 11:46:34 -04004572Error Context::syncStateForPathOperation()
4573{
4574 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4575
4576 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4577 ANGLE_TRY(syncDirtyBits());
4578
4579 return NoError();
4580}
4581
Jiajia Qin5451d532017-11-16 17:16:34 +08004582void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4583{
4584 UNIMPLEMENTED();
4585}
4586
Jamie Madillc20ab272016-06-09 07:20:46 -07004587void Context::activeTexture(GLenum texture)
4588{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004589 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004590}
4591
Jamie Madill876429b2017-04-20 15:46:24 -04004592void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004593{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004594 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004595}
4596
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004597void Context::blendEquation(GLenum mode)
4598{
4599 mGLState.setBlendEquation(mode, mode);
4600}
4601
Jamie Madillc20ab272016-06-09 07:20:46 -07004602void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4603{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004604 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004605}
4606
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004607void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4608{
4609 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4610}
4611
Jamie Madillc20ab272016-06-09 07:20:46 -07004612void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4613{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004614 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004615}
4616
Jamie Madill876429b2017-04-20 15:46:24 -04004617void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004618{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004619 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004620}
4621
Jamie Madill876429b2017-04-20 15:46:24 -04004622void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004623{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004624 mGLState.setDepthClearValue(clamp01(depth));
Jamie Madillc20ab272016-06-09 07:20:46 -07004625}
4626
4627void Context::clearStencil(GLint s)
4628{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004629 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004630}
4631
4632void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4633{
Geoff Lang92019432017-11-20 13:09:34 -05004634 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4635 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004636}
4637
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004638void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004639{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004640 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004641}
4642
4643void Context::depthFunc(GLenum func)
4644{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004645 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004646}
4647
4648void Context::depthMask(GLboolean flag)
4649{
Geoff Lang92019432017-11-20 13:09:34 -05004650 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004651}
4652
Jamie Madill876429b2017-04-20 15:46:24 -04004653void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004654{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004655 mGLState.setDepthRange(clamp01(zNear), clamp01(zFar));
Jamie Madillc20ab272016-06-09 07:20:46 -07004656}
4657
4658void Context::disable(GLenum cap)
4659{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004660 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004661 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004662}
4663
4664void Context::disableVertexAttribArray(GLuint index)
4665{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004666 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004667 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004668}
4669
4670void Context::enable(GLenum cap)
4671{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004672 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004673 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004674}
4675
4676void Context::enableVertexAttribArray(GLuint index)
4677{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004678 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004679 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004680}
4681
4682void Context::frontFace(GLenum mode)
4683{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004684 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004685}
4686
4687void Context::hint(GLenum target, GLenum mode)
4688{
4689 switch (target)
4690 {
4691 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004692 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004693 break;
4694
4695 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004696 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004697 break;
4698
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004699 case GL_PERSPECTIVE_CORRECTION_HINT:
4700 case GL_POINT_SMOOTH_HINT:
4701 case GL_LINE_SMOOTH_HINT:
4702 case GL_FOG_HINT:
4703 mGLState.gles1().setHint(target, mode);
4704 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004705 default:
4706 UNREACHABLE();
4707 return;
4708 }
4709}
4710
4711void Context::lineWidth(GLfloat width)
4712{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004713 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004714}
4715
4716void Context::pixelStorei(GLenum pname, GLint param)
4717{
4718 switch (pname)
4719 {
4720 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004721 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004722 break;
4723
4724 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004725 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004726 break;
4727
4728 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004729 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004730 break;
4731
4732 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004733 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004734 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004735 break;
4736
4737 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004738 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004739 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004740 break;
4741
4742 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004743 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004744 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004745 break;
4746
4747 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004748 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004749 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004750 break;
4751
4752 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004753 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004754 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004755 break;
4756
4757 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004758 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004759 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004760 break;
4761
4762 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004763 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004764 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004765 break;
4766
4767 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004768 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004769 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004770 break;
4771
4772 default:
4773 UNREACHABLE();
4774 return;
4775 }
4776}
4777
4778void Context::polygonOffset(GLfloat factor, GLfloat units)
4779{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004780 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004781}
4782
Jamie Madill876429b2017-04-20 15:46:24 -04004783void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004784{
Geoff Lang92019432017-11-20 13:09:34 -05004785 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004786}
4787
Jiawei Shaodb342272017-09-27 10:21:45 +08004788void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4789{
4790 mGLState.setSampleMaskParams(maskNumber, mask);
4791}
4792
Jamie Madillc20ab272016-06-09 07:20:46 -07004793void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4794{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004795 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004796}
4797
4798void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4799{
4800 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4801 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004802 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004803 }
4804
4805 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4806 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004807 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004808 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004809
4810 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004811}
4812
4813void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4814{
4815 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4816 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004817 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004818 }
4819
4820 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4821 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004822 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004823 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004824
4825 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004826}
4827
4828void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4829{
4830 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4831 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004832 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004833 }
4834
4835 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4836 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004837 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004838 }
4839}
4840
4841void Context::vertexAttrib1f(GLuint index, GLfloat x)
4842{
4843 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004844 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004845 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004846}
4847
4848void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4849{
4850 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004851 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004852 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004853}
4854
4855void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4856{
4857 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004858 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004859 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004860}
4861
4862void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4863{
4864 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004865 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004866 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004867}
4868
4869void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4870{
4871 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004872 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004873 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004874}
4875
4876void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4877{
4878 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004879 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004880 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004881}
4882
4883void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4884{
4885 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004886 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004887 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004888}
4889
4890void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4891{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004892 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004893 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004894}
4895
4896void Context::vertexAttribPointer(GLuint index,
4897 GLint size,
4898 GLenum type,
4899 GLboolean normalized,
4900 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004901 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004902{
Corentin Wallez336129f2017-10-17 15:55:40 -04004903 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004904 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004905 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004906}
4907
Shao80957d92017-02-20 21:25:59 +08004908void Context::vertexAttribFormat(GLuint attribIndex,
4909 GLint size,
4910 GLenum type,
4911 GLboolean normalized,
4912 GLuint relativeOffset)
4913{
Geoff Lang92019432017-11-20 13:09:34 -05004914 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004915 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004916 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004917}
4918
4919void Context::vertexAttribIFormat(GLuint attribIndex,
4920 GLint size,
4921 GLenum type,
4922 GLuint relativeOffset)
4923{
4924 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004925 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004926}
4927
4928void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4929{
Shaodde78e82017-05-22 14:13:27 +08004930 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004931 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004932}
4933
Jiajia Qin5451d532017-11-16 17:16:34 +08004934void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004935{
4936 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004937 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004938}
4939
Jamie Madillc20ab272016-06-09 07:20:46 -07004940void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4941{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004942 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004943}
4944
4945void Context::vertexAttribIPointer(GLuint index,
4946 GLint size,
4947 GLenum type,
4948 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004949 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004950{
Corentin Wallez336129f2017-10-17 15:55:40 -04004951 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4952 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004953 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004954}
4955
4956void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4957{
4958 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004959 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004960 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004961}
4962
4963void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4964{
4965 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004966 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004967 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004968}
4969
4970void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4971{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004972 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004973 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004974}
4975
4976void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4977{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004978 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004979 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004980}
4981
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004982void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4983{
4984 const VertexAttribCurrentValueData &currentValues =
4985 getGLState().getVertexAttribCurrentValue(index);
4986 const VertexArray *vao = getGLState().getVertexArray();
4987 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4988 currentValues, pname, params);
4989}
4990
Brandon Jones59770802018-04-02 13:18:42 -07004991void Context::getVertexAttribivRobust(GLuint index,
4992 GLenum pname,
4993 GLsizei bufSize,
4994 GLsizei *length,
4995 GLint *params)
4996{
4997 getVertexAttribiv(index, pname, params);
4998}
4999
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005000void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
5001{
5002 const VertexAttribCurrentValueData &currentValues =
5003 getGLState().getVertexAttribCurrentValue(index);
5004 const VertexArray *vao = getGLState().getVertexArray();
5005 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5006 currentValues, pname, params);
5007}
5008
Brandon Jones59770802018-04-02 13:18:42 -07005009void Context::getVertexAttribfvRobust(GLuint index,
5010 GLenum pname,
5011 GLsizei bufSize,
5012 GLsizei *length,
5013 GLfloat *params)
5014{
5015 getVertexAttribfv(index, pname, params);
5016}
5017
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005018void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
5019{
5020 const VertexAttribCurrentValueData &currentValues =
5021 getGLState().getVertexAttribCurrentValue(index);
5022 const VertexArray *vao = getGLState().getVertexArray();
5023 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5024 currentValues, pname, params);
5025}
5026
Brandon Jones59770802018-04-02 13:18:42 -07005027void Context::getVertexAttribIivRobust(GLuint index,
5028 GLenum pname,
5029 GLsizei bufSize,
5030 GLsizei *length,
5031 GLint *params)
5032{
5033 getVertexAttribIiv(index, pname, params);
5034}
5035
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005036void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
5037{
5038 const VertexAttribCurrentValueData &currentValues =
5039 getGLState().getVertexAttribCurrentValue(index);
5040 const VertexArray *vao = getGLState().getVertexArray();
5041 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5042 currentValues, pname, params);
5043}
5044
Brandon Jones59770802018-04-02 13:18:42 -07005045void Context::getVertexAttribIuivRobust(GLuint index,
5046 GLenum pname,
5047 GLsizei bufSize,
5048 GLsizei *length,
5049 GLuint *params)
5050{
5051 getVertexAttribIuiv(index, pname, params);
5052}
5053
Jamie Madill876429b2017-04-20 15:46:24 -04005054void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005055{
5056 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
5057 QueryVertexAttribPointerv(attrib, pname, pointer);
5058}
5059
Brandon Jones59770802018-04-02 13:18:42 -07005060void Context::getVertexAttribPointervRobust(GLuint index,
5061 GLenum pname,
5062 GLsizei bufSize,
5063 GLsizei *length,
5064 void **pointer)
5065{
5066 getVertexAttribPointerv(index, pname, pointer);
5067}
5068
Jamie Madillc20ab272016-06-09 07:20:46 -07005069void Context::debugMessageControl(GLenum source,
5070 GLenum type,
5071 GLenum severity,
5072 GLsizei count,
5073 const GLuint *ids,
5074 GLboolean enabled)
5075{
5076 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005077 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05005078 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07005079}
5080
5081void Context::debugMessageInsert(GLenum source,
5082 GLenum type,
5083 GLuint id,
5084 GLenum severity,
5085 GLsizei length,
5086 const GLchar *buf)
5087{
5088 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005089 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005090}
5091
5092void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5093{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005094 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005095}
5096
5097GLuint Context::getDebugMessageLog(GLuint count,
5098 GLsizei bufSize,
5099 GLenum *sources,
5100 GLenum *types,
5101 GLuint *ids,
5102 GLenum *severities,
5103 GLsizei *lengths,
5104 GLchar *messageLog)
5105{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005106 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5107 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005108}
5109
5110void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5111{
5112 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005113 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005114 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005115}
5116
5117void Context::popDebugGroup()
5118{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005119 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005120 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005121}
5122
Corentin Wallez336129f2017-10-17 15:55:40 -04005123void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005124{
5125 Buffer *buffer = mGLState.getTargetBuffer(target);
5126 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005127 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005128}
5129
Corentin Wallez336129f2017-10-17 15:55:40 -04005130void Context::bufferSubData(BufferBinding target,
5131 GLintptr offset,
5132 GLsizeiptr size,
5133 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005134{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005135 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005136 {
5137 return;
5138 }
5139
5140 Buffer *buffer = mGLState.getTargetBuffer(target);
5141 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005142 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005143}
5144
Jamie Madillef300b12016-10-07 15:12:09 -04005145void Context::attachShader(GLuint program, GLuint shader)
5146{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005147 Program *programObject = mState.mShaderPrograms->getProgram(program);
5148 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005149 ASSERT(programObject && shaderObject);
5150 programObject->attachShader(shaderObject);
5151}
5152
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005153const Workarounds &Context::getWorkarounds() const
5154{
5155 return mWorkarounds;
5156}
5157
Corentin Wallez336129f2017-10-17 15:55:40 -04005158void Context::copyBufferSubData(BufferBinding readTarget,
5159 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005160 GLintptr readOffset,
5161 GLintptr writeOffset,
5162 GLsizeiptr size)
5163{
5164 // if size is zero, the copy is a successful no-op
5165 if (size == 0)
5166 {
5167 return;
5168 }
5169
5170 // TODO(jmadill): cache these.
5171 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5172 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5173
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005174 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005175}
5176
Jamie Madill01a80ee2016-11-07 12:06:18 -05005177void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5178{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005179 // Ideally we could share the program query with the validation layer if possible.
5180 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005181 ASSERT(programObject);
5182 programObject->bindAttributeLocation(index, name);
5183}
5184
Corentin Wallez336129f2017-10-17 15:55:40 -04005185void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005186{
Corentin Wallez336129f2017-10-17 15:55:40 -04005187 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5188 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005189 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005190}
5191
Corentin Wallez336129f2017-10-17 15:55:40 -04005192void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005193{
5194 bindBufferRange(target, index, buffer, 0, 0);
5195}
5196
Corentin Wallez336129f2017-10-17 15:55:40 -04005197void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005198 GLuint index,
5199 GLuint buffer,
5200 GLintptr offset,
5201 GLsizeiptr size)
5202{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005203 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5204 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5205 if (target == BufferBinding::Uniform)
5206 {
Jamie Madill472ddc82018-10-18 18:41:56 -04005207 mUniformBufferObserverBindings[index].bind(object);
Jamie Madilld84b6732018-09-06 15:54:35 -04005208 mStateCache.onUniformBufferStateChange(this);
5209 }
5210 else
5211 {
5212 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005213 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005214}
5215
Jamie Madill01a80ee2016-11-07 12:06:18 -05005216void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5217{
5218 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5219 {
5220 bindReadFramebuffer(framebuffer);
5221 }
5222
5223 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5224 {
5225 bindDrawFramebuffer(framebuffer);
5226 }
5227}
5228
5229void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5230{
5231 ASSERT(target == GL_RENDERBUFFER);
5232 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005233 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005234 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005235}
5236
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005237void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005238 GLsizei samples,
5239 GLenum internalformat,
5240 GLsizei width,
5241 GLsizei height,
5242 GLboolean fixedsamplelocations)
5243{
5244 Extents size(width, height, 1);
5245 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005246 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5247 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005248}
5249
Olli Etuaho89664842018-08-24 14:45:36 +03005250void Context::texStorage3DMultisample(TextureType target,
5251 GLsizei samples,
5252 GLenum internalformat,
5253 GLsizei width,
5254 GLsizei height,
5255 GLsizei depth,
5256 GLboolean fixedsamplelocations)
5257{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005258 Extents size(width, height, depth);
5259 Texture *texture = getTargetTexture(target);
5260 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5261 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005262}
5263
JiangYizhoubddc46b2016-12-09 09:50:51 +08005264void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5265{
JiangYizhou5b03f472017-01-09 10:22:53 +08005266 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5267 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005268 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005269 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005270
5271 switch (pname)
5272 {
5273 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005274 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005275 break;
5276 default:
5277 UNREACHABLE();
5278 }
5279}
5280
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005281void Context::getMultisamplefvRobust(GLenum pname,
5282 GLuint index,
5283 GLsizei bufSize,
5284 GLsizei *length,
5285 GLfloat *val)
5286{
5287 UNIMPLEMENTED();
5288}
5289
Jamie Madille8fb6402017-02-14 17:56:40 -05005290void Context::renderbufferStorage(GLenum target,
5291 GLenum internalformat,
5292 GLsizei width,
5293 GLsizei height)
5294{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005295 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5296 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5297
Jamie Madille8fb6402017-02-14 17:56:40 -05005298 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005299 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005300}
5301
5302void Context::renderbufferStorageMultisample(GLenum target,
5303 GLsizei samples,
5304 GLenum internalformat,
5305 GLsizei width,
5306 GLsizei height)
5307{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005308 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5309 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005310
5311 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005312 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005313 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005314}
5315
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005316void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5317{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005318 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005319 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005320}
5321
JiangYizhoue18e6392017-02-20 10:32:23 +08005322void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5323{
5324 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5325 QueryFramebufferParameteriv(framebuffer, pname, params);
5326}
5327
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005328void Context::getFramebufferParameterivRobust(GLenum target,
5329 GLenum pname,
5330 GLsizei bufSize,
5331 GLsizei *length,
5332 GLint *params)
5333{
5334 UNIMPLEMENTED();
5335}
5336
Jiajia Qin5451d532017-11-16 17:16:34 +08005337void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005338{
5339 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005340 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005341}
5342
Jamie Madilldec86232018-07-11 09:01:18 -04005343bool Context::getScratchBuffer(size_t requstedSizeBytes,
5344 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005345{
Jamie Madilldec86232018-07-11 09:01:18 -04005346 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005347}
5348
Jamie Madilldec86232018-07-11 09:01:18 -04005349bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5350 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005351{
Jamie Madilldec86232018-07-11 09:01:18 -04005352 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005353}
5354
Xinghua Cao10a4d432017-11-28 14:46:26 +08005355Error Context::prepareForDispatch()
5356{
Jamie Madill0cc11c62018-10-12 18:07:18 -04005357 ANGLE_TRY(syncDirtyObjects(mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005358
5359 if (isRobustResourceInitEnabled())
5360 {
5361 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5362 }
5363
Jamie Madill0cc11c62018-10-12 18:07:18 -04005364 return syncDirtyBits(mComputeDirtyBits);
Xinghua Cao10a4d432017-11-28 14:46:26 +08005365}
5366
Xinghua Cao2b396592017-03-29 15:36:04 +08005367void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5368{
5369 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5370 {
5371 return;
5372 }
5373
Xinghua Cao10a4d432017-11-28 14:46:26 +08005374 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005375 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005376}
5377
Jiajia Qin5451d532017-11-16 17:16:34 +08005378void Context::dispatchComputeIndirect(GLintptr indirect)
5379{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005380 ANGLE_CONTEXT_TRY(prepareForDispatch());
5381 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005382}
5383
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005384void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005385 GLsizei levels,
5386 GLenum internalFormat,
5387 GLsizei width,
5388 GLsizei height)
5389{
5390 Extents size(width, height, 1);
5391 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005392 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005393}
5394
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005395void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005396 GLsizei levels,
5397 GLenum internalFormat,
5398 GLsizei width,
5399 GLsizei height,
5400 GLsizei depth)
5401{
5402 Extents size(width, height, depth);
5403 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005404 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005405}
5406
Jiajia Qin5451d532017-11-16 17:16:34 +08005407void Context::memoryBarrier(GLbitfield barriers)
5408{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005409 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005410}
5411
5412void Context::memoryBarrierByRegion(GLbitfield barriers)
5413{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005414 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005415}
5416
Jamie Madillc1d770e2017-04-13 17:31:24 -04005417GLenum Context::checkFramebufferStatus(GLenum target)
5418{
5419 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5420 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005421 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005422}
5423
5424void Context::compileShader(GLuint shader)
5425{
5426 Shader *shaderObject = GetValidShader(this, shader);
5427 if (!shaderObject)
5428 {
5429 return;
5430 }
5431 shaderObject->compile(this);
5432}
5433
5434void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5435{
5436 for (int i = 0; i < n; i++)
5437 {
5438 deleteBuffer(buffers[i]);
5439 }
5440}
5441
5442void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5443{
5444 for (int i = 0; i < n; i++)
5445 {
5446 if (framebuffers[i] != 0)
5447 {
5448 deleteFramebuffer(framebuffers[i]);
5449 }
5450 }
5451}
5452
5453void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5454{
5455 for (int i = 0; i < n; i++)
5456 {
5457 deleteRenderbuffer(renderbuffers[i]);
5458 }
5459}
5460
5461void Context::deleteTextures(GLsizei n, const GLuint *textures)
5462{
5463 for (int i = 0; i < n; i++)
5464 {
5465 if (textures[i] != 0)
5466 {
5467 deleteTexture(textures[i]);
5468 }
5469 }
5470}
5471
5472void Context::detachShader(GLuint program, GLuint shader)
5473{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005474 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005475 ASSERT(programObject);
5476
5477 Shader *shaderObject = getShader(shader);
5478 ASSERT(shaderObject);
5479
5480 programObject->detachShader(this, shaderObject);
5481}
5482
5483void Context::genBuffers(GLsizei n, GLuint *buffers)
5484{
5485 for (int i = 0; i < n; i++)
5486 {
5487 buffers[i] = createBuffer();
5488 }
5489}
5490
5491void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5492{
5493 for (int i = 0; i < n; i++)
5494 {
5495 framebuffers[i] = createFramebuffer();
5496 }
5497}
5498
5499void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5500{
5501 for (int i = 0; i < n; i++)
5502 {
5503 renderbuffers[i] = createRenderbuffer();
5504 }
5505}
5506
5507void Context::genTextures(GLsizei n, GLuint *textures)
5508{
5509 for (int i = 0; i < n; i++)
5510 {
5511 textures[i] = createTexture();
5512 }
5513}
5514
5515void Context::getActiveAttrib(GLuint program,
5516 GLuint index,
5517 GLsizei bufsize,
5518 GLsizei *length,
5519 GLint *size,
5520 GLenum *type,
5521 GLchar *name)
5522{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005523 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005524 ASSERT(programObject);
5525 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5526}
5527
5528void Context::getActiveUniform(GLuint program,
5529 GLuint index,
5530 GLsizei bufsize,
5531 GLsizei *length,
5532 GLint *size,
5533 GLenum *type,
5534 GLchar *name)
5535{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005536 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005537 ASSERT(programObject);
5538 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5539}
5540
5541void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5542{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005543 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005544 ASSERT(programObject);
5545 programObject->getAttachedShaders(maxcount, count, shaders);
5546}
5547
5548GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5549{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005550 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005551 ASSERT(programObject);
5552 return programObject->getAttributeLocation(name);
5553}
5554
5555void Context::getBooleanv(GLenum pname, GLboolean *params)
5556{
5557 GLenum nativeType;
5558 unsigned int numParams = 0;
5559 getQueryParameterInfo(pname, &nativeType, &numParams);
5560
5561 if (nativeType == GL_BOOL)
5562 {
5563 getBooleanvImpl(pname, params);
5564 }
5565 else
5566 {
5567 CastStateValues(this, nativeType, pname, numParams, params);
5568 }
5569}
5570
Brandon Jones59770802018-04-02 13:18:42 -07005571void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5572{
5573 getBooleanv(pname, params);
5574}
5575
Jamie Madillc1d770e2017-04-13 17:31:24 -04005576void Context::getFloatv(GLenum pname, GLfloat *params)
5577{
5578 GLenum nativeType;
5579 unsigned int numParams = 0;
5580 getQueryParameterInfo(pname, &nativeType, &numParams);
5581
5582 if (nativeType == GL_FLOAT)
5583 {
5584 getFloatvImpl(pname, params);
5585 }
5586 else
5587 {
5588 CastStateValues(this, nativeType, pname, numParams, params);
5589 }
5590}
5591
Brandon Jones59770802018-04-02 13:18:42 -07005592void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5593{
5594 getFloatv(pname, params);
5595}
5596
Jamie Madillc1d770e2017-04-13 17:31:24 -04005597void Context::getIntegerv(GLenum pname, GLint *params)
5598{
5599 GLenum nativeType;
5600 unsigned int numParams = 0;
5601 getQueryParameterInfo(pname, &nativeType, &numParams);
5602
5603 if (nativeType == GL_INT)
5604 {
5605 getIntegervImpl(pname, params);
5606 }
5607 else
5608 {
5609 CastStateValues(this, nativeType, pname, numParams, params);
5610 }
5611}
5612
Brandon Jones59770802018-04-02 13:18:42 -07005613void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5614{
5615 getIntegerv(pname, data);
5616}
5617
Jamie Madillc1d770e2017-04-13 17:31:24 -04005618void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5619{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005620 // Don't resolve link if checking the link completion status.
5621 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5622 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005623 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005624 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005625}
5626
Brandon Jones59770802018-04-02 13:18:42 -07005627void Context::getProgramivRobust(GLuint program,
5628 GLenum pname,
5629 GLsizei bufSize,
5630 GLsizei *length,
5631 GLint *params)
5632{
5633 getProgramiv(program, pname, params);
5634}
5635
Jiajia Qin5451d532017-11-16 17:16:34 +08005636void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5637{
5638 UNIMPLEMENTED();
5639}
5640
Jamie Madillbe849e42017-05-02 15:49:00 -04005641void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005642{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005643 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005644 ASSERT(programObject);
5645 programObject->getInfoLog(bufsize, length, infolog);
5646}
5647
Jiajia Qin5451d532017-11-16 17:16:34 +08005648void Context::getProgramPipelineInfoLog(GLuint pipeline,
5649 GLsizei bufSize,
5650 GLsizei *length,
5651 GLchar *infoLog)
5652{
5653 UNIMPLEMENTED();
5654}
5655
Jamie Madillc1d770e2017-04-13 17:31:24 -04005656void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5657{
5658 Shader *shaderObject = getShader(shader);
5659 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005660 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005661}
5662
Brandon Jones59770802018-04-02 13:18:42 -07005663void Context::getShaderivRobust(GLuint shader,
5664 GLenum pname,
5665 GLsizei bufSize,
5666 GLsizei *length,
5667 GLint *params)
5668{
5669 getShaderiv(shader, pname, params);
5670}
5671
Jamie Madillc1d770e2017-04-13 17:31:24 -04005672void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5673{
5674 Shader *shaderObject = getShader(shader);
5675 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005676 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005677}
5678
5679void Context::getShaderPrecisionFormat(GLenum shadertype,
5680 GLenum precisiontype,
5681 GLint *range,
5682 GLint *precision)
5683{
5684 // TODO(jmadill): Compute shaders.
5685
5686 switch (shadertype)
5687 {
5688 case GL_VERTEX_SHADER:
5689 switch (precisiontype)
5690 {
5691 case GL_LOW_FLOAT:
5692 mCaps.vertexLowpFloat.get(range, precision);
5693 break;
5694 case GL_MEDIUM_FLOAT:
5695 mCaps.vertexMediumpFloat.get(range, precision);
5696 break;
5697 case GL_HIGH_FLOAT:
5698 mCaps.vertexHighpFloat.get(range, precision);
5699 break;
5700
5701 case GL_LOW_INT:
5702 mCaps.vertexLowpInt.get(range, precision);
5703 break;
5704 case GL_MEDIUM_INT:
5705 mCaps.vertexMediumpInt.get(range, precision);
5706 break;
5707 case GL_HIGH_INT:
5708 mCaps.vertexHighpInt.get(range, precision);
5709 break;
5710
5711 default:
5712 UNREACHABLE();
5713 return;
5714 }
5715 break;
5716
5717 case GL_FRAGMENT_SHADER:
5718 switch (precisiontype)
5719 {
5720 case GL_LOW_FLOAT:
5721 mCaps.fragmentLowpFloat.get(range, precision);
5722 break;
5723 case GL_MEDIUM_FLOAT:
5724 mCaps.fragmentMediumpFloat.get(range, precision);
5725 break;
5726 case GL_HIGH_FLOAT:
5727 mCaps.fragmentHighpFloat.get(range, precision);
5728 break;
5729
5730 case GL_LOW_INT:
5731 mCaps.fragmentLowpInt.get(range, precision);
5732 break;
5733 case GL_MEDIUM_INT:
5734 mCaps.fragmentMediumpInt.get(range, precision);
5735 break;
5736 case GL_HIGH_INT:
5737 mCaps.fragmentHighpInt.get(range, precision);
5738 break;
5739
5740 default:
5741 UNREACHABLE();
5742 return;
5743 }
5744 break;
5745
5746 default:
5747 UNREACHABLE();
5748 return;
5749 }
5750}
5751
5752void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5753{
5754 Shader *shaderObject = getShader(shader);
5755 ASSERT(shaderObject);
5756 shaderObject->getSource(bufsize, length, source);
5757}
5758
5759void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5760{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005761 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005762 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005763 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005764}
5765
Brandon Jones59770802018-04-02 13:18:42 -07005766void Context::getUniformfvRobust(GLuint program,
5767 GLint location,
5768 GLsizei bufSize,
5769 GLsizei *length,
5770 GLfloat *params)
5771{
5772 getUniformfv(program, location, params);
5773}
5774
Jamie Madillc1d770e2017-04-13 17:31:24 -04005775void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5776{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005777 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005778 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005779 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005780}
5781
Brandon Jones59770802018-04-02 13:18:42 -07005782void Context::getUniformivRobust(GLuint program,
5783 GLint location,
5784 GLsizei bufSize,
5785 GLsizei *length,
5786 GLint *params)
5787{
5788 getUniformiv(program, location, params);
5789}
5790
Jamie Madillc1d770e2017-04-13 17:31:24 -04005791GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5792{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005793 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005794 ASSERT(programObject);
5795 return programObject->getUniformLocation(name);
5796}
5797
5798GLboolean Context::isBuffer(GLuint buffer)
5799{
5800 if (buffer == 0)
5801 {
5802 return GL_FALSE;
5803 }
5804
5805 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5806}
5807
5808GLboolean Context::isEnabled(GLenum cap)
5809{
5810 return mGLState.getEnableFeature(cap);
5811}
5812
5813GLboolean Context::isFramebuffer(GLuint framebuffer)
5814{
5815 if (framebuffer == 0)
5816 {
5817 return GL_FALSE;
5818 }
5819
5820 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5821}
5822
5823GLboolean Context::isProgram(GLuint program)
5824{
5825 if (program == 0)
5826 {
5827 return GL_FALSE;
5828 }
5829
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005830 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005831}
5832
5833GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5834{
5835 if (renderbuffer == 0)
5836 {
5837 return GL_FALSE;
5838 }
5839
5840 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5841}
5842
5843GLboolean Context::isShader(GLuint shader)
5844{
5845 if (shader == 0)
5846 {
5847 return GL_FALSE;
5848 }
5849
5850 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5851}
5852
5853GLboolean Context::isTexture(GLuint texture)
5854{
5855 if (texture == 0)
5856 {
5857 return GL_FALSE;
5858 }
5859
5860 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5861}
5862
5863void Context::linkProgram(GLuint program)
5864{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005865 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005866 ASSERT(programObject);
5867 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08005868
5869 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
5870 // don't need to worry that:
5871 // 1. Draw calls after link use the new executable code or the old one depending on the link
5872 // result.
5873 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
5874 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
5875 // ProgramD3D.
5876 if (programObject->isInUse())
5877 {
Jamie Madill785e8a02018-10-04 17:42:00 -04005878 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04005879 if (programObject->isLinked())
5880 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04005881 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04005882 }
jchen107ae70d82018-07-06 13:47:01 +08005883 mStateCache.onProgramExecutableChange(this);
5884 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005885}
5886
5887void Context::releaseShaderCompiler()
5888{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005889 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005890}
5891
5892void Context::shaderBinary(GLsizei n,
5893 const GLuint *shaders,
5894 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005895 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005896 GLsizei length)
5897{
5898 // No binary shader formats are supported.
5899 UNIMPLEMENTED();
5900}
5901
Olli Etuaho0ca09752018-09-24 11:00:50 +03005902void Context::bindFragDataLocationIndexed(GLuint program,
5903 GLuint colorNumber,
5904 GLuint index,
5905 const char *name)
5906{
5907 Program *programObject = getProgramNoResolveLink(program);
5908 programObject->bindFragmentOutputLocation(colorNumber, name);
5909 programObject->bindFragmentOutputIndex(index, name);
5910}
5911
5912void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
5913{
5914 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
5915}
5916
5917int Context::getFragDataIndex(GLuint program, const char *name)
5918{
5919 Program *programObject = getProgramResolveLink(program);
5920 return programObject->getFragDataIndex(name);
5921}
5922
5923int Context::getProgramResourceLocationIndex(GLuint program,
5924 GLenum programInterface,
5925 const char *name)
5926{
5927 Program *programObject = getProgramResolveLink(program);
5928 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
5929 return programObject->getFragDataIndex(name);
5930}
5931
Jamie Madillc1d770e2017-04-13 17:31:24 -04005932void Context::shaderSource(GLuint shader,
5933 GLsizei count,
5934 const GLchar *const *string,
5935 const GLint *length)
5936{
5937 Shader *shaderObject = getShader(shader);
5938 ASSERT(shaderObject);
5939 shaderObject->setSource(count, string, length);
5940}
5941
5942void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5943{
5944 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5945}
5946
5947void Context::stencilMask(GLuint mask)
5948{
5949 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5950}
5951
5952void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5953{
5954 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5955}
5956
5957void Context::uniform1f(GLint location, GLfloat x)
5958{
5959 Program *program = mGLState.getProgram();
5960 program->setUniform1fv(location, 1, &x);
5961}
5962
5963void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5964{
5965 Program *program = mGLState.getProgram();
5966 program->setUniform1fv(location, count, v);
5967}
5968
Jamie Madill7e4eff12018-08-08 15:49:26 -04005969void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005970{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005971 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04005972 {
5973 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04005974 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04005975 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005976}
5977
Jamie Madill7e4eff12018-08-08 15:49:26 -04005978void Context::uniform1i(GLint location, GLint x)
5979{
5980 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
5981}
5982
Jamie Madillc1d770e2017-04-13 17:31:24 -04005983void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5984{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005985 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005986}
5987
5988void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5989{
5990 GLfloat xy[2] = {x, y};
5991 Program *program = mGLState.getProgram();
5992 program->setUniform2fv(location, 1, xy);
5993}
5994
5995void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5996{
5997 Program *program = mGLState.getProgram();
5998 program->setUniform2fv(location, count, v);
5999}
6000
6001void Context::uniform2i(GLint location, GLint x, GLint y)
6002{
6003 GLint xy[2] = {x, y};
6004 Program *program = mGLState.getProgram();
6005 program->setUniform2iv(location, 1, xy);
6006}
6007
6008void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
6009{
6010 Program *program = mGLState.getProgram();
6011 program->setUniform2iv(location, count, v);
6012}
6013
6014void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6015{
6016 GLfloat xyz[3] = {x, y, z};
6017 Program *program = mGLState.getProgram();
6018 program->setUniform3fv(location, 1, xyz);
6019}
6020
6021void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
6022{
6023 Program *program = mGLState.getProgram();
6024 program->setUniform3fv(location, count, v);
6025}
6026
6027void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
6028{
6029 GLint xyz[3] = {x, y, z};
6030 Program *program = mGLState.getProgram();
6031 program->setUniform3iv(location, 1, xyz);
6032}
6033
6034void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
6035{
6036 Program *program = mGLState.getProgram();
6037 program->setUniform3iv(location, count, v);
6038}
6039
6040void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6041{
6042 GLfloat xyzw[4] = {x, y, z, w};
6043 Program *program = mGLState.getProgram();
6044 program->setUniform4fv(location, 1, xyzw);
6045}
6046
6047void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
6048{
6049 Program *program = mGLState.getProgram();
6050 program->setUniform4fv(location, count, v);
6051}
6052
6053void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6054{
6055 GLint xyzw[4] = {x, y, z, w};
6056 Program *program = mGLState.getProgram();
6057 program->setUniform4iv(location, 1, xyzw);
6058}
6059
6060void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
6061{
6062 Program *program = mGLState.getProgram();
6063 program->setUniform4iv(location, count, v);
6064}
6065
6066void Context::uniformMatrix2fv(GLint location,
6067 GLsizei count,
6068 GLboolean transpose,
6069 const GLfloat *value)
6070{
6071 Program *program = mGLState.getProgram();
6072 program->setUniformMatrix2fv(location, count, transpose, value);
6073}
6074
6075void Context::uniformMatrix3fv(GLint location,
6076 GLsizei count,
6077 GLboolean transpose,
6078 const GLfloat *value)
6079{
6080 Program *program = mGLState.getProgram();
6081 program->setUniformMatrix3fv(location, count, transpose, value);
6082}
6083
6084void Context::uniformMatrix4fv(GLint location,
6085 GLsizei count,
6086 GLboolean transpose,
6087 const GLfloat *value)
6088{
6089 Program *program = mGLState.getProgram();
6090 program->setUniformMatrix4fv(location, count, transpose, value);
6091}
6092
6093void Context::validateProgram(GLuint program)
6094{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006095 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006096 ASSERT(programObject);
6097 programObject->validate(mCaps);
6098}
6099
Jiajia Qin5451d532017-11-16 17:16:34 +08006100void Context::validateProgramPipeline(GLuint pipeline)
6101{
6102 UNIMPLEMENTED();
6103}
6104
Jamie Madilld04908b2017-06-09 14:15:35 -04006105void Context::getProgramBinary(GLuint program,
6106 GLsizei bufSize,
6107 GLsizei *length,
6108 GLenum *binaryFormat,
6109 void *binary)
6110{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006111 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006112 ASSERT(programObject != nullptr);
6113
6114 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
6115}
6116
6117void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6118{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006119 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006120 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006121
Jamie Madilld04908b2017-06-09 14:15:35 -04006122 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006123 if (programObject->isInUse())
6124 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006125 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006126 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006127 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006128}
6129
Jamie Madillff325f12017-08-26 15:06:05 -04006130void Context::uniform1ui(GLint location, GLuint v0)
6131{
6132 Program *program = mGLState.getProgram();
6133 program->setUniform1uiv(location, 1, &v0);
6134}
6135
6136void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6137{
6138 Program *program = mGLState.getProgram();
6139 const GLuint xy[] = {v0, v1};
6140 program->setUniform2uiv(location, 1, xy);
6141}
6142
6143void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6144{
6145 Program *program = mGLState.getProgram();
6146 const GLuint xyz[] = {v0, v1, v2};
6147 program->setUniform3uiv(location, 1, xyz);
6148}
6149
6150void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6151{
6152 Program *program = mGLState.getProgram();
6153 const GLuint xyzw[] = {v0, v1, v2, v3};
6154 program->setUniform4uiv(location, 1, xyzw);
6155}
6156
6157void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6158{
6159 Program *program = mGLState.getProgram();
6160 program->setUniform1uiv(location, count, value);
6161}
6162void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6163{
6164 Program *program = mGLState.getProgram();
6165 program->setUniform2uiv(location, count, value);
6166}
6167
6168void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6169{
6170 Program *program = mGLState.getProgram();
6171 program->setUniform3uiv(location, count, value);
6172}
6173
6174void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6175{
6176 Program *program = mGLState.getProgram();
6177 program->setUniform4uiv(location, count, value);
6178}
6179
Jamie Madillf0e04492017-08-26 15:28:42 -04006180void Context::genQueries(GLsizei n, GLuint *ids)
6181{
6182 for (GLsizei i = 0; i < n; i++)
6183 {
6184 GLuint handle = mQueryHandleAllocator.allocate();
6185 mQueryMap.assign(handle, nullptr);
6186 ids[i] = handle;
6187 }
6188}
6189
6190void Context::deleteQueries(GLsizei n, const GLuint *ids)
6191{
6192 for (int i = 0; i < n; i++)
6193 {
6194 GLuint query = ids[i];
6195
6196 Query *queryObject = nullptr;
6197 if (mQueryMap.erase(query, &queryObject))
6198 {
6199 mQueryHandleAllocator.release(query);
6200 if (queryObject)
6201 {
6202 queryObject->release(this);
6203 }
6204 }
6205 }
6206}
6207
6208GLboolean Context::isQuery(GLuint id)
6209{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006210 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006211}
6212
Jamie Madillc8c95812017-08-26 18:40:09 -04006213void Context::uniformMatrix2x3fv(GLint location,
6214 GLsizei count,
6215 GLboolean transpose,
6216 const GLfloat *value)
6217{
6218 Program *program = mGLState.getProgram();
6219 program->setUniformMatrix2x3fv(location, count, transpose, value);
6220}
6221
6222void Context::uniformMatrix3x2fv(GLint location,
6223 GLsizei count,
6224 GLboolean transpose,
6225 const GLfloat *value)
6226{
6227 Program *program = mGLState.getProgram();
6228 program->setUniformMatrix3x2fv(location, count, transpose, value);
6229}
6230
6231void Context::uniformMatrix2x4fv(GLint location,
6232 GLsizei count,
6233 GLboolean transpose,
6234 const GLfloat *value)
6235{
6236 Program *program = mGLState.getProgram();
6237 program->setUniformMatrix2x4fv(location, count, transpose, value);
6238}
6239
6240void Context::uniformMatrix4x2fv(GLint location,
6241 GLsizei count,
6242 GLboolean transpose,
6243 const GLfloat *value)
6244{
6245 Program *program = mGLState.getProgram();
6246 program->setUniformMatrix4x2fv(location, count, transpose, value);
6247}
6248
6249void Context::uniformMatrix3x4fv(GLint location,
6250 GLsizei count,
6251 GLboolean transpose,
6252 const GLfloat *value)
6253{
6254 Program *program = mGLState.getProgram();
6255 program->setUniformMatrix3x4fv(location, count, transpose, value);
6256}
6257
6258void Context::uniformMatrix4x3fv(GLint location,
6259 GLsizei count,
6260 GLboolean transpose,
6261 const GLfloat *value)
6262{
6263 Program *program = mGLState.getProgram();
6264 program->setUniformMatrix4x3fv(location, count, transpose, value);
6265}
6266
Jamie Madilld7576732017-08-26 18:49:50 -04006267void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6268{
6269 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6270 {
6271 GLuint vertexArray = arrays[arrayIndex];
6272
6273 if (arrays[arrayIndex] != 0)
6274 {
6275 VertexArray *vertexArrayObject = nullptr;
6276 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6277 {
6278 if (vertexArrayObject != nullptr)
6279 {
6280 detachVertexArray(vertexArray);
6281 vertexArrayObject->onDestroy(this);
6282 }
6283
6284 mVertexArrayHandleAllocator.release(vertexArray);
6285 }
6286 }
6287 }
6288}
6289
6290void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6291{
6292 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6293 {
6294 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6295 mVertexArrayMap.assign(vertexArray, nullptr);
6296 arrays[arrayIndex] = vertexArray;
6297 }
6298}
6299
6300bool Context::isVertexArray(GLuint array)
6301{
6302 if (array == 0)
6303 {
6304 return GL_FALSE;
6305 }
6306
6307 VertexArray *vao = getVertexArray(array);
6308 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6309}
6310
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006311void Context::endTransformFeedback()
6312{
6313 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6314 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006315 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006316}
6317
6318void Context::transformFeedbackVaryings(GLuint program,
6319 GLsizei count,
6320 const GLchar *const *varyings,
6321 GLenum bufferMode)
6322{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006323 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006324 ASSERT(programObject);
6325 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6326}
6327
6328void Context::getTransformFeedbackVarying(GLuint program,
6329 GLuint index,
6330 GLsizei bufSize,
6331 GLsizei *length,
6332 GLsizei *size,
6333 GLenum *type,
6334 GLchar *name)
6335{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006336 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006337 ASSERT(programObject);
6338 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6339}
6340
6341void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6342{
6343 for (int i = 0; i < n; i++)
6344 {
6345 GLuint transformFeedback = ids[i];
6346 if (transformFeedback == 0)
6347 {
6348 continue;
6349 }
6350
6351 TransformFeedback *transformFeedbackObject = nullptr;
6352 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6353 {
6354 if (transformFeedbackObject != nullptr)
6355 {
6356 detachTransformFeedback(transformFeedback);
6357 transformFeedbackObject->release(this);
6358 }
6359
6360 mTransformFeedbackHandleAllocator.release(transformFeedback);
6361 }
6362 }
6363}
6364
6365void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6366{
6367 for (int i = 0; i < n; i++)
6368 {
6369 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6370 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6371 ids[i] = transformFeedback;
6372 }
6373}
6374
6375bool Context::isTransformFeedback(GLuint id)
6376{
6377 if (id == 0)
6378 {
6379 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6380 // returns FALSE
6381 return GL_FALSE;
6382 }
6383
6384 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6385 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6386}
6387
6388void Context::pauseTransformFeedback()
6389{
6390 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6391 transformFeedback->pause();
6392}
6393
6394void Context::resumeTransformFeedback()
6395{
6396 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6397 transformFeedback->resume();
6398}
6399
Jamie Madill12e957f2017-08-26 21:42:26 -04006400void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6401{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006402 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006403 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006404}
6405
Brandon Jones59770802018-04-02 13:18:42 -07006406void Context::getUniformuivRobust(GLuint program,
6407 GLint location,
6408 GLsizei bufSize,
6409 GLsizei *length,
6410 GLuint *params)
6411{
6412 getUniformuiv(program, location, params);
6413}
6414
Jamie Madill12e957f2017-08-26 21:42:26 -04006415GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6416{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006417 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006418 return programObject->getFragDataLocation(name);
6419}
6420
6421void Context::getUniformIndices(GLuint program,
6422 GLsizei uniformCount,
6423 const GLchar *const *uniformNames,
6424 GLuint *uniformIndices)
6425{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006426 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006427 if (!programObject->isLinked())
6428 {
6429 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6430 {
6431 uniformIndices[uniformId] = GL_INVALID_INDEX;
6432 }
6433 }
6434 else
6435 {
6436 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6437 {
6438 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6439 }
6440 }
6441}
6442
6443void Context::getActiveUniformsiv(GLuint program,
6444 GLsizei uniformCount,
6445 const GLuint *uniformIndices,
6446 GLenum pname,
6447 GLint *params)
6448{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006449 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006450 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6451 {
6452 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006453 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006454 }
6455}
6456
6457GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6458{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006459 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006460 return programObject->getUniformBlockIndex(uniformBlockName);
6461}
6462
6463void Context::getActiveUniformBlockiv(GLuint program,
6464 GLuint uniformBlockIndex,
6465 GLenum pname,
6466 GLint *params)
6467{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006468 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006469 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6470}
6471
Brandon Jones59770802018-04-02 13:18:42 -07006472void Context::getActiveUniformBlockivRobust(GLuint program,
6473 GLuint uniformBlockIndex,
6474 GLenum pname,
6475 GLsizei bufSize,
6476 GLsizei *length,
6477 GLint *params)
6478{
6479 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6480}
6481
Jamie Madill12e957f2017-08-26 21:42:26 -04006482void Context::getActiveUniformBlockName(GLuint program,
6483 GLuint uniformBlockIndex,
6484 GLsizei bufSize,
6485 GLsizei *length,
6486 GLchar *uniformBlockName)
6487{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006488 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006489 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6490}
6491
6492void Context::uniformBlockBinding(GLuint program,
6493 GLuint uniformBlockIndex,
6494 GLuint uniformBlockBinding)
6495{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006496 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006497 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006498
Jamie Madill956ab4d2018-10-10 16:13:03 -04006499 // Note: If the Program is shared between Contexts we would be better using Observer/Subject.
Jamie Madill70aeda42018-08-20 12:17:40 -04006500 if (programObject->isInUse())
6501 {
6502 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006503 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006504 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006505}
6506
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006507GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6508{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006509 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6510 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006511
Jamie Madill70b5bb02017-08-28 13:32:37 -04006512 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006513 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006514 if (error.isError())
6515 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006516 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006517 handleError(error);
6518 return nullptr;
6519 }
6520
Jamie Madill70b5bb02017-08-28 13:32:37 -04006521 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006522}
6523
6524GLboolean Context::isSync(GLsync sync)
6525{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006526 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006527}
6528
6529GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6530{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006531 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006532
6533 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006534 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006535 return result;
6536}
6537
6538void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6539{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006540 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006541 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006542}
6543
6544void Context::getInteger64v(GLenum pname, GLint64 *params)
6545{
6546 GLenum nativeType = GL_NONE;
6547 unsigned int numParams = 0;
6548 getQueryParameterInfo(pname, &nativeType, &numParams);
6549
6550 if (nativeType == GL_INT_64_ANGLEX)
6551 {
6552 getInteger64vImpl(pname, params);
6553 }
6554 else
6555 {
6556 CastStateValues(this, nativeType, pname, numParams, params);
6557 }
6558}
6559
Brandon Jones59770802018-04-02 13:18:42 -07006560void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6561{
6562 getInteger64v(pname, data);
6563}
6564
Corentin Wallez336129f2017-10-17 15:55:40 -04006565void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006566{
6567 Buffer *buffer = mGLState.getTargetBuffer(target);
6568 QueryBufferParameteri64v(buffer, pname, params);
6569}
6570
Brandon Jones59770802018-04-02 13:18:42 -07006571void Context::getBufferParameteri64vRobust(BufferBinding target,
6572 GLenum pname,
6573 GLsizei bufSize,
6574 GLsizei *length,
6575 GLint64 *params)
6576{
6577 getBufferParameteri64v(target, pname, params);
6578}
6579
Jamie Madill3ef140a2017-08-26 23:11:21 -04006580void Context::genSamplers(GLsizei count, GLuint *samplers)
6581{
6582 for (int i = 0; i < count; i++)
6583 {
6584 samplers[i] = mState.mSamplers->createSampler();
6585 }
6586}
6587
6588void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6589{
6590 for (int i = 0; i < count; i++)
6591 {
6592 GLuint sampler = samplers[i];
6593
6594 if (mState.mSamplers->getSampler(sampler))
6595 {
6596 detachSampler(sampler);
6597 }
6598
6599 mState.mSamplers->deleteObject(this, sampler);
6600 }
6601}
6602
6603void Context::getInternalformativ(GLenum target,
6604 GLenum internalformat,
6605 GLenum pname,
6606 GLsizei bufSize,
6607 GLint *params)
6608{
6609 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6610 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6611}
6612
Brandon Jones59770802018-04-02 13:18:42 -07006613void Context::getInternalformativRobust(GLenum target,
6614 GLenum internalformat,
6615 GLenum pname,
6616 GLsizei bufSize,
6617 GLsizei *length,
6618 GLint *params)
6619{
6620 getInternalformativ(target, internalformat, pname, bufSize, params);
6621}
6622
Jiajia Qin5451d532017-11-16 17:16:34 +08006623void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6624{
6625 programUniform1iv(program, location, 1, &v0);
6626}
6627
6628void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6629{
6630 GLint xy[2] = {v0, v1};
6631 programUniform2iv(program, location, 1, xy);
6632}
6633
6634void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6635{
6636 GLint xyz[3] = {v0, v1, v2};
6637 programUniform3iv(program, location, 1, xyz);
6638}
6639
6640void Context::programUniform4i(GLuint program,
6641 GLint location,
6642 GLint v0,
6643 GLint v1,
6644 GLint v2,
6645 GLint v3)
6646{
6647 GLint xyzw[4] = {v0, v1, v2, v3};
6648 programUniform4iv(program, location, 1, xyzw);
6649}
6650
6651void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6652{
6653 programUniform1uiv(program, location, 1, &v0);
6654}
6655
6656void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6657{
6658 GLuint xy[2] = {v0, v1};
6659 programUniform2uiv(program, location, 1, xy);
6660}
6661
6662void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6663{
6664 GLuint xyz[3] = {v0, v1, v2};
6665 programUniform3uiv(program, location, 1, xyz);
6666}
6667
6668void Context::programUniform4ui(GLuint program,
6669 GLint location,
6670 GLuint v0,
6671 GLuint v1,
6672 GLuint v2,
6673 GLuint v3)
6674{
6675 GLuint xyzw[4] = {v0, v1, v2, v3};
6676 programUniform4uiv(program, location, 1, xyzw);
6677}
6678
6679void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6680{
6681 programUniform1fv(program, location, 1, &v0);
6682}
6683
6684void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6685{
6686 GLfloat xy[2] = {v0, v1};
6687 programUniform2fv(program, location, 1, xy);
6688}
6689
6690void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6691{
6692 GLfloat xyz[3] = {v0, v1, v2};
6693 programUniform3fv(program, location, 1, xyz);
6694}
6695
6696void Context::programUniform4f(GLuint program,
6697 GLint location,
6698 GLfloat v0,
6699 GLfloat v1,
6700 GLfloat v2,
6701 GLfloat v3)
6702{
6703 GLfloat xyzw[4] = {v0, v1, v2, v3};
6704 programUniform4fv(program, location, 1, xyzw);
6705}
6706
Jamie Madill81c2e252017-09-09 23:32:46 -04006707void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6708{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006709 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006710 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006711 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006712}
6713
Jiajia Qin5451d532017-11-16 17:16:34 +08006714void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6715{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006716 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006717 ASSERT(programObject);
6718 programObject->setUniform2iv(location, count, value);
6719}
6720
6721void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6722{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006723 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006724 ASSERT(programObject);
6725 programObject->setUniform3iv(location, count, value);
6726}
6727
6728void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6729{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006730 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006731 ASSERT(programObject);
6732 programObject->setUniform4iv(location, count, value);
6733}
6734
6735void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6736{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006737 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006738 ASSERT(programObject);
6739 programObject->setUniform1uiv(location, count, value);
6740}
6741
6742void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6743{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006744 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006745 ASSERT(programObject);
6746 programObject->setUniform2uiv(location, count, value);
6747}
6748
6749void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6750{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006751 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006752 ASSERT(programObject);
6753 programObject->setUniform3uiv(location, count, value);
6754}
6755
6756void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6757{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006758 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006759 ASSERT(programObject);
6760 programObject->setUniform4uiv(location, count, value);
6761}
6762
6763void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6764{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006765 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006766 ASSERT(programObject);
6767 programObject->setUniform1fv(location, count, value);
6768}
6769
6770void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6771{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006772 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006773 ASSERT(programObject);
6774 programObject->setUniform2fv(location, count, value);
6775}
6776
6777void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6778{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006779 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006780 ASSERT(programObject);
6781 programObject->setUniform3fv(location, count, value);
6782}
6783
6784void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6785{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006786 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006787 ASSERT(programObject);
6788 programObject->setUniform4fv(location, count, value);
6789}
6790
6791void Context::programUniformMatrix2fv(GLuint program,
6792 GLint location,
6793 GLsizei count,
6794 GLboolean transpose,
6795 const GLfloat *value)
6796{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006797 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006798 ASSERT(programObject);
6799 programObject->setUniformMatrix2fv(location, count, transpose, value);
6800}
6801
6802void Context::programUniformMatrix3fv(GLuint program,
6803 GLint location,
6804 GLsizei count,
6805 GLboolean transpose,
6806 const GLfloat *value)
6807{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006808 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006809 ASSERT(programObject);
6810 programObject->setUniformMatrix3fv(location, count, transpose, value);
6811}
6812
6813void Context::programUniformMatrix4fv(GLuint program,
6814 GLint location,
6815 GLsizei count,
6816 GLboolean transpose,
6817 const GLfloat *value)
6818{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006819 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006820 ASSERT(programObject);
6821 programObject->setUniformMatrix4fv(location, count, transpose, value);
6822}
6823
6824void Context::programUniformMatrix2x3fv(GLuint program,
6825 GLint location,
6826 GLsizei count,
6827 GLboolean transpose,
6828 const GLfloat *value)
6829{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006830 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006831 ASSERT(programObject);
6832 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6833}
6834
6835void Context::programUniformMatrix3x2fv(GLuint program,
6836 GLint location,
6837 GLsizei count,
6838 GLboolean transpose,
6839 const GLfloat *value)
6840{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006841 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006842 ASSERT(programObject);
6843 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6844}
6845
6846void Context::programUniformMatrix2x4fv(GLuint program,
6847 GLint location,
6848 GLsizei count,
6849 GLboolean transpose,
6850 const GLfloat *value)
6851{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006852 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006853 ASSERT(programObject);
6854 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6855}
6856
6857void Context::programUniformMatrix4x2fv(GLuint program,
6858 GLint location,
6859 GLsizei count,
6860 GLboolean transpose,
6861 const GLfloat *value)
6862{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006863 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006864 ASSERT(programObject);
6865 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6866}
6867
6868void Context::programUniformMatrix3x4fv(GLuint program,
6869 GLint location,
6870 GLsizei count,
6871 GLboolean transpose,
6872 const GLfloat *value)
6873{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006874 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006875 ASSERT(programObject);
6876 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6877}
6878
6879void Context::programUniformMatrix4x3fv(GLuint program,
6880 GLint location,
6881 GLsizei count,
6882 GLboolean transpose,
6883 const GLfloat *value)
6884{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006885 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006886 ASSERT(programObject);
6887 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6888}
6889
Jamie Madill81c2e252017-09-09 23:32:46 -04006890void Context::onTextureChange(const Texture *texture)
6891{
6892 // Conservatively assume all textures are dirty.
6893 // TODO(jmadill): More fine-grained update.
6894 mGLState.setObjectDirty(GL_TEXTURE);
6895}
6896
James Darpiniane8a93c62018-01-04 18:02:24 -08006897bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6898{
6899 return mGLState.isCurrentTransformFeedback(tf);
6900}
James Darpiniane8a93c62018-01-04 18:02:24 -08006901
Yunchao Hea336b902017-08-02 16:05:21 +08006902void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6903{
6904 for (int i = 0; i < count; i++)
6905 {
6906 pipelines[i] = createProgramPipeline();
6907 }
6908}
6909
6910void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6911{
6912 for (int i = 0; i < count; i++)
6913 {
6914 if (pipelines[i] != 0)
6915 {
6916 deleteProgramPipeline(pipelines[i]);
6917 }
6918 }
6919}
6920
6921GLboolean Context::isProgramPipeline(GLuint pipeline)
6922{
6923 if (pipeline == 0)
6924 {
6925 return GL_FALSE;
6926 }
6927
6928 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6929}
6930
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006931void Context::finishFenceNV(GLuint fence)
6932{
6933 FenceNV *fenceObject = getFenceNV(fence);
6934
6935 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04006936 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006937}
6938
6939void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6940{
6941 FenceNV *fenceObject = getFenceNV(fence);
6942
6943 ASSERT(fenceObject && fenceObject->isSet());
6944
6945 switch (pname)
6946 {
6947 case GL_FENCE_STATUS_NV:
6948 {
6949 // GL_NV_fence spec:
6950 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6951 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6952 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6953 GLboolean status = GL_TRUE;
6954 if (fenceObject->getStatus() != GL_TRUE)
6955 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006956 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006957 }
6958 *params = status;
6959 break;
6960 }
6961
6962 case GL_FENCE_CONDITION_NV:
6963 {
6964 *params = static_cast<GLint>(fenceObject->getCondition());
6965 break;
6966 }
6967
6968 default:
6969 UNREACHABLE();
6970 }
6971}
6972
6973void Context::getTranslatedShaderSource(GLuint shader,
6974 GLsizei bufsize,
6975 GLsizei *length,
6976 GLchar *source)
6977{
6978 Shader *shaderObject = getShader(shader);
6979 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08006980 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006981}
6982
6983void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6984{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006985 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006986 ASSERT(programObject);
6987
6988 programObject->getUniformfv(this, location, params);
6989}
6990
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006991void Context::getnUniformfvRobust(GLuint program,
6992 GLint location,
6993 GLsizei bufSize,
6994 GLsizei *length,
6995 GLfloat *params)
6996{
6997 UNIMPLEMENTED();
6998}
6999
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007000void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
7001{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007002 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007003 ASSERT(programObject);
7004
7005 programObject->getUniformiv(this, location, params);
7006}
7007
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007008void Context::getnUniformivRobust(GLuint program,
7009 GLint location,
7010 GLsizei bufSize,
7011 GLsizei *length,
7012 GLint *params)
7013{
7014 UNIMPLEMENTED();
7015}
7016
7017void Context::getnUniformuivRobust(GLuint program,
7018 GLint location,
7019 GLsizei bufSize,
7020 GLsizei *length,
7021 GLuint *params)
7022{
7023 UNIMPLEMENTED();
7024}
7025
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007026GLboolean Context::isFenceNV(GLuint fence)
7027{
7028 FenceNV *fenceObject = getFenceNV(fence);
7029
7030 if (fenceObject == nullptr)
7031 {
7032 return GL_FALSE;
7033 }
7034
7035 // GL_NV_fence spec:
7036 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
7037 // existing fence.
7038 return fenceObject->isSet();
7039}
7040
7041void Context::readnPixels(GLint x,
7042 GLint y,
7043 GLsizei width,
7044 GLsizei height,
7045 GLenum format,
7046 GLenum type,
7047 GLsizei bufSize,
7048 void *data)
7049{
7050 return readPixels(x, y, width, height, format, type, data);
7051}
7052
Jamie Madill007530e2017-12-28 14:27:04 -05007053void Context::setFenceNV(GLuint fence, GLenum condition)
7054{
7055 ASSERT(condition == GL_ALL_COMPLETED_NV);
7056
7057 FenceNV *fenceObject = getFenceNV(fence);
7058 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04007059 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05007060}
7061
7062GLboolean Context::testFenceNV(GLuint fence)
7063{
7064 FenceNV *fenceObject = getFenceNV(fence);
7065
7066 ASSERT(fenceObject != nullptr);
7067 ASSERT(fenceObject->isSet() == GL_TRUE);
7068
7069 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04007070 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05007071 if (error.isError())
7072 {
7073 handleError(error);
7074 return GL_TRUE;
7075 }
7076
7077 return result;
7078}
7079
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007080void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007081{
7082 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007083 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05007084 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007085}
7086
Jamie Madillfa920eb2018-01-04 11:45:50 -05007087void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007088{
7089 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007090 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05007091 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
7092}
7093
Jamie Madillfa920eb2018-01-04 11:45:50 -05007094void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7095{
7096 UNIMPLEMENTED();
7097}
7098
Jamie Madill5b772312018-03-08 20:28:32 -05007099bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7100{
7101 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7102 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7103 // to the fact that it is stored internally as a float, and so would require conversion
7104 // if returned from Context::getIntegerv. Since this conversion is already implemented
7105 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7106 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7107 // application.
7108 switch (pname)
7109 {
7110 case GL_COMPRESSED_TEXTURE_FORMATS:
7111 {
7112 *type = GL_INT;
7113 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7114 return true;
7115 }
7116 case GL_SHADER_BINARY_FORMATS:
7117 {
7118 *type = GL_INT;
7119 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7120 return true;
7121 }
7122
7123 case GL_MAX_VERTEX_ATTRIBS:
7124 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7125 case GL_MAX_VARYING_VECTORS:
7126 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7127 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7128 case GL_MAX_TEXTURE_IMAGE_UNITS:
7129 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7130 case GL_MAX_RENDERBUFFER_SIZE:
7131 case GL_NUM_SHADER_BINARY_FORMATS:
7132 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7133 case GL_ARRAY_BUFFER_BINDING:
7134 case GL_FRAMEBUFFER_BINDING:
7135 case GL_RENDERBUFFER_BINDING:
7136 case GL_CURRENT_PROGRAM:
7137 case GL_PACK_ALIGNMENT:
7138 case GL_UNPACK_ALIGNMENT:
7139 case GL_GENERATE_MIPMAP_HINT:
7140 case GL_RED_BITS:
7141 case GL_GREEN_BITS:
7142 case GL_BLUE_BITS:
7143 case GL_ALPHA_BITS:
7144 case GL_DEPTH_BITS:
7145 case GL_STENCIL_BITS:
7146 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7147 case GL_CULL_FACE_MODE:
7148 case GL_FRONT_FACE:
7149 case GL_ACTIVE_TEXTURE:
7150 case GL_STENCIL_FUNC:
7151 case GL_STENCIL_VALUE_MASK:
7152 case GL_STENCIL_REF:
7153 case GL_STENCIL_FAIL:
7154 case GL_STENCIL_PASS_DEPTH_FAIL:
7155 case GL_STENCIL_PASS_DEPTH_PASS:
7156 case GL_STENCIL_BACK_FUNC:
7157 case GL_STENCIL_BACK_VALUE_MASK:
7158 case GL_STENCIL_BACK_REF:
7159 case GL_STENCIL_BACK_FAIL:
7160 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7161 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7162 case GL_DEPTH_FUNC:
7163 case GL_BLEND_SRC_RGB:
7164 case GL_BLEND_SRC_ALPHA:
7165 case GL_BLEND_DST_RGB:
7166 case GL_BLEND_DST_ALPHA:
7167 case GL_BLEND_EQUATION_RGB:
7168 case GL_BLEND_EQUATION_ALPHA:
7169 case GL_STENCIL_WRITEMASK:
7170 case GL_STENCIL_BACK_WRITEMASK:
7171 case GL_STENCIL_CLEAR_VALUE:
7172 case GL_SUBPIXEL_BITS:
7173 case GL_MAX_TEXTURE_SIZE:
7174 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7175 case GL_SAMPLE_BUFFERS:
7176 case GL_SAMPLES:
7177 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7178 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7179 case GL_TEXTURE_BINDING_2D:
7180 case GL_TEXTURE_BINDING_CUBE_MAP:
7181 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7182 {
7183 *type = GL_INT;
7184 *numParams = 1;
7185 return true;
7186 }
7187 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7188 {
7189 if (!getExtensions().packReverseRowOrder)
7190 {
7191 return false;
7192 }
7193 *type = GL_INT;
7194 *numParams = 1;
7195 return true;
7196 }
7197 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7198 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7199 {
7200 if (!getExtensions().textureRectangle)
7201 {
7202 return false;
7203 }
7204 *type = GL_INT;
7205 *numParams = 1;
7206 return true;
7207 }
7208 case GL_MAX_DRAW_BUFFERS_EXT:
7209 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7210 {
7211 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7212 {
7213 return false;
7214 }
7215 *type = GL_INT;
7216 *numParams = 1;
7217 return true;
7218 }
7219 case GL_MAX_VIEWPORT_DIMS:
7220 {
7221 *type = GL_INT;
7222 *numParams = 2;
7223 return true;
7224 }
7225 case GL_VIEWPORT:
7226 case GL_SCISSOR_BOX:
7227 {
7228 *type = GL_INT;
7229 *numParams = 4;
7230 return true;
7231 }
7232 case GL_SHADER_COMPILER:
7233 case GL_SAMPLE_COVERAGE_INVERT:
7234 case GL_DEPTH_WRITEMASK:
7235 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7236 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7237 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7238 // bool-natural
7239 case GL_SAMPLE_COVERAGE:
7240 case GL_SCISSOR_TEST:
7241 case GL_STENCIL_TEST:
7242 case GL_DEPTH_TEST:
7243 case GL_BLEND:
7244 case GL_DITHER:
7245 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7246 {
7247 *type = GL_BOOL;
7248 *numParams = 1;
7249 return true;
7250 }
7251 case GL_COLOR_WRITEMASK:
7252 {
7253 *type = GL_BOOL;
7254 *numParams = 4;
7255 return true;
7256 }
7257 case GL_POLYGON_OFFSET_FACTOR:
7258 case GL_POLYGON_OFFSET_UNITS:
7259 case GL_SAMPLE_COVERAGE_VALUE:
7260 case GL_DEPTH_CLEAR_VALUE:
7261 case GL_LINE_WIDTH:
7262 {
7263 *type = GL_FLOAT;
7264 *numParams = 1;
7265 return true;
7266 }
7267 case GL_ALIASED_LINE_WIDTH_RANGE:
7268 case GL_ALIASED_POINT_SIZE_RANGE:
7269 case GL_DEPTH_RANGE:
7270 {
7271 *type = GL_FLOAT;
7272 *numParams = 2;
7273 return true;
7274 }
7275 case GL_COLOR_CLEAR_VALUE:
7276 case GL_BLEND_COLOR:
7277 {
7278 *type = GL_FLOAT;
7279 *numParams = 4;
7280 return true;
7281 }
7282 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7283 if (!getExtensions().textureFilterAnisotropic)
7284 {
7285 return false;
7286 }
7287 *type = GL_FLOAT;
7288 *numParams = 1;
7289 return true;
7290 case GL_TIMESTAMP_EXT:
7291 if (!getExtensions().disjointTimerQuery)
7292 {
7293 return false;
7294 }
7295 *type = GL_INT_64_ANGLEX;
7296 *numParams = 1;
7297 return true;
7298 case GL_GPU_DISJOINT_EXT:
7299 if (!getExtensions().disjointTimerQuery)
7300 {
7301 return false;
7302 }
7303 *type = GL_INT;
7304 *numParams = 1;
7305 return true;
7306 case GL_COVERAGE_MODULATION_CHROMIUM:
7307 if (!getExtensions().framebufferMixedSamples)
7308 {
7309 return false;
7310 }
7311 *type = GL_INT;
7312 *numParams = 1;
7313 return true;
7314 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7315 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7316 {
7317 return false;
7318 }
7319 *type = GL_INT;
7320 *numParams = 1;
7321 return true;
7322 }
7323
7324 if (getExtensions().debug)
7325 {
7326 switch (pname)
7327 {
7328 case GL_DEBUG_LOGGED_MESSAGES:
7329 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7330 case GL_DEBUG_GROUP_STACK_DEPTH:
7331 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7332 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7333 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7334 case GL_MAX_LABEL_LENGTH:
7335 *type = GL_INT;
7336 *numParams = 1;
7337 return true;
7338
7339 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7340 case GL_DEBUG_OUTPUT:
7341 *type = GL_BOOL;
7342 *numParams = 1;
7343 return true;
7344 }
7345 }
7346
7347 if (getExtensions().multisampleCompatibility)
7348 {
7349 switch (pname)
7350 {
7351 case GL_MULTISAMPLE_EXT:
7352 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7353 *type = GL_BOOL;
7354 *numParams = 1;
7355 return true;
7356 }
7357 }
7358
7359 if (getExtensions().pathRendering)
7360 {
7361 switch (pname)
7362 {
7363 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7364 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7365 *type = GL_FLOAT;
7366 *numParams = 16;
7367 return true;
7368 }
7369 }
7370
7371 if (getExtensions().bindGeneratesResource)
7372 {
7373 switch (pname)
7374 {
7375 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7376 *type = GL_BOOL;
7377 *numParams = 1;
7378 return true;
7379 }
7380 }
7381
7382 if (getExtensions().clientArrays)
7383 {
7384 switch (pname)
7385 {
7386 case GL_CLIENT_ARRAYS_ANGLE:
7387 *type = GL_BOOL;
7388 *numParams = 1;
7389 return true;
7390 }
7391 }
7392
7393 if (getExtensions().sRGBWriteControl)
7394 {
7395 switch (pname)
7396 {
7397 case GL_FRAMEBUFFER_SRGB_EXT:
7398 *type = GL_BOOL;
7399 *numParams = 1;
7400 return true;
7401 }
7402 }
7403
7404 if (getExtensions().robustResourceInitialization &&
7405 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7406 {
7407 *type = GL_BOOL;
7408 *numParams = 1;
7409 return true;
7410 }
7411
7412 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7413 {
7414 *type = GL_BOOL;
7415 *numParams = 1;
7416 return true;
7417 }
7418
jchen1082af6202018-06-22 10:59:52 +08007419 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7420 {
7421 *type = GL_INT;
7422 *numParams = 1;
7423 return true;
7424 }
7425
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007426 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7427 {
7428 *type = GL_INT;
7429 *numParams = 1;
7430 return true;
7431 }
7432
Jamie Madill5b772312018-03-08 20:28:32 -05007433 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7434 switch (pname)
7435 {
7436 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7437 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7438 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7439 {
7440 return false;
7441 }
7442 *type = GL_INT;
7443 *numParams = 1;
7444 return true;
7445
7446 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7447 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7448 {
7449 return false;
7450 }
7451 *type = GL_INT;
7452 *numParams = 1;
7453 return true;
7454
7455 case GL_PROGRAM_BINARY_FORMATS_OES:
7456 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7457 {
7458 return false;
7459 }
7460 *type = GL_INT;
7461 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7462 return true;
7463
7464 case GL_PACK_ROW_LENGTH:
7465 case GL_PACK_SKIP_ROWS:
7466 case GL_PACK_SKIP_PIXELS:
7467 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7468 {
7469 return false;
7470 }
7471 *type = GL_INT;
7472 *numParams = 1;
7473 return true;
7474 case GL_UNPACK_ROW_LENGTH:
7475 case GL_UNPACK_SKIP_ROWS:
7476 case GL_UNPACK_SKIP_PIXELS:
7477 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7478 {
7479 return false;
7480 }
7481 *type = GL_INT;
7482 *numParams = 1;
7483 return true;
7484 case GL_VERTEX_ARRAY_BINDING:
7485 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7486 {
7487 return false;
7488 }
7489 *type = GL_INT;
7490 *numParams = 1;
7491 return true;
7492 case GL_PIXEL_PACK_BUFFER_BINDING:
7493 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7494 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7495 {
7496 return false;
7497 }
7498 *type = GL_INT;
7499 *numParams = 1;
7500 return true;
7501 case GL_MAX_SAMPLES:
7502 {
7503 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7504 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7505 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7506 {
7507 return false;
7508 }
7509 *type = GL_INT;
7510 *numParams = 1;
7511 return true;
7512
7513 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7514 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7515 {
7516 return false;
7517 }
7518 *type = GL_INT;
7519 *numParams = 1;
7520 return true;
7521 }
7522 }
7523
7524 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7525 {
7526 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7527 {
7528 return false;
7529 }
7530 *type = GL_INT;
7531 *numParams = 1;
7532 return true;
7533 }
7534
7535 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7536 {
7537 *type = GL_INT;
7538 *numParams = 1;
7539 return true;
7540 }
7541
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007542 if (getClientVersion() < Version(2, 0))
7543 {
7544 switch (pname)
7545 {
7546 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007547 case GL_CLIENT_ACTIVE_TEXTURE:
7548 case GL_MATRIX_MODE:
7549 case GL_MAX_TEXTURE_UNITS:
7550 case GL_MAX_MODELVIEW_STACK_DEPTH:
7551 case GL_MAX_PROJECTION_STACK_DEPTH:
7552 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007553 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007554 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007555 case GL_VERTEX_ARRAY_STRIDE:
7556 case GL_NORMAL_ARRAY_STRIDE:
7557 case GL_COLOR_ARRAY_STRIDE:
7558 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7559 case GL_VERTEX_ARRAY_SIZE:
7560 case GL_COLOR_ARRAY_SIZE:
7561 case GL_TEXTURE_COORD_ARRAY_SIZE:
7562 case GL_VERTEX_ARRAY_TYPE:
7563 case GL_NORMAL_ARRAY_TYPE:
7564 case GL_COLOR_ARRAY_TYPE:
7565 case GL_TEXTURE_COORD_ARRAY_TYPE:
7566 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7567 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7568 case GL_COLOR_ARRAY_BUFFER_BINDING:
7569 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7570 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7571 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7572 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007573 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007574 case GL_MODELVIEW_STACK_DEPTH:
7575 case GL_PROJECTION_STACK_DEPTH:
7576 case GL_TEXTURE_STACK_DEPTH:
7577 case GL_LOGIC_OP_MODE:
7578 case GL_BLEND_SRC:
7579 case GL_BLEND_DST:
7580 case GL_PERSPECTIVE_CORRECTION_HINT:
7581 case GL_POINT_SMOOTH_HINT:
7582 case GL_LINE_SMOOTH_HINT:
7583 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007584 *type = GL_INT;
7585 *numParams = 1;
7586 return true;
7587 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007588 case GL_FOG_DENSITY:
7589 case GL_FOG_START:
7590 case GL_FOG_END:
7591 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007592 case GL_POINT_SIZE:
7593 case GL_POINT_SIZE_MIN:
7594 case GL_POINT_SIZE_MAX:
7595 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007596 *type = GL_FLOAT;
7597 *numParams = 1;
7598 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007599 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007600 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007601 *type = GL_FLOAT;
7602 *numParams = 2;
7603 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007604 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007605 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007606 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007607 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007608 *type = GL_FLOAT;
7609 *numParams = 4;
7610 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007611 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007612 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007613 *type = GL_FLOAT;
7614 *numParams = 3;
7615 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007616 case GL_MODELVIEW_MATRIX:
7617 case GL_PROJECTION_MATRIX:
7618 case GL_TEXTURE_MATRIX:
7619 *type = GL_FLOAT;
7620 *numParams = 16;
7621 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007622 case GL_LIGHT_MODEL_TWO_SIDE:
7623 *type = GL_BOOL;
7624 *numParams = 1;
7625 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007626 }
7627 }
7628
Jamie Madill5b772312018-03-08 20:28:32 -05007629 if (getClientVersion() < Version(3, 0))
7630 {
7631 return false;
7632 }
7633
7634 // Check for ES3.0+ parameter names
7635 switch (pname)
7636 {
7637 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7638 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7639 case GL_UNIFORM_BUFFER_BINDING:
7640 case GL_TRANSFORM_FEEDBACK_BINDING:
7641 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7642 case GL_COPY_READ_BUFFER_BINDING:
7643 case GL_COPY_WRITE_BUFFER_BINDING:
7644 case GL_SAMPLER_BINDING:
7645 case GL_READ_BUFFER:
7646 case GL_TEXTURE_BINDING_3D:
7647 case GL_TEXTURE_BINDING_2D_ARRAY:
7648 case GL_MAX_3D_TEXTURE_SIZE:
7649 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7650 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7651 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7652 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7653 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7654 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7655 case GL_MAX_VARYING_COMPONENTS:
7656 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7657 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7658 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7659 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7660 case GL_NUM_EXTENSIONS:
7661 case GL_MAJOR_VERSION:
7662 case GL_MINOR_VERSION:
7663 case GL_MAX_ELEMENTS_INDICES:
7664 case GL_MAX_ELEMENTS_VERTICES:
7665 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7666 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7667 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7668 case GL_UNPACK_IMAGE_HEIGHT:
7669 case GL_UNPACK_SKIP_IMAGES:
7670 {
7671 *type = GL_INT;
7672 *numParams = 1;
7673 return true;
7674 }
7675
7676 case GL_MAX_ELEMENT_INDEX:
7677 case GL_MAX_UNIFORM_BLOCK_SIZE:
7678 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7679 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7680 case GL_MAX_SERVER_WAIT_TIMEOUT:
7681 {
7682 *type = GL_INT_64_ANGLEX;
7683 *numParams = 1;
7684 return true;
7685 }
7686
7687 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7688 case GL_TRANSFORM_FEEDBACK_PAUSED:
7689 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7690 case GL_RASTERIZER_DISCARD:
7691 {
7692 *type = GL_BOOL;
7693 *numParams = 1;
7694 return true;
7695 }
7696
7697 case GL_MAX_TEXTURE_LOD_BIAS:
7698 {
7699 *type = GL_FLOAT;
7700 *numParams = 1;
7701 return true;
7702 }
7703 }
7704
7705 if (getExtensions().requestExtension)
7706 {
7707 switch (pname)
7708 {
7709 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7710 *type = GL_INT;
7711 *numParams = 1;
7712 return true;
7713 }
7714 }
7715
Yizhou Jiang7818a852018-09-06 15:02:04 +08007716 if (getExtensions().textureMultisample)
7717 {
7718 switch (pname)
7719 {
7720 case GL_MAX_COLOR_TEXTURE_SAMPLES_ANGLE:
7721 case GL_MAX_INTEGER_SAMPLES_ANGLE:
7722 case GL_MAX_DEPTH_TEXTURE_SAMPLES_ANGLE:
7723 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE:
7724 *type = GL_INT;
7725 *numParams = 1;
7726 return true;
7727 }
7728 }
7729
Jamie Madill5b772312018-03-08 20:28:32 -05007730 if (getClientVersion() < Version(3, 1))
7731 {
7732 return false;
7733 }
7734
7735 switch (pname)
7736 {
7737 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7738 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7739 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7740 case GL_MAX_FRAMEBUFFER_WIDTH:
7741 case GL_MAX_FRAMEBUFFER_HEIGHT:
7742 case GL_MAX_FRAMEBUFFER_SAMPLES:
7743 case GL_MAX_SAMPLE_MASK_WORDS:
7744 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7745 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7746 case GL_MAX_INTEGER_SAMPLES:
7747 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7748 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7749 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7750 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7751 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7752 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7753 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7754 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7755 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7756 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7757 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7758 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7759 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7760 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7761 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7762 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7763 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7764 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7765 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7766 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7767 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7768 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7769 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7770 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7771 case GL_MAX_UNIFORM_LOCATIONS:
7772 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7773 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7774 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7775 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7776 case GL_MAX_IMAGE_UNITS:
7777 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7778 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7779 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7780 case GL_SHADER_STORAGE_BUFFER_BINDING:
7781 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7782 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007783 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007784 *type = GL_INT;
7785 *numParams = 1;
7786 return true;
7787 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7788 *type = GL_INT_64_ANGLEX;
7789 *numParams = 1;
7790 return true;
7791 case GL_SAMPLE_MASK:
7792 *type = GL_BOOL;
7793 *numParams = 1;
7794 return true;
7795 }
7796
7797 if (getExtensions().geometryShader)
7798 {
7799 switch (pname)
7800 {
7801 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7802 case GL_LAYER_PROVOKING_VERTEX_EXT:
7803 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7804 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7805 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7806 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7807 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7808 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7809 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7810 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7811 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7812 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7813 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7814 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7815 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7816 *type = GL_INT;
7817 *numParams = 1;
7818 return true;
7819 }
7820 }
7821
7822 return false;
7823}
7824
7825bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7826{
7827 if (getClientVersion() < Version(3, 0))
7828 {
7829 return false;
7830 }
7831
7832 switch (target)
7833 {
7834 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7835 case GL_UNIFORM_BUFFER_BINDING:
7836 {
7837 *type = GL_INT;
7838 *numParams = 1;
7839 return true;
7840 }
7841 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7842 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7843 case GL_UNIFORM_BUFFER_START:
7844 case GL_UNIFORM_BUFFER_SIZE:
7845 {
7846 *type = GL_INT_64_ANGLEX;
7847 *numParams = 1;
7848 return true;
7849 }
7850 }
7851
7852 if (getClientVersion() < Version(3, 1))
7853 {
7854 return false;
7855 }
7856
7857 switch (target)
7858 {
7859 case GL_IMAGE_BINDING_LAYERED:
7860 {
7861 *type = GL_BOOL;
7862 *numParams = 1;
7863 return true;
7864 }
7865 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7866 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7867 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7868 case GL_SHADER_STORAGE_BUFFER_BINDING:
7869 case GL_VERTEX_BINDING_BUFFER:
7870 case GL_VERTEX_BINDING_DIVISOR:
7871 case GL_VERTEX_BINDING_OFFSET:
7872 case GL_VERTEX_BINDING_STRIDE:
7873 case GL_SAMPLE_MASK_VALUE:
7874 case GL_IMAGE_BINDING_NAME:
7875 case GL_IMAGE_BINDING_LEVEL:
7876 case GL_IMAGE_BINDING_LAYER:
7877 case GL_IMAGE_BINDING_ACCESS:
7878 case GL_IMAGE_BINDING_FORMAT:
7879 {
7880 *type = GL_INT;
7881 *numParams = 1;
7882 return true;
7883 }
7884 case GL_ATOMIC_COUNTER_BUFFER_START:
7885 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7886 case GL_SHADER_STORAGE_BUFFER_START:
7887 case GL_SHADER_STORAGE_BUFFER_SIZE:
7888 {
7889 *type = GL_INT_64_ANGLEX;
7890 *numParams = 1;
7891 return true;
7892 }
7893 }
7894
7895 return false;
7896}
7897
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007898Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05007899{
7900 return mState.mShaderPrograms->getProgram(handle);
7901}
7902
7903Shader *Context::getShader(GLuint handle) const
7904{
7905 return mState.mShaderPrograms->getShader(handle);
7906}
7907
Jamie Madill5b772312018-03-08 20:28:32 -05007908bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7909{
7910 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7911}
7912
7913bool Context::isFramebufferGenerated(GLuint framebuffer) const
7914{
7915 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7916}
7917
7918bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7919{
7920 return mState.mPipelines->isHandleGenerated(pipeline);
7921}
7922
7923bool Context::usingDisplayTextureShareGroup() const
7924{
7925 return mDisplayTextureShareGroup;
7926}
7927
7928GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7929{
7930 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7931 internalformat == GL_DEPTH_STENCIL
7932 ? GL_DEPTH24_STENCIL8
7933 : internalformat;
7934}
7935
jchen1082af6202018-06-22 10:59:52 +08007936void Context::maxShaderCompilerThreads(GLuint count)
7937{
jchen107ae70d82018-07-06 13:47:01 +08007938 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08007939 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08007940 // A count of zero specifies a request for no parallel compiling or linking.
7941 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
7942 {
7943 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
7944 }
7945 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08007946}
7947
Jamie Madill2eb65032018-07-30 10:25:57 -04007948bool Context::isGLES1() const
7949{
7950 return mState.getClientVersion() < Version(2, 0);
7951}
7952
Jamie Madilla11819d2018-07-30 10:26:01 -04007953void Context::onSubjectStateChange(const Context *context,
7954 angle::SubjectIndex index,
7955 angle::SubjectMessage message)
7956{
Jamie Madilla11819d2018-07-30 10:26:01 -04007957 switch (index)
7958 {
7959 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007960 switch (message)
7961 {
7962 case angle::SubjectMessage::CONTENTS_CHANGED:
7963 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
7964 mStateCache.onVertexArrayBufferContentsChange(this);
7965 break;
7966 case angle::SubjectMessage::RESOURCE_MAPPED:
7967 case angle::SubjectMessage::RESOURCE_UNMAPPED:
7968 case angle::SubjectMessage::BINDING_CHANGED:
7969 mStateCache.onVertexArrayBufferStateChange(this);
7970 break;
7971 default:
7972 break;
7973 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007974 break;
7975
7976 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007977 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7978 {
7979 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
7980 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007981 break;
7982
7983 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007984 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7985 {
7986 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
7987 }
7988 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04007989 break;
7990
7991 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04007992 if (index < kTextureMaxSubjectIndex)
7993 {
7994 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04007995 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007996 }
Jamie Madille25b8002018-09-20 13:39:49 -04007997 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04007998 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04007999 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04008000 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008001 }
Jamie Madille25b8002018-09-20 13:39:49 -04008002 else
8003 {
8004 ASSERT(index < kSamplerMaxSubjectIndex);
8005 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
8006 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008007 break;
8008 }
8009}
8010
Jamie Madill6b873dd2018-07-12 23:56:30 -04008011// ErrorSet implementation.
8012ErrorSet::ErrorSet(Context *context) : mContext(context)
8013{
8014}
8015
8016ErrorSet::~ErrorSet() = default;
8017
Jamie Madill306b6c12018-07-27 08:12:49 -04008018void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04008019{
8020 // This internal enum is used to filter internal errors that are already handled.
8021 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
8022 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
8023 {
8024 return;
8025 }
8026
8027 if (ANGLE_UNLIKELY(error.isError()))
8028 {
8029 GLenum code = error.getCode();
8030 mErrors.insert(code);
Jamie Madill785e8a02018-10-04 17:42:00 -04008031
Jamie Madill6b873dd2018-07-12 23:56:30 -04008032 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
8033 {
8034 mContext->markContextLost();
8035 }
8036
8037 ASSERT(!error.getMessage().empty());
8038 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
8039 error.getID(), GL_DEBUG_SEVERITY_HIGH,
8040 error.getMessage());
8041 }
8042}
8043
Jamie Madillabfbc0f2018-10-09 12:48:52 -04008044void ErrorSet::handleError(GLenum errorCode,
8045 const char *message,
8046 const char *file,
8047 const char *function,
8048 unsigned int line)
8049{
8050 // TODO(jmadill): Handle error directly instead of creating object. http://anglebug.com/2491
8051 std::stringstream errorStream;
8052 errorStream << "Front-end Error: " << gl::FmtHex(errorCode) << ", in " << file << ", "
8053 << function << ":" << line << ". " << message;
8054
8055 handleError(gl::Error(errorCode, errorCode, errorStream.str()));
8056}
8057
Jamie Madilla139f012018-10-10 16:13:03 -04008058void ErrorSet::validationError(GLenum errorCode, const char *message)
8059{
8060 handleError(gl::Error(errorCode, message));
8061}
8062
Jamie Madill6b873dd2018-07-12 23:56:30 -04008063bool ErrorSet::empty() const
8064{
8065 return mErrors.empty();
8066}
8067
8068GLenum ErrorSet::popError()
8069{
8070 ASSERT(!empty());
8071 GLenum error = *mErrors.begin();
8072 mErrors.erase(mErrors.begin());
8073 return error;
8074}
Jamie Madilldc358af2018-07-31 11:22:13 -04008075
8076// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04008077StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008078 : mCachedHasAnyEnabledClientAttrib(false),
8079 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04008080 mCachedInstancedVertexElementLimit(0),
8081 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madilldc358af2018-07-31 11:22:13 -04008082{
8083}
8084
8085StateCache::~StateCache() = default;
8086
Jamie Madillac66f982018-10-09 18:30:01 -04008087void StateCache::initialize(Context *context)
8088{
8089 updateValidDrawModes(context);
8090 updateValidBindTextureTypes(context);
8091}
8092
Jamie Madilldc358af2018-07-31 11:22:13 -04008093void StateCache::updateActiveAttribsMask(Context *context)
8094{
8095 bool isGLES1 = context->isGLES1();
8096 const State &glState = context->getGLState();
8097
8098 if (!isGLES1 && !glState.getProgram())
8099 {
8100 mCachedActiveBufferedAttribsMask = AttributesMask();
8101 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008102 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008103 return;
8104 }
8105
8106 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8107 : glState.getProgram()->getActiveAttribLocationsMask();
8108
8109 const VertexArray *vao = glState.getVertexArray();
8110 ASSERT(vao);
8111
8112 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8113 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008114 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008115
Jamie Madill0a17e482018-08-31 17:19:11 -04008116 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8117 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008118 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008119 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8120}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008121
8122void StateCache::updateVertexElementLimits(Context *context)
8123{
8124 const VertexArray *vao = context->getGLState().getVertexArray();
8125
8126 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8127 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8128
8129 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8130 // If there are no buffered attributes then we should not limit the draw call count.
8131 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8132 {
8133 return;
8134 }
8135
8136 const auto &vertexAttribs = vao->getVertexAttributes();
8137 const auto &vertexBindings = vao->getVertexBindings();
8138
8139 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8140 {
8141 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8142 ASSERT(attrib.enabled);
8143
8144 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8145 ASSERT(context->isGLES1() ||
8146 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8147
8148 GLint64 limit = attrib.getCachedElementLimit();
8149 if (binding.getDivisor() > 0)
8150 {
8151 mCachedInstancedVertexElementLimit =
8152 std::min(mCachedInstancedVertexElementLimit, limit);
8153 }
8154 else
8155 {
8156 mCachedNonInstancedVertexElementLimit =
8157 std::min(mCachedNonInstancedVertexElementLimit, limit);
8158 }
8159 }
8160}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008161
Jamie Madilld84b6732018-09-06 15:54:35 -04008162void StateCache::updateBasicDrawStatesError()
8163{
8164 mCachedBasicDrawStatesError = kInvalidPointer;
8165}
8166
8167intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8168{
8169 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8170 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8171 return mCachedBasicDrawStatesError;
8172}
8173
Jamie Madillc43cdad2018-08-08 15:49:25 -04008174void StateCache::onVertexArrayBindingChange(Context *context)
8175{
8176 updateActiveAttribsMask(context);
8177 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008178 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008179}
8180
8181void StateCache::onProgramExecutableChange(Context *context)
8182{
8183 updateActiveAttribsMask(context);
8184 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008185 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008186 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008187}
8188
Jamie Madilld84b6732018-09-06 15:54:35 -04008189void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008190{
8191 updateVertexElementLimits(context);
8192}
8193
Jamie Madilld84b6732018-09-06 15:54:35 -04008194void StateCache::onVertexArrayBufferContentsChange(Context *context)
8195{
8196 updateVertexElementLimits(context);
8197 updateBasicDrawStatesError();
8198}
8199
Jamie Madillc43cdad2018-08-08 15:49:25 -04008200void StateCache::onVertexArrayStateChange(Context *context)
8201{
8202 updateActiveAttribsMask(context);
8203 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008204 updateBasicDrawStatesError();
8205}
8206
8207void StateCache::onVertexArrayBufferStateChange(Context *context)
8208{
8209 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008210}
8211
8212void StateCache::onGLES1ClientStateChange(Context *context)
8213{
8214 updateActiveAttribsMask(context);
8215}
Jamie Madilld84b6732018-09-06 15:54:35 -04008216
8217void StateCache::onDrawFramebufferChange(Context *context)
8218{
8219 updateBasicDrawStatesError();
8220}
8221
8222void StateCache::onContextCapChange(Context *context)
8223{
8224 updateBasicDrawStatesError();
8225}
8226
8227void StateCache::onStencilStateChange(Context *context)
8228{
8229 updateBasicDrawStatesError();
8230}
8231
8232void StateCache::onDefaultVertexAttributeChange(Context *context)
8233{
8234 updateBasicDrawStatesError();
8235}
8236
8237void StateCache::onActiveTextureChange(Context *context)
8238{
8239 updateBasicDrawStatesError();
8240}
8241
8242void StateCache::onQueryChange(Context *context)
8243{
8244 updateBasicDrawStatesError();
8245}
8246
8247void StateCache::onTransformFeedbackChange(Context *context)
8248{
8249 updateBasicDrawStatesError();
8250}
8251
8252void StateCache::onUniformBufferStateChange(Context *context)
8253{
8254 updateBasicDrawStatesError();
8255}
8256
8257void StateCache::onBufferBindingChange(Context *context)
8258{
8259 updateBasicDrawStatesError();
8260}
Jamie Madill526a6f62018-09-12 11:03:05 -04008261
8262void StateCache::updateValidDrawModes(Context *context)
8263{
8264 Program *program = context->getGLState().getProgram();
8265 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8266 {
8267 mCachedValidDrawModes = {{
8268 true, /* Points */
8269 true, /* Lines */
8270 true, /* LineLoop */
8271 true, /* LineStrip */
8272 true, /* Triangles */
8273 true, /* TriangleStrip */
8274 true, /* TriangleFan */
8275 false, /* LinesAdjacency */
8276 false, /* LineStripAdjacency */
8277 false, /* TrianglesAdjacency */
8278 false, /* TriangleStripAdjacency */
8279 false, /* InvalidEnum */
8280 }};
8281 }
8282 else
8283 {
8284 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8285
8286 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8287
8288 mCachedValidDrawModes = {{
8289 gsMode == PrimitiveMode::Points, /* Points */
8290 gsMode == PrimitiveMode::Lines, /* Lines */
8291 gsMode == PrimitiveMode::Lines, /* LineLoop */
8292 gsMode == PrimitiveMode::Lines, /* LineStrip */
8293 gsMode == PrimitiveMode::Triangles, /* Triangles */
8294 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8295 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8296 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8297 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8298 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8299 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8300 false, /* InvalidEnum */
8301 }};
8302 }
8303}
Jamie Madillac66f982018-10-09 18:30:01 -04008304
8305void StateCache::updateValidBindTextureTypes(Context *context)
8306{
8307 const Extensions &exts = context->getExtensions();
8308 bool isGLES3 = context->getClientMajorVersion() >= 3;
8309 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8310
8311 mCachedValidBindTextureTypes = {{
8312 true, /* _2D */
8313 isGLES3, /* _2DArray */
Yizhou Jiang7818a852018-09-06 15:02:04 +08008314 isGLES31 || exts.textureMultisample, /* _2DMultisample */
Jamie Madillac66f982018-10-09 18:30:01 -04008315 exts.textureStorageMultisample2DArray, /* _2DMultisampleArray */
8316 isGLES3, /* _3D */
8317 exts.eglImageExternal || exts.eglStreamConsumerExternal, /* External */
8318 exts.textureRectangle, /* Rectangle */
8319 true, /* CubeMap */
8320 false, /* InvalidEnum */
8321
8322 }};
8323}
Jamie Madillc29968b2016-01-20 11:17:23 -05008324} // namespace gl