blob: f9a37c80148a8c8f3233517bd30fefaeea47e6f3 [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{
2077 Texture *texture = getTargetTexture(target);
2078 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{
2092 Texture *texture = getTargetTexture(target);
2093 QueryTexParameteriv(texture, pname, params);
2094}
Jiajia Qin5451d532017-11-16 17:16:34 +08002095
Brandon Jones59770802018-04-02 13:18:42 -07002096void Context::getTexParameterivRobust(TextureType target,
2097 GLenum pname,
2098 GLsizei bufSize,
2099 GLsizei *length,
2100 GLint *params)
2101{
2102 getTexParameteriv(target, pname, params);
2103}
2104
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002105void Context::getTexParameterIivRobust(TextureType target,
2106 GLenum pname,
2107 GLsizei bufSize,
2108 GLsizei *length,
2109 GLint *params)
2110{
2111 UNIMPLEMENTED();
2112}
2113
2114void Context::getTexParameterIuivRobust(TextureType target,
2115 GLenum pname,
2116 GLsizei bufSize,
2117 GLsizei *length,
2118 GLuint *params)
2119{
2120 UNIMPLEMENTED();
2121}
2122
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002123void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002124{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002125 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002126 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002127}
2128
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002129void Context::getTexLevelParameterivRobust(TextureTarget target,
2130 GLint level,
2131 GLenum pname,
2132 GLsizei bufSize,
2133 GLsizei *length,
2134 GLint *params)
2135{
2136 UNIMPLEMENTED();
2137}
2138
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002139void Context::getTexLevelParameterfv(TextureTarget target,
2140 GLint level,
2141 GLenum pname,
2142 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002143{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002144 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002145 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002146}
2147
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002148void Context::getTexLevelParameterfvRobust(TextureTarget target,
2149 GLint level,
2150 GLenum pname,
2151 GLsizei bufSize,
2152 GLsizei *length,
2153 GLfloat *params)
2154{
2155 UNIMPLEMENTED();
2156}
2157
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002158void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002159{
2160 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002161 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002162 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002163}
2164
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002165void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002166{
2167 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002168 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002169 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002170}
2171
Brandon Jones59770802018-04-02 13:18:42 -07002172void Context::texParameterfvRobust(TextureType target,
2173 GLenum pname,
2174 GLsizei bufSize,
2175 const GLfloat *params)
2176{
2177 texParameterfv(target, pname, params);
2178}
2179
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002180void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002181{
2182 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002183 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002184 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002185}
2186
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002187void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002188{
2189 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002190 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002191 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002192}
2193
Brandon Jones59770802018-04-02 13:18:42 -07002194void Context::texParameterivRobust(TextureType target,
2195 GLenum pname,
2196 GLsizei bufSize,
2197 const GLint *params)
2198{
2199 texParameteriv(target, pname, params);
2200}
2201
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002202void Context::texParameterIivRobust(TextureType target,
2203 GLenum pname,
2204 GLsizei bufSize,
2205 const GLint *params)
2206{
2207 UNIMPLEMENTED();
2208}
2209
2210void Context::texParameterIuivRobust(TextureType target,
2211 GLenum pname,
2212 GLsizei bufSize,
2213 const GLuint *params)
2214{
2215 UNIMPLEMENTED();
2216}
2217
Jamie Madill493f9572018-05-24 19:52:15 -04002218void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002219{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002220 // No-op if count draws no primitives for given mode
2221 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002222 {
2223 return;
2224 }
2225
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002226 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002227 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002228 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002229}
2230
Jamie Madill493f9572018-05-24 19:52:15 -04002231void Context::drawArraysInstanced(PrimitiveMode mode,
2232 GLint first,
2233 GLsizei count,
2234 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002235{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002236 // No-op if count draws no primitives for given mode
2237 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002238 {
2239 return;
2240 }
2241
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002242 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002243 ANGLE_CONTEXT_TRY(
2244 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002245 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2246 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002247}
2248
Jamie Madill493f9572018-05-24 19:52:15 -04002249void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002250{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002251 // No-op if count draws no primitives for given mode
2252 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002253 {
2254 return;
2255 }
2256
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002257 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002258 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002259}
2260
Jamie Madill493f9572018-05-24 19:52:15 -04002261void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002262 GLsizei count,
2263 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002264 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002265 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002266{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002267 // No-op if count draws no primitives for given mode
2268 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002269 {
2270 return;
2271 }
2272
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002273 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002274 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002275 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002276}
2277
Jamie Madill493f9572018-05-24 19:52:15 -04002278void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002279 GLuint start,
2280 GLuint end,
2281 GLsizei count,
2282 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002283 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002284{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002285 // No-op if count draws no primitives for given mode
2286 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002287 {
2288 return;
2289 }
2290
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002291 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002292 ANGLE_CONTEXT_TRY(
2293 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002294}
2295
Jamie Madill493f9572018-05-24 19:52:15 -04002296void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002297{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002298 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002299 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002300}
2301
Jamie Madill493f9572018-05-24 19:52:15 -04002302void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002303{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002304 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002305 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002306}
2307
Jamie Madill675fe712016-12-19 13:07:54 -05002308void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002309{
Jamie Madillafa02a22017-11-23 12:57:38 -05002310 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002311}
2312
Jamie Madill675fe712016-12-19 13:07:54 -05002313void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002314{
Jamie Madillafa02a22017-11-23 12:57:38 -05002315 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002316}
2317
Austin Kinross6ee1e782015-05-29 17:05:37 -07002318void Context::insertEventMarker(GLsizei length, const char *marker)
2319{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002320 ASSERT(mImplementation);
2321 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002322}
2323
2324void Context::pushGroupMarker(GLsizei length, const char *marker)
2325{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002326 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002327
2328 if (marker == nullptr)
2329 {
2330 // From the EXT_debug_marker spec,
2331 // "If <marker> is null then an empty string is pushed on the stack."
2332 mImplementation->pushGroupMarker(length, "");
2333 }
2334 else
2335 {
2336 mImplementation->pushGroupMarker(length, marker);
2337 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002338}
2339
2340void Context::popGroupMarker()
2341{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002342 ASSERT(mImplementation);
2343 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002344}
2345
Geoff Langd8605522016-04-13 10:19:12 -04002346void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2347{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002348 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002349 ASSERT(programObject);
2350
2351 programObject->bindUniformLocation(location, name);
2352}
2353
Brandon Jones59770802018-04-02 13:18:42 -07002354void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002355{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002356 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002357}
2358
Brandon Jones59770802018-04-02 13:18:42 -07002359void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002360{
2361 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2362}
2363
Brandon Jones59770802018-04-02 13:18:42 -07002364void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002365{
2366 GLfloat I[16];
2367 angle::Matrix<GLfloat>::setToIdentity(I);
2368
2369 mGLState.loadPathRenderingMatrix(matrixMode, I);
2370}
2371
2372void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2373{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002374 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002375 if (!pathObj)
2376 return;
2377
Geoff Lang9bf86f02018-07-26 11:46:34 -04002378 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002379
2380 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2381}
2382
2383void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2384{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002385 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002386 if (!pathObj)
2387 return;
2388
Geoff Lang9bf86f02018-07-26 11:46:34 -04002389 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002390
2391 mImplementation->stencilStrokePath(pathObj, reference, mask);
2392}
2393
2394void Context::coverFillPath(GLuint path, GLenum coverMode)
2395{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002396 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002397 if (!pathObj)
2398 return;
2399
Geoff Lang9bf86f02018-07-26 11:46:34 -04002400 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002401
2402 mImplementation->coverFillPath(pathObj, coverMode);
2403}
2404
2405void Context::coverStrokePath(GLuint path, GLenum coverMode)
2406{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002407 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002408 if (!pathObj)
2409 return;
2410
Geoff Lang9bf86f02018-07-26 11:46:34 -04002411 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002412
2413 mImplementation->coverStrokePath(pathObj, coverMode);
2414}
2415
2416void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2417{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002418 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002419 if (!pathObj)
2420 return;
2421
Geoff Lang9bf86f02018-07-26 11:46:34 -04002422 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002423
2424 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2425}
2426
2427void Context::stencilThenCoverStrokePath(GLuint path,
2428 GLint reference,
2429 GLuint mask,
2430 GLenum coverMode)
2431{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002432 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002433 if (!pathObj)
2434 return;
2435
Geoff Lang9bf86f02018-07-26 11:46:34 -04002436 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002437
2438 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2439}
2440
Sami Väisänend59ca052016-06-21 16:10:00 +03002441void Context::coverFillPathInstanced(GLsizei numPaths,
2442 GLenum pathNameType,
2443 const void *paths,
2444 GLuint pathBase,
2445 GLenum coverMode,
2446 GLenum transformType,
2447 const GLfloat *transformValues)
2448{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002449 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002450
Geoff Lang9bf86f02018-07-26 11:46:34 -04002451 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002452
2453 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2454}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002455
Sami Väisänend59ca052016-06-21 16:10:00 +03002456void Context::coverStrokePathInstanced(GLsizei numPaths,
2457 GLenum pathNameType,
2458 const void *paths,
2459 GLuint pathBase,
2460 GLenum coverMode,
2461 GLenum transformType,
2462 const GLfloat *transformValues)
2463{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002464 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002465
2466 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002467 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002468
2469 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2470 transformValues);
2471}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002472
Sami Väisänend59ca052016-06-21 16:10:00 +03002473void Context::stencilFillPathInstanced(GLsizei numPaths,
2474 GLenum pathNameType,
2475 const void *paths,
2476 GLuint pathBase,
2477 GLenum fillMode,
2478 GLuint mask,
2479 GLenum transformType,
2480 const GLfloat *transformValues)
2481{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002482 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002483
2484 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002485 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002486
2487 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2488 transformValues);
2489}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002490
Sami Väisänend59ca052016-06-21 16:10:00 +03002491void Context::stencilStrokePathInstanced(GLsizei numPaths,
2492 GLenum pathNameType,
2493 const void *paths,
2494 GLuint pathBase,
2495 GLint reference,
2496 GLuint mask,
2497 GLenum transformType,
2498 const GLfloat *transformValues)
2499{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002500 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002501
Geoff Lang9bf86f02018-07-26 11:46:34 -04002502 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002503
2504 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2505 transformValues);
2506}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002507
Sami Väisänend59ca052016-06-21 16:10:00 +03002508void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2509 GLenum pathNameType,
2510 const void *paths,
2511 GLuint pathBase,
2512 GLenum fillMode,
2513 GLuint mask,
2514 GLenum coverMode,
2515 GLenum transformType,
2516 const GLfloat *transformValues)
2517{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002518 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002519
Geoff Lang9bf86f02018-07-26 11:46:34 -04002520 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002521
2522 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2523 transformType, transformValues);
2524}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002525
Sami Väisänend59ca052016-06-21 16:10:00 +03002526void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2527 GLenum pathNameType,
2528 const void *paths,
2529 GLuint pathBase,
2530 GLint reference,
2531 GLuint mask,
2532 GLenum coverMode,
2533 GLenum transformType,
2534 const GLfloat *transformValues)
2535{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002536 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002537
Geoff Lang9bf86f02018-07-26 11:46:34 -04002538 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002539
2540 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2541 transformType, transformValues);
2542}
2543
Sami Väisänen46eaa942016-06-29 10:26:37 +03002544void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2545{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002546 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002547
2548 programObject->bindFragmentInputLocation(location, name);
2549}
2550
2551void Context::programPathFragmentInputGen(GLuint program,
2552 GLint location,
2553 GLenum genMode,
2554 GLint components,
2555 const GLfloat *coeffs)
2556{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002557 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002558
jchen103fd614d2018-08-13 12:21:58 +08002559 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002560}
2561
jchen1015015f72017-03-16 13:54:21 +08002562GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2563{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002564 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002565 return QueryProgramResourceIndex(programObject, programInterface, name);
2566}
2567
jchen10fd7c3b52017-03-21 15:36:03 +08002568void Context::getProgramResourceName(GLuint program,
2569 GLenum programInterface,
2570 GLuint index,
2571 GLsizei bufSize,
2572 GLsizei *length,
2573 GLchar *name)
2574{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002575 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002576 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2577}
2578
jchen10191381f2017-04-11 13:59:04 +08002579GLint Context::getProgramResourceLocation(GLuint program,
2580 GLenum programInterface,
2581 const GLchar *name)
2582{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002583 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002584 return QueryProgramResourceLocation(programObject, programInterface, name);
2585}
2586
jchen10880683b2017-04-12 16:21:55 +08002587void Context::getProgramResourceiv(GLuint program,
2588 GLenum programInterface,
2589 GLuint index,
2590 GLsizei propCount,
2591 const GLenum *props,
2592 GLsizei bufSize,
2593 GLsizei *length,
2594 GLint *params)
2595{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002596 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002597 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2598 length, params);
2599}
2600
jchen10d9cd7b72017-08-30 15:04:25 +08002601void Context::getProgramInterfaceiv(GLuint program,
2602 GLenum programInterface,
2603 GLenum pname,
2604 GLint *params)
2605{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002606 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002607 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2608}
2609
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002610void Context::getProgramInterfaceivRobust(GLuint program,
2611 GLenum programInterface,
2612 GLenum pname,
2613 GLsizei bufSize,
2614 GLsizei *length,
2615 GLint *params)
2616{
2617 UNIMPLEMENTED();
2618}
2619
Jamie Madill306b6c12018-07-27 08:12:49 -04002620void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002621{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002622 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002623}
2624
Jamie Madillabfbc0f2018-10-09 12:48:52 -04002625void Context::handleError(GLenum errorCode,
2626 const char *message,
2627 const char *file,
2628 const char *function,
2629 unsigned int line)
2630{
2631 mErrors.handleError(errorCode, message, file, function, line);
2632}
2633
Jamie Madilla139f012018-10-10 16:13:03 -04002634void Context::validationError(GLenum errorCode, const char *message)
2635{
2636 mErrors.validationError(errorCode, message);
2637}
2638
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002639// Get one of the recorded errors and clear its flag, if any.
2640// [OpenGL ES 2.0.24] section 2.5 page 13.
2641GLenum Context::getError()
2642{
Geoff Langda5777c2014-07-11 09:52:58 -04002643 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002644 {
Geoff Langda5777c2014-07-11 09:52:58 -04002645 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002646 }
Geoff Langda5777c2014-07-11 09:52:58 -04002647 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002648 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002649 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002650 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002651}
2652
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002653// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002654void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002655{
2656 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002657 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002658 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002659 mContextLostForced = true;
2660 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002661 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002662}
2663
Jamie Madillfa920eb2018-01-04 11:45:50 -05002664GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002665{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002666 // Even if the application doesn't want to know about resets, we want to know
2667 // as it will allow us to skip all the calls.
2668 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002669 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002670 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002671 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002672 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002673 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002674
2675 // EXT_robustness, section 2.6: If the reset notification behavior is
2676 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2677 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2678 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002679 }
2680
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002681 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2682 // status should be returned at least once, and GL_NO_ERROR should be returned
2683 // once the device has finished resetting.
2684 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002685 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002686 ASSERT(mResetStatus == GL_NO_ERROR);
2687 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002688
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002689 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002690 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002691 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002692 }
2693 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002694 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002695 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002696 // If markContextLost was used to mark the context lost then
2697 // assume that is not recoverable, and continue to report the
2698 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002699 mResetStatus = mImplementation->getResetStatus();
2700 }
Jamie Madill893ab082014-05-16 16:56:10 -04002701
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002702 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002703}
2704
2705bool Context::isResetNotificationEnabled()
2706{
2707 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2708}
2709
Corentin Walleze3b10e82015-05-20 11:06:25 -04002710const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002711{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002712 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002713}
2714
2715EGLenum Context::getClientType() const
2716{
2717 return mClientType;
2718}
2719
2720EGLenum Context::getRenderBuffer() const
2721{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002722 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2723 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002724 {
2725 return EGL_NONE;
2726 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002727
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002728 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002729 ASSERT(backAttachment != nullptr);
2730 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002731}
2732
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002733VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002734{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002735 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002736 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2737 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002738 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002739 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2740 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002741
Jamie Madill96a483b2017-06-27 16:49:21 -04002742 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002743 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002744
2745 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002746}
2747
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002748TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002749{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002750 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002751 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2752 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002753 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002754 transformFeedback =
2755 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002756 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002757 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002758 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002759
2760 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002761}
2762
2763bool Context::isVertexArrayGenerated(GLuint vertexArray)
2764{
Jamie Madill96a483b2017-06-27 16:49:21 -04002765 ASSERT(mVertexArrayMap.contains(0));
2766 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002767}
2768
2769bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2770{
Jamie Madill96a483b2017-06-27 16:49:21 -04002771 ASSERT(mTransformFeedbackMap.contains(0));
2772 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002773}
2774
Shannon Woods53a94a82014-06-24 15:20:36 -04002775void Context::detachTexture(GLuint texture)
2776{
2777 // Simple pass-through to State's detachTexture method, as textures do not require
2778 // allocation map management either here or in the resource manager at detach time.
2779 // Zero textures are held by the Context, and we don't attempt to request them from
2780 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002781 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002782}
2783
James Darpinian4d9d4832018-03-13 12:43:28 -07002784void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002785{
Yuly Novikov5807a532015-12-03 13:01:22 -05002786 // Simple pass-through to State's detachBuffer method, since
2787 // only buffer attachments to container objects that are bound to the current context
2788 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002789
Yuly Novikov5807a532015-12-03 13:01:22 -05002790 // [OpenGL ES 3.2] section 5.1.2 page 45:
2791 // Attachments to unbound container objects, such as
2792 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2793 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002794 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002795}
2796
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002797void Context::detachFramebuffer(GLuint framebuffer)
2798{
Shannon Woods53a94a82014-06-24 15:20:36 -04002799 // Framebuffer detachment is handled by Context, because 0 is a valid
2800 // Framebuffer object, and a pointer to it must be passed from Context
2801 // to State at binding time.
2802
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002803 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002804 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2805 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2806 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002807
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002808 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002809 {
2810 bindReadFramebuffer(0);
2811 }
2812
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002813 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002814 {
2815 bindDrawFramebuffer(0);
2816 }
2817}
2818
2819void Context::detachRenderbuffer(GLuint renderbuffer)
2820{
Jamie Madilla02315b2017-02-23 14:14:47 -05002821 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002822}
2823
Jamie Madill57a89722013-07-02 11:57:03 -04002824void Context::detachVertexArray(GLuint vertexArray)
2825{
Jamie Madill77a72f62015-04-14 11:18:32 -04002826 // Vertex array detachment is handled by Context, because 0 is a valid
2827 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002828 // binding time.
2829
Jamie Madill57a89722013-07-02 11:57:03 -04002830 // [OpenGL ES 3.0.2] section 2.10 page 43:
2831 // If a vertex array object that is currently bound is deleted, the binding
2832 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002833 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002834 {
2835 bindVertexArray(0);
2836 }
2837}
2838
Geoff Langc8058452014-02-03 12:04:11 -05002839void Context::detachTransformFeedback(GLuint transformFeedback)
2840{
Corentin Walleza2257da2016-04-19 16:43:12 -04002841 // Transform feedback detachment is handled by Context, because 0 is a valid
2842 // transform feedback, and a pointer to it must be passed from Context to State at
2843 // binding time.
2844
2845 // The OpenGL specification doesn't mention what should happen when the currently bound
2846 // transform feedback object is deleted. Since it is a container object, we treat it like
2847 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002848 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002849 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002850 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002851 }
Geoff Langc8058452014-02-03 12:04:11 -05002852}
2853
Jamie Madilldc356042013-07-19 16:36:57 -04002854void Context::detachSampler(GLuint sampler)
2855{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002856 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002857}
2858
Yunchao Hea336b902017-08-02 16:05:21 +08002859void Context::detachProgramPipeline(GLuint pipeline)
2860{
2861 mGLState.detachProgramPipeline(this, pipeline);
2862}
2863
Jamie Madill3ef140a2017-08-26 23:11:21 -04002864void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002865{
Shaodde78e82017-05-22 14:13:27 +08002866 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002867 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002868}
2869
Jamie Madille29d1672013-07-19 16:36:57 -04002870void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2871{
Geoff Langc1984ed2016-10-07 12:41:00 -04002872 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002873 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002874 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002875}
Jamie Madille29d1672013-07-19 16:36:57 -04002876
Geoff Langc1984ed2016-10-07 12:41:00 -04002877void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2878{
2879 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002880 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002881 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002882}
2883
Brandon Jones59770802018-04-02 13:18:42 -07002884void Context::samplerParameterivRobust(GLuint sampler,
2885 GLenum pname,
2886 GLsizei bufSize,
2887 const GLint *param)
2888{
2889 samplerParameteriv(sampler, pname, param);
2890}
2891
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002892void Context::samplerParameterIivRobust(GLuint sampler,
2893 GLenum pname,
2894 GLsizei bufSize,
2895 const GLint *param)
2896{
2897 UNIMPLEMENTED();
2898}
2899
2900void Context::samplerParameterIuivRobust(GLuint sampler,
2901 GLenum pname,
2902 GLsizei bufSize,
2903 const GLuint *param)
2904{
2905 UNIMPLEMENTED();
2906}
2907
Jamie Madille29d1672013-07-19 16:36:57 -04002908void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2909{
Geoff Langc1984ed2016-10-07 12:41:00 -04002910 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002911 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002912 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002913}
2914
Geoff Langc1984ed2016-10-07 12:41:00 -04002915void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002916{
Geoff Langc1984ed2016-10-07 12:41:00 -04002917 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002918 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002919 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002920}
2921
Brandon Jones59770802018-04-02 13:18:42 -07002922void Context::samplerParameterfvRobust(GLuint sampler,
2923 GLenum pname,
2924 GLsizei bufSize,
2925 const GLfloat *param)
2926{
2927 samplerParameterfv(sampler, pname, param);
2928}
2929
Geoff Langc1984ed2016-10-07 12:41:00 -04002930void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002931{
Geoff Langc1984ed2016-10-07 12:41:00 -04002932 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002933 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002934 QuerySamplerParameteriv(samplerObject, pname, params);
2935}
Jamie Madill9675b802013-07-19 16:36:59 -04002936
Brandon Jones59770802018-04-02 13:18:42 -07002937void Context::getSamplerParameterivRobust(GLuint sampler,
2938 GLenum pname,
2939 GLsizei bufSize,
2940 GLsizei *length,
2941 GLint *params)
2942{
2943 getSamplerParameteriv(sampler, pname, params);
2944}
2945
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002946void Context::getSamplerParameterIivRobust(GLuint sampler,
2947 GLenum pname,
2948 GLsizei bufSize,
2949 GLsizei *length,
2950 GLint *params)
2951{
2952 UNIMPLEMENTED();
2953}
2954
2955void Context::getSamplerParameterIuivRobust(GLuint sampler,
2956 GLenum pname,
2957 GLsizei bufSize,
2958 GLsizei *length,
2959 GLuint *params)
2960{
2961 UNIMPLEMENTED();
2962}
2963
Geoff Langc1984ed2016-10-07 12:41:00 -04002964void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2965{
2966 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002967 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002968 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04002969}
2970
Brandon Jones59770802018-04-02 13:18:42 -07002971void Context::getSamplerParameterfvRobust(GLuint sampler,
2972 GLenum pname,
2973 GLsizei bufSize,
2974 GLsizei *length,
2975 GLfloat *params)
2976{
2977 getSamplerParameterfv(sampler, pname, params);
2978}
2979
Olli Etuahof0fee072016-03-30 15:11:58 +03002980void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2981{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002982 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08002983 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002984}
2985
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002986void Context::initRendererString()
2987{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002988 std::ostringstream rendererString;
2989 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002990 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002991 rendererString << ")";
2992
Geoff Langcec35902014-04-16 10:52:36 -04002993 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002994}
2995
Geoff Langc339c4e2016-11-29 10:37:36 -05002996void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002997{
Geoff Langc339c4e2016-11-29 10:37:36 -05002998 const Version &clientVersion = getClientVersion();
2999
3000 std::ostringstream versionString;
3001 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
3002 << ANGLE_VERSION_STRING << ")";
3003 mVersionString = MakeStaticString(versionString.str());
3004
3005 std::ostringstream shadingLanguageVersionString;
3006 shadingLanguageVersionString << "OpenGL ES GLSL ES "
3007 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
3008 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
3009 << ")";
3010 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003011}
3012
Geoff Langcec35902014-04-16 10:52:36 -04003013void Context::initExtensionStrings()
3014{
Geoff Langc339c4e2016-11-29 10:37:36 -05003015 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
3016 std::ostringstream combinedStringStream;
3017 std::copy(strings.begin(), strings.end(),
3018 std::ostream_iterator<const char *>(combinedStringStream, " "));
3019 return MakeStaticString(combinedStringStream.str());
3020 };
3021
3022 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003023 for (const auto &extensionString : mExtensions.getStrings())
3024 {
3025 mExtensionStrings.push_back(MakeStaticString(extensionString));
3026 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003027 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003028
Geoff Langc339c4e2016-11-29 10:37:36 -05003029 mRequestableExtensionStrings.clear();
3030 for (const auto &extensionInfo : GetExtensionInfoMap())
3031 {
3032 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003033 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003034 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003035 {
3036 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3037 }
3038 }
3039 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003040}
3041
Geoff Langc339c4e2016-11-29 10:37:36 -05003042const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003043{
Geoff Langc339c4e2016-11-29 10:37:36 -05003044 switch (name)
3045 {
3046 case GL_VENDOR:
3047 return reinterpret_cast<const GLubyte *>("Google Inc.");
3048
3049 case GL_RENDERER:
3050 return reinterpret_cast<const GLubyte *>(mRendererString);
3051
3052 case GL_VERSION:
3053 return reinterpret_cast<const GLubyte *>(mVersionString);
3054
3055 case GL_SHADING_LANGUAGE_VERSION:
3056 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3057
3058 case GL_EXTENSIONS:
3059 return reinterpret_cast<const GLubyte *>(mExtensionString);
3060
3061 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3062 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3063
3064 default:
3065 UNREACHABLE();
3066 return nullptr;
3067 }
Geoff Langcec35902014-04-16 10:52:36 -04003068}
3069
Geoff Langc339c4e2016-11-29 10:37:36 -05003070const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003071{
Geoff Langc339c4e2016-11-29 10:37:36 -05003072 switch (name)
3073 {
3074 case GL_EXTENSIONS:
3075 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3076
3077 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3078 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3079
3080 default:
3081 UNREACHABLE();
3082 return nullptr;
3083 }
Geoff Langcec35902014-04-16 10:52:36 -04003084}
3085
3086size_t Context::getExtensionStringCount() const
3087{
3088 return mExtensionStrings.size();
3089}
3090
Geoff Lang111a99e2017-10-17 10:58:41 -04003091bool Context::isExtensionRequestable(const char *name)
3092{
3093 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3094 auto extension = extensionInfos.find(name);
3095
Geoff Lang111a99e2017-10-17 10:58:41 -04003096 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003097 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003098}
3099
Geoff Langc339c4e2016-11-29 10:37:36 -05003100void Context::requestExtension(const char *name)
3101{
3102 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3103 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3104 const auto &extension = extensionInfos.at(name);
3105 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003106 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003107
3108 if (mExtensions.*(extension.ExtensionsMember))
3109 {
3110 // Extension already enabled
3111 return;
3112 }
3113
3114 mExtensions.*(extension.ExtensionsMember) = true;
3115 updateCaps();
3116 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003117
Jamie Madill2f348d22017-06-05 10:50:59 -04003118 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3119 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003120
Jamie Madill81c2e252017-09-09 23:32:46 -04003121 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3122 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003123 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003124 for (auto &zeroTexture : mZeroTextures)
3125 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003126 if (zeroTexture.get() != nullptr)
3127 {
3128 zeroTexture->signalDirty(this, InitState::Initialized);
3129 }
Geoff Lang9aded172017-04-05 11:07:56 -04003130 }
3131
Jamie Madillb983a4b2018-08-01 11:34:51 -04003132 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003133}
3134
3135size_t Context::getRequestableExtensionStringCount() const
3136{
3137 return mRequestableExtensionStrings.size();
3138}
3139
Jamie Madill493f9572018-05-24 19:52:15 -04003140void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003141{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003142 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003143 ASSERT(transformFeedback != nullptr);
3144 ASSERT(!transformFeedback->isPaused());
3145
Jamie Madill6c1f6712017-02-14 19:08:04 -05003146 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003147 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003148}
3149
3150bool Context::hasActiveTransformFeedback(GLuint program) const
3151{
3152 for (auto pair : mTransformFeedbackMap)
3153 {
3154 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3155 {
3156 return true;
3157 }
3158 }
3159 return false;
3160}
3161
Geoff Lang33f11fb2018-05-07 13:42:47 -04003162Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003163{
3164 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3165
jchen1082af6202018-06-22 10:59:52 +08003166 // Explicitly enable GL_KHR_parallel_shader_compile
3167 supportedExtensions.parallelShaderCompile = true;
3168
Geoff Langb0f917f2017-12-05 13:41:54 -05003169 if (getClientVersion() < ES_2_0)
3170 {
3171 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003172 supportedExtensions.pointSizeArray = true;
3173 supportedExtensions.textureCubeMap = true;
3174 supportedExtensions.pointSprite = true;
3175 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003176 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003177 }
3178
3179 if (getClientVersion() < ES_3_0)
3180 {
3181 // Disable ES3+ extensions
3182 supportedExtensions.colorBufferFloat = false;
3183 supportedExtensions.eglImageExternalEssl3 = false;
3184 supportedExtensions.textureNorm16 = false;
3185 supportedExtensions.multiview = false;
3186 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003187 supportedExtensions.copyTexture3d = false;
Yizhou Jiang7818a852018-09-06 15:02:04 +08003188 supportedExtensions.textureMultisample = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003189 }
3190
3191 if (getClientVersion() < ES_3_1)
3192 {
3193 // Disable ES3.1+ extensions
3194 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003195
3196 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3197 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003198 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003199 }
3200
3201 if (getClientVersion() > ES_2_0)
3202 {
3203 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3204 // supportedExtensions.sRGB = false;
3205 }
3206
3207 // Some extensions are always available because they are implemented in the GL layer.
3208 supportedExtensions.bindUniformLocation = true;
3209 supportedExtensions.vertexArrayObject = true;
3210 supportedExtensions.bindGeneratesResource = true;
3211 supportedExtensions.clientArrays = true;
3212 supportedExtensions.requestExtension = true;
3213
3214 // Enable the no error extension if the context was created with the flag.
3215 supportedExtensions.noError = mSkipValidation;
3216
3217 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003218 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003219
3220 // Explicitly enable GL_KHR_debug
3221 supportedExtensions.debug = true;
3222 supportedExtensions.maxDebugMessageLength = 1024;
3223 supportedExtensions.maxDebugLoggedMessages = 1024;
3224 supportedExtensions.maxDebugGroupStackDepth = 1024;
3225 supportedExtensions.maxLabelLength = 1024;
3226
3227 // Explicitly enable GL_ANGLE_robust_client_memory
3228 supportedExtensions.robustClientMemory = true;
3229
3230 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003231 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003232
3233 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3234 // supports it.
3235 supportedExtensions.robustBufferAccessBehavior =
3236 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3237
3238 // Enable the cache control query unconditionally.
3239 supportedExtensions.programCacheControl = true;
3240
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003241 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003242 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003243 {
3244 // GL_ANGLE_explicit_context_gles1
3245 supportedExtensions.explicitContextGles1 = true;
3246 // GL_ANGLE_explicit_context
3247 supportedExtensions.explicitContext = true;
3248 }
3249
Geoff Lang79b91402018-10-04 15:11:30 -04003250 supportedExtensions.memorySize = true;
3251
Geoff Langb0f917f2017-12-05 13:41:54 -05003252 return supportedExtensions;
3253}
3254
Geoff Lang33f11fb2018-05-07 13:42:47 -04003255void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003256{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003257 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003258
Geoff Lang33f11fb2018-05-07 13:42:47 -04003259 mSupportedExtensions = generateSupportedExtensions();
3260 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003261
3262 mLimitations = mImplementation->getNativeLimitations();
3263
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003264 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3265 if (getClientVersion() < Version(2, 0))
3266 {
3267 mCaps.maxMultitextureUnits = 4;
3268 mCaps.maxClipPlanes = 6;
3269 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003270 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3271 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3272 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003273 mCaps.minSmoothPointSize = 1.0f;
3274 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003275 mCaps.minSmoothLineWidth = 1.0f;
3276 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003277 }
3278
Luc Ferronad2ae932018-06-11 15:31:17 -04003279 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003280 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003281
Luc Ferronad2ae932018-06-11 15:31:17 -04003282 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3283
Jamie Madill0f80ed82017-09-19 00:24:56 -04003284 if (getClientVersion() < ES_3_1)
3285 {
3286 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3287 }
3288 else
3289 {
3290 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3291 }
Geoff Lang301d1612014-07-09 10:34:37 -04003292
Jiawei Shao54aafe52018-04-27 14:54:57 +08003293 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3294 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003295 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3296
Jamie Madill0f80ed82017-09-19 00:24:56 -04003297 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3298 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3299
3300 // Limit textures as well, so we can use fast bitsets with texture bindings.
3301 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003302 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3303 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3304 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3305 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003306
Jiawei Shaodb342272017-09-27 10:21:45 +08003307 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3308
Geoff Langc287ea62016-09-16 14:46:51 -04003309 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003310 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003311 for (const auto &extensionInfo : GetExtensionInfoMap())
3312 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003313 // If the user has requested that extensions start disabled and they are requestable,
3314 // disable them.
3315 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003316 {
3317 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3318 }
3319 }
3320
3321 // Generate texture caps
3322 updateCaps();
3323}
3324
3325void Context::updateCaps()
3326{
Geoff Lang900013c2014-07-07 11:32:19 -04003327 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003328 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003329
Jamie Madill7b62cf92017-11-02 15:20:49 -04003330 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003331 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003332 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003333 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003334
Geoff Lang0d8b7242015-09-09 14:56:53 -04003335 // Update the format caps based on the client version and extensions.
3336 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3337 // ES3.
3338 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003339 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003340 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003341 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003342 formatCaps.textureAttachment =
3343 formatCaps.textureAttachment &&
3344 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3345 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3346 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003347
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003348 // OpenGL ES does not support multisampling with non-rendererable formats
3349 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003350 if (!formatCaps.renderbuffer ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003351 (getClientVersion() < ES_3_1 &&
3352 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003353 {
Geoff Langd87878e2014-09-19 15:42:59 -04003354 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003355 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003356 else
3357 {
3358 // We may have limited the max samples for some required renderbuffer formats due to
3359 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3360 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3361
3362 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3363 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3364 // exception of signed and unsigned integer formats."
3365 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3366 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3367 {
3368 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3369 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3370 }
3371
3372 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3373 if (getClientVersion() >= ES_3_1)
3374 {
3375 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3376 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3377 // the exception that the signed and unsigned integer formats are required only to
3378 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3379 // multisamples, which must be at least one."
3380 if (formatInfo.componentType == GL_INT ||
3381 formatInfo.componentType == GL_UNSIGNED_INT)
3382 {
3383 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3384 }
3385
3386 // GLES 3.1 section 19.3.1.
3387 if (formatCaps.texturable)
3388 {
3389 if (formatInfo.depthBits > 0)
3390 {
3391 mCaps.maxDepthTextureSamples =
3392 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3393 }
3394 else if (formatInfo.redBits > 0)
3395 {
3396 mCaps.maxColorTextureSamples =
3397 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3398 }
3399 }
3400 }
3401 }
Geoff Langd87878e2014-09-19 15:42:59 -04003402
3403 if (formatCaps.texturable && formatInfo.compressed)
3404 {
Geoff Langca271392017-04-05 12:30:00 -04003405 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003406 }
3407
Geoff Langca271392017-04-05 12:30:00 -04003408 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003409 }
Jamie Madill32447362017-06-28 14:53:52 -04003410
3411 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003412 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003413 {
3414 mMemoryProgramCache = nullptr;
3415 }
Corentin Walleze4477002017-12-01 14:39:58 -05003416
3417 // Compute which buffer types are allowed
3418 mValidBufferBindings.reset();
3419 mValidBufferBindings.set(BufferBinding::ElementArray);
3420 mValidBufferBindings.set(BufferBinding::Array);
3421
3422 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3423 {
3424 mValidBufferBindings.set(BufferBinding::PixelPack);
3425 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3426 }
3427
3428 if (getClientVersion() >= ES_3_0)
3429 {
3430 mValidBufferBindings.set(BufferBinding::CopyRead);
3431 mValidBufferBindings.set(BufferBinding::CopyWrite);
3432 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3433 mValidBufferBindings.set(BufferBinding::Uniform);
3434 }
3435
3436 if (getClientVersion() >= ES_3_1)
3437 {
3438 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3439 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3440 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3441 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3442 }
jchen107ae70d82018-07-06 13:47:01 +08003443
3444 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003445
3446 // Reinitialize state cache after extension changes.
3447 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003448}
3449
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003450void Context::initWorkarounds()
3451{
Jamie Madill761b02c2017-06-23 16:27:06 -04003452 // Apply back-end workarounds.
3453 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3454
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003455 // Lose the context upon out of memory error if the application is
3456 // expecting to watch for those events.
3457 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
Jamie Madilld4f07762018-10-19 19:24:07 -04003458
3459 if (mWorkarounds.syncFramebufferBindingsOnTexImage)
3460 {
3461 // Update the Framebuffer bindings on TexImage to work around an Intel bug.
3462 mTexImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
3463 mTexImageDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
3464 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003465}
3466
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003467// Return true if the draw is a no-op, else return false.
3468// A no-op draw occurs if the count of vertices is less than the minimum required to
3469// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3470bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3471{
3472 return count < kMinimumPrimitiveCounts[mode];
3473}
3474
3475bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3476{
3477 return (instanceCount == 0) || noopDraw(mode, count);
3478}
3479
Jamie Madill6f755b22018-10-09 12:48:54 -04003480angle::Result Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003481{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003482 if (mGLES1Renderer)
3483 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003484 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003485 }
3486
Geoff Lang9bf86f02018-07-26 11:46:34 -04003487 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003488
3489 if (isRobustResourceInitEnabled())
3490 {
3491 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3492 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3493 }
3494
Geoff Langa8cb2872018-03-09 16:09:40 -05003495 ANGLE_TRY(syncDirtyBits());
Jamie Madill6f755b22018-10-09 12:48:54 -04003496 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003497}
3498
3499Error Context::prepareForClear(GLbitfield mask)
3500{
Geoff Langa8cb2872018-03-09 16:09:40 -05003501 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003502 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003503 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003504 return NoError();
3505}
3506
3507Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3508{
Geoff Langa8cb2872018-03-09 16:09:40 -05003509 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003510 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3511 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003512 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003513 return NoError();
3514}
3515
Geoff Langa8cb2872018-03-09 16:09:40 -05003516Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003517{
Geoff Langa8cb2872018-03-09 16:09:40 -05003518 ANGLE_TRY(syncDirtyObjects(objectMask));
3519 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003520 return NoError();
3521}
3522
Jamie Madill6f755b22018-10-09 12:48:54 -04003523angle::Result Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003524{
3525 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003526 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003527 mGLState.clearDirtyBits();
Jamie Madill6f755b22018-10-09 12:48:54 -04003528 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003529}
3530
Jamie Madill6f755b22018-10-09 12:48:54 -04003531angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003532{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003533 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003534 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003535 mGLState.clearDirtyBits(dirtyBits);
Jamie Madill6f755b22018-10-09 12:48:54 -04003536 return angle::Result::Continue();
Jamie Madill1b94d432015-08-07 13:23:23 -04003537}
Jamie Madillc29968b2016-01-20 11:17:23 -05003538
Jamie Madill6f755b22018-10-09 12:48:54 -04003539angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003540{
3541 return mGLState.syncDirtyObjects(this, objectMask);
3542}
3543
Jamie Madillc29968b2016-01-20 11:17:23 -05003544void Context::blitFramebuffer(GLint srcX0,
3545 GLint srcY0,
3546 GLint srcX1,
3547 GLint srcY1,
3548 GLint dstX0,
3549 GLint dstY0,
3550 GLint dstX1,
3551 GLint dstY1,
3552 GLbitfield mask,
3553 GLenum filter)
3554{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003555 if (mask == 0)
3556 {
3557 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3558 // buffers are copied.
3559 return;
3560 }
3561
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003562 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003563 ASSERT(drawFramebuffer);
3564
3565 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3566 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3567
Jamie Madillbc918e72018-03-08 09:47:21 -05003568 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003569
Jamie Madillc564c072017-06-01 12:45:42 -04003570 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003571}
Jamie Madillc29968b2016-01-20 11:17:23 -05003572
3573void Context::clear(GLbitfield mask)
3574{
Geoff Langd4fff502017-09-22 11:28:28 -04003575 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3576 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003577}
3578
3579void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3580{
Olli Etuaho78df3362018-10-05 16:43:27 +03003581 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3582 const FramebufferAttachment *attachment = nullptr;
3583 if (buffer == GL_DEPTH)
3584 {
3585 attachment = framebufferObject->getDepthbuffer();
3586 }
3587 if (buffer == GL_COLOR &&
3588 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3589 {
3590 attachment = framebufferObject->getColorbuffer(drawbuffer);
3591 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003592 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3593 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003594 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003595 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003596 return;
3597 }
Geoff Langd4fff502017-09-22 11:28:28 -04003598 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003599 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003600}
3601
3602void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3603{
Olli Etuaho78df3362018-10-05 16:43:27 +03003604 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3605 const FramebufferAttachment *attachment = nullptr;
3606 if (buffer == GL_COLOR &&
3607 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3608 {
3609 attachment = framebufferObject->getColorbuffer(drawbuffer);
3610 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003611 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3612 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003613 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003614 {
3615 return;
3616 }
Geoff Langd4fff502017-09-22 11:28:28 -04003617 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003618 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003619}
3620
3621void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3622{
Olli Etuaho78df3362018-10-05 16:43:27 +03003623 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3624 const FramebufferAttachment *attachment = nullptr;
3625 if (buffer == GL_STENCIL)
3626 {
3627 attachment = framebufferObject->getStencilbuffer();
3628 }
3629 if (buffer == GL_COLOR &&
3630 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3631 {
3632 attachment = framebufferObject->getColorbuffer(drawbuffer);
3633 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003634 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3635 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003636 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003637 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003638 return;
3639 }
Geoff Langd4fff502017-09-22 11:28:28 -04003640 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003641 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003642}
3643
3644void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3645{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003646 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003647 ASSERT(framebufferObject);
3648
3649 // If a buffer is not present, the clear has no effect
3650 if (framebufferObject->getDepthbuffer() == nullptr &&
3651 framebufferObject->getStencilbuffer() == nullptr)
3652 {
3653 return;
3654 }
3655
Geoff Langd4fff502017-09-22 11:28:28 -04003656 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3657 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003658}
3659
3660void Context::readPixels(GLint x,
3661 GLint y,
3662 GLsizei width,
3663 GLsizei height,
3664 GLenum format,
3665 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003666 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003667{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003668 if (width == 0 || height == 0)
3669 {
3670 return;
3671 }
3672
Jamie Madillbc918e72018-03-08 09:47:21 -05003673 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003674
Jamie Madillb6664922017-07-25 12:55:04 -04003675 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3676 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003677
3678 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003679 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003680}
3681
Brandon Jones59770802018-04-02 13:18:42 -07003682void Context::readPixelsRobust(GLint x,
3683 GLint y,
3684 GLsizei width,
3685 GLsizei height,
3686 GLenum format,
3687 GLenum type,
3688 GLsizei bufSize,
3689 GLsizei *length,
3690 GLsizei *columns,
3691 GLsizei *rows,
3692 void *pixels)
3693{
3694 readPixels(x, y, width, height, format, type, pixels);
3695}
3696
3697void Context::readnPixelsRobust(GLint x,
3698 GLint y,
3699 GLsizei width,
3700 GLsizei height,
3701 GLenum format,
3702 GLenum type,
3703 GLsizei bufSize,
3704 GLsizei *length,
3705 GLsizei *columns,
3706 GLsizei *rows,
3707 void *data)
3708{
3709 readPixels(x, y, width, height, format, type, data);
3710}
3711
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003712void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003713 GLint level,
3714 GLenum internalformat,
3715 GLint x,
3716 GLint y,
3717 GLsizei width,
3718 GLsizei height,
3719 GLint border)
3720{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003721 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003722 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003723
Jamie Madillc29968b2016-01-20 11:17:23 -05003724 Rectangle sourceArea(x, y, width, height);
3725
Jamie Madill05b35b22017-10-03 09:01:44 -04003726 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003727 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003728 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003729}
3730
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003731void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003732 GLint level,
3733 GLint xoffset,
3734 GLint yoffset,
3735 GLint x,
3736 GLint y,
3737 GLsizei width,
3738 GLsizei height)
3739{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003740 if (width == 0 || height == 0)
3741 {
3742 return;
3743 }
3744
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003745 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003746 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003747
Jamie Madillc29968b2016-01-20 11:17:23 -05003748 Offset destOffset(xoffset, yoffset, 0);
3749 Rectangle sourceArea(x, y, width, height);
3750
Jamie Madill05b35b22017-10-03 09:01:44 -04003751 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003752 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003753 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003754}
3755
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003756void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003757 GLint level,
3758 GLint xoffset,
3759 GLint yoffset,
3760 GLint zoffset,
3761 GLint x,
3762 GLint y,
3763 GLsizei width,
3764 GLsizei height)
3765{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003766 if (width == 0 || height == 0)
3767 {
3768 return;
3769 }
3770
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003771 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003772 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003773
Jamie Madillc29968b2016-01-20 11:17:23 -05003774 Offset destOffset(xoffset, yoffset, zoffset);
3775 Rectangle sourceArea(x, y, width, height);
3776
Jamie Madill05b35b22017-10-03 09:01:44 -04003777 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3778 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003779 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3780 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003781}
3782
3783void Context::framebufferTexture2D(GLenum target,
3784 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003785 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003786 GLuint texture,
3787 GLint level)
3788{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003789 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003790 ASSERT(framebuffer);
3791
3792 if (texture != 0)
3793 {
3794 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003795 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003796 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003797 }
3798 else
3799 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003800 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003801 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003802
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003803 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003804}
3805
3806void Context::framebufferRenderbuffer(GLenum target,
3807 GLenum attachment,
3808 GLenum renderbuffertarget,
3809 GLuint renderbuffer)
3810{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003811 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003812 ASSERT(framebuffer);
3813
3814 if (renderbuffer != 0)
3815 {
3816 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003817
Jamie Madillcc129372018-04-12 09:13:18 -04003818 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003819 renderbufferObject);
3820 }
3821 else
3822 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003823 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003824 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003825
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003826 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003827}
3828
3829void Context::framebufferTextureLayer(GLenum target,
3830 GLenum attachment,
3831 GLuint texture,
3832 GLint level,
3833 GLint layer)
3834{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003835 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003836 ASSERT(framebuffer);
3837
3838 if (texture != 0)
3839 {
3840 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003841 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003842 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003843 }
3844 else
3845 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003846 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003847 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003848
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003849 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003850}
3851
Brandon Jones59770802018-04-02 13:18:42 -07003852void Context::framebufferTextureMultiviewLayered(GLenum target,
3853 GLenum attachment,
3854 GLuint texture,
3855 GLint level,
3856 GLint baseViewIndex,
3857 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003858{
Martin Radev82ef7742017-08-08 17:44:58 +03003859 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3860 ASSERT(framebuffer);
3861
3862 if (texture != 0)
3863 {
3864 Texture *textureObj = getTexture(texture);
3865
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003866 ImageIndex index;
3867 if (textureObj->getType() == TextureType::_2DArray)
3868 {
3869 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3870 }
3871 else
3872 {
3873 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3874 ASSERT(level == 0);
3875 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3876 }
Martin Radev82ef7742017-08-08 17:44:58 +03003877 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3878 numViews, baseViewIndex);
3879 }
3880 else
3881 {
3882 framebuffer->resetAttachment(this, attachment);
3883 }
3884
3885 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003886}
3887
Brandon Jones59770802018-04-02 13:18:42 -07003888void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3889 GLenum attachment,
3890 GLuint texture,
3891 GLint level,
3892 GLsizei numViews,
3893 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003894{
Martin Radev5dae57b2017-07-14 16:15:55 +03003895 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3896 ASSERT(framebuffer);
3897
3898 if (texture != 0)
3899 {
3900 Texture *textureObj = getTexture(texture);
3901
3902 ImageIndex index = ImageIndex::Make2D(level);
3903 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3904 textureObj, numViews, viewportOffsets);
3905 }
3906 else
3907 {
3908 framebuffer->resetAttachment(this, attachment);
3909 }
3910
3911 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003912}
3913
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003914void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3915{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003916 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3917 ASSERT(framebuffer);
3918
3919 if (texture != 0)
3920 {
3921 Texture *textureObj = getTexture(texture);
3922
3923 ImageIndex index = ImageIndex::MakeFromType(
3924 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3925 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3926 }
3927 else
3928 {
3929 framebuffer->resetAttachment(this, attachment);
3930 }
3931
3932 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003933}
3934
Jamie Madillc29968b2016-01-20 11:17:23 -05003935void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3936{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003937 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003938 ASSERT(framebuffer);
3939 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003940 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003941 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003942}
3943
3944void Context::readBuffer(GLenum mode)
3945{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003946 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003947 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003948 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003949}
3950
3951void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3952{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003953 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003954 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003955
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003956 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003957 ASSERT(framebuffer);
3958
3959 // The specification isn't clear what should be done when the framebuffer isn't complete.
3960 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003961 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003962}
3963
3964void Context::invalidateFramebuffer(GLenum target,
3965 GLsizei numAttachments,
3966 const GLenum *attachments)
3967{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003968 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003969 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003970
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003971 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003972 ASSERT(framebuffer);
3973
Jamie Madill427064d2018-04-13 16:20:34 -04003974 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003975 {
Jamie Madill437fa652016-05-03 15:13:24 -04003976 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003977 }
Jamie Madill437fa652016-05-03 15:13:24 -04003978
Jamie Madill4928b7c2017-06-20 12:57:39 -04003979 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003980}
3981
3982void Context::invalidateSubFramebuffer(GLenum target,
3983 GLsizei numAttachments,
3984 const GLenum *attachments,
3985 GLint x,
3986 GLint y,
3987 GLsizei width,
3988 GLsizei height)
3989{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003990 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003991 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003992
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003993 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003994 ASSERT(framebuffer);
3995
Jamie Madill427064d2018-04-13 16:20:34 -04003996 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003997 {
Jamie Madill437fa652016-05-03 15:13:24 -04003998 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003999 }
Jamie Madill437fa652016-05-03 15:13:24 -04004000
4001 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004002 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05004003}
4004
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004005void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004006 GLint level,
4007 GLint internalformat,
4008 GLsizei width,
4009 GLsizei height,
4010 GLint border,
4011 GLenum format,
4012 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004013 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004014{
Jamie Madillbc918e72018-03-08 09:47:21 -05004015 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004016
4017 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004018 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004019 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004020 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004021}
4022
Brandon Jones59770802018-04-02 13:18:42 -07004023void Context::texImage2DRobust(TextureTarget target,
4024 GLint level,
4025 GLint internalformat,
4026 GLsizei width,
4027 GLsizei height,
4028 GLint border,
4029 GLenum format,
4030 GLenum type,
4031 GLsizei bufSize,
4032 const void *pixels)
4033{
4034 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4035}
4036
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004037void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004038 GLint level,
4039 GLint internalformat,
4040 GLsizei width,
4041 GLsizei height,
4042 GLsizei depth,
4043 GLint border,
4044 GLenum format,
4045 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004046 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004047{
Jamie Madillbc918e72018-03-08 09:47:21 -05004048 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004049
4050 Extents size(width, height, depth);
4051 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004052 handleError(texture->setImage(this, mGLState.getUnpackState(),
4053 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004054 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004055}
4056
Brandon Jones59770802018-04-02 13:18:42 -07004057void Context::texImage3DRobust(TextureType target,
4058 GLint level,
4059 GLint internalformat,
4060 GLsizei width,
4061 GLsizei height,
4062 GLsizei depth,
4063 GLint border,
4064 GLenum format,
4065 GLenum type,
4066 GLsizei bufSize,
4067 const void *pixels)
4068{
4069 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4070}
4071
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004072void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004073 GLint level,
4074 GLint xoffset,
4075 GLint yoffset,
4076 GLsizei width,
4077 GLsizei height,
4078 GLenum format,
4079 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004080 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004081{
4082 // Zero sized uploads are valid but no-ops
4083 if (width == 0 || height == 0)
4084 {
4085 return;
4086 }
4087
Jamie Madillbc918e72018-03-08 09:47:21 -05004088 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004089
4090 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004091 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004092
4093 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4094
4095 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4096 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004097}
4098
Brandon Jones59770802018-04-02 13:18:42 -07004099void Context::texSubImage2DRobust(TextureTarget target,
4100 GLint level,
4101 GLint xoffset,
4102 GLint yoffset,
4103 GLsizei width,
4104 GLsizei height,
4105 GLenum format,
4106 GLenum type,
4107 GLsizei bufSize,
4108 const void *pixels)
4109{
4110 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4111}
4112
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004113void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004114 GLint level,
4115 GLint xoffset,
4116 GLint yoffset,
4117 GLint zoffset,
4118 GLsizei width,
4119 GLsizei height,
4120 GLsizei depth,
4121 GLenum format,
4122 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004123 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004124{
4125 // Zero sized uploads are valid but no-ops
4126 if (width == 0 || height == 0 || depth == 0)
4127 {
4128 return;
4129 }
4130
Jamie Madillbc918e72018-03-08 09:47:21 -05004131 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004132
4133 Box area(xoffset, yoffset, zoffset, width, height, depth);
4134 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004135
4136 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4137
4138 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004139 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004140 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004141}
4142
Brandon Jones59770802018-04-02 13:18:42 -07004143void Context::texSubImage3DRobust(TextureType target,
4144 GLint level,
4145 GLint xoffset,
4146 GLint yoffset,
4147 GLint zoffset,
4148 GLsizei width,
4149 GLsizei height,
4150 GLsizei depth,
4151 GLenum format,
4152 GLenum type,
4153 GLsizei bufSize,
4154 const void *pixels)
4155{
4156 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4157 pixels);
4158}
4159
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004160void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004161 GLint level,
4162 GLenum internalformat,
4163 GLsizei width,
4164 GLsizei height,
4165 GLint border,
4166 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004167 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004168{
Jamie Madillbc918e72018-03-08 09:47:21 -05004169 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004170
4171 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004172 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004173 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4174 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004175 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004176}
4177
Brandon Jones59770802018-04-02 13:18:42 -07004178void Context::compressedTexImage2DRobust(TextureTarget target,
4179 GLint level,
4180 GLenum internalformat,
4181 GLsizei width,
4182 GLsizei height,
4183 GLint border,
4184 GLsizei imageSize,
4185 GLsizei dataSize,
4186 const GLvoid *data)
4187{
4188 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4189}
4190
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004191void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004192 GLint level,
4193 GLenum internalformat,
4194 GLsizei width,
4195 GLsizei height,
4196 GLsizei depth,
4197 GLint border,
4198 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004199 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004200{
Jamie Madillbc918e72018-03-08 09:47:21 -05004201 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004202
4203 Extents size(width, height, depth);
4204 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004205 handleError(texture->setCompressedImage(
4206 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004207 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004208}
4209
Brandon Jones59770802018-04-02 13:18:42 -07004210void Context::compressedTexImage3DRobust(TextureType target,
4211 GLint level,
4212 GLenum internalformat,
4213 GLsizei width,
4214 GLsizei height,
4215 GLsizei depth,
4216 GLint border,
4217 GLsizei imageSize,
4218 GLsizei dataSize,
4219 const GLvoid *data)
4220{
4221 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4222 data);
4223}
4224
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004225void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004226 GLint level,
4227 GLint xoffset,
4228 GLint yoffset,
4229 GLsizei width,
4230 GLsizei height,
4231 GLenum format,
4232 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004233 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004234{
Jamie Madillbc918e72018-03-08 09:47:21 -05004235 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004236
4237 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004238 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004239 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4240 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004241 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004242}
4243
Brandon Jones59770802018-04-02 13:18:42 -07004244void Context::compressedTexSubImage2DRobust(TextureTarget target,
4245 GLint level,
4246 GLint xoffset,
4247 GLint yoffset,
4248 GLsizei width,
4249 GLsizei height,
4250 GLenum format,
4251 GLsizei imageSize,
4252 GLsizei dataSize,
4253 const GLvoid *data)
4254{
4255 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4256 data);
4257}
4258
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004259void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004260 GLint level,
4261 GLint xoffset,
4262 GLint yoffset,
4263 GLint zoffset,
4264 GLsizei width,
4265 GLsizei height,
4266 GLsizei depth,
4267 GLenum format,
4268 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004269 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004270{
4271 // Zero sized uploads are valid but no-ops
4272 if (width == 0 || height == 0)
4273 {
4274 return;
4275 }
4276
Jamie Madillbc918e72018-03-08 09:47:21 -05004277 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004278
4279 Box area(xoffset, yoffset, zoffset, width, height, depth);
4280 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004281 handleError(texture->setCompressedSubImage(
4282 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004283 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004284}
4285
Brandon Jones59770802018-04-02 13:18:42 -07004286void Context::compressedTexSubImage3DRobust(TextureType target,
4287 GLint level,
4288 GLint xoffset,
4289 GLint yoffset,
4290 GLint zoffset,
4291 GLsizei width,
4292 GLsizei height,
4293 GLsizei depth,
4294 GLenum format,
4295 GLsizei imageSize,
4296 GLsizei dataSize,
4297 const GLvoid *data)
4298{
4299 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4300 imageSize, data);
4301}
4302
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004303void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004304{
4305 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004306 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004307}
4308
Jamie Madill007530e2017-12-28 14:27:04 -05004309void Context::copyTexture(GLuint sourceId,
4310 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004311 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004312 GLuint destId,
4313 GLint destLevel,
4314 GLint internalFormat,
4315 GLenum destType,
4316 GLboolean unpackFlipY,
4317 GLboolean unpackPremultiplyAlpha,
4318 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004319{
Jamie Madillbc918e72018-03-08 09:47:21 -05004320 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004321
4322 gl::Texture *sourceTexture = getTexture(sourceId);
4323 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004324 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4325 sourceLevel, ConvertToBool(unpackFlipY),
4326 ConvertToBool(unpackPremultiplyAlpha),
4327 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004328}
4329
Jamie Madill007530e2017-12-28 14:27:04 -05004330void Context::copySubTexture(GLuint sourceId,
4331 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004332 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004333 GLuint destId,
4334 GLint destLevel,
4335 GLint xoffset,
4336 GLint yoffset,
4337 GLint x,
4338 GLint y,
4339 GLsizei width,
4340 GLsizei height,
4341 GLboolean unpackFlipY,
4342 GLboolean unpackPremultiplyAlpha,
4343 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004344{
4345 // Zero sized copies are valid but no-ops
4346 if (width == 0 || height == 0)
4347 {
4348 return;
4349 }
4350
Jamie Madillbc918e72018-03-08 09:47:21 -05004351 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004352
4353 gl::Texture *sourceTexture = getTexture(sourceId);
4354 gl::Texture *destTexture = getTexture(destId);
4355 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004356 Box box(x, y, 0, width, height, 1);
4357 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4358 ConvertToBool(unpackFlipY),
4359 ConvertToBool(unpackPremultiplyAlpha),
4360 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4361}
4362
4363void Context::copyTexture3D(GLuint sourceId,
4364 GLint sourceLevel,
4365 TextureTarget destTarget,
4366 GLuint destId,
4367 GLint destLevel,
4368 GLint internalFormat,
4369 GLenum destType,
4370 GLboolean unpackFlipY,
4371 GLboolean unpackPremultiplyAlpha,
4372 GLboolean unpackUnmultiplyAlpha)
4373{
4374 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4375
4376 Texture *sourceTexture = getTexture(sourceId);
4377 Texture *destTexture = getTexture(destId);
4378 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4379 sourceLevel, ConvertToBool(unpackFlipY),
4380 ConvertToBool(unpackPremultiplyAlpha),
4381 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4382}
4383
4384void Context::copySubTexture3D(GLuint sourceId,
4385 GLint sourceLevel,
4386 TextureTarget destTarget,
4387 GLuint destId,
4388 GLint destLevel,
4389 GLint xoffset,
4390 GLint yoffset,
4391 GLint zoffset,
4392 GLint x,
4393 GLint y,
4394 GLint z,
4395 GLsizei width,
4396 GLsizei height,
4397 GLsizei depth,
4398 GLboolean unpackFlipY,
4399 GLboolean unpackPremultiplyAlpha,
4400 GLboolean unpackUnmultiplyAlpha)
4401{
4402 // Zero sized copies are valid but no-ops
4403 if (width == 0 || height == 0 || depth == 0)
4404 {
4405 return;
4406 }
4407
4408 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4409
4410 Texture *sourceTexture = getTexture(sourceId);
4411 Texture *destTexture = getTexture(destId);
4412 Offset offset(xoffset, yoffset, zoffset);
4413 Box box(x, y, z, width, height, depth);
4414 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004415 ConvertToBool(unpackFlipY),
4416 ConvertToBool(unpackPremultiplyAlpha),
4417 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004418}
4419
Jamie Madill007530e2017-12-28 14:27:04 -05004420void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004421{
Jamie Madillbc918e72018-03-08 09:47:21 -05004422 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004423
4424 gl::Texture *sourceTexture = getTexture(sourceId);
4425 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004426 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004427}
4428
Corentin Wallez336129f2017-10-17 15:55:40 -04004429void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004430{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004431 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004432 ASSERT(buffer);
4433
Geoff Lang496c02d2016-10-20 11:38:11 -07004434 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004435}
4436
Brandon Jones59770802018-04-02 13:18:42 -07004437void Context::getBufferPointervRobust(BufferBinding target,
4438 GLenum pname,
4439 GLsizei bufSize,
4440 GLsizei *length,
4441 void **params)
4442{
4443 getBufferPointerv(target, pname, params);
4444}
4445
Corentin Wallez336129f2017-10-17 15:55:40 -04004446void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004447{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004448 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004449 ASSERT(buffer);
4450
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004451 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004452 if (error.isError())
4453 {
Jamie Madill437fa652016-05-03 15:13:24 -04004454 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004455 return nullptr;
4456 }
4457
4458 return buffer->getMapPointer();
4459}
4460
Corentin Wallez336129f2017-10-17 15:55:40 -04004461GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004462{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004463 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004464 ASSERT(buffer);
4465
4466 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004467 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004468 if (error.isError())
4469 {
Jamie Madill437fa652016-05-03 15:13:24 -04004470 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004471 return GL_FALSE;
4472 }
4473
4474 return result;
4475}
4476
Corentin Wallez336129f2017-10-17 15:55:40 -04004477void *Context::mapBufferRange(BufferBinding target,
4478 GLintptr offset,
4479 GLsizeiptr length,
4480 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004481{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004482 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004483 ASSERT(buffer);
4484
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004485 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004486 if (error.isError())
4487 {
Jamie Madill437fa652016-05-03 15:13:24 -04004488 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004489 return nullptr;
4490 }
4491
4492 return buffer->getMapPointer();
4493}
4494
Corentin Wallez336129f2017-10-17 15:55:40 -04004495void Context::flushMappedBufferRange(BufferBinding /*target*/,
4496 GLintptr /*offset*/,
4497 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004498{
4499 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4500}
4501
Jamie Madillbc918e72018-03-08 09:47:21 -05004502Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004503{
Geoff Langa8cb2872018-03-09 16:09:40 -05004504 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004505}
4506
Jamie Madillbc918e72018-03-08 09:47:21 -05004507Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004508{
Geoff Langa8cb2872018-03-09 16:09:40 -05004509 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004510}
4511
Jamie Madillbc918e72018-03-08 09:47:21 -05004512Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004513{
Geoff Langa8cb2872018-03-09 16:09:40 -05004514 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004515}
4516
Geoff Lang9bf86f02018-07-26 11:46:34 -04004517Error Context::syncStateForPathOperation()
4518{
4519 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4520
4521 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4522 ANGLE_TRY(syncDirtyBits());
4523
4524 return NoError();
4525}
4526
Jiajia Qin5451d532017-11-16 17:16:34 +08004527void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4528{
4529 UNIMPLEMENTED();
4530}
4531
Jamie Madillc20ab272016-06-09 07:20:46 -07004532void Context::activeTexture(GLenum texture)
4533{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004534 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004535}
4536
Jamie Madill876429b2017-04-20 15:46:24 -04004537void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004538{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004539 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004540}
4541
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004542void Context::blendEquation(GLenum mode)
4543{
4544 mGLState.setBlendEquation(mode, mode);
4545}
4546
Jamie Madillc20ab272016-06-09 07:20:46 -07004547void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4548{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004549 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004550}
4551
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004552void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4553{
4554 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4555}
4556
Jamie Madillc20ab272016-06-09 07:20:46 -07004557void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4558{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004559 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004560}
4561
Jamie Madill876429b2017-04-20 15:46:24 -04004562void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004563{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004564 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004565}
4566
Jamie Madill876429b2017-04-20 15:46:24 -04004567void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004568{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004569 mGLState.setDepthClearValue(clamp01(depth));
Jamie Madillc20ab272016-06-09 07:20:46 -07004570}
4571
4572void Context::clearStencil(GLint s)
4573{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004574 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004575}
4576
4577void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4578{
Geoff Lang92019432017-11-20 13:09:34 -05004579 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4580 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004581}
4582
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004583void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004584{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004585 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004586}
4587
4588void Context::depthFunc(GLenum func)
4589{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004590 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004591}
4592
4593void Context::depthMask(GLboolean flag)
4594{
Geoff Lang92019432017-11-20 13:09:34 -05004595 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004596}
4597
Jamie Madill876429b2017-04-20 15:46:24 -04004598void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004599{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004600 mGLState.setDepthRange(clamp01(zNear), clamp01(zFar));
Jamie Madillc20ab272016-06-09 07:20:46 -07004601}
4602
4603void Context::disable(GLenum cap)
4604{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004605 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004606 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004607}
4608
4609void Context::disableVertexAttribArray(GLuint index)
4610{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004611 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004612 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004613}
4614
4615void Context::enable(GLenum cap)
4616{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004617 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004618 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004619}
4620
4621void Context::enableVertexAttribArray(GLuint index)
4622{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004623 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004624 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004625}
4626
4627void Context::frontFace(GLenum mode)
4628{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004629 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004630}
4631
4632void Context::hint(GLenum target, GLenum mode)
4633{
4634 switch (target)
4635 {
4636 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004637 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004638 break;
4639
4640 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004641 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004642 break;
4643
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004644 case GL_PERSPECTIVE_CORRECTION_HINT:
4645 case GL_POINT_SMOOTH_HINT:
4646 case GL_LINE_SMOOTH_HINT:
4647 case GL_FOG_HINT:
4648 mGLState.gles1().setHint(target, mode);
4649 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004650 default:
4651 UNREACHABLE();
4652 return;
4653 }
4654}
4655
4656void Context::lineWidth(GLfloat width)
4657{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004658 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004659}
4660
4661void Context::pixelStorei(GLenum pname, GLint param)
4662{
4663 switch (pname)
4664 {
4665 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004666 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004667 break;
4668
4669 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004670 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004671 break;
4672
4673 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004674 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004675 break;
4676
4677 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004678 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004679 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004680 break;
4681
4682 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004683 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004684 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004685 break;
4686
4687 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004688 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004689 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004690 break;
4691
4692 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004693 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004694 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004695 break;
4696
4697 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004698 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004699 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004700 break;
4701
4702 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004703 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004704 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004705 break;
4706
4707 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004708 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004709 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004710 break;
4711
4712 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004713 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004714 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004715 break;
4716
4717 default:
4718 UNREACHABLE();
4719 return;
4720 }
4721}
4722
4723void Context::polygonOffset(GLfloat factor, GLfloat units)
4724{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004725 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004726}
4727
Jamie Madill876429b2017-04-20 15:46:24 -04004728void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004729{
Geoff Lang92019432017-11-20 13:09:34 -05004730 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004731}
4732
Jiawei Shaodb342272017-09-27 10:21:45 +08004733void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4734{
4735 mGLState.setSampleMaskParams(maskNumber, mask);
4736}
4737
Jamie Madillc20ab272016-06-09 07:20:46 -07004738void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4739{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004740 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004741}
4742
4743void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4744{
4745 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4746 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004747 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004748 }
4749
4750 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4751 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004752 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004753 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004754
4755 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004756}
4757
4758void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4759{
4760 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4761 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004762 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004763 }
4764
4765 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4766 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004767 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004768 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004769
4770 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004771}
4772
4773void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4774{
4775 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4776 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004777 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004778 }
4779
4780 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4781 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004782 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004783 }
4784}
4785
4786void Context::vertexAttrib1f(GLuint index, GLfloat x)
4787{
4788 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004789 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004790 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004791}
4792
4793void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4794{
4795 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004796 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004797 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004798}
4799
4800void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4801{
4802 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004803 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004804 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004805}
4806
4807void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4808{
4809 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004810 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004811 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004812}
4813
4814void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4815{
4816 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004817 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004818 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004819}
4820
4821void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4822{
4823 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004824 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004825 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004826}
4827
4828void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4829{
4830 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004831 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004832 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004833}
4834
4835void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4836{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004837 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004838 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004839}
4840
4841void Context::vertexAttribPointer(GLuint index,
4842 GLint size,
4843 GLenum type,
4844 GLboolean normalized,
4845 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004846 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004847{
Corentin Wallez336129f2017-10-17 15:55:40 -04004848 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004849 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004850 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004851}
4852
Shao80957d92017-02-20 21:25:59 +08004853void Context::vertexAttribFormat(GLuint attribIndex,
4854 GLint size,
4855 GLenum type,
4856 GLboolean normalized,
4857 GLuint relativeOffset)
4858{
Geoff Lang92019432017-11-20 13:09:34 -05004859 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004860 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004861 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004862}
4863
4864void Context::vertexAttribIFormat(GLuint attribIndex,
4865 GLint size,
4866 GLenum type,
4867 GLuint relativeOffset)
4868{
4869 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004870 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004871}
4872
4873void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4874{
Shaodde78e82017-05-22 14:13:27 +08004875 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004876 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004877}
4878
Jiajia Qin5451d532017-11-16 17:16:34 +08004879void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004880{
4881 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004882 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004883}
4884
Jamie Madillc20ab272016-06-09 07:20:46 -07004885void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4886{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004887 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004888}
4889
4890void Context::vertexAttribIPointer(GLuint index,
4891 GLint size,
4892 GLenum type,
4893 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004894 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004895{
Corentin Wallez336129f2017-10-17 15:55:40 -04004896 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4897 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004898 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004899}
4900
4901void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4902{
4903 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004904 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004905 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004906}
4907
4908void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4909{
4910 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004911 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004912 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004913}
4914
4915void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4916{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004917 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004918 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004919}
4920
4921void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4922{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004923 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004924 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004925}
4926
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004927void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4928{
4929 const VertexAttribCurrentValueData &currentValues =
4930 getGLState().getVertexAttribCurrentValue(index);
4931 const VertexArray *vao = getGLState().getVertexArray();
4932 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4933 currentValues, pname, params);
4934}
4935
Brandon Jones59770802018-04-02 13:18:42 -07004936void Context::getVertexAttribivRobust(GLuint index,
4937 GLenum pname,
4938 GLsizei bufSize,
4939 GLsizei *length,
4940 GLint *params)
4941{
4942 getVertexAttribiv(index, pname, params);
4943}
4944
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004945void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4946{
4947 const VertexAttribCurrentValueData &currentValues =
4948 getGLState().getVertexAttribCurrentValue(index);
4949 const VertexArray *vao = getGLState().getVertexArray();
4950 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4951 currentValues, pname, params);
4952}
4953
Brandon Jones59770802018-04-02 13:18:42 -07004954void Context::getVertexAttribfvRobust(GLuint index,
4955 GLenum pname,
4956 GLsizei bufSize,
4957 GLsizei *length,
4958 GLfloat *params)
4959{
4960 getVertexAttribfv(index, pname, params);
4961}
4962
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004963void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4964{
4965 const VertexAttribCurrentValueData &currentValues =
4966 getGLState().getVertexAttribCurrentValue(index);
4967 const VertexArray *vao = getGLState().getVertexArray();
4968 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4969 currentValues, pname, params);
4970}
4971
Brandon Jones59770802018-04-02 13:18:42 -07004972void Context::getVertexAttribIivRobust(GLuint index,
4973 GLenum pname,
4974 GLsizei bufSize,
4975 GLsizei *length,
4976 GLint *params)
4977{
4978 getVertexAttribIiv(index, pname, params);
4979}
4980
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004981void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4982{
4983 const VertexAttribCurrentValueData &currentValues =
4984 getGLState().getVertexAttribCurrentValue(index);
4985 const VertexArray *vao = getGLState().getVertexArray();
4986 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4987 currentValues, pname, params);
4988}
4989
Brandon Jones59770802018-04-02 13:18:42 -07004990void Context::getVertexAttribIuivRobust(GLuint index,
4991 GLenum pname,
4992 GLsizei bufSize,
4993 GLsizei *length,
4994 GLuint *params)
4995{
4996 getVertexAttribIuiv(index, pname, params);
4997}
4998
Jamie Madill876429b2017-04-20 15:46:24 -04004999void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005000{
5001 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
5002 QueryVertexAttribPointerv(attrib, pname, pointer);
5003}
5004
Brandon Jones59770802018-04-02 13:18:42 -07005005void Context::getVertexAttribPointervRobust(GLuint index,
5006 GLenum pname,
5007 GLsizei bufSize,
5008 GLsizei *length,
5009 void **pointer)
5010{
5011 getVertexAttribPointerv(index, pname, pointer);
5012}
5013
Jamie Madillc20ab272016-06-09 07:20:46 -07005014void Context::debugMessageControl(GLenum source,
5015 GLenum type,
5016 GLenum severity,
5017 GLsizei count,
5018 const GLuint *ids,
5019 GLboolean enabled)
5020{
5021 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005022 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05005023 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07005024}
5025
5026void Context::debugMessageInsert(GLenum source,
5027 GLenum type,
5028 GLuint id,
5029 GLenum severity,
5030 GLsizei length,
5031 const GLchar *buf)
5032{
5033 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005034 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005035}
5036
5037void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5038{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005039 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005040}
5041
5042GLuint Context::getDebugMessageLog(GLuint count,
5043 GLsizei bufSize,
5044 GLenum *sources,
5045 GLenum *types,
5046 GLuint *ids,
5047 GLenum *severities,
5048 GLsizei *lengths,
5049 GLchar *messageLog)
5050{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005051 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5052 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005053}
5054
5055void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5056{
5057 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005058 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005059 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005060}
5061
5062void Context::popDebugGroup()
5063{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005064 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005065 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005066}
5067
Corentin Wallez336129f2017-10-17 15:55:40 -04005068void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005069{
5070 Buffer *buffer = mGLState.getTargetBuffer(target);
5071 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005072 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005073}
5074
Corentin Wallez336129f2017-10-17 15:55:40 -04005075void Context::bufferSubData(BufferBinding target,
5076 GLintptr offset,
5077 GLsizeiptr size,
5078 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005079{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005080 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005081 {
5082 return;
5083 }
5084
5085 Buffer *buffer = mGLState.getTargetBuffer(target);
5086 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005087 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005088}
5089
Jamie Madillef300b12016-10-07 15:12:09 -04005090void Context::attachShader(GLuint program, GLuint shader)
5091{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005092 Program *programObject = mState.mShaderPrograms->getProgram(program);
5093 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005094 ASSERT(programObject && shaderObject);
5095 programObject->attachShader(shaderObject);
5096}
5097
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005098const Workarounds &Context::getWorkarounds() const
5099{
5100 return mWorkarounds;
5101}
5102
Corentin Wallez336129f2017-10-17 15:55:40 -04005103void Context::copyBufferSubData(BufferBinding readTarget,
5104 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005105 GLintptr readOffset,
5106 GLintptr writeOffset,
5107 GLsizeiptr size)
5108{
5109 // if size is zero, the copy is a successful no-op
5110 if (size == 0)
5111 {
5112 return;
5113 }
5114
5115 // TODO(jmadill): cache these.
5116 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5117 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5118
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005119 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005120}
5121
Jamie Madill01a80ee2016-11-07 12:06:18 -05005122void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5123{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005124 // Ideally we could share the program query with the validation layer if possible.
5125 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005126 ASSERT(programObject);
5127 programObject->bindAttributeLocation(index, name);
5128}
5129
Corentin Wallez336129f2017-10-17 15:55:40 -04005130void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005131{
Corentin Wallez336129f2017-10-17 15:55:40 -04005132 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5133 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005134 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005135}
5136
Corentin Wallez336129f2017-10-17 15:55:40 -04005137void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005138{
5139 bindBufferRange(target, index, buffer, 0, 0);
5140}
5141
Corentin Wallez336129f2017-10-17 15:55:40 -04005142void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005143 GLuint index,
5144 GLuint buffer,
5145 GLintptr offset,
5146 GLsizeiptr size)
5147{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005148 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5149 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5150 if (target == BufferBinding::Uniform)
5151 {
Jamie Madill472ddc82018-10-18 18:41:56 -04005152 mUniformBufferObserverBindings[index].bind(object);
Jamie Madilld84b6732018-09-06 15:54:35 -04005153 mStateCache.onUniformBufferStateChange(this);
5154 }
5155 else
5156 {
5157 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005158 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005159}
5160
Jamie Madill01a80ee2016-11-07 12:06:18 -05005161void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5162{
5163 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5164 {
5165 bindReadFramebuffer(framebuffer);
5166 }
5167
5168 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5169 {
5170 bindDrawFramebuffer(framebuffer);
5171 }
5172}
5173
5174void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5175{
5176 ASSERT(target == GL_RENDERBUFFER);
5177 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005178 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005179 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005180}
5181
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005182void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005183 GLsizei samples,
5184 GLenum internalformat,
5185 GLsizei width,
5186 GLsizei height,
5187 GLboolean fixedsamplelocations)
5188{
5189 Extents size(width, height, 1);
5190 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005191 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5192 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005193}
5194
Olli Etuaho89664842018-08-24 14:45:36 +03005195void Context::texStorage3DMultisample(TextureType target,
5196 GLsizei samples,
5197 GLenum internalformat,
5198 GLsizei width,
5199 GLsizei height,
5200 GLsizei depth,
5201 GLboolean fixedsamplelocations)
5202{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005203 Extents size(width, height, depth);
5204 Texture *texture = getTargetTexture(target);
5205 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5206 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005207}
5208
JiangYizhoubddc46b2016-12-09 09:50:51 +08005209void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5210{
JiangYizhou5b03f472017-01-09 10:22:53 +08005211 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5212 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005213 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005214 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005215
5216 switch (pname)
5217 {
5218 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005219 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005220 break;
5221 default:
5222 UNREACHABLE();
5223 }
5224}
5225
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005226void Context::getMultisamplefvRobust(GLenum pname,
5227 GLuint index,
5228 GLsizei bufSize,
5229 GLsizei *length,
5230 GLfloat *val)
5231{
5232 UNIMPLEMENTED();
5233}
5234
Jamie Madille8fb6402017-02-14 17:56:40 -05005235void Context::renderbufferStorage(GLenum target,
5236 GLenum internalformat,
5237 GLsizei width,
5238 GLsizei height)
5239{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005240 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5241 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5242
Jamie Madille8fb6402017-02-14 17:56:40 -05005243 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005244 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005245}
5246
5247void Context::renderbufferStorageMultisample(GLenum target,
5248 GLsizei samples,
5249 GLenum internalformat,
5250 GLsizei width,
5251 GLsizei height)
5252{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005253 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5254 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005255
5256 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005257 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005258 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005259}
5260
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005261void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5262{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005263 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005264 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005265}
5266
JiangYizhoue18e6392017-02-20 10:32:23 +08005267void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5268{
5269 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5270 QueryFramebufferParameteriv(framebuffer, pname, params);
5271}
5272
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005273void Context::getFramebufferParameterivRobust(GLenum target,
5274 GLenum pname,
5275 GLsizei bufSize,
5276 GLsizei *length,
5277 GLint *params)
5278{
5279 UNIMPLEMENTED();
5280}
5281
Jiajia Qin5451d532017-11-16 17:16:34 +08005282void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005283{
5284 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005285 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005286}
5287
Jamie Madilldec86232018-07-11 09:01:18 -04005288bool Context::getScratchBuffer(size_t requstedSizeBytes,
5289 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005290{
Jamie Madilldec86232018-07-11 09:01:18 -04005291 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005292}
5293
Jamie Madilldec86232018-07-11 09:01:18 -04005294bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5295 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005296{
Jamie Madilldec86232018-07-11 09:01:18 -04005297 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005298}
5299
Xinghua Cao10a4d432017-11-28 14:46:26 +08005300Error Context::prepareForDispatch()
5301{
Jamie Madill0cc11c62018-10-12 18:07:18 -04005302 ANGLE_TRY(syncDirtyObjects(mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005303
5304 if (isRobustResourceInitEnabled())
5305 {
5306 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5307 }
5308
Jamie Madill0cc11c62018-10-12 18:07:18 -04005309 return syncDirtyBits(mComputeDirtyBits);
Xinghua Cao10a4d432017-11-28 14:46:26 +08005310}
5311
Xinghua Cao2b396592017-03-29 15:36:04 +08005312void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5313{
5314 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5315 {
5316 return;
5317 }
5318
Xinghua Cao10a4d432017-11-28 14:46:26 +08005319 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005320 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005321}
5322
Jiajia Qin5451d532017-11-16 17:16:34 +08005323void Context::dispatchComputeIndirect(GLintptr indirect)
5324{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005325 ANGLE_CONTEXT_TRY(prepareForDispatch());
5326 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005327}
5328
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005329void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005330 GLsizei levels,
5331 GLenum internalFormat,
5332 GLsizei width,
5333 GLsizei height)
5334{
5335 Extents size(width, height, 1);
5336 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005337 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005338}
5339
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005340void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005341 GLsizei levels,
5342 GLenum internalFormat,
5343 GLsizei width,
5344 GLsizei height,
5345 GLsizei depth)
5346{
5347 Extents size(width, height, depth);
5348 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005349 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005350}
5351
Jiajia Qin5451d532017-11-16 17:16:34 +08005352void Context::memoryBarrier(GLbitfield barriers)
5353{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005354 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005355}
5356
5357void Context::memoryBarrierByRegion(GLbitfield barriers)
5358{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005359 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005360}
5361
Jamie Madillc1d770e2017-04-13 17:31:24 -04005362GLenum Context::checkFramebufferStatus(GLenum target)
5363{
5364 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5365 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005366 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005367}
5368
5369void Context::compileShader(GLuint shader)
5370{
5371 Shader *shaderObject = GetValidShader(this, shader);
5372 if (!shaderObject)
5373 {
5374 return;
5375 }
5376 shaderObject->compile(this);
5377}
5378
5379void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5380{
5381 for (int i = 0; i < n; i++)
5382 {
5383 deleteBuffer(buffers[i]);
5384 }
5385}
5386
5387void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5388{
5389 for (int i = 0; i < n; i++)
5390 {
5391 if (framebuffers[i] != 0)
5392 {
5393 deleteFramebuffer(framebuffers[i]);
5394 }
5395 }
5396}
5397
5398void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5399{
5400 for (int i = 0; i < n; i++)
5401 {
5402 deleteRenderbuffer(renderbuffers[i]);
5403 }
5404}
5405
5406void Context::deleteTextures(GLsizei n, const GLuint *textures)
5407{
5408 for (int i = 0; i < n; i++)
5409 {
5410 if (textures[i] != 0)
5411 {
5412 deleteTexture(textures[i]);
5413 }
5414 }
5415}
5416
5417void Context::detachShader(GLuint program, GLuint shader)
5418{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005419 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005420 ASSERT(programObject);
5421
5422 Shader *shaderObject = getShader(shader);
5423 ASSERT(shaderObject);
5424
5425 programObject->detachShader(this, shaderObject);
5426}
5427
5428void Context::genBuffers(GLsizei n, GLuint *buffers)
5429{
5430 for (int i = 0; i < n; i++)
5431 {
5432 buffers[i] = createBuffer();
5433 }
5434}
5435
5436void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5437{
5438 for (int i = 0; i < n; i++)
5439 {
5440 framebuffers[i] = createFramebuffer();
5441 }
5442}
5443
5444void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5445{
5446 for (int i = 0; i < n; i++)
5447 {
5448 renderbuffers[i] = createRenderbuffer();
5449 }
5450}
5451
5452void Context::genTextures(GLsizei n, GLuint *textures)
5453{
5454 for (int i = 0; i < n; i++)
5455 {
5456 textures[i] = createTexture();
5457 }
5458}
5459
5460void Context::getActiveAttrib(GLuint program,
5461 GLuint index,
5462 GLsizei bufsize,
5463 GLsizei *length,
5464 GLint *size,
5465 GLenum *type,
5466 GLchar *name)
5467{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005468 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005469 ASSERT(programObject);
5470 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5471}
5472
5473void Context::getActiveUniform(GLuint program,
5474 GLuint index,
5475 GLsizei bufsize,
5476 GLsizei *length,
5477 GLint *size,
5478 GLenum *type,
5479 GLchar *name)
5480{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005481 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005482 ASSERT(programObject);
5483 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5484}
5485
5486void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5487{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005488 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005489 ASSERT(programObject);
5490 programObject->getAttachedShaders(maxcount, count, shaders);
5491}
5492
5493GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5494{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005495 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005496 ASSERT(programObject);
5497 return programObject->getAttributeLocation(name);
5498}
5499
5500void Context::getBooleanv(GLenum pname, GLboolean *params)
5501{
5502 GLenum nativeType;
5503 unsigned int numParams = 0;
5504 getQueryParameterInfo(pname, &nativeType, &numParams);
5505
5506 if (nativeType == GL_BOOL)
5507 {
5508 getBooleanvImpl(pname, params);
5509 }
5510 else
5511 {
5512 CastStateValues(this, nativeType, pname, numParams, params);
5513 }
5514}
5515
Brandon Jones59770802018-04-02 13:18:42 -07005516void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5517{
5518 getBooleanv(pname, params);
5519}
5520
Jamie Madillc1d770e2017-04-13 17:31:24 -04005521void Context::getFloatv(GLenum pname, GLfloat *params)
5522{
5523 GLenum nativeType;
5524 unsigned int numParams = 0;
5525 getQueryParameterInfo(pname, &nativeType, &numParams);
5526
5527 if (nativeType == GL_FLOAT)
5528 {
5529 getFloatvImpl(pname, params);
5530 }
5531 else
5532 {
5533 CastStateValues(this, nativeType, pname, numParams, params);
5534 }
5535}
5536
Brandon Jones59770802018-04-02 13:18:42 -07005537void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5538{
5539 getFloatv(pname, params);
5540}
5541
Jamie Madillc1d770e2017-04-13 17:31:24 -04005542void Context::getIntegerv(GLenum pname, GLint *params)
5543{
5544 GLenum nativeType;
5545 unsigned int numParams = 0;
5546 getQueryParameterInfo(pname, &nativeType, &numParams);
5547
5548 if (nativeType == GL_INT)
5549 {
5550 getIntegervImpl(pname, params);
5551 }
5552 else
5553 {
5554 CastStateValues(this, nativeType, pname, numParams, params);
5555 }
5556}
5557
Brandon Jones59770802018-04-02 13:18:42 -07005558void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5559{
5560 getIntegerv(pname, data);
5561}
5562
Jamie Madillc1d770e2017-04-13 17:31:24 -04005563void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5564{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005565 // Don't resolve link if checking the link completion status.
5566 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5567 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005568 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005569 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005570}
5571
Brandon Jones59770802018-04-02 13:18:42 -07005572void Context::getProgramivRobust(GLuint program,
5573 GLenum pname,
5574 GLsizei bufSize,
5575 GLsizei *length,
5576 GLint *params)
5577{
5578 getProgramiv(program, pname, params);
5579}
5580
Jiajia Qin5451d532017-11-16 17:16:34 +08005581void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5582{
5583 UNIMPLEMENTED();
5584}
5585
Jamie Madillbe849e42017-05-02 15:49:00 -04005586void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005587{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005588 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005589 ASSERT(programObject);
5590 programObject->getInfoLog(bufsize, length, infolog);
5591}
5592
Jiajia Qin5451d532017-11-16 17:16:34 +08005593void Context::getProgramPipelineInfoLog(GLuint pipeline,
5594 GLsizei bufSize,
5595 GLsizei *length,
5596 GLchar *infoLog)
5597{
5598 UNIMPLEMENTED();
5599}
5600
Jamie Madillc1d770e2017-04-13 17:31:24 -04005601void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5602{
5603 Shader *shaderObject = getShader(shader);
5604 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005605 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005606}
5607
Brandon Jones59770802018-04-02 13:18:42 -07005608void Context::getShaderivRobust(GLuint shader,
5609 GLenum pname,
5610 GLsizei bufSize,
5611 GLsizei *length,
5612 GLint *params)
5613{
5614 getShaderiv(shader, pname, params);
5615}
5616
Jamie Madillc1d770e2017-04-13 17:31:24 -04005617void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5618{
5619 Shader *shaderObject = getShader(shader);
5620 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005621 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005622}
5623
5624void Context::getShaderPrecisionFormat(GLenum shadertype,
5625 GLenum precisiontype,
5626 GLint *range,
5627 GLint *precision)
5628{
5629 // TODO(jmadill): Compute shaders.
5630
5631 switch (shadertype)
5632 {
5633 case GL_VERTEX_SHADER:
5634 switch (precisiontype)
5635 {
5636 case GL_LOW_FLOAT:
5637 mCaps.vertexLowpFloat.get(range, precision);
5638 break;
5639 case GL_MEDIUM_FLOAT:
5640 mCaps.vertexMediumpFloat.get(range, precision);
5641 break;
5642 case GL_HIGH_FLOAT:
5643 mCaps.vertexHighpFloat.get(range, precision);
5644 break;
5645
5646 case GL_LOW_INT:
5647 mCaps.vertexLowpInt.get(range, precision);
5648 break;
5649 case GL_MEDIUM_INT:
5650 mCaps.vertexMediumpInt.get(range, precision);
5651 break;
5652 case GL_HIGH_INT:
5653 mCaps.vertexHighpInt.get(range, precision);
5654 break;
5655
5656 default:
5657 UNREACHABLE();
5658 return;
5659 }
5660 break;
5661
5662 case GL_FRAGMENT_SHADER:
5663 switch (precisiontype)
5664 {
5665 case GL_LOW_FLOAT:
5666 mCaps.fragmentLowpFloat.get(range, precision);
5667 break;
5668 case GL_MEDIUM_FLOAT:
5669 mCaps.fragmentMediumpFloat.get(range, precision);
5670 break;
5671 case GL_HIGH_FLOAT:
5672 mCaps.fragmentHighpFloat.get(range, precision);
5673 break;
5674
5675 case GL_LOW_INT:
5676 mCaps.fragmentLowpInt.get(range, precision);
5677 break;
5678 case GL_MEDIUM_INT:
5679 mCaps.fragmentMediumpInt.get(range, precision);
5680 break;
5681 case GL_HIGH_INT:
5682 mCaps.fragmentHighpInt.get(range, precision);
5683 break;
5684
5685 default:
5686 UNREACHABLE();
5687 return;
5688 }
5689 break;
5690
5691 default:
5692 UNREACHABLE();
5693 return;
5694 }
5695}
5696
5697void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5698{
5699 Shader *shaderObject = getShader(shader);
5700 ASSERT(shaderObject);
5701 shaderObject->getSource(bufsize, length, source);
5702}
5703
5704void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5705{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005706 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005707 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005708 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005709}
5710
Brandon Jones59770802018-04-02 13:18:42 -07005711void Context::getUniformfvRobust(GLuint program,
5712 GLint location,
5713 GLsizei bufSize,
5714 GLsizei *length,
5715 GLfloat *params)
5716{
5717 getUniformfv(program, location, params);
5718}
5719
Jamie Madillc1d770e2017-04-13 17:31:24 -04005720void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5721{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005722 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005723 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005724 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005725}
5726
Brandon Jones59770802018-04-02 13:18:42 -07005727void Context::getUniformivRobust(GLuint program,
5728 GLint location,
5729 GLsizei bufSize,
5730 GLsizei *length,
5731 GLint *params)
5732{
5733 getUniformiv(program, location, params);
5734}
5735
Jamie Madillc1d770e2017-04-13 17:31:24 -04005736GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5737{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005738 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005739 ASSERT(programObject);
5740 return programObject->getUniformLocation(name);
5741}
5742
5743GLboolean Context::isBuffer(GLuint buffer)
5744{
5745 if (buffer == 0)
5746 {
5747 return GL_FALSE;
5748 }
5749
5750 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5751}
5752
5753GLboolean Context::isEnabled(GLenum cap)
5754{
5755 return mGLState.getEnableFeature(cap);
5756}
5757
5758GLboolean Context::isFramebuffer(GLuint framebuffer)
5759{
5760 if (framebuffer == 0)
5761 {
5762 return GL_FALSE;
5763 }
5764
5765 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5766}
5767
5768GLboolean Context::isProgram(GLuint program)
5769{
5770 if (program == 0)
5771 {
5772 return GL_FALSE;
5773 }
5774
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005775 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005776}
5777
5778GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5779{
5780 if (renderbuffer == 0)
5781 {
5782 return GL_FALSE;
5783 }
5784
5785 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5786}
5787
5788GLboolean Context::isShader(GLuint shader)
5789{
5790 if (shader == 0)
5791 {
5792 return GL_FALSE;
5793 }
5794
5795 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5796}
5797
5798GLboolean Context::isTexture(GLuint texture)
5799{
5800 if (texture == 0)
5801 {
5802 return GL_FALSE;
5803 }
5804
5805 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5806}
5807
5808void Context::linkProgram(GLuint program)
5809{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005810 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005811 ASSERT(programObject);
5812 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08005813
5814 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
5815 // don't need to worry that:
5816 // 1. Draw calls after link use the new executable code or the old one depending on the link
5817 // result.
5818 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
5819 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
5820 // ProgramD3D.
5821 if (programObject->isInUse())
5822 {
Jamie Madill785e8a02018-10-04 17:42:00 -04005823 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04005824 if (programObject->isLinked())
5825 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04005826 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04005827 }
jchen107ae70d82018-07-06 13:47:01 +08005828 mStateCache.onProgramExecutableChange(this);
5829 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005830}
5831
5832void Context::releaseShaderCompiler()
5833{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005834 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005835}
5836
5837void Context::shaderBinary(GLsizei n,
5838 const GLuint *shaders,
5839 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005840 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005841 GLsizei length)
5842{
5843 // No binary shader formats are supported.
5844 UNIMPLEMENTED();
5845}
5846
Olli Etuaho0ca09752018-09-24 11:00:50 +03005847void Context::bindFragDataLocationIndexed(GLuint program,
5848 GLuint colorNumber,
5849 GLuint index,
5850 const char *name)
5851{
5852 Program *programObject = getProgramNoResolveLink(program);
5853 programObject->bindFragmentOutputLocation(colorNumber, name);
5854 programObject->bindFragmentOutputIndex(index, name);
5855}
5856
5857void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
5858{
5859 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
5860}
5861
5862int Context::getFragDataIndex(GLuint program, const char *name)
5863{
5864 Program *programObject = getProgramResolveLink(program);
5865 return programObject->getFragDataIndex(name);
5866}
5867
5868int Context::getProgramResourceLocationIndex(GLuint program,
5869 GLenum programInterface,
5870 const char *name)
5871{
5872 Program *programObject = getProgramResolveLink(program);
5873 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
5874 return programObject->getFragDataIndex(name);
5875}
5876
Jamie Madillc1d770e2017-04-13 17:31:24 -04005877void Context::shaderSource(GLuint shader,
5878 GLsizei count,
5879 const GLchar *const *string,
5880 const GLint *length)
5881{
5882 Shader *shaderObject = getShader(shader);
5883 ASSERT(shaderObject);
5884 shaderObject->setSource(count, string, length);
5885}
5886
5887void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5888{
5889 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5890}
5891
5892void Context::stencilMask(GLuint mask)
5893{
5894 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5895}
5896
5897void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5898{
5899 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5900}
5901
5902void Context::uniform1f(GLint location, GLfloat x)
5903{
5904 Program *program = mGLState.getProgram();
5905 program->setUniform1fv(location, 1, &x);
5906}
5907
5908void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5909{
5910 Program *program = mGLState.getProgram();
5911 program->setUniform1fv(location, count, v);
5912}
5913
Jamie Madill7e4eff12018-08-08 15:49:26 -04005914void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005915{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005916 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04005917 {
5918 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04005919 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04005920 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005921}
5922
Jamie Madill7e4eff12018-08-08 15:49:26 -04005923void Context::uniform1i(GLint location, GLint x)
5924{
5925 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
5926}
5927
Jamie Madillc1d770e2017-04-13 17:31:24 -04005928void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5929{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005930 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005931}
5932
5933void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5934{
5935 GLfloat xy[2] = {x, y};
5936 Program *program = mGLState.getProgram();
5937 program->setUniform2fv(location, 1, xy);
5938}
5939
5940void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5941{
5942 Program *program = mGLState.getProgram();
5943 program->setUniform2fv(location, count, v);
5944}
5945
5946void Context::uniform2i(GLint location, GLint x, GLint y)
5947{
5948 GLint xy[2] = {x, y};
5949 Program *program = mGLState.getProgram();
5950 program->setUniform2iv(location, 1, xy);
5951}
5952
5953void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
5954{
5955 Program *program = mGLState.getProgram();
5956 program->setUniform2iv(location, count, v);
5957}
5958
5959void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5960{
5961 GLfloat xyz[3] = {x, y, z};
5962 Program *program = mGLState.getProgram();
5963 program->setUniform3fv(location, 1, xyz);
5964}
5965
5966void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
5967{
5968 Program *program = mGLState.getProgram();
5969 program->setUniform3fv(location, count, v);
5970}
5971
5972void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
5973{
5974 GLint xyz[3] = {x, y, z};
5975 Program *program = mGLState.getProgram();
5976 program->setUniform3iv(location, 1, xyz);
5977}
5978
5979void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
5980{
5981 Program *program = mGLState.getProgram();
5982 program->setUniform3iv(location, count, v);
5983}
5984
5985void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5986{
5987 GLfloat xyzw[4] = {x, y, z, w};
5988 Program *program = mGLState.getProgram();
5989 program->setUniform4fv(location, 1, xyzw);
5990}
5991
5992void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
5993{
5994 Program *program = mGLState.getProgram();
5995 program->setUniform4fv(location, count, v);
5996}
5997
5998void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5999{
6000 GLint xyzw[4] = {x, y, z, w};
6001 Program *program = mGLState.getProgram();
6002 program->setUniform4iv(location, 1, xyzw);
6003}
6004
6005void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
6006{
6007 Program *program = mGLState.getProgram();
6008 program->setUniform4iv(location, count, v);
6009}
6010
6011void Context::uniformMatrix2fv(GLint location,
6012 GLsizei count,
6013 GLboolean transpose,
6014 const GLfloat *value)
6015{
6016 Program *program = mGLState.getProgram();
6017 program->setUniformMatrix2fv(location, count, transpose, value);
6018}
6019
6020void Context::uniformMatrix3fv(GLint location,
6021 GLsizei count,
6022 GLboolean transpose,
6023 const GLfloat *value)
6024{
6025 Program *program = mGLState.getProgram();
6026 program->setUniformMatrix3fv(location, count, transpose, value);
6027}
6028
6029void Context::uniformMatrix4fv(GLint location,
6030 GLsizei count,
6031 GLboolean transpose,
6032 const GLfloat *value)
6033{
6034 Program *program = mGLState.getProgram();
6035 program->setUniformMatrix4fv(location, count, transpose, value);
6036}
6037
6038void Context::validateProgram(GLuint program)
6039{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006040 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006041 ASSERT(programObject);
6042 programObject->validate(mCaps);
6043}
6044
Jiajia Qin5451d532017-11-16 17:16:34 +08006045void Context::validateProgramPipeline(GLuint pipeline)
6046{
6047 UNIMPLEMENTED();
6048}
6049
Jamie Madilld04908b2017-06-09 14:15:35 -04006050void Context::getProgramBinary(GLuint program,
6051 GLsizei bufSize,
6052 GLsizei *length,
6053 GLenum *binaryFormat,
6054 void *binary)
6055{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006056 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006057 ASSERT(programObject != nullptr);
6058
6059 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
6060}
6061
6062void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6063{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006064 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006065 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006066
Jamie Madilld04908b2017-06-09 14:15:35 -04006067 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006068 if (programObject->isInUse())
6069 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006070 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006071 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006072 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006073}
6074
Jamie Madillff325f12017-08-26 15:06:05 -04006075void Context::uniform1ui(GLint location, GLuint v0)
6076{
6077 Program *program = mGLState.getProgram();
6078 program->setUniform1uiv(location, 1, &v0);
6079}
6080
6081void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6082{
6083 Program *program = mGLState.getProgram();
6084 const GLuint xy[] = {v0, v1};
6085 program->setUniform2uiv(location, 1, xy);
6086}
6087
6088void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6089{
6090 Program *program = mGLState.getProgram();
6091 const GLuint xyz[] = {v0, v1, v2};
6092 program->setUniform3uiv(location, 1, xyz);
6093}
6094
6095void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6096{
6097 Program *program = mGLState.getProgram();
6098 const GLuint xyzw[] = {v0, v1, v2, v3};
6099 program->setUniform4uiv(location, 1, xyzw);
6100}
6101
6102void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6103{
6104 Program *program = mGLState.getProgram();
6105 program->setUniform1uiv(location, count, value);
6106}
6107void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6108{
6109 Program *program = mGLState.getProgram();
6110 program->setUniform2uiv(location, count, value);
6111}
6112
6113void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6114{
6115 Program *program = mGLState.getProgram();
6116 program->setUniform3uiv(location, count, value);
6117}
6118
6119void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6120{
6121 Program *program = mGLState.getProgram();
6122 program->setUniform4uiv(location, count, value);
6123}
6124
Jamie Madillf0e04492017-08-26 15:28:42 -04006125void Context::genQueries(GLsizei n, GLuint *ids)
6126{
6127 for (GLsizei i = 0; i < n; i++)
6128 {
6129 GLuint handle = mQueryHandleAllocator.allocate();
6130 mQueryMap.assign(handle, nullptr);
6131 ids[i] = handle;
6132 }
6133}
6134
6135void Context::deleteQueries(GLsizei n, const GLuint *ids)
6136{
6137 for (int i = 0; i < n; i++)
6138 {
6139 GLuint query = ids[i];
6140
6141 Query *queryObject = nullptr;
6142 if (mQueryMap.erase(query, &queryObject))
6143 {
6144 mQueryHandleAllocator.release(query);
6145 if (queryObject)
6146 {
6147 queryObject->release(this);
6148 }
6149 }
6150 }
6151}
6152
6153GLboolean Context::isQuery(GLuint id)
6154{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006155 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006156}
6157
Jamie Madillc8c95812017-08-26 18:40:09 -04006158void Context::uniformMatrix2x3fv(GLint location,
6159 GLsizei count,
6160 GLboolean transpose,
6161 const GLfloat *value)
6162{
6163 Program *program = mGLState.getProgram();
6164 program->setUniformMatrix2x3fv(location, count, transpose, value);
6165}
6166
6167void Context::uniformMatrix3x2fv(GLint location,
6168 GLsizei count,
6169 GLboolean transpose,
6170 const GLfloat *value)
6171{
6172 Program *program = mGLState.getProgram();
6173 program->setUniformMatrix3x2fv(location, count, transpose, value);
6174}
6175
6176void Context::uniformMatrix2x4fv(GLint location,
6177 GLsizei count,
6178 GLboolean transpose,
6179 const GLfloat *value)
6180{
6181 Program *program = mGLState.getProgram();
6182 program->setUniformMatrix2x4fv(location, count, transpose, value);
6183}
6184
6185void Context::uniformMatrix4x2fv(GLint location,
6186 GLsizei count,
6187 GLboolean transpose,
6188 const GLfloat *value)
6189{
6190 Program *program = mGLState.getProgram();
6191 program->setUniformMatrix4x2fv(location, count, transpose, value);
6192}
6193
6194void Context::uniformMatrix3x4fv(GLint location,
6195 GLsizei count,
6196 GLboolean transpose,
6197 const GLfloat *value)
6198{
6199 Program *program = mGLState.getProgram();
6200 program->setUniformMatrix3x4fv(location, count, transpose, value);
6201}
6202
6203void Context::uniformMatrix4x3fv(GLint location,
6204 GLsizei count,
6205 GLboolean transpose,
6206 const GLfloat *value)
6207{
6208 Program *program = mGLState.getProgram();
6209 program->setUniformMatrix4x3fv(location, count, transpose, value);
6210}
6211
Jamie Madilld7576732017-08-26 18:49:50 -04006212void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6213{
6214 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6215 {
6216 GLuint vertexArray = arrays[arrayIndex];
6217
6218 if (arrays[arrayIndex] != 0)
6219 {
6220 VertexArray *vertexArrayObject = nullptr;
6221 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6222 {
6223 if (vertexArrayObject != nullptr)
6224 {
6225 detachVertexArray(vertexArray);
6226 vertexArrayObject->onDestroy(this);
6227 }
6228
6229 mVertexArrayHandleAllocator.release(vertexArray);
6230 }
6231 }
6232 }
6233}
6234
6235void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6236{
6237 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6238 {
6239 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6240 mVertexArrayMap.assign(vertexArray, nullptr);
6241 arrays[arrayIndex] = vertexArray;
6242 }
6243}
6244
6245bool Context::isVertexArray(GLuint array)
6246{
6247 if (array == 0)
6248 {
6249 return GL_FALSE;
6250 }
6251
6252 VertexArray *vao = getVertexArray(array);
6253 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6254}
6255
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006256void Context::endTransformFeedback()
6257{
6258 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6259 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006260 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006261}
6262
6263void Context::transformFeedbackVaryings(GLuint program,
6264 GLsizei count,
6265 const GLchar *const *varyings,
6266 GLenum bufferMode)
6267{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006268 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006269 ASSERT(programObject);
6270 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6271}
6272
6273void Context::getTransformFeedbackVarying(GLuint program,
6274 GLuint index,
6275 GLsizei bufSize,
6276 GLsizei *length,
6277 GLsizei *size,
6278 GLenum *type,
6279 GLchar *name)
6280{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006281 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006282 ASSERT(programObject);
6283 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6284}
6285
6286void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6287{
6288 for (int i = 0; i < n; i++)
6289 {
6290 GLuint transformFeedback = ids[i];
6291 if (transformFeedback == 0)
6292 {
6293 continue;
6294 }
6295
6296 TransformFeedback *transformFeedbackObject = nullptr;
6297 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6298 {
6299 if (transformFeedbackObject != nullptr)
6300 {
6301 detachTransformFeedback(transformFeedback);
6302 transformFeedbackObject->release(this);
6303 }
6304
6305 mTransformFeedbackHandleAllocator.release(transformFeedback);
6306 }
6307 }
6308}
6309
6310void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6311{
6312 for (int i = 0; i < n; i++)
6313 {
6314 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6315 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6316 ids[i] = transformFeedback;
6317 }
6318}
6319
6320bool Context::isTransformFeedback(GLuint id)
6321{
6322 if (id == 0)
6323 {
6324 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6325 // returns FALSE
6326 return GL_FALSE;
6327 }
6328
6329 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6330 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6331}
6332
6333void Context::pauseTransformFeedback()
6334{
6335 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6336 transformFeedback->pause();
6337}
6338
6339void Context::resumeTransformFeedback()
6340{
6341 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6342 transformFeedback->resume();
6343}
6344
Jamie Madill12e957f2017-08-26 21:42:26 -04006345void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6346{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006347 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006348 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006349}
6350
Brandon Jones59770802018-04-02 13:18:42 -07006351void Context::getUniformuivRobust(GLuint program,
6352 GLint location,
6353 GLsizei bufSize,
6354 GLsizei *length,
6355 GLuint *params)
6356{
6357 getUniformuiv(program, location, params);
6358}
6359
Jamie Madill12e957f2017-08-26 21:42:26 -04006360GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6361{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006362 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006363 return programObject->getFragDataLocation(name);
6364}
6365
6366void Context::getUniformIndices(GLuint program,
6367 GLsizei uniformCount,
6368 const GLchar *const *uniformNames,
6369 GLuint *uniformIndices)
6370{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006371 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006372 if (!programObject->isLinked())
6373 {
6374 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6375 {
6376 uniformIndices[uniformId] = GL_INVALID_INDEX;
6377 }
6378 }
6379 else
6380 {
6381 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6382 {
6383 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6384 }
6385 }
6386}
6387
6388void Context::getActiveUniformsiv(GLuint program,
6389 GLsizei uniformCount,
6390 const GLuint *uniformIndices,
6391 GLenum pname,
6392 GLint *params)
6393{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006394 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006395 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6396 {
6397 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006398 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006399 }
6400}
6401
6402GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6403{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006404 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006405 return programObject->getUniformBlockIndex(uniformBlockName);
6406}
6407
6408void Context::getActiveUniformBlockiv(GLuint program,
6409 GLuint uniformBlockIndex,
6410 GLenum pname,
6411 GLint *params)
6412{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006413 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006414 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6415}
6416
Brandon Jones59770802018-04-02 13:18:42 -07006417void Context::getActiveUniformBlockivRobust(GLuint program,
6418 GLuint uniformBlockIndex,
6419 GLenum pname,
6420 GLsizei bufSize,
6421 GLsizei *length,
6422 GLint *params)
6423{
6424 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6425}
6426
Jamie Madill12e957f2017-08-26 21:42:26 -04006427void Context::getActiveUniformBlockName(GLuint program,
6428 GLuint uniformBlockIndex,
6429 GLsizei bufSize,
6430 GLsizei *length,
6431 GLchar *uniformBlockName)
6432{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006433 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006434 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6435}
6436
6437void Context::uniformBlockBinding(GLuint program,
6438 GLuint uniformBlockIndex,
6439 GLuint uniformBlockBinding)
6440{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006441 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006442 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006443
Jamie Madill956ab4d2018-10-10 16:13:03 -04006444 // Note: If the Program is shared between Contexts we would be better using Observer/Subject.
Jamie Madill70aeda42018-08-20 12:17:40 -04006445 if (programObject->isInUse())
6446 {
6447 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006448 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006449 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006450}
6451
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006452GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6453{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006454 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6455 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006456
Jamie Madill70b5bb02017-08-28 13:32:37 -04006457 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006458 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006459 if (error.isError())
6460 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006461 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006462 handleError(error);
6463 return nullptr;
6464 }
6465
Jamie Madill70b5bb02017-08-28 13:32:37 -04006466 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006467}
6468
6469GLboolean Context::isSync(GLsync sync)
6470{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006471 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006472}
6473
6474GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6475{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006476 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006477
6478 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006479 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006480 return result;
6481}
6482
6483void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6484{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006485 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006486 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006487}
6488
6489void Context::getInteger64v(GLenum pname, GLint64 *params)
6490{
6491 GLenum nativeType = GL_NONE;
6492 unsigned int numParams = 0;
6493 getQueryParameterInfo(pname, &nativeType, &numParams);
6494
6495 if (nativeType == GL_INT_64_ANGLEX)
6496 {
6497 getInteger64vImpl(pname, params);
6498 }
6499 else
6500 {
6501 CastStateValues(this, nativeType, pname, numParams, params);
6502 }
6503}
6504
Brandon Jones59770802018-04-02 13:18:42 -07006505void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6506{
6507 getInteger64v(pname, data);
6508}
6509
Corentin Wallez336129f2017-10-17 15:55:40 -04006510void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006511{
6512 Buffer *buffer = mGLState.getTargetBuffer(target);
6513 QueryBufferParameteri64v(buffer, pname, params);
6514}
6515
Brandon Jones59770802018-04-02 13:18:42 -07006516void Context::getBufferParameteri64vRobust(BufferBinding target,
6517 GLenum pname,
6518 GLsizei bufSize,
6519 GLsizei *length,
6520 GLint64 *params)
6521{
6522 getBufferParameteri64v(target, pname, params);
6523}
6524
Jamie Madill3ef140a2017-08-26 23:11:21 -04006525void Context::genSamplers(GLsizei count, GLuint *samplers)
6526{
6527 for (int i = 0; i < count; i++)
6528 {
6529 samplers[i] = mState.mSamplers->createSampler();
6530 }
6531}
6532
6533void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6534{
6535 for (int i = 0; i < count; i++)
6536 {
6537 GLuint sampler = samplers[i];
6538
6539 if (mState.mSamplers->getSampler(sampler))
6540 {
6541 detachSampler(sampler);
6542 }
6543
6544 mState.mSamplers->deleteObject(this, sampler);
6545 }
6546}
6547
6548void Context::getInternalformativ(GLenum target,
6549 GLenum internalformat,
6550 GLenum pname,
6551 GLsizei bufSize,
6552 GLint *params)
6553{
6554 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6555 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6556}
6557
Brandon Jones59770802018-04-02 13:18:42 -07006558void Context::getInternalformativRobust(GLenum target,
6559 GLenum internalformat,
6560 GLenum pname,
6561 GLsizei bufSize,
6562 GLsizei *length,
6563 GLint *params)
6564{
6565 getInternalformativ(target, internalformat, pname, bufSize, params);
6566}
6567
Jiajia Qin5451d532017-11-16 17:16:34 +08006568void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6569{
6570 programUniform1iv(program, location, 1, &v0);
6571}
6572
6573void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6574{
6575 GLint xy[2] = {v0, v1};
6576 programUniform2iv(program, location, 1, xy);
6577}
6578
6579void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6580{
6581 GLint xyz[3] = {v0, v1, v2};
6582 programUniform3iv(program, location, 1, xyz);
6583}
6584
6585void Context::programUniform4i(GLuint program,
6586 GLint location,
6587 GLint v0,
6588 GLint v1,
6589 GLint v2,
6590 GLint v3)
6591{
6592 GLint xyzw[4] = {v0, v1, v2, v3};
6593 programUniform4iv(program, location, 1, xyzw);
6594}
6595
6596void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6597{
6598 programUniform1uiv(program, location, 1, &v0);
6599}
6600
6601void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6602{
6603 GLuint xy[2] = {v0, v1};
6604 programUniform2uiv(program, location, 1, xy);
6605}
6606
6607void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6608{
6609 GLuint xyz[3] = {v0, v1, v2};
6610 programUniform3uiv(program, location, 1, xyz);
6611}
6612
6613void Context::programUniform4ui(GLuint program,
6614 GLint location,
6615 GLuint v0,
6616 GLuint v1,
6617 GLuint v2,
6618 GLuint v3)
6619{
6620 GLuint xyzw[4] = {v0, v1, v2, v3};
6621 programUniform4uiv(program, location, 1, xyzw);
6622}
6623
6624void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6625{
6626 programUniform1fv(program, location, 1, &v0);
6627}
6628
6629void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6630{
6631 GLfloat xy[2] = {v0, v1};
6632 programUniform2fv(program, location, 1, xy);
6633}
6634
6635void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6636{
6637 GLfloat xyz[3] = {v0, v1, v2};
6638 programUniform3fv(program, location, 1, xyz);
6639}
6640
6641void Context::programUniform4f(GLuint program,
6642 GLint location,
6643 GLfloat v0,
6644 GLfloat v1,
6645 GLfloat v2,
6646 GLfloat v3)
6647{
6648 GLfloat xyzw[4] = {v0, v1, v2, v3};
6649 programUniform4fv(program, location, 1, xyzw);
6650}
6651
Jamie Madill81c2e252017-09-09 23:32:46 -04006652void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6653{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006654 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006655 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006656 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006657}
6658
Jiajia Qin5451d532017-11-16 17:16:34 +08006659void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6660{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006661 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006662 ASSERT(programObject);
6663 programObject->setUniform2iv(location, count, value);
6664}
6665
6666void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6667{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006668 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006669 ASSERT(programObject);
6670 programObject->setUniform3iv(location, count, value);
6671}
6672
6673void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6674{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006675 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006676 ASSERT(programObject);
6677 programObject->setUniform4iv(location, count, value);
6678}
6679
6680void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6681{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006682 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006683 ASSERT(programObject);
6684 programObject->setUniform1uiv(location, count, value);
6685}
6686
6687void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6688{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006689 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006690 ASSERT(programObject);
6691 programObject->setUniform2uiv(location, count, value);
6692}
6693
6694void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6695{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006696 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006697 ASSERT(programObject);
6698 programObject->setUniform3uiv(location, count, value);
6699}
6700
6701void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6702{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006703 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006704 ASSERT(programObject);
6705 programObject->setUniform4uiv(location, count, value);
6706}
6707
6708void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6709{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006710 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006711 ASSERT(programObject);
6712 programObject->setUniform1fv(location, count, value);
6713}
6714
6715void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6716{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006717 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006718 ASSERT(programObject);
6719 programObject->setUniform2fv(location, count, value);
6720}
6721
6722void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6723{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006724 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006725 ASSERT(programObject);
6726 programObject->setUniform3fv(location, count, value);
6727}
6728
6729void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6730{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006731 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006732 ASSERT(programObject);
6733 programObject->setUniform4fv(location, count, value);
6734}
6735
6736void Context::programUniformMatrix2fv(GLuint program,
6737 GLint location,
6738 GLsizei count,
6739 GLboolean transpose,
6740 const GLfloat *value)
6741{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006742 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006743 ASSERT(programObject);
6744 programObject->setUniformMatrix2fv(location, count, transpose, value);
6745}
6746
6747void Context::programUniformMatrix3fv(GLuint program,
6748 GLint location,
6749 GLsizei count,
6750 GLboolean transpose,
6751 const GLfloat *value)
6752{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006753 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006754 ASSERT(programObject);
6755 programObject->setUniformMatrix3fv(location, count, transpose, value);
6756}
6757
6758void Context::programUniformMatrix4fv(GLuint program,
6759 GLint location,
6760 GLsizei count,
6761 GLboolean transpose,
6762 const GLfloat *value)
6763{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006764 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006765 ASSERT(programObject);
6766 programObject->setUniformMatrix4fv(location, count, transpose, value);
6767}
6768
6769void Context::programUniformMatrix2x3fv(GLuint program,
6770 GLint location,
6771 GLsizei count,
6772 GLboolean transpose,
6773 const GLfloat *value)
6774{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006775 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006776 ASSERT(programObject);
6777 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6778}
6779
6780void Context::programUniformMatrix3x2fv(GLuint program,
6781 GLint location,
6782 GLsizei count,
6783 GLboolean transpose,
6784 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->setUniformMatrix3x2fv(location, count, transpose, value);
6789}
6790
6791void Context::programUniformMatrix2x4fv(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->setUniformMatrix2x4fv(location, count, transpose, value);
6800}
6801
6802void Context::programUniformMatrix4x2fv(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->setUniformMatrix4x2fv(location, count, transpose, value);
6811}
6812
6813void Context::programUniformMatrix3x4fv(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->setUniformMatrix3x4fv(location, count, transpose, value);
6822}
6823
6824void Context::programUniformMatrix4x3fv(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->setUniformMatrix4x3fv(location, count, transpose, value);
6833}
6834
Jamie Madill81c2e252017-09-09 23:32:46 -04006835void Context::onTextureChange(const Texture *texture)
6836{
6837 // Conservatively assume all textures are dirty.
6838 // TODO(jmadill): More fine-grained update.
6839 mGLState.setObjectDirty(GL_TEXTURE);
6840}
6841
James Darpiniane8a93c62018-01-04 18:02:24 -08006842bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6843{
6844 return mGLState.isCurrentTransformFeedback(tf);
6845}
James Darpiniane8a93c62018-01-04 18:02:24 -08006846
Yunchao Hea336b902017-08-02 16:05:21 +08006847void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6848{
6849 for (int i = 0; i < count; i++)
6850 {
6851 pipelines[i] = createProgramPipeline();
6852 }
6853}
6854
6855void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6856{
6857 for (int i = 0; i < count; i++)
6858 {
6859 if (pipelines[i] != 0)
6860 {
6861 deleteProgramPipeline(pipelines[i]);
6862 }
6863 }
6864}
6865
6866GLboolean Context::isProgramPipeline(GLuint pipeline)
6867{
6868 if (pipeline == 0)
6869 {
6870 return GL_FALSE;
6871 }
6872
6873 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6874}
6875
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006876void Context::finishFenceNV(GLuint fence)
6877{
6878 FenceNV *fenceObject = getFenceNV(fence);
6879
6880 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04006881 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006882}
6883
6884void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6885{
6886 FenceNV *fenceObject = getFenceNV(fence);
6887
6888 ASSERT(fenceObject && fenceObject->isSet());
6889
6890 switch (pname)
6891 {
6892 case GL_FENCE_STATUS_NV:
6893 {
6894 // GL_NV_fence spec:
6895 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6896 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6897 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6898 GLboolean status = GL_TRUE;
6899 if (fenceObject->getStatus() != GL_TRUE)
6900 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006901 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006902 }
6903 *params = status;
6904 break;
6905 }
6906
6907 case GL_FENCE_CONDITION_NV:
6908 {
6909 *params = static_cast<GLint>(fenceObject->getCondition());
6910 break;
6911 }
6912
6913 default:
6914 UNREACHABLE();
6915 }
6916}
6917
6918void Context::getTranslatedShaderSource(GLuint shader,
6919 GLsizei bufsize,
6920 GLsizei *length,
6921 GLchar *source)
6922{
6923 Shader *shaderObject = getShader(shader);
6924 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08006925 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006926}
6927
6928void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6929{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006930 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006931 ASSERT(programObject);
6932
6933 programObject->getUniformfv(this, location, params);
6934}
6935
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006936void Context::getnUniformfvRobust(GLuint program,
6937 GLint location,
6938 GLsizei bufSize,
6939 GLsizei *length,
6940 GLfloat *params)
6941{
6942 UNIMPLEMENTED();
6943}
6944
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006945void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
6946{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006947 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006948 ASSERT(programObject);
6949
6950 programObject->getUniformiv(this, location, params);
6951}
6952
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006953void Context::getnUniformivRobust(GLuint program,
6954 GLint location,
6955 GLsizei bufSize,
6956 GLsizei *length,
6957 GLint *params)
6958{
6959 UNIMPLEMENTED();
6960}
6961
6962void Context::getnUniformuivRobust(GLuint program,
6963 GLint location,
6964 GLsizei bufSize,
6965 GLsizei *length,
6966 GLuint *params)
6967{
6968 UNIMPLEMENTED();
6969}
6970
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006971GLboolean Context::isFenceNV(GLuint fence)
6972{
6973 FenceNV *fenceObject = getFenceNV(fence);
6974
6975 if (fenceObject == nullptr)
6976 {
6977 return GL_FALSE;
6978 }
6979
6980 // GL_NV_fence spec:
6981 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
6982 // existing fence.
6983 return fenceObject->isSet();
6984}
6985
6986void Context::readnPixels(GLint x,
6987 GLint y,
6988 GLsizei width,
6989 GLsizei height,
6990 GLenum format,
6991 GLenum type,
6992 GLsizei bufSize,
6993 void *data)
6994{
6995 return readPixels(x, y, width, height, format, type, data);
6996}
6997
Jamie Madill007530e2017-12-28 14:27:04 -05006998void Context::setFenceNV(GLuint fence, GLenum condition)
6999{
7000 ASSERT(condition == GL_ALL_COMPLETED_NV);
7001
7002 FenceNV *fenceObject = getFenceNV(fence);
7003 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04007004 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05007005}
7006
7007GLboolean Context::testFenceNV(GLuint fence)
7008{
7009 FenceNV *fenceObject = getFenceNV(fence);
7010
7011 ASSERT(fenceObject != nullptr);
7012 ASSERT(fenceObject->isSet() == GL_TRUE);
7013
7014 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04007015 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05007016 if (error.isError())
7017 {
7018 handleError(error);
7019 return GL_TRUE;
7020 }
7021
7022 return result;
7023}
7024
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007025void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007026{
7027 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007028 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05007029 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007030}
7031
Jamie Madillfa920eb2018-01-04 11:45:50 -05007032void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007033{
7034 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007035 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05007036 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
7037}
7038
Jamie Madillfa920eb2018-01-04 11:45:50 -05007039void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7040{
7041 UNIMPLEMENTED();
7042}
7043
Jamie Madill5b772312018-03-08 20:28:32 -05007044bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7045{
7046 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7047 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7048 // to the fact that it is stored internally as a float, and so would require conversion
7049 // if returned from Context::getIntegerv. Since this conversion is already implemented
7050 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7051 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7052 // application.
7053 switch (pname)
7054 {
7055 case GL_COMPRESSED_TEXTURE_FORMATS:
7056 {
7057 *type = GL_INT;
7058 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7059 return true;
7060 }
7061 case GL_SHADER_BINARY_FORMATS:
7062 {
7063 *type = GL_INT;
7064 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7065 return true;
7066 }
7067
7068 case GL_MAX_VERTEX_ATTRIBS:
7069 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7070 case GL_MAX_VARYING_VECTORS:
7071 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7072 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7073 case GL_MAX_TEXTURE_IMAGE_UNITS:
7074 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7075 case GL_MAX_RENDERBUFFER_SIZE:
7076 case GL_NUM_SHADER_BINARY_FORMATS:
7077 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7078 case GL_ARRAY_BUFFER_BINDING:
7079 case GL_FRAMEBUFFER_BINDING:
7080 case GL_RENDERBUFFER_BINDING:
7081 case GL_CURRENT_PROGRAM:
7082 case GL_PACK_ALIGNMENT:
7083 case GL_UNPACK_ALIGNMENT:
7084 case GL_GENERATE_MIPMAP_HINT:
7085 case GL_RED_BITS:
7086 case GL_GREEN_BITS:
7087 case GL_BLUE_BITS:
7088 case GL_ALPHA_BITS:
7089 case GL_DEPTH_BITS:
7090 case GL_STENCIL_BITS:
7091 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7092 case GL_CULL_FACE_MODE:
7093 case GL_FRONT_FACE:
7094 case GL_ACTIVE_TEXTURE:
7095 case GL_STENCIL_FUNC:
7096 case GL_STENCIL_VALUE_MASK:
7097 case GL_STENCIL_REF:
7098 case GL_STENCIL_FAIL:
7099 case GL_STENCIL_PASS_DEPTH_FAIL:
7100 case GL_STENCIL_PASS_DEPTH_PASS:
7101 case GL_STENCIL_BACK_FUNC:
7102 case GL_STENCIL_BACK_VALUE_MASK:
7103 case GL_STENCIL_BACK_REF:
7104 case GL_STENCIL_BACK_FAIL:
7105 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7106 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7107 case GL_DEPTH_FUNC:
7108 case GL_BLEND_SRC_RGB:
7109 case GL_BLEND_SRC_ALPHA:
7110 case GL_BLEND_DST_RGB:
7111 case GL_BLEND_DST_ALPHA:
7112 case GL_BLEND_EQUATION_RGB:
7113 case GL_BLEND_EQUATION_ALPHA:
7114 case GL_STENCIL_WRITEMASK:
7115 case GL_STENCIL_BACK_WRITEMASK:
7116 case GL_STENCIL_CLEAR_VALUE:
7117 case GL_SUBPIXEL_BITS:
7118 case GL_MAX_TEXTURE_SIZE:
7119 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7120 case GL_SAMPLE_BUFFERS:
7121 case GL_SAMPLES:
7122 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7123 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7124 case GL_TEXTURE_BINDING_2D:
7125 case GL_TEXTURE_BINDING_CUBE_MAP:
7126 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7127 {
7128 *type = GL_INT;
7129 *numParams = 1;
7130 return true;
7131 }
7132 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7133 {
7134 if (!getExtensions().packReverseRowOrder)
7135 {
7136 return false;
7137 }
7138 *type = GL_INT;
7139 *numParams = 1;
7140 return true;
7141 }
7142 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7143 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7144 {
7145 if (!getExtensions().textureRectangle)
7146 {
7147 return false;
7148 }
7149 *type = GL_INT;
7150 *numParams = 1;
7151 return true;
7152 }
7153 case GL_MAX_DRAW_BUFFERS_EXT:
7154 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7155 {
7156 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7157 {
7158 return false;
7159 }
7160 *type = GL_INT;
7161 *numParams = 1;
7162 return true;
7163 }
7164 case GL_MAX_VIEWPORT_DIMS:
7165 {
7166 *type = GL_INT;
7167 *numParams = 2;
7168 return true;
7169 }
7170 case GL_VIEWPORT:
7171 case GL_SCISSOR_BOX:
7172 {
7173 *type = GL_INT;
7174 *numParams = 4;
7175 return true;
7176 }
7177 case GL_SHADER_COMPILER:
7178 case GL_SAMPLE_COVERAGE_INVERT:
7179 case GL_DEPTH_WRITEMASK:
7180 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7181 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7182 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7183 // bool-natural
7184 case GL_SAMPLE_COVERAGE:
7185 case GL_SCISSOR_TEST:
7186 case GL_STENCIL_TEST:
7187 case GL_DEPTH_TEST:
7188 case GL_BLEND:
7189 case GL_DITHER:
7190 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7191 {
7192 *type = GL_BOOL;
7193 *numParams = 1;
7194 return true;
7195 }
7196 case GL_COLOR_WRITEMASK:
7197 {
7198 *type = GL_BOOL;
7199 *numParams = 4;
7200 return true;
7201 }
7202 case GL_POLYGON_OFFSET_FACTOR:
7203 case GL_POLYGON_OFFSET_UNITS:
7204 case GL_SAMPLE_COVERAGE_VALUE:
7205 case GL_DEPTH_CLEAR_VALUE:
7206 case GL_LINE_WIDTH:
7207 {
7208 *type = GL_FLOAT;
7209 *numParams = 1;
7210 return true;
7211 }
7212 case GL_ALIASED_LINE_WIDTH_RANGE:
7213 case GL_ALIASED_POINT_SIZE_RANGE:
7214 case GL_DEPTH_RANGE:
7215 {
7216 *type = GL_FLOAT;
7217 *numParams = 2;
7218 return true;
7219 }
7220 case GL_COLOR_CLEAR_VALUE:
7221 case GL_BLEND_COLOR:
7222 {
7223 *type = GL_FLOAT;
7224 *numParams = 4;
7225 return true;
7226 }
7227 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7228 if (!getExtensions().textureFilterAnisotropic)
7229 {
7230 return false;
7231 }
7232 *type = GL_FLOAT;
7233 *numParams = 1;
7234 return true;
7235 case GL_TIMESTAMP_EXT:
7236 if (!getExtensions().disjointTimerQuery)
7237 {
7238 return false;
7239 }
7240 *type = GL_INT_64_ANGLEX;
7241 *numParams = 1;
7242 return true;
7243 case GL_GPU_DISJOINT_EXT:
7244 if (!getExtensions().disjointTimerQuery)
7245 {
7246 return false;
7247 }
7248 *type = GL_INT;
7249 *numParams = 1;
7250 return true;
7251 case GL_COVERAGE_MODULATION_CHROMIUM:
7252 if (!getExtensions().framebufferMixedSamples)
7253 {
7254 return false;
7255 }
7256 *type = GL_INT;
7257 *numParams = 1;
7258 return true;
7259 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7260 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7261 {
7262 return false;
7263 }
7264 *type = GL_INT;
7265 *numParams = 1;
7266 return true;
7267 }
7268
7269 if (getExtensions().debug)
7270 {
7271 switch (pname)
7272 {
7273 case GL_DEBUG_LOGGED_MESSAGES:
7274 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7275 case GL_DEBUG_GROUP_STACK_DEPTH:
7276 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7277 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7278 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7279 case GL_MAX_LABEL_LENGTH:
7280 *type = GL_INT;
7281 *numParams = 1;
7282 return true;
7283
7284 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7285 case GL_DEBUG_OUTPUT:
7286 *type = GL_BOOL;
7287 *numParams = 1;
7288 return true;
7289 }
7290 }
7291
7292 if (getExtensions().multisampleCompatibility)
7293 {
7294 switch (pname)
7295 {
7296 case GL_MULTISAMPLE_EXT:
7297 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7298 *type = GL_BOOL;
7299 *numParams = 1;
7300 return true;
7301 }
7302 }
7303
7304 if (getExtensions().pathRendering)
7305 {
7306 switch (pname)
7307 {
7308 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7309 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7310 *type = GL_FLOAT;
7311 *numParams = 16;
7312 return true;
7313 }
7314 }
7315
7316 if (getExtensions().bindGeneratesResource)
7317 {
7318 switch (pname)
7319 {
7320 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7321 *type = GL_BOOL;
7322 *numParams = 1;
7323 return true;
7324 }
7325 }
7326
7327 if (getExtensions().clientArrays)
7328 {
7329 switch (pname)
7330 {
7331 case GL_CLIENT_ARRAYS_ANGLE:
7332 *type = GL_BOOL;
7333 *numParams = 1;
7334 return true;
7335 }
7336 }
7337
7338 if (getExtensions().sRGBWriteControl)
7339 {
7340 switch (pname)
7341 {
7342 case GL_FRAMEBUFFER_SRGB_EXT:
7343 *type = GL_BOOL;
7344 *numParams = 1;
7345 return true;
7346 }
7347 }
7348
7349 if (getExtensions().robustResourceInitialization &&
7350 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7351 {
7352 *type = GL_BOOL;
7353 *numParams = 1;
7354 return true;
7355 }
7356
7357 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7358 {
7359 *type = GL_BOOL;
7360 *numParams = 1;
7361 return true;
7362 }
7363
jchen1082af6202018-06-22 10:59:52 +08007364 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7365 {
7366 *type = GL_INT;
7367 *numParams = 1;
7368 return true;
7369 }
7370
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007371 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7372 {
7373 *type = GL_INT;
7374 *numParams = 1;
7375 return true;
7376 }
7377
Jamie Madill5b772312018-03-08 20:28:32 -05007378 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7379 switch (pname)
7380 {
7381 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7382 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7383 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7384 {
7385 return false;
7386 }
7387 *type = GL_INT;
7388 *numParams = 1;
7389 return true;
7390
7391 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7392 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7393 {
7394 return false;
7395 }
7396 *type = GL_INT;
7397 *numParams = 1;
7398 return true;
7399
7400 case GL_PROGRAM_BINARY_FORMATS_OES:
7401 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7402 {
7403 return false;
7404 }
7405 *type = GL_INT;
7406 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7407 return true;
7408
7409 case GL_PACK_ROW_LENGTH:
7410 case GL_PACK_SKIP_ROWS:
7411 case GL_PACK_SKIP_PIXELS:
7412 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7413 {
7414 return false;
7415 }
7416 *type = GL_INT;
7417 *numParams = 1;
7418 return true;
7419 case GL_UNPACK_ROW_LENGTH:
7420 case GL_UNPACK_SKIP_ROWS:
7421 case GL_UNPACK_SKIP_PIXELS:
7422 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7423 {
7424 return false;
7425 }
7426 *type = GL_INT;
7427 *numParams = 1;
7428 return true;
7429 case GL_VERTEX_ARRAY_BINDING:
7430 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7431 {
7432 return false;
7433 }
7434 *type = GL_INT;
7435 *numParams = 1;
7436 return true;
7437 case GL_PIXEL_PACK_BUFFER_BINDING:
7438 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7439 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7440 {
7441 return false;
7442 }
7443 *type = GL_INT;
7444 *numParams = 1;
7445 return true;
7446 case GL_MAX_SAMPLES:
7447 {
7448 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7449 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7450 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7451 {
7452 return false;
7453 }
7454 *type = GL_INT;
7455 *numParams = 1;
7456 return true;
7457
7458 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7459 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7460 {
7461 return false;
7462 }
7463 *type = GL_INT;
7464 *numParams = 1;
7465 return true;
7466 }
7467 }
7468
7469 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7470 {
7471 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7472 {
7473 return false;
7474 }
7475 *type = GL_INT;
7476 *numParams = 1;
7477 return true;
7478 }
7479
7480 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7481 {
7482 *type = GL_INT;
7483 *numParams = 1;
7484 return true;
7485 }
7486
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007487 if (getClientVersion() < Version(2, 0))
7488 {
7489 switch (pname)
7490 {
7491 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007492 case GL_CLIENT_ACTIVE_TEXTURE:
7493 case GL_MATRIX_MODE:
7494 case GL_MAX_TEXTURE_UNITS:
7495 case GL_MAX_MODELVIEW_STACK_DEPTH:
7496 case GL_MAX_PROJECTION_STACK_DEPTH:
7497 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007498 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007499 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007500 case GL_VERTEX_ARRAY_STRIDE:
7501 case GL_NORMAL_ARRAY_STRIDE:
7502 case GL_COLOR_ARRAY_STRIDE:
7503 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7504 case GL_VERTEX_ARRAY_SIZE:
7505 case GL_COLOR_ARRAY_SIZE:
7506 case GL_TEXTURE_COORD_ARRAY_SIZE:
7507 case GL_VERTEX_ARRAY_TYPE:
7508 case GL_NORMAL_ARRAY_TYPE:
7509 case GL_COLOR_ARRAY_TYPE:
7510 case GL_TEXTURE_COORD_ARRAY_TYPE:
7511 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7512 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7513 case GL_COLOR_ARRAY_BUFFER_BINDING:
7514 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7515 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7516 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7517 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007518 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007519 case GL_MODELVIEW_STACK_DEPTH:
7520 case GL_PROJECTION_STACK_DEPTH:
7521 case GL_TEXTURE_STACK_DEPTH:
7522 case GL_LOGIC_OP_MODE:
7523 case GL_BLEND_SRC:
7524 case GL_BLEND_DST:
7525 case GL_PERSPECTIVE_CORRECTION_HINT:
7526 case GL_POINT_SMOOTH_HINT:
7527 case GL_LINE_SMOOTH_HINT:
7528 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007529 *type = GL_INT;
7530 *numParams = 1;
7531 return true;
7532 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007533 case GL_FOG_DENSITY:
7534 case GL_FOG_START:
7535 case GL_FOG_END:
7536 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007537 case GL_POINT_SIZE:
7538 case GL_POINT_SIZE_MIN:
7539 case GL_POINT_SIZE_MAX:
7540 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007541 *type = GL_FLOAT;
7542 *numParams = 1;
7543 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007544 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007545 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007546 *type = GL_FLOAT;
7547 *numParams = 2;
7548 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007549 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007550 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007551 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007552 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007553 *type = GL_FLOAT;
7554 *numParams = 4;
7555 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007556 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007557 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007558 *type = GL_FLOAT;
7559 *numParams = 3;
7560 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007561 case GL_MODELVIEW_MATRIX:
7562 case GL_PROJECTION_MATRIX:
7563 case GL_TEXTURE_MATRIX:
7564 *type = GL_FLOAT;
7565 *numParams = 16;
7566 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007567 case GL_LIGHT_MODEL_TWO_SIDE:
7568 *type = GL_BOOL;
7569 *numParams = 1;
7570 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007571 }
7572 }
7573
Jamie Madill5b772312018-03-08 20:28:32 -05007574 if (getClientVersion() < Version(3, 0))
7575 {
7576 return false;
7577 }
7578
7579 // Check for ES3.0+ parameter names
7580 switch (pname)
7581 {
7582 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7583 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7584 case GL_UNIFORM_BUFFER_BINDING:
7585 case GL_TRANSFORM_FEEDBACK_BINDING:
7586 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7587 case GL_COPY_READ_BUFFER_BINDING:
7588 case GL_COPY_WRITE_BUFFER_BINDING:
7589 case GL_SAMPLER_BINDING:
7590 case GL_READ_BUFFER:
7591 case GL_TEXTURE_BINDING_3D:
7592 case GL_TEXTURE_BINDING_2D_ARRAY:
7593 case GL_MAX_3D_TEXTURE_SIZE:
7594 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7595 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7596 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7597 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7598 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7599 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7600 case GL_MAX_VARYING_COMPONENTS:
7601 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7602 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7603 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7604 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7605 case GL_NUM_EXTENSIONS:
7606 case GL_MAJOR_VERSION:
7607 case GL_MINOR_VERSION:
7608 case GL_MAX_ELEMENTS_INDICES:
7609 case GL_MAX_ELEMENTS_VERTICES:
7610 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7611 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7612 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7613 case GL_UNPACK_IMAGE_HEIGHT:
7614 case GL_UNPACK_SKIP_IMAGES:
7615 {
7616 *type = GL_INT;
7617 *numParams = 1;
7618 return true;
7619 }
7620
7621 case GL_MAX_ELEMENT_INDEX:
7622 case GL_MAX_UNIFORM_BLOCK_SIZE:
7623 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7624 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7625 case GL_MAX_SERVER_WAIT_TIMEOUT:
7626 {
7627 *type = GL_INT_64_ANGLEX;
7628 *numParams = 1;
7629 return true;
7630 }
7631
7632 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7633 case GL_TRANSFORM_FEEDBACK_PAUSED:
7634 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7635 case GL_RASTERIZER_DISCARD:
7636 {
7637 *type = GL_BOOL;
7638 *numParams = 1;
7639 return true;
7640 }
7641
7642 case GL_MAX_TEXTURE_LOD_BIAS:
7643 {
7644 *type = GL_FLOAT;
7645 *numParams = 1;
7646 return true;
7647 }
7648 }
7649
7650 if (getExtensions().requestExtension)
7651 {
7652 switch (pname)
7653 {
7654 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7655 *type = GL_INT;
7656 *numParams = 1;
7657 return true;
7658 }
7659 }
7660
Yizhou Jiang7818a852018-09-06 15:02:04 +08007661 if (getExtensions().textureMultisample)
7662 {
7663 switch (pname)
7664 {
7665 case GL_MAX_COLOR_TEXTURE_SAMPLES_ANGLE:
7666 case GL_MAX_INTEGER_SAMPLES_ANGLE:
7667 case GL_MAX_DEPTH_TEXTURE_SAMPLES_ANGLE:
7668 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE:
7669 *type = GL_INT;
7670 *numParams = 1;
7671 return true;
7672 }
7673 }
7674
Jamie Madill5b772312018-03-08 20:28:32 -05007675 if (getClientVersion() < Version(3, 1))
7676 {
7677 return false;
7678 }
7679
7680 switch (pname)
7681 {
7682 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7683 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7684 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7685 case GL_MAX_FRAMEBUFFER_WIDTH:
7686 case GL_MAX_FRAMEBUFFER_HEIGHT:
7687 case GL_MAX_FRAMEBUFFER_SAMPLES:
7688 case GL_MAX_SAMPLE_MASK_WORDS:
7689 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7690 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7691 case GL_MAX_INTEGER_SAMPLES:
7692 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7693 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7694 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7695 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7696 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7697 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7698 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7699 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7700 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7701 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7702 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7703 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7704 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7705 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7706 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7707 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7708 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7709 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7710 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7711 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7712 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7713 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7714 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7715 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7716 case GL_MAX_UNIFORM_LOCATIONS:
7717 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7718 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7719 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7720 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7721 case GL_MAX_IMAGE_UNITS:
7722 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7723 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7724 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7725 case GL_SHADER_STORAGE_BUFFER_BINDING:
7726 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7727 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007728 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007729 *type = GL_INT;
7730 *numParams = 1;
7731 return true;
7732 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7733 *type = GL_INT_64_ANGLEX;
7734 *numParams = 1;
7735 return true;
7736 case GL_SAMPLE_MASK:
7737 *type = GL_BOOL;
7738 *numParams = 1;
7739 return true;
7740 }
7741
7742 if (getExtensions().geometryShader)
7743 {
7744 switch (pname)
7745 {
7746 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7747 case GL_LAYER_PROVOKING_VERTEX_EXT:
7748 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7749 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7750 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7751 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7752 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7753 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7754 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7755 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7756 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7757 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7758 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7759 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7760 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7761 *type = GL_INT;
7762 *numParams = 1;
7763 return true;
7764 }
7765 }
7766
7767 return false;
7768}
7769
7770bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7771{
7772 if (getClientVersion() < Version(3, 0))
7773 {
7774 return false;
7775 }
7776
7777 switch (target)
7778 {
7779 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7780 case GL_UNIFORM_BUFFER_BINDING:
7781 {
7782 *type = GL_INT;
7783 *numParams = 1;
7784 return true;
7785 }
7786 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7787 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7788 case GL_UNIFORM_BUFFER_START:
7789 case GL_UNIFORM_BUFFER_SIZE:
7790 {
7791 *type = GL_INT_64_ANGLEX;
7792 *numParams = 1;
7793 return true;
7794 }
7795 }
7796
7797 if (getClientVersion() < Version(3, 1))
7798 {
7799 return false;
7800 }
7801
7802 switch (target)
7803 {
7804 case GL_IMAGE_BINDING_LAYERED:
7805 {
7806 *type = GL_BOOL;
7807 *numParams = 1;
7808 return true;
7809 }
7810 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7811 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7812 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7813 case GL_SHADER_STORAGE_BUFFER_BINDING:
7814 case GL_VERTEX_BINDING_BUFFER:
7815 case GL_VERTEX_BINDING_DIVISOR:
7816 case GL_VERTEX_BINDING_OFFSET:
7817 case GL_VERTEX_BINDING_STRIDE:
7818 case GL_SAMPLE_MASK_VALUE:
7819 case GL_IMAGE_BINDING_NAME:
7820 case GL_IMAGE_BINDING_LEVEL:
7821 case GL_IMAGE_BINDING_LAYER:
7822 case GL_IMAGE_BINDING_ACCESS:
7823 case GL_IMAGE_BINDING_FORMAT:
7824 {
7825 *type = GL_INT;
7826 *numParams = 1;
7827 return true;
7828 }
7829 case GL_ATOMIC_COUNTER_BUFFER_START:
7830 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7831 case GL_SHADER_STORAGE_BUFFER_START:
7832 case GL_SHADER_STORAGE_BUFFER_SIZE:
7833 {
7834 *type = GL_INT_64_ANGLEX;
7835 *numParams = 1;
7836 return true;
7837 }
7838 }
7839
7840 return false;
7841}
7842
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007843Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05007844{
7845 return mState.mShaderPrograms->getProgram(handle);
7846}
7847
7848Shader *Context::getShader(GLuint handle) const
7849{
7850 return mState.mShaderPrograms->getShader(handle);
7851}
7852
Jamie Madill5b772312018-03-08 20:28:32 -05007853bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7854{
7855 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7856}
7857
7858bool Context::isFramebufferGenerated(GLuint framebuffer) const
7859{
7860 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7861}
7862
7863bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7864{
7865 return mState.mPipelines->isHandleGenerated(pipeline);
7866}
7867
7868bool Context::usingDisplayTextureShareGroup() const
7869{
7870 return mDisplayTextureShareGroup;
7871}
7872
7873GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7874{
7875 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7876 internalformat == GL_DEPTH_STENCIL
7877 ? GL_DEPTH24_STENCIL8
7878 : internalformat;
7879}
7880
jchen1082af6202018-06-22 10:59:52 +08007881void Context::maxShaderCompilerThreads(GLuint count)
7882{
jchen107ae70d82018-07-06 13:47:01 +08007883 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08007884 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08007885 // A count of zero specifies a request for no parallel compiling or linking.
7886 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
7887 {
7888 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
7889 }
7890 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08007891}
7892
Jamie Madill2eb65032018-07-30 10:25:57 -04007893bool Context::isGLES1() const
7894{
7895 return mState.getClientVersion() < Version(2, 0);
7896}
7897
Jamie Madilla11819d2018-07-30 10:26:01 -04007898void Context::onSubjectStateChange(const Context *context,
7899 angle::SubjectIndex index,
7900 angle::SubjectMessage message)
7901{
Jamie Madilla11819d2018-07-30 10:26:01 -04007902 switch (index)
7903 {
7904 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007905 switch (message)
7906 {
7907 case angle::SubjectMessage::CONTENTS_CHANGED:
7908 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
7909 mStateCache.onVertexArrayBufferContentsChange(this);
7910 break;
7911 case angle::SubjectMessage::RESOURCE_MAPPED:
7912 case angle::SubjectMessage::RESOURCE_UNMAPPED:
7913 case angle::SubjectMessage::BINDING_CHANGED:
7914 mStateCache.onVertexArrayBufferStateChange(this);
7915 break;
7916 default:
7917 break;
7918 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007919 break;
7920
7921 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007922 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7923 {
7924 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
7925 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007926 break;
7927
7928 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007929 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7930 {
7931 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
7932 }
7933 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04007934 break;
7935
7936 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04007937 if (index < kTextureMaxSubjectIndex)
7938 {
7939 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04007940 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007941 }
Jamie Madille25b8002018-09-20 13:39:49 -04007942 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04007943 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04007944 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04007945 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007946 }
Jamie Madille25b8002018-09-20 13:39:49 -04007947 else
7948 {
7949 ASSERT(index < kSamplerMaxSubjectIndex);
7950 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
7951 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007952 break;
7953 }
7954}
7955
Jamie Madill6b873dd2018-07-12 23:56:30 -04007956// ErrorSet implementation.
7957ErrorSet::ErrorSet(Context *context) : mContext(context)
7958{
7959}
7960
7961ErrorSet::~ErrorSet() = default;
7962
Jamie Madill306b6c12018-07-27 08:12:49 -04007963void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04007964{
7965 // This internal enum is used to filter internal errors that are already handled.
7966 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
7967 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
7968 {
7969 return;
7970 }
7971
7972 if (ANGLE_UNLIKELY(error.isError()))
7973 {
7974 GLenum code = error.getCode();
7975 mErrors.insert(code);
Jamie Madill785e8a02018-10-04 17:42:00 -04007976
Jamie Madill6b873dd2018-07-12 23:56:30 -04007977 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
7978 {
7979 mContext->markContextLost();
7980 }
7981
7982 ASSERT(!error.getMessage().empty());
7983 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
7984 error.getID(), GL_DEBUG_SEVERITY_HIGH,
7985 error.getMessage());
7986 }
7987}
7988
Jamie Madillabfbc0f2018-10-09 12:48:52 -04007989void ErrorSet::handleError(GLenum errorCode,
7990 const char *message,
7991 const char *file,
7992 const char *function,
7993 unsigned int line)
7994{
7995 // TODO(jmadill): Handle error directly instead of creating object. http://anglebug.com/2491
7996 std::stringstream errorStream;
7997 errorStream << "Front-end Error: " << gl::FmtHex(errorCode) << ", in " << file << ", "
7998 << function << ":" << line << ". " << message;
7999
8000 handleError(gl::Error(errorCode, errorCode, errorStream.str()));
8001}
8002
Jamie Madilla139f012018-10-10 16:13:03 -04008003void ErrorSet::validationError(GLenum errorCode, const char *message)
8004{
8005 handleError(gl::Error(errorCode, message));
8006}
8007
Jamie Madill6b873dd2018-07-12 23:56:30 -04008008bool ErrorSet::empty() const
8009{
8010 return mErrors.empty();
8011}
8012
8013GLenum ErrorSet::popError()
8014{
8015 ASSERT(!empty());
8016 GLenum error = *mErrors.begin();
8017 mErrors.erase(mErrors.begin());
8018 return error;
8019}
Jamie Madilldc358af2018-07-31 11:22:13 -04008020
8021// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04008022StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008023 : mCachedHasAnyEnabledClientAttrib(false),
8024 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04008025 mCachedInstancedVertexElementLimit(0),
8026 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madilldc358af2018-07-31 11:22:13 -04008027{
8028}
8029
8030StateCache::~StateCache() = default;
8031
Jamie Madillac66f982018-10-09 18:30:01 -04008032void StateCache::initialize(Context *context)
8033{
8034 updateValidDrawModes(context);
8035 updateValidBindTextureTypes(context);
8036}
8037
Jamie Madilldc358af2018-07-31 11:22:13 -04008038void StateCache::updateActiveAttribsMask(Context *context)
8039{
8040 bool isGLES1 = context->isGLES1();
8041 const State &glState = context->getGLState();
8042
8043 if (!isGLES1 && !glState.getProgram())
8044 {
8045 mCachedActiveBufferedAttribsMask = AttributesMask();
8046 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008047 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008048 return;
8049 }
8050
8051 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8052 : glState.getProgram()->getActiveAttribLocationsMask();
8053
8054 const VertexArray *vao = glState.getVertexArray();
8055 ASSERT(vao);
8056
8057 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8058 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008059 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008060
Jamie Madill0a17e482018-08-31 17:19:11 -04008061 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8062 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008063 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008064 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8065}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008066
8067void StateCache::updateVertexElementLimits(Context *context)
8068{
8069 const VertexArray *vao = context->getGLState().getVertexArray();
8070
8071 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8072 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8073
8074 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8075 // If there are no buffered attributes then we should not limit the draw call count.
8076 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8077 {
8078 return;
8079 }
8080
8081 const auto &vertexAttribs = vao->getVertexAttributes();
8082 const auto &vertexBindings = vao->getVertexBindings();
8083
8084 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8085 {
8086 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8087 ASSERT(attrib.enabled);
8088
8089 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8090 ASSERT(context->isGLES1() ||
8091 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8092
8093 GLint64 limit = attrib.getCachedElementLimit();
8094 if (binding.getDivisor() > 0)
8095 {
8096 mCachedInstancedVertexElementLimit =
8097 std::min(mCachedInstancedVertexElementLimit, limit);
8098 }
8099 else
8100 {
8101 mCachedNonInstancedVertexElementLimit =
8102 std::min(mCachedNonInstancedVertexElementLimit, limit);
8103 }
8104 }
8105}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008106
Jamie Madilld84b6732018-09-06 15:54:35 -04008107void StateCache::updateBasicDrawStatesError()
8108{
8109 mCachedBasicDrawStatesError = kInvalidPointer;
8110}
8111
8112intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8113{
8114 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8115 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8116 return mCachedBasicDrawStatesError;
8117}
8118
Jamie Madillc43cdad2018-08-08 15:49:25 -04008119void StateCache::onVertexArrayBindingChange(Context *context)
8120{
8121 updateActiveAttribsMask(context);
8122 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008123 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008124}
8125
8126void StateCache::onProgramExecutableChange(Context *context)
8127{
8128 updateActiveAttribsMask(context);
8129 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008130 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008131 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008132}
8133
Jamie Madilld84b6732018-09-06 15:54:35 -04008134void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008135{
8136 updateVertexElementLimits(context);
8137}
8138
Jamie Madilld84b6732018-09-06 15:54:35 -04008139void StateCache::onVertexArrayBufferContentsChange(Context *context)
8140{
8141 updateVertexElementLimits(context);
8142 updateBasicDrawStatesError();
8143}
8144
Jamie Madillc43cdad2018-08-08 15:49:25 -04008145void StateCache::onVertexArrayStateChange(Context *context)
8146{
8147 updateActiveAttribsMask(context);
8148 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008149 updateBasicDrawStatesError();
8150}
8151
8152void StateCache::onVertexArrayBufferStateChange(Context *context)
8153{
8154 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008155}
8156
8157void StateCache::onGLES1ClientStateChange(Context *context)
8158{
8159 updateActiveAttribsMask(context);
8160}
Jamie Madilld84b6732018-09-06 15:54:35 -04008161
8162void StateCache::onDrawFramebufferChange(Context *context)
8163{
8164 updateBasicDrawStatesError();
8165}
8166
8167void StateCache::onContextCapChange(Context *context)
8168{
8169 updateBasicDrawStatesError();
8170}
8171
8172void StateCache::onStencilStateChange(Context *context)
8173{
8174 updateBasicDrawStatesError();
8175}
8176
8177void StateCache::onDefaultVertexAttributeChange(Context *context)
8178{
8179 updateBasicDrawStatesError();
8180}
8181
8182void StateCache::onActiveTextureChange(Context *context)
8183{
8184 updateBasicDrawStatesError();
8185}
8186
8187void StateCache::onQueryChange(Context *context)
8188{
8189 updateBasicDrawStatesError();
8190}
8191
8192void StateCache::onTransformFeedbackChange(Context *context)
8193{
8194 updateBasicDrawStatesError();
8195}
8196
8197void StateCache::onUniformBufferStateChange(Context *context)
8198{
8199 updateBasicDrawStatesError();
8200}
8201
8202void StateCache::onBufferBindingChange(Context *context)
8203{
8204 updateBasicDrawStatesError();
8205}
Jamie Madill526a6f62018-09-12 11:03:05 -04008206
8207void StateCache::updateValidDrawModes(Context *context)
8208{
8209 Program *program = context->getGLState().getProgram();
8210 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8211 {
8212 mCachedValidDrawModes = {{
8213 true, /* Points */
8214 true, /* Lines */
8215 true, /* LineLoop */
8216 true, /* LineStrip */
8217 true, /* Triangles */
8218 true, /* TriangleStrip */
8219 true, /* TriangleFan */
8220 false, /* LinesAdjacency */
8221 false, /* LineStripAdjacency */
8222 false, /* TrianglesAdjacency */
8223 false, /* TriangleStripAdjacency */
8224 false, /* InvalidEnum */
8225 }};
8226 }
8227 else
8228 {
8229 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8230
8231 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8232
8233 mCachedValidDrawModes = {{
8234 gsMode == PrimitiveMode::Points, /* Points */
8235 gsMode == PrimitiveMode::Lines, /* Lines */
8236 gsMode == PrimitiveMode::Lines, /* LineLoop */
8237 gsMode == PrimitiveMode::Lines, /* LineStrip */
8238 gsMode == PrimitiveMode::Triangles, /* Triangles */
8239 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8240 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8241 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8242 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8243 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8244 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8245 false, /* InvalidEnum */
8246 }};
8247 }
8248}
Jamie Madillac66f982018-10-09 18:30:01 -04008249
8250void StateCache::updateValidBindTextureTypes(Context *context)
8251{
8252 const Extensions &exts = context->getExtensions();
8253 bool isGLES3 = context->getClientMajorVersion() >= 3;
8254 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8255
8256 mCachedValidBindTextureTypes = {{
8257 true, /* _2D */
8258 isGLES3, /* _2DArray */
Yizhou Jiang7818a852018-09-06 15:02:04 +08008259 isGLES31 || exts.textureMultisample, /* _2DMultisample */
Jamie Madillac66f982018-10-09 18:30:01 -04008260 exts.textureStorageMultisample2DArray, /* _2DMultisampleArray */
8261 isGLES3, /* _3D */
8262 exts.eglImageExternal || exts.eglStreamConsumerExternal, /* External */
8263 exts.textureRectangle, /* Rectangle */
8264 true, /* CubeMap */
8265 false, /* InvalidEnum */
8266
8267 }};
8268}
Jamie Madillc29968b2016-01-20 11:17:23 -05008269} // namespace gl