blob: c0b8a8bdbf5d01a7e3e3ac53d3e91b415c1ce994 [file] [log] [blame]
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001//
Geoff Langeeba6e12014-02-03 13:12:30 -05002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Context.cpp: Implements the gl::Context class, managing all GL state and performing
8// rendering operations. It is the GLES2 specific implementation of EGLContext.
9
Geoff Lang2b5420c2014-11-19 14:20:15 -050010#include "libANGLE/Context.h"
apatrick@chromium.org144f2802012-07-12 01:42:34 +000011
Jamie Madill231c7f52017-04-26 13:45:37 -040012#include <string.h>
Jamie Madillb9293972015-02-19 11:07:54 -050013#include <iterator>
14#include <sstream>
Sami Väisänend59ca052016-06-21 16:10:00 +030015#include <vector>
Jamie Madillb9293972015-02-19 11:07:54 -050016
Tobin Ehlisd7890bc2018-06-29 11:57:22 -060017#include "common/PackedEnums.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030018#include "common/matrix_utils.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040019#include "common/platform.h"
Jamie Madillb9293972015-02-19 11:07:54 -050020#include "common/utilities.h"
Geoff Langc339c4e2016-11-29 10:37:36 -050021#include "common/version.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050022#include "libANGLE/Buffer.h"
Jamie Madillb9293972015-02-19 11:07:54 -050023#include "libANGLE/Compiler.h"
Jamie Madill948bbe52017-06-01 13:10:42 -040024#include "libANGLE/Display.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050025#include "libANGLE/Fence.h"
26#include "libANGLE/Framebuffer.h"
27#include "libANGLE/FramebufferAttachment.h"
Lingfeng Yang461b09a2018-04-23 09:02:09 -070028#include "libANGLE/GLES1Renderer.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030029#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050030#include "libANGLE/Program.h"
Yunchao Hea336b902017-08-02 16:05:21 +080031#include "libANGLE/ProgramPipeline.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050032#include "libANGLE/Query.h"
Jamie Madillb9293972015-02-19 11:07:54 -050033#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050034#include "libANGLE/ResourceManager.h"
35#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050036#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050037#include "libANGLE/Texture.h"
38#include "libANGLE/TransformFeedback.h"
39#include "libANGLE/VertexArray.h"
Kenneth Russellf2f6f652016-10-05 19:53:23 -070040#include "libANGLE/Workarounds.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040041#include "libANGLE/formatutils.h"
Martin Radev66fb8202016-07-28 11:45:20 +030042#include "libANGLE/queryconversions.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040043#include "libANGLE/queryutils.h"
Jamie Madill6d32cef2018-08-14 02:34:28 -040044#include "libANGLE/renderer/BufferImpl.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040045#include "libANGLE/renderer/ContextImpl.h"
46#include "libANGLE/renderer/EGLImplFactory.h"
Jamie Madill7b62cf92017-11-02 15:20:49 -040047#include "libANGLE/renderer/Format.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040048#include "libANGLE/validationES.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000049
Geoff Langf6db0982015-08-25 13:04:00 -040050namespace
51{
52
Jamie Madillb6664922017-07-25 12:55:04 -040053#define ANGLE_HANDLE_ERR(X) \
54 handleError(X); \
55 return;
56#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
57
Ian Ewell3ffd78b2016-01-22 16:09:42 -050058template <typename T>
Geoff Lang4ddf5af2016-12-01 14:30:44 -050059std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030060 GLsizei numPaths,
61 const void *paths,
62 GLuint pathBase)
63{
64 std::vector<gl::Path *> ret;
65 ret.reserve(numPaths);
66
67 const auto *nameArray = static_cast<const T *>(paths);
68
69 for (GLsizei i = 0; i < numPaths; ++i)
70 {
71 const GLuint pathName = nameArray[i] + pathBase;
72
73 ret.push_back(resourceManager.getPath(pathName));
74 }
75
76 return ret;
77}
78
Geoff Lang4ddf5af2016-12-01 14:30:44 -050079std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030080 GLsizei numPaths,
81 GLenum pathNameType,
82 const void *paths,
83 GLuint pathBase)
84{
85 switch (pathNameType)
86 {
87 case GL_UNSIGNED_BYTE:
88 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
89
90 case GL_BYTE:
91 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
92
93 case GL_UNSIGNED_SHORT:
94 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
95
96 case GL_SHORT:
97 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
98
99 case GL_UNSIGNED_INT:
100 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
101
102 case GL_INT:
103 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
104 }
105
106 UNREACHABLE();
107 return std::vector<gl::Path *>();
108}
109
110template <typename T>
Jamie Madill5188a272018-07-25 10:53:56 -0400111gl::Error GetQueryObjectParameter(const gl::Context *context,
112 gl::Query *query,
113 GLenum pname,
114 T *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500115{
Geoff Lang2186c382016-10-14 10:54:54 -0400116 ASSERT(query != nullptr);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500117
118 switch (pname)
119 {
120 case GL_QUERY_RESULT_EXT:
Jamie Madill5188a272018-07-25 10:53:56 -0400121 return query->getResult(context, params);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500122 case GL_QUERY_RESULT_AVAILABLE_EXT:
123 {
124 bool available;
Jamie Madill5188a272018-07-25 10:53:56 -0400125 gl::Error error = query->isResultAvailable(context, &available);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500126 if (!error.isError())
127 {
jchen10a99ed552017-09-22 08:10:32 +0800128 *params = gl::CastFromStateValue<T>(pname, static_cast<GLuint>(available));
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500129 }
130 return error;
131 }
132 default:
133 UNREACHABLE();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500134 return gl::InternalError() << "Unreachable Error";
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500135 }
136}
137
Jamie Madill09463932018-04-04 05:26:59 -0400138void MarkTransformFeedbackBufferUsage(const gl::Context *context,
139 gl::TransformFeedback *transformFeedback,
James Darpinian30b604d2018-03-12 17:26:57 -0700140 GLsizei count,
141 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -0400142{
Geoff Lang1a683462015-09-29 15:09:59 -0400143 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400144 {
Jamie Madill09463932018-04-04 05:26:59 -0400145 transformFeedback->onVerticesDrawn(context, count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -0400146 }
147}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500148
149// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300150EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500151{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400152 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500153}
154
Martin Radev1be913c2016-07-11 17:59:16 +0300155EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
156{
157 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
158}
159
Geoff Langeb66a6e2016-10-31 13:06:12 -0400160gl::Version GetClientVersion(const egl::AttributeMap &attribs)
161{
162 return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
163}
164
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500165GLenum GetResetStrategy(const egl::AttributeMap &attribs)
166{
Lingfeng Yangb27b03a2018-02-19 13:38:48 -0800167 EGLAttrib attrib =
168 attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500169 switch (attrib)
170 {
171 case EGL_NO_RESET_NOTIFICATION:
172 return GL_NO_RESET_NOTIFICATION_EXT;
173 case EGL_LOSE_CONTEXT_ON_RESET:
174 return GL_LOSE_CONTEXT_ON_RESET_EXT;
175 default:
176 UNREACHABLE();
177 return GL_NONE;
178 }
179}
180
181bool GetRobustAccess(const egl::AttributeMap &attribs)
182{
Geoff Lang077f20a2016-11-01 10:08:02 -0400183 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
184 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
185 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500186}
187
188bool GetDebug(const egl::AttributeMap &attribs)
189{
Geoff Lang077f20a2016-11-01 10:08:02 -0400190 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
191 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500192}
193
194bool GetNoError(const egl::AttributeMap &attribs)
195{
196 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
197}
198
Geoff Langc287ea62016-09-16 14:46:51 -0400199bool GetWebGLContext(const egl::AttributeMap &attribs)
200{
Jamie Madill4230d482018-09-14 10:14:45 -0400201 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
Geoff Langc287ea62016-09-16 14:46:51 -0400202}
203
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400204bool GetExtensionsEnabled(const egl::AttributeMap &attribs, bool webGLContext)
205{
206 // If the context is WebGL, extensions are disabled by default
207 EGLAttrib defaultValue = webGLContext ? EGL_FALSE : EGL_TRUE;
208 return (attribs.get(EGL_EXTENSIONS_ENABLED_ANGLE, defaultValue) == EGL_TRUE);
209}
210
Geoff Langf41a7152016-09-19 15:11:17 -0400211bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
212{
Jamie Madill4230d482018-09-14 10:14:45 -0400213 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
Geoff Langf41a7152016-09-19 15:11:17 -0400214}
215
Geoff Langfeb8c682017-02-13 16:07:35 -0500216bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
217{
218 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
219}
220
Geoff Langb433e872017-10-05 14:01:47 -0400221bool GetRobustResourceInit(const egl::AttributeMap &attribs)
222{
223 return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
224}
225
Martin Radev9d901792016-07-15 15:58:58 +0300226std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
227{
228 std::string labelName;
229 if (label != nullptr)
230 {
231 size_t labelLength = length < 0 ? strlen(label) : length;
232 labelName = std::string(label, labelLength);
233 }
234 return labelName;
235}
236
237void GetObjectLabelBase(const std::string &objectLabel,
238 GLsizei bufSize,
239 GLsizei *length,
240 GLchar *label)
241{
242 size_t writeLength = objectLabel.length();
243 if (label != nullptr && bufSize > 0)
244 {
245 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
246 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
247 label[writeLength] = '\0';
248 }
249
250 if (length != nullptr)
251 {
252 *length = static_cast<GLsizei>(writeLength);
253 }
254}
255
Jamie Madill0f80ed82017-09-19 00:24:56 -0400256template <typename CapT, typename MaxT>
257void LimitCap(CapT *cap, MaxT maximum)
258{
259 *cap = std::min(*cap, static_cast<CapT>(maximum));
260}
261
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600262constexpr angle::PackedEnumMap<gl::PrimitiveMode, GLsizei> kMinimumPrimitiveCounts = {{
Jamie Madill526a6f62018-09-12 11:03:05 -0400263 1, /* Points */
264 2, /* Lines */
265 2, /* LineLoop */
266 2, /* LineStrip */
267 3, /* Triangles */
268 3, /* TriangleStrip */
269 3, /* TriangleFan */
270 2, /* LinesAdjacency */
271 2, /* LineStripAdjacency */
272 3, /* TrianglesAdjacency */
273 3, /* TriangleStripAdjacency */
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600274}};
275// Indices above are code-gen'd so make sure they don't change
276// if any of these static asserts are hit, must update kMinimumPrimitiveCounts abouve
277static_assert(static_cast<gl::PrimitiveMode>(0) == gl::PrimitiveMode::Points,
278 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
279static_assert(static_cast<gl::PrimitiveMode>(1) == gl::PrimitiveMode::Lines,
280 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
281static_assert(static_cast<gl::PrimitiveMode>(2) == gl::PrimitiveMode::LineLoop,
282 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
283static_assert(static_cast<gl::PrimitiveMode>(3) == gl::PrimitiveMode::LineStrip,
284 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
285static_assert(static_cast<gl::PrimitiveMode>(4) == gl::PrimitiveMode::Triangles,
286 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
287static_assert(static_cast<gl::PrimitiveMode>(5) == gl::PrimitiveMode::TriangleStrip,
288 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
289static_assert(static_cast<gl::PrimitiveMode>(6) == gl::PrimitiveMode::TriangleFan,
290 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
291static_assert(static_cast<gl::PrimitiveMode>(7) == gl::PrimitiveMode::LinesAdjacency,
292 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
293static_assert(static_cast<gl::PrimitiveMode>(8) == gl::PrimitiveMode::LineStripAdjacency,
294 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
295static_assert(static_cast<gl::PrimitiveMode>(9) == gl::PrimitiveMode::TrianglesAdjacency,
296 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
297static_assert(static_cast<gl::PrimitiveMode>(10) == gl::PrimitiveMode::TriangleStripAdjacency,
298 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
299static_assert(static_cast<gl::PrimitiveMode>(11) == gl::PrimitiveMode::EnumCount,
300 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
301
Jamie Madill6d32cef2018-08-14 02:34:28 -0400302enum SubjectIndexes : angle::SubjectIndex
303{
304 kTexture0SubjectIndex = 0,
305 kTextureMaxSubjectIndex = kTexture0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
306 kUniformBuffer0SubjectIndex = kTextureMaxSubjectIndex,
307 kUniformBufferMaxSubjectIndex =
308 kUniformBuffer0SubjectIndex + gl::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS,
Jamie Madille25b8002018-09-20 13:39:49 -0400309 kSampler0SubjectIndex = kUniformBufferMaxSubjectIndex,
310 kSamplerMaxSubjectIndex = kSampler0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
311 kVertexArraySubjectIndex = kSamplerMaxSubjectIndex,
Jamie Madill6d32cef2018-08-14 02:34:28 -0400312 kReadFramebufferSubjectIndex,
313 kDrawFramebufferSubjectIndex
314};
Geoff Langf6db0982015-08-25 13:04:00 -0400315} // anonymous namespace
316
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000317namespace gl
318{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000319
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400320Context::Context(rx::EGLImplFactory *implFactory,
321 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400322 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500323 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400324 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500325 const egl::AttributeMap &attribs,
Brandon Jones2b0cdcc2018-05-02 08:02:50 -0700326 const egl::DisplayExtensions &displayExtensions,
327 const egl::ClientExtensions &clientExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500328 : mState(reinterpret_cast<ContextID>(this),
329 shareContext ? &shareContext->mState : nullptr,
330 shareTextures,
331 GetClientVersion(attribs),
332 &mGLState,
333 mCaps,
334 mTextureCaps,
335 mExtensions,
336 mLimitations),
337 mSkipValidation(GetNoError(attribs)),
338 mDisplayTextureShareGroup(shareTextures != nullptr),
339 mSavedArgsType(nullptr),
Geoff Lang3cacf692018-06-20 16:49:57 -0400340 mImplementation(implFactory->createContext(mState, config, shareContext, attribs)),
Geoff Lang75359662018-04-11 01:42:27 -0400341 mLabel(nullptr),
Jamie Madill2f348d22017-06-05 10:50:59 -0400342 mCompiler(),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400343 mGLState(GetDebug(attribs),
344 GetBindGeneratesResource(attribs),
345 GetClientArraysEnabled(attribs),
346 GetRobustResourceInit(attribs),
347 memoryProgramCache != nullptr),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400348 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500349 mClientType(EGL_OPENGL_ES_API),
Jamie Madill6b873dd2018-07-12 23:56:30 -0400350 mErrors(this),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500351 mHasBeenCurrent(false),
352 mContextLost(false),
353 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700354 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500355 mResetStrategy(GetResetStrategy(attribs)),
356 mRobustAccess(GetRobustAccess(attribs)),
Geoff Lang33f11fb2018-05-07 13:42:47 -0400357 mSurfacelessSupported(displayExtensions.surfacelessContext),
358 mExplicitContextAvailable(clientExtensions.explicitContext),
Jamie Madill61e16b42017-06-19 11:13:23 -0400359 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
360 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madille14951e2017-03-09 18:55:16 -0500361 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400362 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400363 mMemoryProgramCache(memoryProgramCache),
Jamie 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 }
Geoff Lang3b573612016-10-31 14:08:10 -0400420 if (getClientVersion() >= Version(3, 1))
421 {
Olli Etuahod310a432018-08-24 15:40:23 +0300422 // TODO(http://anglebug.com/2775): These could also be enabled via extension
Geoff Lang3b573612016-10-31 14:08:10 -0400423 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500424 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800425 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Olli Etuahod310a432018-08-24 15:40:23 +0300426 Texture *zeroTexture2DMultisampleArray =
427 new Texture(mImplementation.get(), 0, TextureType::_2DMultisampleArray);
428 mZeroTextures[TextureType::_2DMultisampleArray].set(this, zeroTexture2DMultisampleArray);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800429
Jiajia Qin6eafb042016-12-27 17:04:07 +0800430 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
431 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800432 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800433 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800434
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800435 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
436 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400437 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800438 }
Geoff Lang3b573612016-10-31 14:08:10 -0400439 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000440
Geoff Langb0f917f2017-12-05 13:41:54 -0500441 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400442 {
443 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500444 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800445 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400446 }
447
Geoff Langb0f917f2017-12-05 13:41:54 -0500448 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400449 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500450 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800451 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400452 }
453
Jamie Madill4928b7c2017-06-20 12:57:39 -0400454 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500455
Jamie Madill57a89722013-07-02 11:57:03 -0400456 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000457
Geoff Langeb66a6e2016-10-31 13:06:12 -0400458 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400459 {
460 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
461 // In the initial state, a default transform feedback object is bound and treated as
462 // a transform feedback object with a name of zero. That object is bound any time
463 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400464 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400465 }
Geoff Langc8058452014-02-03 12:04:11 -0500466
Corentin Wallez336129f2017-10-17 15:55:40 -0400467 for (auto type : angle::AllEnums<BufferBinding>())
468 {
469 bindBuffer(type, 0);
470 }
471
472 bindRenderbuffer(GL_RENDERBUFFER, 0);
473
474 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
475 {
476 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
477 }
478
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700479 // Initialize GLES1 renderer if appropriate.
480 if (getClientVersion() < Version(2, 0))
481 {
482 mGLES1Renderer.reset(new GLES1Renderer());
483 }
484
Jamie Madillad9f24e2016-02-12 09:27:24 -0500485 // Initialize dirty bit masks
Jamie Madill9d0bb3d2018-10-09 20:29:13 -0400486 mAllDirtyBits.set();
487
Geoff Lang9bf86f02018-07-26 11:46:34 -0400488 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
489 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
490 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400491 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400492 mDrawDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400493
494 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
495 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
496 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madille25b8002018-09-20 13:39:49 -0400497 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400498
Jamie Madillc67323a2017-11-02 23:11:41 -0400499 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500500 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500501 // No dirty objects.
502
503 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400504 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500505 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400506 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500507 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
508
509 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
510 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
511 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
512 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
513 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
514 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
515 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
516 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
517 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
518 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
519 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400520 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500521 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
522
523 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
524 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700525 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400526 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
527 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500528 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
529 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400530
Xinghua Cao10a4d432017-11-28 14:46:26 +0800531 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
jchen1099118c12018-09-10 16:28:51 +0800532 mComputeDirtyBits.set(State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
533 mComputeDirtyBits.set(State::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800534 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
535 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
536 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
537 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
jchen1099118c12018-09-10 16:28:51 +0800538 mComputeDirtyBits.set(State::DIRTY_BIT_IMAGE_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800539 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800540 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400541 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400542 mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800543
Jamie Madillb4927eb2018-07-16 11:39:46 -0400544 mImplementation->setErrorSet(&mErrors);
545
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400546 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000547}
548
Jamie Madill4928b7c2017-06-20 12:57:39 -0400549egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000550{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700551 if (mGLES1Renderer)
552 {
553 mGLES1Renderer->onDestroy(this, &mGLState);
554 }
555
Jamie Madille7b3fe22018-04-05 09:42:46 -0400556 // Delete the Surface first to trigger a finish() in Vulkan.
Jamie Madille7b3fe22018-04-05 09:42:46 -0400557 ANGLE_TRY(releaseSurface(display));
558
Corentin Wallez80b24112015-08-25 16:41:57 -0400559 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000560 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400561 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000562 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400563 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000564
Corentin Wallez80b24112015-08-25 16:41:57 -0400565 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000566 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400567 if (query.second != nullptr)
568 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400569 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400570 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000571 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400572 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000573
Corentin Wallez80b24112015-08-25 16:41:57 -0400574 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400575 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400576 if (vertexArray.second)
577 {
578 vertexArray.second->onDestroy(this);
579 }
Jamie Madill57a89722013-07-02 11:57:03 -0400580 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400581 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400582
Corentin Wallez80b24112015-08-25 16:41:57 -0400583 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500584 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500585 if (transformFeedback.second != nullptr)
586 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500587 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500588 }
Geoff Langc8058452014-02-03 12:04:11 -0500589 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400590 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500591
Jamie Madill5b772312018-03-08 20:28:32 -0500592 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400593 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800594 if (zeroTexture.get() != nullptr)
595 {
596 ANGLE_TRY(zeroTexture->onDestroy(this));
597 zeroTexture.set(this, nullptr);
598 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400599 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000600
Jamie Madill2f348d22017-06-05 10:50:59 -0400601 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500602
Jamie Madill4928b7c2017-06-20 12:57:39 -0400603 mGLState.reset(this);
604
Jamie Madill6c1f6712017-02-14 19:08:04 -0500605 mState.mBuffers->release(this);
606 mState.mShaderPrograms->release(this);
607 mState.mTextures->release(this);
608 mState.mRenderbuffers->release(this);
609 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400610 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500611 mState.mPaths->release(this);
612 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800613 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400614
jchen107ae70d82018-07-06 13:47:01 +0800615 mThreadPool.reset();
616
Jamie Madill76e471e2017-10-21 09:56:01 -0400617 mImplementation->onDestroy(this);
618
Jamie Madill4928b7c2017-06-20 12:57:39 -0400619 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000620}
621
Jamie Madill70ee0f62017-02-06 16:04:20 -0500622Context::~Context()
623{
624}
625
Geoff Lang75359662018-04-11 01:42:27 -0400626void Context::setLabel(EGLLabelKHR label)
627{
628 mLabel = label;
629}
630
631EGLLabelKHR Context::getLabel() const
632{
633 return mLabel;
634}
635
Jamie Madill4928b7c2017-06-20 12:57:39 -0400636egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000637{
Jamie Madill61e16b42017-06-19 11:13:23 -0400638 mCurrentDisplay = display;
639
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000640 if (!mHasBeenCurrent)
641 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400642 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000643 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500644 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400645 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000646
Corentin Wallezc295e512017-01-27 17:47:50 -0500647 int width = 0;
648 int height = 0;
649 if (surface != nullptr)
650 {
651 width = surface->getWidth();
652 height = surface->getHeight();
653 }
654
655 mGLState.setViewportParams(0, 0, width, height);
656 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000657
658 mHasBeenCurrent = true;
659 }
660
Jamie Madill1b94d432015-08-07 13:23:23 -0400661 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700662 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400663 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400664
Jamie Madill4928b7c2017-06-20 12:57:39 -0400665 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500666
667 Framebuffer *newDefault = nullptr;
668 if (surface != nullptr)
669 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400670 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500671 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400672 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500673 }
674 else
675 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400676 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500677 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000678
Corentin Wallez37c39792015-08-20 14:19:46 -0400679 // Update default framebuffer, the binding of the previous default
680 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400681 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400682 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700683 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400684 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400685 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400686 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700687 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400688 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400689 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400690 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400691 }
Ian Ewell292f0052016-02-04 10:37:32 -0500692
693 // Notify the renderer of a context switch
Luc Ferron5396f2a2018-07-12 08:24:23 -0400694 ANGLE_TRY(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400695 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000696}
697
Jamie Madill4928b7c2017-06-20 12:57:39 -0400698egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400699{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400700 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400701
Geoff Langbf7b95d2018-05-01 16:48:21 -0400702 // Remove the default framebuffer
703 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500704 {
705 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400706 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500707 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400708
709 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500710 {
711 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400712 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500713 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400714
715 if (defaultFramebuffer)
716 {
717 defaultFramebuffer->onDestroy(this);
718 delete defaultFramebuffer;
719 }
720
Corentin Wallezc295e512017-01-27 17:47:50 -0500721 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
722
723 if (mCurrentSurface)
724 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400725 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500726 mCurrentSurface = nullptr;
727 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400728
729 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400730}
731
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000732GLuint Context::createBuffer()
733{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500734 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000735}
736
737GLuint Context::createProgram()
738{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500739 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000740}
741
Jiawei Shao385b3e02018-03-21 09:43:28 +0800742GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000743{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500744 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000745}
746
747GLuint Context::createTexture()
748{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500749 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000750}
751
752GLuint Context::createRenderbuffer()
753{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500754 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000755}
756
Jamie Madill13951342018-09-30 15:24:28 -0400757void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
758{
759 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(mImplementation.get(), range, createdOut));
760}
761
Brandon Jones59770802018-04-02 13:18:42 -0700762GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300763{
Jamie Madill13951342018-09-30 15:24:28 -0400764 GLuint created = 0;
765 tryGenPaths(range, &created);
766 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300767}
768
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000769// Returns an unused framebuffer name
770GLuint Context::createFramebuffer()
771{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500772 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000773}
774
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500775void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000776{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500777 for (int i = 0; i < n; i++)
778 {
779 GLuint handle = mFenceNVHandleAllocator.allocate();
780 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
781 fences[i] = handle;
782 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000783}
784
Yunchao Hea336b902017-08-02 16:05:21 +0800785GLuint Context::createProgramPipeline()
786{
787 return mState.mPipelines->createProgramPipeline();
788}
789
Jiawei Shao385b3e02018-03-21 09:43:28 +0800790GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800791{
792 UNIMPLEMENTED();
793 return 0u;
794}
795
James Darpinian4d9d4832018-03-13 12:43:28 -0700796void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000797{
James Darpinian4d9d4832018-03-13 12:43:28 -0700798 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
799 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000800 {
801 detachBuffer(buffer);
802 }
Jamie Madill893ab082014-05-16 16:56:10 -0400803
James Darpinian4d9d4832018-03-13 12:43:28 -0700804 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000805}
806
807void Context::deleteShader(GLuint shader)
808{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500809 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000810}
811
812void Context::deleteProgram(GLuint program)
813{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500814 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000815}
816
817void Context::deleteTexture(GLuint texture)
818{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500819 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000820 {
821 detachTexture(texture);
822 }
823
Jamie Madill6c1f6712017-02-14 19:08:04 -0500824 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000825}
826
827void Context::deleteRenderbuffer(GLuint renderbuffer)
828{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500829 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000830 {
831 detachRenderbuffer(renderbuffer);
832 }
Jamie Madill893ab082014-05-16 16:56:10 -0400833
Jamie Madill6c1f6712017-02-14 19:08:04 -0500834 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000835}
836
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400837void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400838{
839 // The spec specifies the underlying Fence object is not deleted until all current
840 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
841 // and since our API is currently designed for being called from a single thread, we can delete
842 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400843 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400844}
845
Yunchao Hea336b902017-08-02 16:05:21 +0800846void Context::deleteProgramPipeline(GLuint pipeline)
847{
848 if (mState.mPipelines->getProgramPipeline(pipeline))
849 {
850 detachProgramPipeline(pipeline);
851 }
852
853 mState.mPipelines->deleteObject(this, pipeline);
854}
855
Sami Väisänene45e53b2016-05-25 10:36:04 +0300856void Context::deletePaths(GLuint first, GLsizei range)
857{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500858 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300859}
860
Brandon Jones59770802018-04-02 13:18:42 -0700861bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300862{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500863 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300864 if (pathObj == nullptr)
865 return false;
866
867 return pathObj->hasPathData();
868}
869
Brandon Jones59770802018-04-02 13:18:42 -0700870bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300871{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500872 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300873}
874
Brandon Jones59770802018-04-02 13:18:42 -0700875void Context::pathCommands(GLuint path,
876 GLsizei numCommands,
877 const GLubyte *commands,
878 GLsizei numCoords,
879 GLenum coordType,
880 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300881{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500882 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300883
884 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
885}
886
Jamie Madill007530e2017-12-28 14:27:04 -0500887void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300888{
Jamie Madill007530e2017-12-28 14:27:04 -0500889 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300890
891 switch (pname)
892 {
893 case GL_PATH_STROKE_WIDTH_CHROMIUM:
894 pathObj->setStrokeWidth(value);
895 break;
896 case GL_PATH_END_CAPS_CHROMIUM:
897 pathObj->setEndCaps(static_cast<GLenum>(value));
898 break;
899 case GL_PATH_JOIN_STYLE_CHROMIUM:
900 pathObj->setJoinStyle(static_cast<GLenum>(value));
901 break;
902 case GL_PATH_MITER_LIMIT_CHROMIUM:
903 pathObj->setMiterLimit(value);
904 break;
905 case GL_PATH_STROKE_BOUND_CHROMIUM:
906 pathObj->setStrokeBound(value);
907 break;
908 default:
909 UNREACHABLE();
910 break;
911 }
912}
913
Jamie Madill007530e2017-12-28 14:27:04 -0500914void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300915{
Jamie Madill007530e2017-12-28 14:27:04 -0500916 // TODO(jmadill): Should use proper clamping/casting.
917 pathParameterf(path, pname, static_cast<GLfloat>(value));
918}
919
920void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
921{
922 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300923
924 switch (pname)
925 {
926 case GL_PATH_STROKE_WIDTH_CHROMIUM:
927 *value = pathObj->getStrokeWidth();
928 break;
929 case GL_PATH_END_CAPS_CHROMIUM:
930 *value = static_cast<GLfloat>(pathObj->getEndCaps());
931 break;
932 case GL_PATH_JOIN_STYLE_CHROMIUM:
933 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
934 break;
935 case GL_PATH_MITER_LIMIT_CHROMIUM:
936 *value = pathObj->getMiterLimit();
937 break;
938 case GL_PATH_STROKE_BOUND_CHROMIUM:
939 *value = pathObj->getStrokeBound();
940 break;
941 default:
942 UNREACHABLE();
943 break;
944 }
945}
946
Jamie Madill007530e2017-12-28 14:27:04 -0500947void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
948{
949 GLfloat val = 0.0f;
950 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
951 if (value)
952 *value = static_cast<GLint>(val);
953}
954
Brandon Jones59770802018-04-02 13:18:42 -0700955void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300956{
957 mGLState.setPathStencilFunc(func, ref, mask);
958}
959
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000960void Context::deleteFramebuffer(GLuint framebuffer)
961{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500962 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000963 {
964 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000965 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500966
Jamie Madill6c1f6712017-02-14 19:08:04 -0500967 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000968}
969
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500970void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000971{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500972 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000973 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500974 GLuint fence = fences[i];
975
976 FenceNV *fenceObject = nullptr;
977 if (mFenceNVMap.erase(fence, &fenceObject))
978 {
979 mFenceNVHandleAllocator.release(fence);
980 delete fenceObject;
981 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000982 }
983}
984
Geoff Lang70d0f492015-12-10 17:45:46 -0500985Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000986{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500987 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000988}
989
Geoff Lang70d0f492015-12-10 17:45:46 -0500990Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000991{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500992 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000993}
994
Jamie Madill70b5bb02017-08-28 13:32:37 -0400995Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400996{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400997 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400998}
999
Jamie Madill57a89722013-07-02 11:57:03 -04001000VertexArray *Context::getVertexArray(GLuint handle) const
1001{
Jamie Madill96a483b2017-06-27 16:49:21 -04001002 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -04001003}
1004
Jamie Madilldc356042013-07-19 16:36:57 -04001005Sampler *Context::getSampler(GLuint handle) const
1006{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001007 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -04001008}
1009
Geoff Langc8058452014-02-03 12:04:11 -05001010TransformFeedback *Context::getTransformFeedback(GLuint handle) const
1011{
Jamie Madill96a483b2017-06-27 16:49:21 -04001012 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -05001013}
1014
Yunchao Hea336b902017-08-02 16:05:21 +08001015ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
1016{
1017 return mState.mPipelines->getProgramPipeline(handle);
1018}
1019
Geoff Lang75359662018-04-11 01:42:27 -04001020gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001021{
1022 switch (identifier)
1023 {
1024 case GL_BUFFER:
1025 return getBuffer(name);
1026 case GL_SHADER:
1027 return getShader(name);
1028 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04001029 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -05001030 case GL_VERTEX_ARRAY:
1031 return getVertexArray(name);
1032 case GL_QUERY:
1033 return getQuery(name);
1034 case GL_TRANSFORM_FEEDBACK:
1035 return getTransformFeedback(name);
1036 case GL_SAMPLER:
1037 return getSampler(name);
1038 case GL_TEXTURE:
1039 return getTexture(name);
1040 case GL_RENDERBUFFER:
1041 return getRenderbuffer(name);
1042 case GL_FRAMEBUFFER:
1043 return getFramebuffer(name);
1044 default:
1045 UNREACHABLE();
1046 return nullptr;
1047 }
1048}
1049
Geoff Lang75359662018-04-11 01:42:27 -04001050gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001051{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001052 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001053}
1054
Martin Radev9d901792016-07-15 15:58:58 +03001055void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1056{
Geoff Lang75359662018-04-11 01:42:27 -04001057 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001058 ASSERT(object != nullptr);
1059
1060 std::string labelName = GetObjectLabelFromPointer(length, label);
1061 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001062
1063 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1064 // specified object is active until we do this.
1065 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001066}
1067
1068void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1069{
Geoff Lang75359662018-04-11 01:42:27 -04001070 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001071 ASSERT(object != nullptr);
1072
1073 std::string labelName = GetObjectLabelFromPointer(length, label);
1074 object->setLabel(labelName);
1075}
1076
1077void Context::getObjectLabel(GLenum identifier,
1078 GLuint name,
1079 GLsizei bufSize,
1080 GLsizei *length,
1081 GLchar *label) const
1082{
Geoff Lang75359662018-04-11 01:42:27 -04001083 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001084 ASSERT(object != nullptr);
1085
1086 const std::string &objectLabel = object->getLabel();
1087 GetObjectLabelBase(objectLabel, bufSize, length, label);
1088}
1089
1090void Context::getObjectPtrLabel(const void *ptr,
1091 GLsizei bufSize,
1092 GLsizei *length,
1093 GLchar *label) const
1094{
Geoff Lang75359662018-04-11 01:42:27 -04001095 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001096 ASSERT(object != nullptr);
1097
1098 const std::string &objectLabel = object->getLabel();
1099 GetObjectLabelBase(objectLabel, bufSize, length, label);
1100}
1101
Jamie Madilldc356042013-07-19 16:36:57 -04001102bool Context::isSampler(GLuint samplerName) const
1103{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001104 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001105}
1106
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001107void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001108{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001109 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001110
Jamie Madilldedd7b92014-11-05 16:30:36 -05001111 if (handle == 0)
1112 {
1113 texture = mZeroTextures[target].get();
1114 }
1115 else
1116 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001117 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001118 }
1119
1120 ASSERT(texture);
Jamie Madill14246812018-10-03 17:51:16 -04001121 ANGLE_CONTEXT_TRY(mGLState.setSamplerTexture(this, target, texture));
Jamie Madilld84b6732018-09-06 15:54:35 -04001122 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001123}
1124
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001125void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001126{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001127 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1128 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001129 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001130 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001131}
1132
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001133void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001134{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001135 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1136 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001137 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001138 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001139 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001140}
1141
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001142void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001143{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001144 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001145 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001146 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001147 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001148}
1149
Shao80957d92017-02-20 21:25:59 +08001150void Context::bindVertexBuffer(GLuint bindingIndex,
1151 GLuint bufferHandle,
1152 GLintptr offset,
1153 GLsizei stride)
1154{
1155 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001156 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001157 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001158}
1159
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001160void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001161{
Geoff Lang76b10c92014-09-05 16:28:14 -04001162 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001163 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001164 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001165 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001166 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001167}
1168
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001169void Context::bindImageTexture(GLuint unit,
1170 GLuint texture,
1171 GLint level,
1172 GLboolean layered,
1173 GLint layer,
1174 GLenum access,
1175 GLenum format)
1176{
1177 Texture *tex = mState.mTextures->getTexture(texture);
1178 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1179}
1180
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001181void Context::useProgram(GLuint program)
1182{
Jamie Madille3bb6b72018-10-03 17:51:15 -04001183 ANGLE_CONTEXT_TRY(mGLState.setProgram(this, getProgramResolveLink(program)));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001184 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001185}
1186
Jiajia Qin5451d532017-11-16 17:16:34 +08001187void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1188{
1189 UNIMPLEMENTED();
1190}
1191
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001192void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001193{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001194 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001195 TransformFeedback *transformFeedback =
1196 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001197 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Jamie Madilld84b6732018-09-06 15:54:35 -04001198 mStateCache.onTransformFeedbackChange(this);
Geoff Langc8058452014-02-03 12:04:11 -05001199}
1200
Yunchao Hea336b902017-08-02 16:05:21 +08001201void Context::bindProgramPipeline(GLuint pipelineHandle)
1202{
1203 ProgramPipeline *pipeline =
1204 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1205 mGLState.setProgramPipelineBinding(this, pipeline);
1206}
1207
Corentin Wallezad3ae902018-03-09 13:40:42 -05001208void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001209{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001210 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001211 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001212
Geoff Lang5aad9672014-09-08 11:10:42 -04001213 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001214 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001215
1216 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001217 mGLState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001218 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001219}
1220
Corentin Wallezad3ae902018-03-09 13:40:42 -05001221void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001222{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001223 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001224 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001225
Jamie Madill5188a272018-07-25 10:53:56 -04001226 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001227
Geoff Lang5aad9672014-09-08 11:10:42 -04001228 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001229 mGLState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001230 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001231}
1232
Corentin Wallezad3ae902018-03-09 13:40:42 -05001233void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001234{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001235 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001236
1237 Query *queryObject = getQuery(id, true, target);
1238 ASSERT(queryObject);
1239
Jamie Madill5188a272018-07-25 10:53:56 -04001240 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001241}
1242
Corentin Wallezad3ae902018-03-09 13:40:42 -05001243void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001244{
1245 switch (pname)
1246 {
1247 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001248 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001249 break;
1250 case GL_QUERY_COUNTER_BITS_EXT:
1251 switch (target)
1252 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001253 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001254 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1255 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001256 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001257 params[0] = getExtensions().queryCounterBitsTimestamp;
1258 break;
1259 default:
1260 UNREACHABLE();
1261 params[0] = 0;
1262 break;
1263 }
1264 break;
1265 default:
1266 UNREACHABLE();
1267 return;
1268 }
1269}
1270
Corentin Wallezad3ae902018-03-09 13:40:42 -05001271void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001272 GLenum pname,
1273 GLsizei bufSize,
1274 GLsizei *length,
1275 GLint *params)
1276{
1277 getQueryiv(target, pname, params);
1278}
1279
Geoff Lang2186c382016-10-14 10:54:54 -04001280void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001281{
Jamie Madill5188a272018-07-25 10:53:56 -04001282 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001283}
1284
Brandon Jones59770802018-04-02 13:18:42 -07001285void Context::getQueryObjectivRobust(GLuint id,
1286 GLenum pname,
1287 GLsizei bufSize,
1288 GLsizei *length,
1289 GLint *params)
1290{
1291 getQueryObjectiv(id, pname, params);
1292}
1293
Geoff Lang2186c382016-10-14 10:54:54 -04001294void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001295{
Jamie Madill5188a272018-07-25 10:53:56 -04001296 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001297}
1298
Brandon Jones59770802018-04-02 13:18:42 -07001299void Context::getQueryObjectuivRobust(GLuint id,
1300 GLenum pname,
1301 GLsizei bufSize,
1302 GLsizei *length,
1303 GLuint *params)
1304{
1305 getQueryObjectuiv(id, pname, params);
1306}
1307
Geoff Lang2186c382016-10-14 10:54:54 -04001308void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001309{
Jamie Madill5188a272018-07-25 10:53:56 -04001310 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001311}
1312
Brandon Jones59770802018-04-02 13:18:42 -07001313void Context::getQueryObjecti64vRobust(GLuint id,
1314 GLenum pname,
1315 GLsizei bufSize,
1316 GLsizei *length,
1317 GLint64 *params)
1318{
1319 getQueryObjecti64v(id, pname, params);
1320}
1321
Geoff Lang2186c382016-10-14 10:54:54 -04001322void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001323{
Jamie Madill5188a272018-07-25 10:53:56 -04001324 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001325}
1326
Brandon Jones59770802018-04-02 13:18:42 -07001327void Context::getQueryObjectui64vRobust(GLuint id,
1328 GLenum pname,
1329 GLsizei bufSize,
1330 GLsizei *length,
1331 GLuint64 *params)
1332{
1333 getQueryObjectui64v(id, pname, params);
1334}
1335
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001336Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001337{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001338 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001339}
1340
Jamie Madill2f348d22017-06-05 10:50:59 -04001341FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001342{
Jamie Madill96a483b2017-06-27 16:49:21 -04001343 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001344}
1345
Corentin Wallezad3ae902018-03-09 13:40:42 -05001346Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001347{
Jamie Madill96a483b2017-06-27 16:49:21 -04001348 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001349 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001350 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001351 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001352
1353 Query *query = mQueryMap.query(handle);
1354 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001355 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001356 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001357 query = new Query(mImplementation->createQuery(type), handle);
1358 query->addRef();
1359 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001360 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001361 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001362}
1363
Geoff Lang70d0f492015-12-10 17:45:46 -05001364Query *Context::getQuery(GLuint handle) const
1365{
Jamie Madill96a483b2017-06-27 16:49:21 -04001366 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001367}
1368
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001369Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001370{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001371 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1372 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001373}
1374
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001375Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001376{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001377 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001378}
1379
Geoff Lang492a7e42014-11-05 13:27:06 -05001380Compiler *Context::getCompiler() const
1381{
Jamie Madill2f348d22017-06-05 10:50:59 -04001382 if (mCompiler.get() == nullptr)
1383 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001384 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001385 }
1386 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001387}
1388
Jamie Madillc1d770e2017-04-13 17:31:24 -04001389void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001390{
1391 switch (pname)
1392 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001393 case GL_SHADER_COMPILER:
1394 *params = GL_TRUE;
1395 break;
1396 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1397 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1398 break;
1399 default:
1400 mGLState.getBooleanv(pname, params);
1401 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001402 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001403}
1404
Jamie Madillc1d770e2017-04-13 17:31:24 -04001405void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001406{
Shannon Woods53a94a82014-06-24 15:20:36 -04001407 // Queries about context capabilities and maximums are answered by Context.
1408 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001409 switch (pname)
1410 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001411 case GL_ALIASED_LINE_WIDTH_RANGE:
1412 params[0] = mCaps.minAliasedLineWidth;
1413 params[1] = mCaps.maxAliasedLineWidth;
1414 break;
1415 case GL_ALIASED_POINT_SIZE_RANGE:
1416 params[0] = mCaps.minAliasedPointSize;
1417 params[1] = mCaps.maxAliasedPointSize;
1418 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001419 case GL_SMOOTH_POINT_SIZE_RANGE:
1420 params[0] = mCaps.minSmoothPointSize;
1421 params[1] = mCaps.maxSmoothPointSize;
1422 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001423 case GL_SMOOTH_LINE_WIDTH_RANGE:
1424 params[0] = mCaps.minSmoothLineWidth;
1425 params[1] = mCaps.maxSmoothLineWidth;
1426 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001427 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1428 ASSERT(mExtensions.textureFilterAnisotropic);
1429 *params = mExtensions.maxTextureAnisotropy;
1430 break;
1431 case GL_MAX_TEXTURE_LOD_BIAS:
1432 *params = mCaps.maxLODBias;
1433 break;
1434
1435 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1436 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1437 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001438 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1439 // GLES1 constants for modelview/projection matrix.
1440 if (getClientVersion() < Version(2, 0))
1441 {
1442 mGLState.getFloatv(pname, params);
1443 }
1444 else
1445 {
1446 ASSERT(mExtensions.pathRendering);
1447 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1448 memcpy(params, m, 16 * sizeof(GLfloat));
1449 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001450 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001451 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001452
Jamie Madill231c7f52017-04-26 13:45:37 -04001453 default:
1454 mGLState.getFloatv(pname, params);
1455 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001456 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001457}
1458
Jamie Madillc1d770e2017-04-13 17:31:24 -04001459void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001460{
Shannon Woods53a94a82014-06-24 15:20:36 -04001461 // Queries about context capabilities and maximums are answered by Context.
1462 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001463
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001464 switch (pname)
1465 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001466 case GL_MAX_VERTEX_ATTRIBS:
1467 *params = mCaps.maxVertexAttributes;
1468 break;
1469 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1470 *params = mCaps.maxVertexUniformVectors;
1471 break;
1472 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001473 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001474 break;
1475 case GL_MAX_VARYING_VECTORS:
1476 *params = mCaps.maxVaryingVectors;
1477 break;
1478 case GL_MAX_VARYING_COMPONENTS:
1479 *params = mCaps.maxVertexOutputComponents;
1480 break;
1481 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1482 *params = mCaps.maxCombinedTextureImageUnits;
1483 break;
1484 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001485 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001486 break;
1487 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001488 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001489 break;
1490 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1491 *params = mCaps.maxFragmentUniformVectors;
1492 break;
1493 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001494 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001495 break;
1496 case GL_MAX_RENDERBUFFER_SIZE:
1497 *params = mCaps.maxRenderbufferSize;
1498 break;
1499 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1500 *params = mCaps.maxColorAttachments;
1501 break;
1502 case GL_MAX_DRAW_BUFFERS_EXT:
1503 *params = mCaps.maxDrawBuffers;
1504 break;
1505 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1506 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1507 case GL_SUBPIXEL_BITS:
1508 *params = 4;
1509 break;
1510 case GL_MAX_TEXTURE_SIZE:
1511 *params = mCaps.max2DTextureSize;
1512 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001513 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1514 *params = mCaps.maxRectangleTextureSize;
1515 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001516 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1517 *params = mCaps.maxCubeMapTextureSize;
1518 break;
1519 case GL_MAX_3D_TEXTURE_SIZE:
1520 *params = mCaps.max3DTextureSize;
1521 break;
1522 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1523 *params = mCaps.maxArrayTextureLayers;
1524 break;
1525 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1526 *params = mCaps.uniformBufferOffsetAlignment;
1527 break;
1528 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1529 *params = mCaps.maxUniformBufferBindings;
1530 break;
1531 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001532 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001533 break;
1534 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001535 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001536 break;
1537 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1538 *params = mCaps.maxCombinedTextureImageUnits;
1539 break;
1540 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1541 *params = mCaps.maxVertexOutputComponents;
1542 break;
1543 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1544 *params = mCaps.maxFragmentInputComponents;
1545 break;
1546 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1547 *params = mCaps.minProgramTexelOffset;
1548 break;
1549 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1550 *params = mCaps.maxProgramTexelOffset;
1551 break;
1552 case GL_MAJOR_VERSION:
1553 *params = getClientVersion().major;
1554 break;
1555 case GL_MINOR_VERSION:
1556 *params = getClientVersion().minor;
1557 break;
1558 case GL_MAX_ELEMENTS_INDICES:
1559 *params = mCaps.maxElementsIndices;
1560 break;
1561 case GL_MAX_ELEMENTS_VERTICES:
1562 *params = mCaps.maxElementsVertices;
1563 break;
1564 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1565 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1566 break;
1567 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1568 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1569 break;
1570 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1571 *params = mCaps.maxTransformFeedbackSeparateComponents;
1572 break;
1573 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1574 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1575 break;
1576 case GL_MAX_SAMPLES_ANGLE:
1577 *params = mCaps.maxSamples;
1578 break;
1579 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001580 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001581 params[0] = mCaps.maxViewportWidth;
1582 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001583 }
1584 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001585 case GL_COMPRESSED_TEXTURE_FORMATS:
1586 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1587 params);
1588 break;
1589 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1590 *params = mResetStrategy;
1591 break;
1592 case GL_NUM_SHADER_BINARY_FORMATS:
1593 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1594 break;
1595 case GL_SHADER_BINARY_FORMATS:
1596 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1597 break;
1598 case GL_NUM_PROGRAM_BINARY_FORMATS:
1599 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1600 break;
1601 case GL_PROGRAM_BINARY_FORMATS:
1602 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1603 break;
1604 case GL_NUM_EXTENSIONS:
1605 *params = static_cast<GLint>(mExtensionStrings.size());
1606 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001607
Geoff Lang38f24ee2018-10-01 13:04:59 -04001608 // GL_ANGLE_request_extension
1609 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1610 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1611 break;
1612
Jamie Madill231c7f52017-04-26 13:45:37 -04001613 // GL_KHR_debug
1614 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1615 *params = mExtensions.maxDebugMessageLength;
1616 break;
1617 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1618 *params = mExtensions.maxDebugLoggedMessages;
1619 break;
1620 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1621 *params = mExtensions.maxDebugGroupStackDepth;
1622 break;
1623 case GL_MAX_LABEL_LENGTH:
1624 *params = mExtensions.maxLabelLength;
1625 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001626
Martin Radeve5285d22017-07-14 16:23:53 +03001627 // GL_ANGLE_multiview
1628 case GL_MAX_VIEWS_ANGLE:
1629 *params = mExtensions.maxViews;
1630 break;
1631
Jamie Madill231c7f52017-04-26 13:45:37 -04001632 // GL_EXT_disjoint_timer_query
1633 case GL_GPU_DISJOINT_EXT:
1634 *params = mImplementation->getGPUDisjoint();
1635 break;
1636 case GL_MAX_FRAMEBUFFER_WIDTH:
1637 *params = mCaps.maxFramebufferWidth;
1638 break;
1639 case GL_MAX_FRAMEBUFFER_HEIGHT:
1640 *params = mCaps.maxFramebufferHeight;
1641 break;
1642 case GL_MAX_FRAMEBUFFER_SAMPLES:
1643 *params = mCaps.maxFramebufferSamples;
1644 break;
1645 case GL_MAX_SAMPLE_MASK_WORDS:
1646 *params = mCaps.maxSampleMaskWords;
1647 break;
1648 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1649 *params = mCaps.maxColorTextureSamples;
1650 break;
1651 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1652 *params = mCaps.maxDepthTextureSamples;
1653 break;
1654 case GL_MAX_INTEGER_SAMPLES:
1655 *params = mCaps.maxIntegerSamples;
1656 break;
1657 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1658 *params = mCaps.maxVertexAttribRelativeOffset;
1659 break;
1660 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1661 *params = mCaps.maxVertexAttribBindings;
1662 break;
1663 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1664 *params = mCaps.maxVertexAttribStride;
1665 break;
1666 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001667 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001668 break;
1669 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001670 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001671 break;
1672 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001673 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001674 break;
1675 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001676 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001677 break;
1678 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001679 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001680 break;
1681 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001682 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001683 break;
1684 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001685 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001686 break;
1687 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001688 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001689 break;
1690 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1691 *params = mCaps.minProgramTextureGatherOffset;
1692 break;
1693 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1694 *params = mCaps.maxProgramTextureGatherOffset;
1695 break;
1696 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1697 *params = mCaps.maxComputeWorkGroupInvocations;
1698 break;
1699 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001700 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001701 break;
1702 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001703 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001704 break;
1705 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1706 *params = mCaps.maxComputeSharedMemorySize;
1707 break;
1708 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001709 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001710 break;
1711 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001712 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001713 break;
1714 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001715 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001716 break;
1717 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001718 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001719 break;
1720 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001721 *params =
1722 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001723 break;
1724 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001725 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001726 break;
1727 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1728 *params = mCaps.maxCombinedShaderOutputResources;
1729 break;
1730 case GL_MAX_UNIFORM_LOCATIONS:
1731 *params = mCaps.maxUniformLocations;
1732 break;
1733 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1734 *params = mCaps.maxAtomicCounterBufferBindings;
1735 break;
1736 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1737 *params = mCaps.maxAtomicCounterBufferSize;
1738 break;
1739 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1740 *params = mCaps.maxCombinedAtomicCounterBuffers;
1741 break;
1742 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1743 *params = mCaps.maxCombinedAtomicCounters;
1744 break;
1745 case GL_MAX_IMAGE_UNITS:
1746 *params = mCaps.maxImageUnits;
1747 break;
1748 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1749 *params = mCaps.maxCombinedImageUniforms;
1750 break;
1751 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1752 *params = mCaps.maxShaderStorageBufferBindings;
1753 break;
1754 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1755 *params = mCaps.maxCombinedShaderStorageBlocks;
1756 break;
1757 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1758 *params = mCaps.shaderStorageBufferOffsetAlignment;
1759 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001760
1761 // GL_EXT_geometry_shader
1762 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1763 *params = mCaps.maxFramebufferLayers;
1764 break;
1765 case GL_LAYER_PROVOKING_VERTEX_EXT:
1766 *params = mCaps.layerProvokingVertex;
1767 break;
1768 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001769 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001770 break;
1771 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001772 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001773 break;
1774 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001775 *params =
1776 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001777 break;
1778 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1779 *params = mCaps.maxGeometryInputComponents;
1780 break;
1781 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1782 *params = mCaps.maxGeometryOutputComponents;
1783 break;
1784 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1785 *params = mCaps.maxGeometryOutputVertices;
1786 break;
1787 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1788 *params = mCaps.maxGeometryTotalOutputComponents;
1789 break;
1790 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1791 *params = mCaps.maxGeometryShaderInvocations;
1792 break;
1793 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001794 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001795 break;
1796 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001797 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001798 break;
1799 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001800 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001801 break;
1802 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001803 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001804 break;
1805 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001806 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001807 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001808 // GLES1 emulation: Caps queries
1809 case GL_MAX_TEXTURE_UNITS:
1810 *params = mCaps.maxMultitextureUnits;
1811 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001812 case GL_MAX_MODELVIEW_STACK_DEPTH:
1813 *params = mCaps.maxModelviewMatrixStackDepth;
1814 break;
1815 case GL_MAX_PROJECTION_STACK_DEPTH:
1816 *params = mCaps.maxProjectionMatrixStackDepth;
1817 break;
1818 case GL_MAX_TEXTURE_STACK_DEPTH:
1819 *params = mCaps.maxTextureMatrixStackDepth;
1820 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001821 case GL_MAX_LIGHTS:
1822 *params = mCaps.maxLights;
1823 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001824 case GL_MAX_CLIP_PLANES:
1825 *params = mCaps.maxClipPlanes;
1826 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001827 // GLES1 emulation: Vertex attribute queries
1828 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1829 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1830 case GL_COLOR_ARRAY_BUFFER_BINDING:
1831 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1832 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1833 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1834 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1835 break;
1836 case GL_VERTEX_ARRAY_STRIDE:
1837 case GL_NORMAL_ARRAY_STRIDE:
1838 case GL_COLOR_ARRAY_STRIDE:
1839 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1840 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1841 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1842 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1843 break;
1844 case GL_VERTEX_ARRAY_SIZE:
1845 case GL_COLOR_ARRAY_SIZE:
1846 case GL_TEXTURE_COORD_ARRAY_SIZE:
1847 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1848 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1849 break;
1850 case GL_VERTEX_ARRAY_TYPE:
1851 case GL_COLOR_ARRAY_TYPE:
1852 case GL_NORMAL_ARRAY_TYPE:
1853 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1854 case GL_TEXTURE_COORD_ARRAY_TYPE:
1855 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1856 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1857 break;
1858
jchen1082af6202018-06-22 10:59:52 +08001859 // GL_KHR_parallel_shader_compile
1860 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1861 *params = mGLState.getMaxShaderCompilerThreads();
1862 break;
1863
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001864 // GL_EXT_blend_func_extended
1865 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
1866 *params = mExtensions.maxDualSourceDrawBuffers;
1867 break;
1868
Jamie Madill231c7f52017-04-26 13:45:37 -04001869 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001870 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001871 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001872 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001873}
1874
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001875void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001876{
Shannon Woods53a94a82014-06-24 15:20:36 -04001877 // Queries about context capabilities and maximums are answered by Context.
1878 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001879 switch (pname)
1880 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001881 case GL_MAX_ELEMENT_INDEX:
1882 *params = mCaps.maxElementIndex;
1883 break;
1884 case GL_MAX_UNIFORM_BLOCK_SIZE:
1885 *params = mCaps.maxUniformBlockSize;
1886 break;
1887 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001888 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001889 break;
1890 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001891 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001892 break;
1893 case GL_MAX_SERVER_WAIT_TIMEOUT:
1894 *params = mCaps.maxServerWaitTimeout;
1895 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001896
Jamie Madill231c7f52017-04-26 13:45:37 -04001897 // GL_EXT_disjoint_timer_query
1898 case GL_TIMESTAMP_EXT:
1899 *params = mImplementation->getTimestamp();
1900 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001901
Jamie Madill231c7f52017-04-26 13:45:37 -04001902 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1903 *params = mCaps.maxShaderStorageBlockSize;
1904 break;
1905 default:
1906 UNREACHABLE();
1907 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001908 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001909}
1910
Geoff Lang70d0f492015-12-10 17:45:46 -05001911void Context::getPointerv(GLenum pname, void **params) const
1912{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001913 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001914}
1915
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001916void Context::getPointervRobustANGLERobust(GLenum pname,
1917 GLsizei bufSize,
1918 GLsizei *length,
1919 void **params)
1920{
1921 UNIMPLEMENTED();
1922}
1923
Martin Radev66fb8202016-07-28 11:45:20 +03001924void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001925{
Shannon Woods53a94a82014-06-24 15:20:36 -04001926 // Queries about context capabilities and maximums are answered by Context.
1927 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001928
1929 GLenum nativeType;
1930 unsigned int numParams;
1931 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1932 ASSERT(queryStatus);
1933
1934 if (nativeType == GL_INT)
1935 {
1936 switch (target)
1937 {
1938 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1939 ASSERT(index < 3u);
1940 *data = mCaps.maxComputeWorkGroupCount[index];
1941 break;
1942 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1943 ASSERT(index < 3u);
1944 *data = mCaps.maxComputeWorkGroupSize[index];
1945 break;
1946 default:
1947 mGLState.getIntegeri_v(target, index, data);
1948 }
1949 }
1950 else
1951 {
1952 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1953 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001954}
1955
Brandon Jones59770802018-04-02 13:18:42 -07001956void Context::getIntegeri_vRobust(GLenum target,
1957 GLuint index,
1958 GLsizei bufSize,
1959 GLsizei *length,
1960 GLint *data)
1961{
1962 getIntegeri_v(target, index, data);
1963}
1964
Martin Radev66fb8202016-07-28 11:45:20 +03001965void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001966{
Shannon Woods53a94a82014-06-24 15:20:36 -04001967 // Queries about context capabilities and maximums are answered by Context.
1968 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001969
1970 GLenum nativeType;
1971 unsigned int numParams;
1972 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1973 ASSERT(queryStatus);
1974
1975 if (nativeType == GL_INT_64_ANGLEX)
1976 {
1977 mGLState.getInteger64i_v(target, index, data);
1978 }
1979 else
1980 {
1981 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1982 }
1983}
1984
Brandon Jones59770802018-04-02 13:18:42 -07001985void Context::getInteger64i_vRobust(GLenum target,
1986 GLuint index,
1987 GLsizei bufSize,
1988 GLsizei *length,
1989 GLint64 *data)
1990{
1991 getInteger64i_v(target, index, data);
1992}
1993
Martin Radev66fb8202016-07-28 11:45:20 +03001994void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1995{
1996 // Queries about context capabilities and maximums are answered by Context.
1997 // Queries about current GL state values are answered by State.
1998
1999 GLenum nativeType;
2000 unsigned int numParams;
2001 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
2002 ASSERT(queryStatus);
2003
2004 if (nativeType == GL_BOOL)
2005 {
2006 mGLState.getBooleani_v(target, index, data);
2007 }
2008 else
2009 {
2010 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
2011 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04002012}
2013
Brandon Jones59770802018-04-02 13:18:42 -07002014void Context::getBooleani_vRobust(GLenum target,
2015 GLuint index,
2016 GLsizei bufSize,
2017 GLsizei *length,
2018 GLboolean *data)
2019{
2020 getBooleani_v(target, index, data);
2021}
2022
Corentin Wallez336129f2017-10-17 15:55:40 -04002023void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002024{
2025 Buffer *buffer = mGLState.getTargetBuffer(target);
2026 QueryBufferParameteriv(buffer, pname, params);
2027}
2028
Brandon Jones59770802018-04-02 13:18:42 -07002029void Context::getBufferParameterivRobust(BufferBinding target,
2030 GLenum pname,
2031 GLsizei bufSize,
2032 GLsizei *length,
2033 GLint *params)
2034{
2035 getBufferParameteriv(target, pname, params);
2036}
2037
He Yunchao010e4db2017-03-03 14:22:06 +08002038void Context::getFramebufferAttachmentParameteriv(GLenum target,
2039 GLenum attachment,
2040 GLenum pname,
2041 GLint *params)
2042{
2043 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002044 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002045}
2046
Brandon Jones59770802018-04-02 13:18:42 -07002047void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2048 GLenum attachment,
2049 GLenum pname,
2050 GLsizei bufSize,
2051 GLsizei *length,
2052 GLint *params)
2053{
2054 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2055}
2056
He Yunchao010e4db2017-03-03 14:22:06 +08002057void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2058{
2059 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2060 QueryRenderbufferiv(this, renderbuffer, pname, params);
2061}
2062
Brandon Jones59770802018-04-02 13:18:42 -07002063void Context::getRenderbufferParameterivRobust(GLenum target,
2064 GLenum pname,
2065 GLsizei bufSize,
2066 GLsizei *length,
2067 GLint *params)
2068{
2069 getRenderbufferParameteriv(target, pname, params);
2070}
2071
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002072void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002073{
2074 Texture *texture = getTargetTexture(target);
2075 QueryTexParameterfv(texture, pname, params);
2076}
2077
Brandon Jones59770802018-04-02 13:18:42 -07002078void Context::getTexParameterfvRobust(TextureType target,
2079 GLenum pname,
2080 GLsizei bufSize,
2081 GLsizei *length,
2082 GLfloat *params)
2083{
2084 getTexParameterfv(target, pname, params);
2085}
2086
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002087void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002088{
2089 Texture *texture = getTargetTexture(target);
2090 QueryTexParameteriv(texture, pname, params);
2091}
Jiajia Qin5451d532017-11-16 17:16:34 +08002092
Brandon Jones59770802018-04-02 13:18:42 -07002093void Context::getTexParameterivRobust(TextureType target,
2094 GLenum pname,
2095 GLsizei bufSize,
2096 GLsizei *length,
2097 GLint *params)
2098{
2099 getTexParameteriv(target, pname, params);
2100}
2101
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002102void Context::getTexParameterIivRobust(TextureType target,
2103 GLenum pname,
2104 GLsizei bufSize,
2105 GLsizei *length,
2106 GLint *params)
2107{
2108 UNIMPLEMENTED();
2109}
2110
2111void Context::getTexParameterIuivRobust(TextureType target,
2112 GLenum pname,
2113 GLsizei bufSize,
2114 GLsizei *length,
2115 GLuint *params)
2116{
2117 UNIMPLEMENTED();
2118}
2119
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002120void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002121{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002122 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002123 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002124}
2125
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002126void Context::getTexLevelParameterivRobust(TextureTarget target,
2127 GLint level,
2128 GLenum pname,
2129 GLsizei bufSize,
2130 GLsizei *length,
2131 GLint *params)
2132{
2133 UNIMPLEMENTED();
2134}
2135
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002136void Context::getTexLevelParameterfv(TextureTarget target,
2137 GLint level,
2138 GLenum pname,
2139 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002140{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002141 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002142 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002143}
2144
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002145void Context::getTexLevelParameterfvRobust(TextureTarget target,
2146 GLint level,
2147 GLenum pname,
2148 GLsizei bufSize,
2149 GLsizei *length,
2150 GLfloat *params)
2151{
2152 UNIMPLEMENTED();
2153}
2154
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002155void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002156{
2157 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002158 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002159 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002160}
2161
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002162void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002163{
2164 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002165 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002166 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002167}
2168
Brandon Jones59770802018-04-02 13:18:42 -07002169void Context::texParameterfvRobust(TextureType target,
2170 GLenum pname,
2171 GLsizei bufSize,
2172 const GLfloat *params)
2173{
2174 texParameterfv(target, pname, params);
2175}
2176
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002177void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002178{
2179 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002180 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002181 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002182}
2183
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002184void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002185{
2186 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002187 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002188 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002189}
2190
Brandon Jones59770802018-04-02 13:18:42 -07002191void Context::texParameterivRobust(TextureType target,
2192 GLenum pname,
2193 GLsizei bufSize,
2194 const GLint *params)
2195{
2196 texParameteriv(target, pname, params);
2197}
2198
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002199void Context::texParameterIivRobust(TextureType target,
2200 GLenum pname,
2201 GLsizei bufSize,
2202 const GLint *params)
2203{
2204 UNIMPLEMENTED();
2205}
2206
2207void Context::texParameterIuivRobust(TextureType target,
2208 GLenum pname,
2209 GLsizei bufSize,
2210 const GLuint *params)
2211{
2212 UNIMPLEMENTED();
2213}
2214
Jamie Madill493f9572018-05-24 19:52:15 -04002215void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002216{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002217 // No-op if count draws no primitives for given mode
2218 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002219 {
2220 return;
2221 }
2222
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002223 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002224 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002225 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002226}
2227
Jamie Madill493f9572018-05-24 19:52:15 -04002228void Context::drawArraysInstanced(PrimitiveMode mode,
2229 GLint first,
2230 GLsizei count,
2231 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002232{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002233 // No-op if count draws no primitives for given mode
2234 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002235 {
2236 return;
2237 }
2238
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002239 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002240 ANGLE_CONTEXT_TRY(
2241 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002242 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2243 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002244}
2245
Jamie Madill493f9572018-05-24 19:52:15 -04002246void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002247{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002248 // No-op if count draws no primitives for given mode
2249 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002250 {
2251 return;
2252 }
2253
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002254 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002255 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002256}
2257
Jamie Madill493f9572018-05-24 19:52:15 -04002258void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002259 GLsizei count,
2260 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002261 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002262 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002263{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002264 // No-op if count draws no primitives for given mode
2265 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002266 {
2267 return;
2268 }
2269
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002270 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002271 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002272 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002273}
2274
Jamie Madill493f9572018-05-24 19:52:15 -04002275void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002276 GLuint start,
2277 GLuint end,
2278 GLsizei count,
2279 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002280 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002281{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002282 // No-op if count draws no primitives for given mode
2283 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002284 {
2285 return;
2286 }
2287
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002288 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002289 ANGLE_CONTEXT_TRY(
2290 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002291}
2292
Jamie Madill493f9572018-05-24 19:52:15 -04002293void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002294{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002295 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002296 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002297}
2298
Jamie Madill493f9572018-05-24 19:52:15 -04002299void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002300{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002301 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002302 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002303}
2304
Jamie Madill675fe712016-12-19 13:07:54 -05002305void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002306{
Jamie Madillafa02a22017-11-23 12:57:38 -05002307 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002308}
2309
Jamie Madill675fe712016-12-19 13:07:54 -05002310void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002311{
Jamie Madillafa02a22017-11-23 12:57:38 -05002312 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002313}
2314
Austin Kinross6ee1e782015-05-29 17:05:37 -07002315void Context::insertEventMarker(GLsizei length, const char *marker)
2316{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002317 ASSERT(mImplementation);
2318 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002319}
2320
2321void Context::pushGroupMarker(GLsizei length, const char *marker)
2322{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002323 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002324
2325 if (marker == nullptr)
2326 {
2327 // From the EXT_debug_marker spec,
2328 // "If <marker> is null then an empty string is pushed on the stack."
2329 mImplementation->pushGroupMarker(length, "");
2330 }
2331 else
2332 {
2333 mImplementation->pushGroupMarker(length, marker);
2334 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002335}
2336
2337void Context::popGroupMarker()
2338{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002339 ASSERT(mImplementation);
2340 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002341}
2342
Geoff Langd8605522016-04-13 10:19:12 -04002343void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2344{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002345 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002346 ASSERT(programObject);
2347
2348 programObject->bindUniformLocation(location, name);
2349}
2350
Brandon Jones59770802018-04-02 13:18:42 -07002351void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002352{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002353 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002354}
2355
Brandon Jones59770802018-04-02 13:18:42 -07002356void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002357{
2358 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2359}
2360
Brandon Jones59770802018-04-02 13:18:42 -07002361void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002362{
2363 GLfloat I[16];
2364 angle::Matrix<GLfloat>::setToIdentity(I);
2365
2366 mGLState.loadPathRenderingMatrix(matrixMode, I);
2367}
2368
2369void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2370{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002371 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002372 if (!pathObj)
2373 return;
2374
Geoff Lang9bf86f02018-07-26 11:46:34 -04002375 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002376
2377 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2378}
2379
2380void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2381{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002382 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002383 if (!pathObj)
2384 return;
2385
Geoff Lang9bf86f02018-07-26 11:46:34 -04002386 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002387
2388 mImplementation->stencilStrokePath(pathObj, reference, mask);
2389}
2390
2391void Context::coverFillPath(GLuint path, GLenum coverMode)
2392{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002393 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002394 if (!pathObj)
2395 return;
2396
Geoff Lang9bf86f02018-07-26 11:46:34 -04002397 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002398
2399 mImplementation->coverFillPath(pathObj, coverMode);
2400}
2401
2402void Context::coverStrokePath(GLuint path, GLenum coverMode)
2403{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002404 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002405 if (!pathObj)
2406 return;
2407
Geoff Lang9bf86f02018-07-26 11:46:34 -04002408 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002409
2410 mImplementation->coverStrokePath(pathObj, coverMode);
2411}
2412
2413void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2414{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002415 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002416 if (!pathObj)
2417 return;
2418
Geoff Lang9bf86f02018-07-26 11:46:34 -04002419 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002420
2421 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2422}
2423
2424void Context::stencilThenCoverStrokePath(GLuint path,
2425 GLint reference,
2426 GLuint mask,
2427 GLenum coverMode)
2428{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002429 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002430 if (!pathObj)
2431 return;
2432
Geoff Lang9bf86f02018-07-26 11:46:34 -04002433 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002434
2435 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2436}
2437
Sami Väisänend59ca052016-06-21 16:10:00 +03002438void Context::coverFillPathInstanced(GLsizei numPaths,
2439 GLenum pathNameType,
2440 const void *paths,
2441 GLuint pathBase,
2442 GLenum coverMode,
2443 GLenum transformType,
2444 const GLfloat *transformValues)
2445{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002446 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002447
Geoff Lang9bf86f02018-07-26 11:46:34 -04002448 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002449
2450 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2451}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002452
Sami Väisänend59ca052016-06-21 16:10:00 +03002453void Context::coverStrokePathInstanced(GLsizei numPaths,
2454 GLenum pathNameType,
2455 const void *paths,
2456 GLuint pathBase,
2457 GLenum coverMode,
2458 GLenum transformType,
2459 const GLfloat *transformValues)
2460{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002461 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002462
2463 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002464 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002465
2466 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2467 transformValues);
2468}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002469
Sami Väisänend59ca052016-06-21 16:10:00 +03002470void Context::stencilFillPathInstanced(GLsizei numPaths,
2471 GLenum pathNameType,
2472 const void *paths,
2473 GLuint pathBase,
2474 GLenum fillMode,
2475 GLuint mask,
2476 GLenum transformType,
2477 const GLfloat *transformValues)
2478{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002479 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002480
2481 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002482 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002483
2484 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2485 transformValues);
2486}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002487
Sami Väisänend59ca052016-06-21 16:10:00 +03002488void Context::stencilStrokePathInstanced(GLsizei numPaths,
2489 GLenum pathNameType,
2490 const void *paths,
2491 GLuint pathBase,
2492 GLint reference,
2493 GLuint mask,
2494 GLenum transformType,
2495 const GLfloat *transformValues)
2496{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002497 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002498
Geoff Lang9bf86f02018-07-26 11:46:34 -04002499 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002500
2501 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2502 transformValues);
2503}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002504
Sami Väisänend59ca052016-06-21 16:10:00 +03002505void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2506 GLenum pathNameType,
2507 const void *paths,
2508 GLuint pathBase,
2509 GLenum fillMode,
2510 GLuint mask,
2511 GLenum coverMode,
2512 GLenum transformType,
2513 const GLfloat *transformValues)
2514{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002515 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002516
Geoff Lang9bf86f02018-07-26 11:46:34 -04002517 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002518
2519 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2520 transformType, transformValues);
2521}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002522
Sami Väisänend59ca052016-06-21 16:10:00 +03002523void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2524 GLenum pathNameType,
2525 const void *paths,
2526 GLuint pathBase,
2527 GLint reference,
2528 GLuint mask,
2529 GLenum coverMode,
2530 GLenum transformType,
2531 const GLfloat *transformValues)
2532{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002533 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002534
Geoff Lang9bf86f02018-07-26 11:46:34 -04002535 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002536
2537 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2538 transformType, transformValues);
2539}
2540
Sami Väisänen46eaa942016-06-29 10:26:37 +03002541void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2542{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002543 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002544
2545 programObject->bindFragmentInputLocation(location, name);
2546}
2547
2548void Context::programPathFragmentInputGen(GLuint program,
2549 GLint location,
2550 GLenum genMode,
2551 GLint components,
2552 const GLfloat *coeffs)
2553{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002554 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002555
jchen103fd614d2018-08-13 12:21:58 +08002556 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002557}
2558
jchen1015015f72017-03-16 13:54:21 +08002559GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2560{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002561 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002562 return QueryProgramResourceIndex(programObject, programInterface, name);
2563}
2564
jchen10fd7c3b52017-03-21 15:36:03 +08002565void Context::getProgramResourceName(GLuint program,
2566 GLenum programInterface,
2567 GLuint index,
2568 GLsizei bufSize,
2569 GLsizei *length,
2570 GLchar *name)
2571{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002572 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002573 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2574}
2575
jchen10191381f2017-04-11 13:59:04 +08002576GLint Context::getProgramResourceLocation(GLuint program,
2577 GLenum programInterface,
2578 const GLchar *name)
2579{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002580 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002581 return QueryProgramResourceLocation(programObject, programInterface, name);
2582}
2583
jchen10880683b2017-04-12 16:21:55 +08002584void Context::getProgramResourceiv(GLuint program,
2585 GLenum programInterface,
2586 GLuint index,
2587 GLsizei propCount,
2588 const GLenum *props,
2589 GLsizei bufSize,
2590 GLsizei *length,
2591 GLint *params)
2592{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002593 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002594 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2595 length, params);
2596}
2597
jchen10d9cd7b72017-08-30 15:04:25 +08002598void Context::getProgramInterfaceiv(GLuint program,
2599 GLenum programInterface,
2600 GLenum pname,
2601 GLint *params)
2602{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002603 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002604 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2605}
2606
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002607void Context::getProgramInterfaceivRobust(GLuint program,
2608 GLenum programInterface,
2609 GLenum pname,
2610 GLsizei bufSize,
2611 GLsizei *length,
2612 GLint *params)
2613{
2614 UNIMPLEMENTED();
2615}
2616
Jamie Madill306b6c12018-07-27 08:12:49 -04002617void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002618{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002619 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002620}
2621
Jamie Madillabfbc0f2018-10-09 12:48:52 -04002622void Context::handleError(GLenum errorCode,
2623 const char *message,
2624 const char *file,
2625 const char *function,
2626 unsigned int line)
2627{
2628 mErrors.handleError(errorCode, message, file, function, line);
2629}
2630
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002631// Get one of the recorded errors and clear its flag, if any.
2632// [OpenGL ES 2.0.24] section 2.5 page 13.
2633GLenum Context::getError()
2634{
Geoff Langda5777c2014-07-11 09:52:58 -04002635 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002636 {
Geoff Langda5777c2014-07-11 09:52:58 -04002637 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002638 }
Geoff Langda5777c2014-07-11 09:52:58 -04002639 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002640 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002641 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002642 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002643}
2644
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002645// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002646void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002647{
2648 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002649 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002650 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002651 mContextLostForced = true;
2652 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002653 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002654}
2655
Jamie Madillfa920eb2018-01-04 11:45:50 -05002656GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002657{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002658 // Even if the application doesn't want to know about resets, we want to know
2659 // as it will allow us to skip all the calls.
2660 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002661 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002662 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002663 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002664 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002665 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002666
2667 // EXT_robustness, section 2.6: If the reset notification behavior is
2668 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2669 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2670 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002671 }
2672
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002673 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2674 // status should be returned at least once, and GL_NO_ERROR should be returned
2675 // once the device has finished resetting.
2676 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002677 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002678 ASSERT(mResetStatus == GL_NO_ERROR);
2679 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002680
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002681 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002682 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002683 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002684 }
2685 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002686 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002687 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002688 // If markContextLost was used to mark the context lost then
2689 // assume that is not recoverable, and continue to report the
2690 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002691 mResetStatus = mImplementation->getResetStatus();
2692 }
Jamie Madill893ab082014-05-16 16:56:10 -04002693
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002694 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002695}
2696
2697bool Context::isResetNotificationEnabled()
2698{
2699 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2700}
2701
Corentin Walleze3b10e82015-05-20 11:06:25 -04002702const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002703{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002704 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002705}
2706
2707EGLenum Context::getClientType() const
2708{
2709 return mClientType;
2710}
2711
2712EGLenum Context::getRenderBuffer() const
2713{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002714 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2715 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002716 {
2717 return EGL_NONE;
2718 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002719
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002720 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002721 ASSERT(backAttachment != nullptr);
2722 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002723}
2724
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002725VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002726{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002727 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002728 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2729 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002730 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002731 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2732 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002733
Jamie Madill96a483b2017-06-27 16:49:21 -04002734 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002735 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002736
2737 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002738}
2739
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002740TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002741{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002742 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002743 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2744 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002745 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002746 transformFeedback =
2747 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002748 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002749 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002750 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002751
2752 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002753}
2754
2755bool Context::isVertexArrayGenerated(GLuint vertexArray)
2756{
Jamie Madill96a483b2017-06-27 16:49:21 -04002757 ASSERT(mVertexArrayMap.contains(0));
2758 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002759}
2760
2761bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2762{
Jamie Madill96a483b2017-06-27 16:49:21 -04002763 ASSERT(mTransformFeedbackMap.contains(0));
2764 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002765}
2766
Shannon Woods53a94a82014-06-24 15:20:36 -04002767void Context::detachTexture(GLuint texture)
2768{
2769 // Simple pass-through to State's detachTexture method, as textures do not require
2770 // allocation map management either here or in the resource manager at detach time.
2771 // Zero textures are held by the Context, and we don't attempt to request them from
2772 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002773 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002774}
2775
James Darpinian4d9d4832018-03-13 12:43:28 -07002776void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002777{
Yuly Novikov5807a532015-12-03 13:01:22 -05002778 // Simple pass-through to State's detachBuffer method, since
2779 // only buffer attachments to container objects that are bound to the current context
2780 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002781
Yuly Novikov5807a532015-12-03 13:01:22 -05002782 // [OpenGL ES 3.2] section 5.1.2 page 45:
2783 // Attachments to unbound container objects, such as
2784 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2785 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002786 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002787}
2788
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002789void Context::detachFramebuffer(GLuint framebuffer)
2790{
Shannon Woods53a94a82014-06-24 15:20:36 -04002791 // Framebuffer detachment is handled by Context, because 0 is a valid
2792 // Framebuffer object, and a pointer to it must be passed from Context
2793 // to State at binding time.
2794
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002795 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002796 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2797 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2798 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002799
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002800 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002801 {
2802 bindReadFramebuffer(0);
2803 }
2804
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002805 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002806 {
2807 bindDrawFramebuffer(0);
2808 }
2809}
2810
2811void Context::detachRenderbuffer(GLuint renderbuffer)
2812{
Jamie Madilla02315b2017-02-23 14:14:47 -05002813 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002814}
2815
Jamie Madill57a89722013-07-02 11:57:03 -04002816void Context::detachVertexArray(GLuint vertexArray)
2817{
Jamie Madill77a72f62015-04-14 11:18:32 -04002818 // Vertex array detachment is handled by Context, because 0 is a valid
2819 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002820 // binding time.
2821
Jamie Madill57a89722013-07-02 11:57:03 -04002822 // [OpenGL ES 3.0.2] section 2.10 page 43:
2823 // If a vertex array object that is currently bound is deleted, the binding
2824 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002825 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002826 {
2827 bindVertexArray(0);
2828 }
2829}
2830
Geoff Langc8058452014-02-03 12:04:11 -05002831void Context::detachTransformFeedback(GLuint transformFeedback)
2832{
Corentin Walleza2257da2016-04-19 16:43:12 -04002833 // Transform feedback detachment is handled by Context, because 0 is a valid
2834 // transform feedback, and a pointer to it must be passed from Context to State at
2835 // binding time.
2836
2837 // The OpenGL specification doesn't mention what should happen when the currently bound
2838 // transform feedback object is deleted. Since it is a container object, we treat it like
2839 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002840 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002841 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002842 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002843 }
Geoff Langc8058452014-02-03 12:04:11 -05002844}
2845
Jamie Madilldc356042013-07-19 16:36:57 -04002846void Context::detachSampler(GLuint sampler)
2847{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002848 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002849}
2850
Yunchao Hea336b902017-08-02 16:05:21 +08002851void Context::detachProgramPipeline(GLuint pipeline)
2852{
2853 mGLState.detachProgramPipeline(this, pipeline);
2854}
2855
Jamie Madill3ef140a2017-08-26 23:11:21 -04002856void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002857{
Shaodde78e82017-05-22 14:13:27 +08002858 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002859 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002860}
2861
Jamie Madille29d1672013-07-19 16:36:57 -04002862void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2863{
Geoff Langc1984ed2016-10-07 12:41:00 -04002864 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002865 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002866 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002867}
Jamie Madille29d1672013-07-19 16:36:57 -04002868
Geoff Langc1984ed2016-10-07 12:41:00 -04002869void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2870{
2871 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002872 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002873 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002874}
2875
Brandon Jones59770802018-04-02 13:18:42 -07002876void Context::samplerParameterivRobust(GLuint sampler,
2877 GLenum pname,
2878 GLsizei bufSize,
2879 const GLint *param)
2880{
2881 samplerParameteriv(sampler, pname, param);
2882}
2883
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002884void Context::samplerParameterIivRobust(GLuint sampler,
2885 GLenum pname,
2886 GLsizei bufSize,
2887 const GLint *param)
2888{
2889 UNIMPLEMENTED();
2890}
2891
2892void Context::samplerParameterIuivRobust(GLuint sampler,
2893 GLenum pname,
2894 GLsizei bufSize,
2895 const GLuint *param)
2896{
2897 UNIMPLEMENTED();
2898}
2899
Jamie Madille29d1672013-07-19 16:36:57 -04002900void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2901{
Geoff Langc1984ed2016-10-07 12:41:00 -04002902 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002903 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002904 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002905}
2906
Geoff Langc1984ed2016-10-07 12:41:00 -04002907void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002908{
Geoff Langc1984ed2016-10-07 12:41:00 -04002909 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002910 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002911 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002912}
2913
Brandon Jones59770802018-04-02 13:18:42 -07002914void Context::samplerParameterfvRobust(GLuint sampler,
2915 GLenum pname,
2916 GLsizei bufSize,
2917 const GLfloat *param)
2918{
2919 samplerParameterfv(sampler, pname, param);
2920}
2921
Geoff Langc1984ed2016-10-07 12:41:00 -04002922void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002923{
Geoff Langc1984ed2016-10-07 12:41:00 -04002924 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002925 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002926 QuerySamplerParameteriv(samplerObject, pname, params);
2927}
Jamie Madill9675b802013-07-19 16:36:59 -04002928
Brandon Jones59770802018-04-02 13:18:42 -07002929void Context::getSamplerParameterivRobust(GLuint sampler,
2930 GLenum pname,
2931 GLsizei bufSize,
2932 GLsizei *length,
2933 GLint *params)
2934{
2935 getSamplerParameteriv(sampler, pname, params);
2936}
2937
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002938void Context::getSamplerParameterIivRobust(GLuint sampler,
2939 GLenum pname,
2940 GLsizei bufSize,
2941 GLsizei *length,
2942 GLint *params)
2943{
2944 UNIMPLEMENTED();
2945}
2946
2947void Context::getSamplerParameterIuivRobust(GLuint sampler,
2948 GLenum pname,
2949 GLsizei bufSize,
2950 GLsizei *length,
2951 GLuint *params)
2952{
2953 UNIMPLEMENTED();
2954}
2955
Geoff Langc1984ed2016-10-07 12:41:00 -04002956void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2957{
2958 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002959 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002960 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04002961}
2962
Brandon Jones59770802018-04-02 13:18:42 -07002963void Context::getSamplerParameterfvRobust(GLuint sampler,
2964 GLenum pname,
2965 GLsizei bufSize,
2966 GLsizei *length,
2967 GLfloat *params)
2968{
2969 getSamplerParameterfv(sampler, pname, params);
2970}
2971
Olli Etuahof0fee072016-03-30 15:11:58 +03002972void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2973{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002974 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08002975 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002976}
2977
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002978void Context::initRendererString()
2979{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002980 std::ostringstream rendererString;
2981 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002982 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002983 rendererString << ")";
2984
Geoff Langcec35902014-04-16 10:52:36 -04002985 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002986}
2987
Geoff Langc339c4e2016-11-29 10:37:36 -05002988void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002989{
Geoff Langc339c4e2016-11-29 10:37:36 -05002990 const Version &clientVersion = getClientVersion();
2991
2992 std::ostringstream versionString;
2993 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2994 << ANGLE_VERSION_STRING << ")";
2995 mVersionString = MakeStaticString(versionString.str());
2996
2997 std::ostringstream shadingLanguageVersionString;
2998 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2999 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
3000 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
3001 << ")";
3002 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003003}
3004
Geoff Langcec35902014-04-16 10:52:36 -04003005void Context::initExtensionStrings()
3006{
Geoff Langc339c4e2016-11-29 10:37:36 -05003007 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
3008 std::ostringstream combinedStringStream;
3009 std::copy(strings.begin(), strings.end(),
3010 std::ostream_iterator<const char *>(combinedStringStream, " "));
3011 return MakeStaticString(combinedStringStream.str());
3012 };
3013
3014 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003015 for (const auto &extensionString : mExtensions.getStrings())
3016 {
3017 mExtensionStrings.push_back(MakeStaticString(extensionString));
3018 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003019 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003020
Geoff Langc339c4e2016-11-29 10:37:36 -05003021 mRequestableExtensionStrings.clear();
3022 for (const auto &extensionInfo : GetExtensionInfoMap())
3023 {
3024 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003025 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003026 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003027 {
3028 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3029 }
3030 }
3031 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003032}
3033
Geoff Langc339c4e2016-11-29 10:37:36 -05003034const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003035{
Geoff Langc339c4e2016-11-29 10:37:36 -05003036 switch (name)
3037 {
3038 case GL_VENDOR:
3039 return reinterpret_cast<const GLubyte *>("Google Inc.");
3040
3041 case GL_RENDERER:
3042 return reinterpret_cast<const GLubyte *>(mRendererString);
3043
3044 case GL_VERSION:
3045 return reinterpret_cast<const GLubyte *>(mVersionString);
3046
3047 case GL_SHADING_LANGUAGE_VERSION:
3048 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3049
3050 case GL_EXTENSIONS:
3051 return reinterpret_cast<const GLubyte *>(mExtensionString);
3052
3053 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3054 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3055
3056 default:
3057 UNREACHABLE();
3058 return nullptr;
3059 }
Geoff Langcec35902014-04-16 10:52:36 -04003060}
3061
Geoff Langc339c4e2016-11-29 10:37:36 -05003062const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003063{
Geoff Langc339c4e2016-11-29 10:37:36 -05003064 switch (name)
3065 {
3066 case GL_EXTENSIONS:
3067 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3068
3069 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3070 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3071
3072 default:
3073 UNREACHABLE();
3074 return nullptr;
3075 }
Geoff Langcec35902014-04-16 10:52:36 -04003076}
3077
3078size_t Context::getExtensionStringCount() const
3079{
3080 return mExtensionStrings.size();
3081}
3082
Geoff Lang111a99e2017-10-17 10:58:41 -04003083bool Context::isExtensionRequestable(const char *name)
3084{
3085 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3086 auto extension = extensionInfos.find(name);
3087
Geoff Lang111a99e2017-10-17 10:58:41 -04003088 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003089 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003090}
3091
Geoff Langc339c4e2016-11-29 10:37:36 -05003092void Context::requestExtension(const char *name)
3093{
3094 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3095 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3096 const auto &extension = extensionInfos.at(name);
3097 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003098 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003099
3100 if (mExtensions.*(extension.ExtensionsMember))
3101 {
3102 // Extension already enabled
3103 return;
3104 }
3105
3106 mExtensions.*(extension.ExtensionsMember) = true;
3107 updateCaps();
3108 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003109
Jamie Madill2f348d22017-06-05 10:50:59 -04003110 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3111 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003112
Jamie Madill81c2e252017-09-09 23:32:46 -04003113 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3114 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003115 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003116 for (auto &zeroTexture : mZeroTextures)
3117 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003118 if (zeroTexture.get() != nullptr)
3119 {
3120 zeroTexture->signalDirty(this, InitState::Initialized);
3121 }
Geoff Lang9aded172017-04-05 11:07:56 -04003122 }
3123
Jamie Madillb983a4b2018-08-01 11:34:51 -04003124 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003125}
3126
3127size_t Context::getRequestableExtensionStringCount() const
3128{
3129 return mRequestableExtensionStrings.size();
3130}
3131
Jamie Madill493f9572018-05-24 19:52:15 -04003132void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003133{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003134 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003135 ASSERT(transformFeedback != nullptr);
3136 ASSERT(!transformFeedback->isPaused());
3137
Jamie Madill6c1f6712017-02-14 19:08:04 -05003138 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003139 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003140}
3141
3142bool Context::hasActiveTransformFeedback(GLuint program) const
3143{
3144 for (auto pair : mTransformFeedbackMap)
3145 {
3146 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3147 {
3148 return true;
3149 }
3150 }
3151 return false;
3152}
3153
Geoff Lang33f11fb2018-05-07 13:42:47 -04003154Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003155{
3156 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3157
jchen1082af6202018-06-22 10:59:52 +08003158 // Explicitly enable GL_KHR_parallel_shader_compile
3159 supportedExtensions.parallelShaderCompile = true;
3160
Geoff Langb0f917f2017-12-05 13:41:54 -05003161 if (getClientVersion() < ES_2_0)
3162 {
3163 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003164 supportedExtensions.pointSizeArray = true;
3165 supportedExtensions.textureCubeMap = true;
3166 supportedExtensions.pointSprite = true;
3167 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003168 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003169 }
3170
3171 if (getClientVersion() < ES_3_0)
3172 {
3173 // Disable ES3+ extensions
3174 supportedExtensions.colorBufferFloat = false;
3175 supportedExtensions.eglImageExternalEssl3 = false;
3176 supportedExtensions.textureNorm16 = false;
3177 supportedExtensions.multiview = false;
3178 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003179 supportedExtensions.copyTexture3d = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003180 }
3181
3182 if (getClientVersion() < ES_3_1)
3183 {
3184 // Disable ES3.1+ extensions
3185 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003186
3187 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3188 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003189 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003190 }
3191
3192 if (getClientVersion() > ES_2_0)
3193 {
3194 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3195 // supportedExtensions.sRGB = false;
3196 }
3197
3198 // Some extensions are always available because they are implemented in the GL layer.
3199 supportedExtensions.bindUniformLocation = true;
3200 supportedExtensions.vertexArrayObject = true;
3201 supportedExtensions.bindGeneratesResource = true;
3202 supportedExtensions.clientArrays = true;
3203 supportedExtensions.requestExtension = true;
3204
3205 // Enable the no error extension if the context was created with the flag.
3206 supportedExtensions.noError = mSkipValidation;
3207
3208 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003209 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003210
3211 // Explicitly enable GL_KHR_debug
3212 supportedExtensions.debug = true;
3213 supportedExtensions.maxDebugMessageLength = 1024;
3214 supportedExtensions.maxDebugLoggedMessages = 1024;
3215 supportedExtensions.maxDebugGroupStackDepth = 1024;
3216 supportedExtensions.maxLabelLength = 1024;
3217
3218 // Explicitly enable GL_ANGLE_robust_client_memory
3219 supportedExtensions.robustClientMemory = true;
3220
3221 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003222 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003223
3224 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3225 // supports it.
3226 supportedExtensions.robustBufferAccessBehavior =
3227 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3228
3229 // Enable the cache control query unconditionally.
3230 supportedExtensions.programCacheControl = true;
3231
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003232 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003233 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003234 {
3235 // GL_ANGLE_explicit_context_gles1
3236 supportedExtensions.explicitContextGles1 = true;
3237 // GL_ANGLE_explicit_context
3238 supportedExtensions.explicitContext = true;
3239 }
3240
Geoff Langb0f917f2017-12-05 13:41:54 -05003241 return supportedExtensions;
3242}
3243
Geoff Lang33f11fb2018-05-07 13:42:47 -04003244void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003245{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003246 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003247
Geoff Lang33f11fb2018-05-07 13:42:47 -04003248 mSupportedExtensions = generateSupportedExtensions();
3249 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003250
3251 mLimitations = mImplementation->getNativeLimitations();
3252
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003253 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3254 if (getClientVersion() < Version(2, 0))
3255 {
3256 mCaps.maxMultitextureUnits = 4;
3257 mCaps.maxClipPlanes = 6;
3258 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003259 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3260 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3261 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003262 mCaps.minSmoothPointSize = 1.0f;
3263 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003264 mCaps.minSmoothLineWidth = 1.0f;
3265 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003266 }
3267
Luc Ferronad2ae932018-06-11 15:31:17 -04003268 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003269 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003270
Luc Ferronad2ae932018-06-11 15:31:17 -04003271 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3272
Jamie Madill0f80ed82017-09-19 00:24:56 -04003273 if (getClientVersion() < ES_3_1)
3274 {
3275 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3276 }
3277 else
3278 {
3279 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3280 }
Geoff Lang301d1612014-07-09 10:34:37 -04003281
Jiawei Shao54aafe52018-04-27 14:54:57 +08003282 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3283 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003284 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3285
Jamie Madill0f80ed82017-09-19 00:24:56 -04003286 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3287 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3288
3289 // Limit textures as well, so we can use fast bitsets with texture bindings.
3290 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003291 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3292 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3293 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3294 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003295
Jiawei Shaodb342272017-09-27 10:21:45 +08003296 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3297
Geoff Langc287ea62016-09-16 14:46:51 -04003298 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003299 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003300 for (const auto &extensionInfo : GetExtensionInfoMap())
3301 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003302 // If the user has requested that extensions start disabled and they are requestable,
3303 // disable them.
3304 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003305 {
3306 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3307 }
3308 }
3309
3310 // Generate texture caps
3311 updateCaps();
3312}
3313
3314void Context::updateCaps()
3315{
Geoff Lang900013c2014-07-07 11:32:19 -04003316 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003317 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003318
Jamie Madill7b62cf92017-11-02 15:20:49 -04003319 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003320 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003321 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003322 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003323
Geoff Lang0d8b7242015-09-09 14:56:53 -04003324 // Update the format caps based on the client version and extensions.
3325 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3326 // ES3.
3327 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003328 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003329 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003330 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003331 formatCaps.textureAttachment =
3332 formatCaps.textureAttachment &&
3333 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3334 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3335 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003336
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003337 // OpenGL ES does not support multisampling with non-rendererable formats
3338 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003339 if (!formatCaps.renderbuffer ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003340 (getClientVersion() < ES_3_1 &&
3341 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003342 {
Geoff Langd87878e2014-09-19 15:42:59 -04003343 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003344 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003345 else
3346 {
3347 // We may have limited the max samples for some required renderbuffer formats due to
3348 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3349 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3350
3351 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3352 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3353 // exception of signed and unsigned integer formats."
3354 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3355 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3356 {
3357 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3358 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3359 }
3360
3361 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3362 if (getClientVersion() >= ES_3_1)
3363 {
3364 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3365 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3366 // the exception that the signed and unsigned integer formats are required only to
3367 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3368 // multisamples, which must be at least one."
3369 if (formatInfo.componentType == GL_INT ||
3370 formatInfo.componentType == GL_UNSIGNED_INT)
3371 {
3372 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3373 }
3374
3375 // GLES 3.1 section 19.3.1.
3376 if (formatCaps.texturable)
3377 {
3378 if (formatInfo.depthBits > 0)
3379 {
3380 mCaps.maxDepthTextureSamples =
3381 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3382 }
3383 else if (formatInfo.redBits > 0)
3384 {
3385 mCaps.maxColorTextureSamples =
3386 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3387 }
3388 }
3389 }
3390 }
Geoff Langd87878e2014-09-19 15:42:59 -04003391
3392 if (formatCaps.texturable && formatInfo.compressed)
3393 {
Geoff Langca271392017-04-05 12:30:00 -04003394 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003395 }
3396
Geoff Langca271392017-04-05 12:30:00 -04003397 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003398 }
Jamie Madill32447362017-06-28 14:53:52 -04003399
3400 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003401 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003402 {
3403 mMemoryProgramCache = nullptr;
3404 }
Corentin Walleze4477002017-12-01 14:39:58 -05003405
3406 // Compute which buffer types are allowed
3407 mValidBufferBindings.reset();
3408 mValidBufferBindings.set(BufferBinding::ElementArray);
3409 mValidBufferBindings.set(BufferBinding::Array);
3410
3411 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3412 {
3413 mValidBufferBindings.set(BufferBinding::PixelPack);
3414 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3415 }
3416
3417 if (getClientVersion() >= ES_3_0)
3418 {
3419 mValidBufferBindings.set(BufferBinding::CopyRead);
3420 mValidBufferBindings.set(BufferBinding::CopyWrite);
3421 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3422 mValidBufferBindings.set(BufferBinding::Uniform);
3423 }
3424
3425 if (getClientVersion() >= ES_3_1)
3426 {
3427 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3428 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3429 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3430 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3431 }
jchen107ae70d82018-07-06 13:47:01 +08003432
3433 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003434
3435 // Reinitialize state cache after extension changes.
3436 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003437}
3438
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003439void Context::initWorkarounds()
3440{
Jamie Madill761b02c2017-06-23 16:27:06 -04003441 // Apply back-end workarounds.
3442 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3443
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003444 // Lose the context upon out of memory error if the application is
3445 // expecting to watch for those events.
3446 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
3447}
3448
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003449// Return true if the draw is a no-op, else return false.
3450// A no-op draw occurs if the count of vertices is less than the minimum required to
3451// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3452bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3453{
3454 return count < kMinimumPrimitiveCounts[mode];
3455}
3456
3457bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3458{
3459 return (instanceCount == 0) || noopDraw(mode, count);
3460}
3461
Jamie Madill6f755b22018-10-09 12:48:54 -04003462angle::Result Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003463{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003464 if (mGLES1Renderer)
3465 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003466 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003467 }
3468
Geoff Lang9bf86f02018-07-26 11:46:34 -04003469 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003470
3471 if (isRobustResourceInitEnabled())
3472 {
3473 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3474 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3475 }
3476
Geoff Langa8cb2872018-03-09 16:09:40 -05003477 ANGLE_TRY(syncDirtyBits());
Jamie Madill6f755b22018-10-09 12:48:54 -04003478 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003479}
3480
3481Error Context::prepareForClear(GLbitfield mask)
3482{
Geoff Langa8cb2872018-03-09 16:09:40 -05003483 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003484 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003485 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003486 return NoError();
3487}
3488
3489Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3490{
Geoff Langa8cb2872018-03-09 16:09:40 -05003491 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003492 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3493 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003494 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003495 return NoError();
3496}
3497
Geoff Langa8cb2872018-03-09 16:09:40 -05003498Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003499{
Geoff Langa8cb2872018-03-09 16:09:40 -05003500 ANGLE_TRY(syncDirtyObjects(objectMask));
3501 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003502 return NoError();
3503}
3504
Jamie Madill6f755b22018-10-09 12:48:54 -04003505angle::Result Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003506{
3507 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003508 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003509 mGLState.clearDirtyBits();
Jamie Madill6f755b22018-10-09 12:48:54 -04003510 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003511}
3512
Jamie Madill6f755b22018-10-09 12:48:54 -04003513angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003514{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003515 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003516 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003517 mGLState.clearDirtyBits(dirtyBits);
Jamie Madill6f755b22018-10-09 12:48:54 -04003518 return angle::Result::Continue();
Jamie Madill1b94d432015-08-07 13:23:23 -04003519}
Jamie Madillc29968b2016-01-20 11:17:23 -05003520
Jamie Madill6f755b22018-10-09 12:48:54 -04003521angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003522{
3523 return mGLState.syncDirtyObjects(this, objectMask);
3524}
3525
Jamie Madillc29968b2016-01-20 11:17:23 -05003526void Context::blitFramebuffer(GLint srcX0,
3527 GLint srcY0,
3528 GLint srcX1,
3529 GLint srcY1,
3530 GLint dstX0,
3531 GLint dstY0,
3532 GLint dstX1,
3533 GLint dstY1,
3534 GLbitfield mask,
3535 GLenum filter)
3536{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003537 if (mask == 0)
3538 {
3539 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3540 // buffers are copied.
3541 return;
3542 }
3543
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003544 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003545 ASSERT(drawFramebuffer);
3546
3547 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3548 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3549
Jamie Madillbc918e72018-03-08 09:47:21 -05003550 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003551
Jamie Madillc564c072017-06-01 12:45:42 -04003552 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003553}
Jamie Madillc29968b2016-01-20 11:17:23 -05003554
3555void Context::clear(GLbitfield mask)
3556{
Geoff Langd4fff502017-09-22 11:28:28 -04003557 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3558 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003559}
3560
3561void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3562{
Olli Etuaho78df3362018-10-05 16:43:27 +03003563 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3564 const FramebufferAttachment *attachment = nullptr;
3565 if (buffer == GL_DEPTH)
3566 {
3567 attachment = framebufferObject->getDepthbuffer();
3568 }
3569 if (buffer == GL_COLOR &&
3570 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3571 {
3572 attachment = framebufferObject->getColorbuffer(drawbuffer);
3573 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003574 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3575 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003576 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003577 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003578 return;
3579 }
Geoff Langd4fff502017-09-22 11:28:28 -04003580 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003581 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003582}
3583
3584void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3585{
Olli Etuaho78df3362018-10-05 16:43:27 +03003586 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3587 const FramebufferAttachment *attachment = nullptr;
3588 if (buffer == GL_COLOR &&
3589 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3590 {
3591 attachment = framebufferObject->getColorbuffer(drawbuffer);
3592 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003593 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3594 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003595 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003596 {
3597 return;
3598 }
Geoff Langd4fff502017-09-22 11:28:28 -04003599 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003600 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003601}
3602
3603void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3604{
Olli Etuaho78df3362018-10-05 16:43:27 +03003605 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3606 const FramebufferAttachment *attachment = nullptr;
3607 if (buffer == GL_STENCIL)
3608 {
3609 attachment = framebufferObject->getStencilbuffer();
3610 }
3611 if (buffer == GL_COLOR &&
3612 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3613 {
3614 attachment = framebufferObject->getColorbuffer(drawbuffer);
3615 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003616 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3617 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003618 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003619 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003620 return;
3621 }
Geoff Langd4fff502017-09-22 11:28:28 -04003622 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003623 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003624}
3625
3626void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3627{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003628 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003629 ASSERT(framebufferObject);
3630
3631 // If a buffer is not present, the clear has no effect
3632 if (framebufferObject->getDepthbuffer() == nullptr &&
3633 framebufferObject->getStencilbuffer() == nullptr)
3634 {
3635 return;
3636 }
3637
Geoff Langd4fff502017-09-22 11:28:28 -04003638 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3639 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003640}
3641
3642void Context::readPixels(GLint x,
3643 GLint y,
3644 GLsizei width,
3645 GLsizei height,
3646 GLenum format,
3647 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003648 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003649{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003650 if (width == 0 || height == 0)
3651 {
3652 return;
3653 }
3654
Jamie Madillbc918e72018-03-08 09:47:21 -05003655 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003656
Jamie Madillb6664922017-07-25 12:55:04 -04003657 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3658 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003659
3660 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003661 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003662}
3663
Brandon Jones59770802018-04-02 13:18:42 -07003664void Context::readPixelsRobust(GLint x,
3665 GLint y,
3666 GLsizei width,
3667 GLsizei height,
3668 GLenum format,
3669 GLenum type,
3670 GLsizei bufSize,
3671 GLsizei *length,
3672 GLsizei *columns,
3673 GLsizei *rows,
3674 void *pixels)
3675{
3676 readPixels(x, y, width, height, format, type, pixels);
3677}
3678
3679void Context::readnPixelsRobust(GLint x,
3680 GLint y,
3681 GLsizei width,
3682 GLsizei height,
3683 GLenum format,
3684 GLenum type,
3685 GLsizei bufSize,
3686 GLsizei *length,
3687 GLsizei *columns,
3688 GLsizei *rows,
3689 void *data)
3690{
3691 readPixels(x, y, width, height, format, type, data);
3692}
3693
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003694void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003695 GLint level,
3696 GLenum internalformat,
3697 GLint x,
3698 GLint y,
3699 GLsizei width,
3700 GLsizei height,
3701 GLint border)
3702{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003703 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003704 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003705
Jamie Madillc29968b2016-01-20 11:17:23 -05003706 Rectangle sourceArea(x, y, width, height);
3707
Jamie Madill05b35b22017-10-03 09:01:44 -04003708 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003709 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003710 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003711}
3712
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003713void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003714 GLint level,
3715 GLint xoffset,
3716 GLint yoffset,
3717 GLint x,
3718 GLint y,
3719 GLsizei width,
3720 GLsizei height)
3721{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003722 if (width == 0 || height == 0)
3723 {
3724 return;
3725 }
3726
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003727 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003728 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003729
Jamie Madillc29968b2016-01-20 11:17:23 -05003730 Offset destOffset(xoffset, yoffset, 0);
3731 Rectangle sourceArea(x, y, width, height);
3732
Jamie Madill05b35b22017-10-03 09:01:44 -04003733 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003734 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003735 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003736}
3737
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003738void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003739 GLint level,
3740 GLint xoffset,
3741 GLint yoffset,
3742 GLint zoffset,
3743 GLint x,
3744 GLint y,
3745 GLsizei width,
3746 GLsizei height)
3747{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003748 if (width == 0 || height == 0)
3749 {
3750 return;
3751 }
3752
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003753 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003754 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003755
Jamie Madillc29968b2016-01-20 11:17:23 -05003756 Offset destOffset(xoffset, yoffset, zoffset);
3757 Rectangle sourceArea(x, y, width, height);
3758
Jamie Madill05b35b22017-10-03 09:01:44 -04003759 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3760 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003761 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3762 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003763}
3764
3765void Context::framebufferTexture2D(GLenum target,
3766 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003767 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003768 GLuint texture,
3769 GLint level)
3770{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003771 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003772 ASSERT(framebuffer);
3773
3774 if (texture != 0)
3775 {
3776 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003777 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003778 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003779 }
3780 else
3781 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003782 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003783 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003784
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003785 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003786}
3787
3788void Context::framebufferRenderbuffer(GLenum target,
3789 GLenum attachment,
3790 GLenum renderbuffertarget,
3791 GLuint renderbuffer)
3792{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003793 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003794 ASSERT(framebuffer);
3795
3796 if (renderbuffer != 0)
3797 {
3798 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003799
Jamie Madillcc129372018-04-12 09:13:18 -04003800 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003801 renderbufferObject);
3802 }
3803 else
3804 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003805 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003806 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003807
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003808 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003809}
3810
3811void Context::framebufferTextureLayer(GLenum target,
3812 GLenum attachment,
3813 GLuint texture,
3814 GLint level,
3815 GLint layer)
3816{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003817 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003818 ASSERT(framebuffer);
3819
3820 if (texture != 0)
3821 {
3822 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003823 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003824 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003825 }
3826 else
3827 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003828 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003829 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003830
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003831 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003832}
3833
Brandon Jones59770802018-04-02 13:18:42 -07003834void Context::framebufferTextureMultiviewLayered(GLenum target,
3835 GLenum attachment,
3836 GLuint texture,
3837 GLint level,
3838 GLint baseViewIndex,
3839 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003840{
Martin Radev82ef7742017-08-08 17:44:58 +03003841 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3842 ASSERT(framebuffer);
3843
3844 if (texture != 0)
3845 {
3846 Texture *textureObj = getTexture(texture);
3847
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003848 ImageIndex index;
3849 if (textureObj->getType() == TextureType::_2DArray)
3850 {
3851 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3852 }
3853 else
3854 {
3855 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3856 ASSERT(level == 0);
3857 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3858 }
Martin Radev82ef7742017-08-08 17:44:58 +03003859 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3860 numViews, baseViewIndex);
3861 }
3862 else
3863 {
3864 framebuffer->resetAttachment(this, attachment);
3865 }
3866
3867 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003868}
3869
Brandon Jones59770802018-04-02 13:18:42 -07003870void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3871 GLenum attachment,
3872 GLuint texture,
3873 GLint level,
3874 GLsizei numViews,
3875 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003876{
Martin Radev5dae57b2017-07-14 16:15:55 +03003877 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3878 ASSERT(framebuffer);
3879
3880 if (texture != 0)
3881 {
3882 Texture *textureObj = getTexture(texture);
3883
3884 ImageIndex index = ImageIndex::Make2D(level);
3885 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3886 textureObj, numViews, viewportOffsets);
3887 }
3888 else
3889 {
3890 framebuffer->resetAttachment(this, attachment);
3891 }
3892
3893 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003894}
3895
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003896void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3897{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003898 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3899 ASSERT(framebuffer);
3900
3901 if (texture != 0)
3902 {
3903 Texture *textureObj = getTexture(texture);
3904
3905 ImageIndex index = ImageIndex::MakeFromType(
3906 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3907 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3908 }
3909 else
3910 {
3911 framebuffer->resetAttachment(this, attachment);
3912 }
3913
3914 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003915}
3916
Jamie Madillc29968b2016-01-20 11:17:23 -05003917void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3918{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003919 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003920 ASSERT(framebuffer);
3921 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003922 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003923 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003924}
3925
3926void Context::readBuffer(GLenum mode)
3927{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003928 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003929 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003930 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003931}
3932
3933void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3934{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003935 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003936 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003937
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003938 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003939 ASSERT(framebuffer);
3940
3941 // The specification isn't clear what should be done when the framebuffer isn't complete.
3942 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003943 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003944}
3945
3946void Context::invalidateFramebuffer(GLenum target,
3947 GLsizei numAttachments,
3948 const GLenum *attachments)
3949{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003950 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003951 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003952
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003953 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003954 ASSERT(framebuffer);
3955
Jamie Madill427064d2018-04-13 16:20:34 -04003956 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003957 {
Jamie Madill437fa652016-05-03 15:13:24 -04003958 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003959 }
Jamie Madill437fa652016-05-03 15:13:24 -04003960
Jamie Madill4928b7c2017-06-20 12:57:39 -04003961 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003962}
3963
3964void Context::invalidateSubFramebuffer(GLenum target,
3965 GLsizei numAttachments,
3966 const GLenum *attachments,
3967 GLint x,
3968 GLint y,
3969 GLsizei width,
3970 GLsizei height)
3971{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003972 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003973 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003974
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003975 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003976 ASSERT(framebuffer);
3977
Jamie Madill427064d2018-04-13 16:20:34 -04003978 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003979 {
Jamie Madill437fa652016-05-03 15:13:24 -04003980 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003981 }
Jamie Madill437fa652016-05-03 15:13:24 -04003982
3983 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003984 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003985}
3986
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003987void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003988 GLint level,
3989 GLint internalformat,
3990 GLsizei width,
3991 GLsizei height,
3992 GLint border,
3993 GLenum format,
3994 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003995 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003996{
Jamie Madillbc918e72018-03-08 09:47:21 -05003997 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003998
3999 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004000 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004001 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004002 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004003}
4004
Brandon Jones59770802018-04-02 13:18:42 -07004005void Context::texImage2DRobust(TextureTarget target,
4006 GLint level,
4007 GLint internalformat,
4008 GLsizei width,
4009 GLsizei height,
4010 GLint border,
4011 GLenum format,
4012 GLenum type,
4013 GLsizei bufSize,
4014 const void *pixels)
4015{
4016 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4017}
4018
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004019void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004020 GLint level,
4021 GLint internalformat,
4022 GLsizei width,
4023 GLsizei height,
4024 GLsizei depth,
4025 GLint border,
4026 GLenum format,
4027 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004028 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004029{
Jamie Madillbc918e72018-03-08 09:47:21 -05004030 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004031
4032 Extents size(width, height, depth);
4033 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004034 handleError(texture->setImage(this, mGLState.getUnpackState(),
4035 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004036 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004037}
4038
Brandon Jones59770802018-04-02 13:18:42 -07004039void Context::texImage3DRobust(TextureType target,
4040 GLint level,
4041 GLint internalformat,
4042 GLsizei width,
4043 GLsizei height,
4044 GLsizei depth,
4045 GLint border,
4046 GLenum format,
4047 GLenum type,
4048 GLsizei bufSize,
4049 const void *pixels)
4050{
4051 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4052}
4053
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004054void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004055 GLint level,
4056 GLint xoffset,
4057 GLint yoffset,
4058 GLsizei width,
4059 GLsizei height,
4060 GLenum format,
4061 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004062 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004063{
4064 // Zero sized uploads are valid but no-ops
4065 if (width == 0 || height == 0)
4066 {
4067 return;
4068 }
4069
Jamie Madillbc918e72018-03-08 09:47:21 -05004070 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004071
4072 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004073 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004074
4075 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4076
4077 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4078 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004079}
4080
Brandon Jones59770802018-04-02 13:18:42 -07004081void Context::texSubImage2DRobust(TextureTarget target,
4082 GLint level,
4083 GLint xoffset,
4084 GLint yoffset,
4085 GLsizei width,
4086 GLsizei height,
4087 GLenum format,
4088 GLenum type,
4089 GLsizei bufSize,
4090 const void *pixels)
4091{
4092 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4093}
4094
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004095void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004096 GLint level,
4097 GLint xoffset,
4098 GLint yoffset,
4099 GLint zoffset,
4100 GLsizei width,
4101 GLsizei height,
4102 GLsizei depth,
4103 GLenum format,
4104 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004105 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004106{
4107 // Zero sized uploads are valid but no-ops
4108 if (width == 0 || height == 0 || depth == 0)
4109 {
4110 return;
4111 }
4112
Jamie Madillbc918e72018-03-08 09:47:21 -05004113 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004114
4115 Box area(xoffset, yoffset, zoffset, width, height, depth);
4116 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004117
4118 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4119
4120 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004121 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004122 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004123}
4124
Brandon Jones59770802018-04-02 13:18:42 -07004125void Context::texSubImage3DRobust(TextureType target,
4126 GLint level,
4127 GLint xoffset,
4128 GLint yoffset,
4129 GLint zoffset,
4130 GLsizei width,
4131 GLsizei height,
4132 GLsizei depth,
4133 GLenum format,
4134 GLenum type,
4135 GLsizei bufSize,
4136 const void *pixels)
4137{
4138 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4139 pixels);
4140}
4141
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004142void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004143 GLint level,
4144 GLenum internalformat,
4145 GLsizei width,
4146 GLsizei height,
4147 GLint border,
4148 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004149 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004150{
Jamie Madillbc918e72018-03-08 09:47:21 -05004151 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004152
4153 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004154 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004155 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4156 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004157 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004158}
4159
Brandon Jones59770802018-04-02 13:18:42 -07004160void Context::compressedTexImage2DRobust(TextureTarget target,
4161 GLint level,
4162 GLenum internalformat,
4163 GLsizei width,
4164 GLsizei height,
4165 GLint border,
4166 GLsizei imageSize,
4167 GLsizei dataSize,
4168 const GLvoid *data)
4169{
4170 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4171}
4172
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004173void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004174 GLint level,
4175 GLenum internalformat,
4176 GLsizei width,
4177 GLsizei height,
4178 GLsizei depth,
4179 GLint border,
4180 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004181 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004182{
Jamie Madillbc918e72018-03-08 09:47:21 -05004183 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004184
4185 Extents size(width, height, depth);
4186 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004187 handleError(texture->setCompressedImage(
4188 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004189 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004190}
4191
Brandon Jones59770802018-04-02 13:18:42 -07004192void Context::compressedTexImage3DRobust(TextureType target,
4193 GLint level,
4194 GLenum internalformat,
4195 GLsizei width,
4196 GLsizei height,
4197 GLsizei depth,
4198 GLint border,
4199 GLsizei imageSize,
4200 GLsizei dataSize,
4201 const GLvoid *data)
4202{
4203 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4204 data);
4205}
4206
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004207void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004208 GLint level,
4209 GLint xoffset,
4210 GLint yoffset,
4211 GLsizei width,
4212 GLsizei height,
4213 GLenum format,
4214 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004215 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004216{
Jamie Madillbc918e72018-03-08 09:47:21 -05004217 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004218
4219 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004220 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004221 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4222 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004223 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004224}
4225
Brandon Jones59770802018-04-02 13:18:42 -07004226void Context::compressedTexSubImage2DRobust(TextureTarget target,
4227 GLint level,
4228 GLint xoffset,
4229 GLint yoffset,
4230 GLsizei width,
4231 GLsizei height,
4232 GLenum format,
4233 GLsizei imageSize,
4234 GLsizei dataSize,
4235 const GLvoid *data)
4236{
4237 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4238 data);
4239}
4240
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004241void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004242 GLint level,
4243 GLint xoffset,
4244 GLint yoffset,
4245 GLint zoffset,
4246 GLsizei width,
4247 GLsizei height,
4248 GLsizei depth,
4249 GLenum format,
4250 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004251 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004252{
4253 // Zero sized uploads are valid but no-ops
4254 if (width == 0 || height == 0)
4255 {
4256 return;
4257 }
4258
Jamie Madillbc918e72018-03-08 09:47:21 -05004259 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004260
4261 Box area(xoffset, yoffset, zoffset, width, height, depth);
4262 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004263 handleError(texture->setCompressedSubImage(
4264 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004265 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004266}
4267
Brandon Jones59770802018-04-02 13:18:42 -07004268void Context::compressedTexSubImage3DRobust(TextureType target,
4269 GLint level,
4270 GLint xoffset,
4271 GLint yoffset,
4272 GLint zoffset,
4273 GLsizei width,
4274 GLsizei height,
4275 GLsizei depth,
4276 GLenum format,
4277 GLsizei imageSize,
4278 GLsizei dataSize,
4279 const GLvoid *data)
4280{
4281 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4282 imageSize, data);
4283}
4284
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004285void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004286{
4287 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004288 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004289}
4290
Jamie Madill007530e2017-12-28 14:27:04 -05004291void Context::copyTexture(GLuint sourceId,
4292 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004293 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004294 GLuint destId,
4295 GLint destLevel,
4296 GLint internalFormat,
4297 GLenum destType,
4298 GLboolean unpackFlipY,
4299 GLboolean unpackPremultiplyAlpha,
4300 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004301{
Jamie Madillbc918e72018-03-08 09:47:21 -05004302 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004303
4304 gl::Texture *sourceTexture = getTexture(sourceId);
4305 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004306 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4307 sourceLevel, ConvertToBool(unpackFlipY),
4308 ConvertToBool(unpackPremultiplyAlpha),
4309 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004310}
4311
Jamie Madill007530e2017-12-28 14:27:04 -05004312void Context::copySubTexture(GLuint sourceId,
4313 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004314 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004315 GLuint destId,
4316 GLint destLevel,
4317 GLint xoffset,
4318 GLint yoffset,
4319 GLint x,
4320 GLint y,
4321 GLsizei width,
4322 GLsizei height,
4323 GLboolean unpackFlipY,
4324 GLboolean unpackPremultiplyAlpha,
4325 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004326{
4327 // Zero sized copies are valid but no-ops
4328 if (width == 0 || height == 0)
4329 {
4330 return;
4331 }
4332
Jamie Madillbc918e72018-03-08 09:47:21 -05004333 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004334
4335 gl::Texture *sourceTexture = getTexture(sourceId);
4336 gl::Texture *destTexture = getTexture(destId);
4337 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004338 Box box(x, y, 0, width, height, 1);
4339 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4340 ConvertToBool(unpackFlipY),
4341 ConvertToBool(unpackPremultiplyAlpha),
4342 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4343}
4344
4345void Context::copyTexture3D(GLuint sourceId,
4346 GLint sourceLevel,
4347 TextureTarget destTarget,
4348 GLuint destId,
4349 GLint destLevel,
4350 GLint internalFormat,
4351 GLenum destType,
4352 GLboolean unpackFlipY,
4353 GLboolean unpackPremultiplyAlpha,
4354 GLboolean unpackUnmultiplyAlpha)
4355{
4356 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4357
4358 Texture *sourceTexture = getTexture(sourceId);
4359 Texture *destTexture = getTexture(destId);
4360 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4361 sourceLevel, ConvertToBool(unpackFlipY),
4362 ConvertToBool(unpackPremultiplyAlpha),
4363 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4364}
4365
4366void Context::copySubTexture3D(GLuint sourceId,
4367 GLint sourceLevel,
4368 TextureTarget destTarget,
4369 GLuint destId,
4370 GLint destLevel,
4371 GLint xoffset,
4372 GLint yoffset,
4373 GLint zoffset,
4374 GLint x,
4375 GLint y,
4376 GLint z,
4377 GLsizei width,
4378 GLsizei height,
4379 GLsizei depth,
4380 GLboolean unpackFlipY,
4381 GLboolean unpackPremultiplyAlpha,
4382 GLboolean unpackUnmultiplyAlpha)
4383{
4384 // Zero sized copies are valid but no-ops
4385 if (width == 0 || height == 0 || depth == 0)
4386 {
4387 return;
4388 }
4389
4390 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4391
4392 Texture *sourceTexture = getTexture(sourceId);
4393 Texture *destTexture = getTexture(destId);
4394 Offset offset(xoffset, yoffset, zoffset);
4395 Box box(x, y, z, width, height, depth);
4396 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004397 ConvertToBool(unpackFlipY),
4398 ConvertToBool(unpackPremultiplyAlpha),
4399 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004400}
4401
Jamie Madill007530e2017-12-28 14:27:04 -05004402void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004403{
Jamie Madillbc918e72018-03-08 09:47:21 -05004404 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004405
4406 gl::Texture *sourceTexture = getTexture(sourceId);
4407 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004408 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004409}
4410
Corentin Wallez336129f2017-10-17 15:55:40 -04004411void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004412{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004413 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004414 ASSERT(buffer);
4415
Geoff Lang496c02d2016-10-20 11:38:11 -07004416 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004417}
4418
Brandon Jones59770802018-04-02 13:18:42 -07004419void Context::getBufferPointervRobust(BufferBinding target,
4420 GLenum pname,
4421 GLsizei bufSize,
4422 GLsizei *length,
4423 void **params)
4424{
4425 getBufferPointerv(target, pname, params);
4426}
4427
Corentin Wallez336129f2017-10-17 15:55:40 -04004428void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004429{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004430 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004431 ASSERT(buffer);
4432
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004433 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004434 if (error.isError())
4435 {
Jamie Madill437fa652016-05-03 15:13:24 -04004436 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004437 return nullptr;
4438 }
4439
4440 return buffer->getMapPointer();
4441}
4442
Corentin Wallez336129f2017-10-17 15:55:40 -04004443GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004444{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004445 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004446 ASSERT(buffer);
4447
4448 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004449 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004450 if (error.isError())
4451 {
Jamie Madill437fa652016-05-03 15:13:24 -04004452 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004453 return GL_FALSE;
4454 }
4455
4456 return result;
4457}
4458
Corentin Wallez336129f2017-10-17 15:55:40 -04004459void *Context::mapBufferRange(BufferBinding target,
4460 GLintptr offset,
4461 GLsizeiptr length,
4462 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004463{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004464 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004465 ASSERT(buffer);
4466
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004467 Error error = buffer->mapRange(this, offset, length, access);
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 nullptr;
4472 }
4473
4474 return buffer->getMapPointer();
4475}
4476
Corentin Wallez336129f2017-10-17 15:55:40 -04004477void Context::flushMappedBufferRange(BufferBinding /*target*/,
4478 GLintptr /*offset*/,
4479 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004480{
4481 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4482}
4483
Jamie Madillbc918e72018-03-08 09:47:21 -05004484Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004485{
Geoff Langa8cb2872018-03-09 16:09:40 -05004486 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004487}
4488
Jamie Madillbc918e72018-03-08 09:47:21 -05004489Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004490{
Geoff Langa8cb2872018-03-09 16:09:40 -05004491 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004492}
4493
Jamie Madillbc918e72018-03-08 09:47:21 -05004494Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004495{
Geoff Langa8cb2872018-03-09 16:09:40 -05004496 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004497}
4498
Geoff Lang9bf86f02018-07-26 11:46:34 -04004499Error Context::syncStateForPathOperation()
4500{
4501 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4502
4503 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4504 ANGLE_TRY(syncDirtyBits());
4505
4506 return NoError();
4507}
4508
Jiajia Qin5451d532017-11-16 17:16:34 +08004509void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4510{
4511 UNIMPLEMENTED();
4512}
4513
Jamie Madillc20ab272016-06-09 07:20:46 -07004514void Context::activeTexture(GLenum texture)
4515{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004516 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004517}
4518
Jamie Madill876429b2017-04-20 15:46:24 -04004519void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004520{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004521 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004522}
4523
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004524void Context::blendEquation(GLenum mode)
4525{
4526 mGLState.setBlendEquation(mode, mode);
4527}
4528
Jamie Madillc20ab272016-06-09 07:20:46 -07004529void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4530{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004531 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004532}
4533
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004534void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4535{
4536 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4537}
4538
Jamie Madillc20ab272016-06-09 07:20:46 -07004539void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4540{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004541 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004542}
4543
Jamie Madill876429b2017-04-20 15:46:24 -04004544void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004545{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004546 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004547}
4548
Jamie Madill876429b2017-04-20 15:46:24 -04004549void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004550{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004551 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07004552}
4553
4554void Context::clearStencil(GLint s)
4555{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004556 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004557}
4558
4559void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4560{
Geoff Lang92019432017-11-20 13:09:34 -05004561 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4562 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004563}
4564
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004565void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004566{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004567 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004568}
4569
4570void Context::depthFunc(GLenum func)
4571{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004572 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004573}
4574
4575void Context::depthMask(GLboolean flag)
4576{
Geoff Lang92019432017-11-20 13:09:34 -05004577 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004578}
4579
Jamie Madill876429b2017-04-20 15:46:24 -04004580void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004581{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004582 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07004583}
4584
4585void Context::disable(GLenum cap)
4586{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004587 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004588 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004589}
4590
4591void Context::disableVertexAttribArray(GLuint index)
4592{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004593 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004594 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004595}
4596
4597void Context::enable(GLenum cap)
4598{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004599 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004600 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004601}
4602
4603void Context::enableVertexAttribArray(GLuint index)
4604{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004605 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004606 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004607}
4608
4609void Context::frontFace(GLenum mode)
4610{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004611 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004612}
4613
4614void Context::hint(GLenum target, GLenum mode)
4615{
4616 switch (target)
4617 {
4618 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004619 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004620 break;
4621
4622 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004623 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004624 break;
4625
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004626 case GL_PERSPECTIVE_CORRECTION_HINT:
4627 case GL_POINT_SMOOTH_HINT:
4628 case GL_LINE_SMOOTH_HINT:
4629 case GL_FOG_HINT:
4630 mGLState.gles1().setHint(target, mode);
4631 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004632 default:
4633 UNREACHABLE();
4634 return;
4635 }
4636}
4637
4638void Context::lineWidth(GLfloat width)
4639{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004640 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004641}
4642
4643void Context::pixelStorei(GLenum pname, GLint param)
4644{
4645 switch (pname)
4646 {
4647 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004648 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004649 break;
4650
4651 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004652 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004653 break;
4654
4655 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004656 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004657 break;
4658
4659 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004660 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004661 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004662 break;
4663
4664 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004665 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004666 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004667 break;
4668
4669 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004670 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004671 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004672 break;
4673
4674 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004675 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004676 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004677 break;
4678
4679 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004680 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004681 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004682 break;
4683
4684 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004685 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004686 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004687 break;
4688
4689 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004690 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004691 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004692 break;
4693
4694 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004695 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004696 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004697 break;
4698
4699 default:
4700 UNREACHABLE();
4701 return;
4702 }
4703}
4704
4705void Context::polygonOffset(GLfloat factor, GLfloat units)
4706{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004707 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004708}
4709
Jamie Madill876429b2017-04-20 15:46:24 -04004710void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004711{
Geoff Lang92019432017-11-20 13:09:34 -05004712 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004713}
4714
Jiawei Shaodb342272017-09-27 10:21:45 +08004715void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4716{
4717 mGLState.setSampleMaskParams(maskNumber, mask);
4718}
4719
Jamie Madillc20ab272016-06-09 07:20:46 -07004720void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4721{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004722 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004723}
4724
4725void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4726{
4727 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4728 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004729 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004730 }
4731
4732 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4733 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004734 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004735 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004736
4737 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004738}
4739
4740void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4741{
4742 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4743 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004744 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004745 }
4746
4747 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4748 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004749 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004750 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004751
4752 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004753}
4754
4755void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4756{
4757 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4758 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004759 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004760 }
4761
4762 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4763 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004764 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004765 }
4766}
4767
4768void Context::vertexAttrib1f(GLuint index, GLfloat x)
4769{
4770 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004771 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004772 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004773}
4774
4775void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4776{
4777 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004778 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004779 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004780}
4781
4782void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4783{
4784 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004785 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004786 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004787}
4788
4789void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4790{
4791 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004792 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004793 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004794}
4795
4796void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4797{
4798 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004799 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004800 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004801}
4802
4803void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4804{
4805 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004806 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004807 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004808}
4809
4810void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4811{
4812 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004813 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004814 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004815}
4816
4817void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4818{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004819 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004820 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004821}
4822
4823void Context::vertexAttribPointer(GLuint index,
4824 GLint size,
4825 GLenum type,
4826 GLboolean normalized,
4827 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004828 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004829{
Corentin Wallez336129f2017-10-17 15:55:40 -04004830 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004831 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004832 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004833}
4834
Shao80957d92017-02-20 21:25:59 +08004835void Context::vertexAttribFormat(GLuint attribIndex,
4836 GLint size,
4837 GLenum type,
4838 GLboolean normalized,
4839 GLuint relativeOffset)
4840{
Geoff Lang92019432017-11-20 13:09:34 -05004841 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004842 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004843 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004844}
4845
4846void Context::vertexAttribIFormat(GLuint attribIndex,
4847 GLint size,
4848 GLenum type,
4849 GLuint relativeOffset)
4850{
4851 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004852 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004853}
4854
4855void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4856{
Shaodde78e82017-05-22 14:13:27 +08004857 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004858 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004859}
4860
Jiajia Qin5451d532017-11-16 17:16:34 +08004861void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004862{
4863 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004864 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004865}
4866
Jamie Madillc20ab272016-06-09 07:20:46 -07004867void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4868{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004869 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004870}
4871
4872void Context::vertexAttribIPointer(GLuint index,
4873 GLint size,
4874 GLenum type,
4875 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004876 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004877{
Corentin Wallez336129f2017-10-17 15:55:40 -04004878 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4879 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004880 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004881}
4882
4883void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4884{
4885 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004886 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004887 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004888}
4889
4890void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4891{
4892 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004893 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004894 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004895}
4896
4897void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4898{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004899 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004900 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004901}
4902
4903void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4904{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004905 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004906 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004907}
4908
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004909void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4910{
4911 const VertexAttribCurrentValueData &currentValues =
4912 getGLState().getVertexAttribCurrentValue(index);
4913 const VertexArray *vao = getGLState().getVertexArray();
4914 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4915 currentValues, pname, params);
4916}
4917
Brandon Jones59770802018-04-02 13:18:42 -07004918void Context::getVertexAttribivRobust(GLuint index,
4919 GLenum pname,
4920 GLsizei bufSize,
4921 GLsizei *length,
4922 GLint *params)
4923{
4924 getVertexAttribiv(index, pname, params);
4925}
4926
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004927void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4928{
4929 const VertexAttribCurrentValueData &currentValues =
4930 getGLState().getVertexAttribCurrentValue(index);
4931 const VertexArray *vao = getGLState().getVertexArray();
4932 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4933 currentValues, pname, params);
4934}
4935
Brandon Jones59770802018-04-02 13:18:42 -07004936void Context::getVertexAttribfvRobust(GLuint index,
4937 GLenum pname,
4938 GLsizei bufSize,
4939 GLsizei *length,
4940 GLfloat *params)
4941{
4942 getVertexAttribfv(index, pname, params);
4943}
4944
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004945void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4946{
4947 const VertexAttribCurrentValueData &currentValues =
4948 getGLState().getVertexAttribCurrentValue(index);
4949 const VertexArray *vao = getGLState().getVertexArray();
4950 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4951 currentValues, pname, params);
4952}
4953
Brandon Jones59770802018-04-02 13:18:42 -07004954void Context::getVertexAttribIivRobust(GLuint index,
4955 GLenum pname,
4956 GLsizei bufSize,
4957 GLsizei *length,
4958 GLint *params)
4959{
4960 getVertexAttribIiv(index, pname, params);
4961}
4962
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004963void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4964{
4965 const VertexAttribCurrentValueData &currentValues =
4966 getGLState().getVertexAttribCurrentValue(index);
4967 const VertexArray *vao = getGLState().getVertexArray();
4968 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4969 currentValues, pname, params);
4970}
4971
Brandon Jones59770802018-04-02 13:18:42 -07004972void Context::getVertexAttribIuivRobust(GLuint index,
4973 GLenum pname,
4974 GLsizei bufSize,
4975 GLsizei *length,
4976 GLuint *params)
4977{
4978 getVertexAttribIuiv(index, pname, params);
4979}
4980
Jamie Madill876429b2017-04-20 15:46:24 -04004981void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004982{
4983 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4984 QueryVertexAttribPointerv(attrib, pname, pointer);
4985}
4986
Brandon Jones59770802018-04-02 13:18:42 -07004987void Context::getVertexAttribPointervRobust(GLuint index,
4988 GLenum pname,
4989 GLsizei bufSize,
4990 GLsizei *length,
4991 void **pointer)
4992{
4993 getVertexAttribPointerv(index, pname, pointer);
4994}
4995
Jamie Madillc20ab272016-06-09 07:20:46 -07004996void Context::debugMessageControl(GLenum source,
4997 GLenum type,
4998 GLenum severity,
4999 GLsizei count,
5000 const GLuint *ids,
5001 GLboolean enabled)
5002{
5003 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005004 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05005005 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07005006}
5007
5008void Context::debugMessageInsert(GLenum source,
5009 GLenum type,
5010 GLuint id,
5011 GLenum severity,
5012 GLsizei length,
5013 const GLchar *buf)
5014{
5015 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005016 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005017}
5018
5019void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5020{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005021 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005022}
5023
5024GLuint Context::getDebugMessageLog(GLuint count,
5025 GLsizei bufSize,
5026 GLenum *sources,
5027 GLenum *types,
5028 GLuint *ids,
5029 GLenum *severities,
5030 GLsizei *lengths,
5031 GLchar *messageLog)
5032{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005033 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5034 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005035}
5036
5037void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5038{
5039 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005040 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005041 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005042}
5043
5044void Context::popDebugGroup()
5045{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005046 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005047 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005048}
5049
Corentin Wallez336129f2017-10-17 15:55:40 -04005050void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005051{
5052 Buffer *buffer = mGLState.getTargetBuffer(target);
5053 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005054 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005055}
5056
Corentin Wallez336129f2017-10-17 15:55:40 -04005057void Context::bufferSubData(BufferBinding target,
5058 GLintptr offset,
5059 GLsizeiptr size,
5060 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005061{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005062 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005063 {
5064 return;
5065 }
5066
5067 Buffer *buffer = mGLState.getTargetBuffer(target);
5068 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005069 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005070}
5071
Jamie Madillef300b12016-10-07 15:12:09 -04005072void Context::attachShader(GLuint program, GLuint shader)
5073{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005074 Program *programObject = mState.mShaderPrograms->getProgram(program);
5075 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005076 ASSERT(programObject && shaderObject);
5077 programObject->attachShader(shaderObject);
5078}
5079
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005080const Workarounds &Context::getWorkarounds() const
5081{
5082 return mWorkarounds;
5083}
5084
Corentin Wallez336129f2017-10-17 15:55:40 -04005085void Context::copyBufferSubData(BufferBinding readTarget,
5086 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005087 GLintptr readOffset,
5088 GLintptr writeOffset,
5089 GLsizeiptr size)
5090{
5091 // if size is zero, the copy is a successful no-op
5092 if (size == 0)
5093 {
5094 return;
5095 }
5096
5097 // TODO(jmadill): cache these.
5098 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5099 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5100
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005101 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005102}
5103
Jamie Madill01a80ee2016-11-07 12:06:18 -05005104void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5105{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005106 // Ideally we could share the program query with the validation layer if possible.
5107 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005108 ASSERT(programObject);
5109 programObject->bindAttributeLocation(index, name);
5110}
5111
Corentin Wallez336129f2017-10-17 15:55:40 -04005112void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005113{
Corentin Wallez336129f2017-10-17 15:55:40 -04005114 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5115 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005116 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005117}
5118
Corentin Wallez336129f2017-10-17 15:55:40 -04005119void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005120{
5121 bindBufferRange(target, index, buffer, 0, 0);
5122}
5123
Corentin Wallez336129f2017-10-17 15:55:40 -04005124void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005125 GLuint index,
5126 GLuint buffer,
5127 GLintptr offset,
5128 GLsizeiptr size)
5129{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005130 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5131 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5132 if (target == BufferBinding::Uniform)
5133 {
5134 mUniformBufferObserverBindings[index].bind(object ? object->getImplementation() : nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04005135 mStateCache.onUniformBufferStateChange(this);
5136 }
5137 else
5138 {
5139 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005140 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005141}
5142
Jamie Madill01a80ee2016-11-07 12:06:18 -05005143void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5144{
5145 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5146 {
5147 bindReadFramebuffer(framebuffer);
5148 }
5149
5150 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5151 {
5152 bindDrawFramebuffer(framebuffer);
5153 }
5154}
5155
5156void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5157{
5158 ASSERT(target == GL_RENDERBUFFER);
5159 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005160 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005161 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005162}
5163
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005164void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005165 GLsizei samples,
5166 GLenum internalformat,
5167 GLsizei width,
5168 GLsizei height,
5169 GLboolean fixedsamplelocations)
5170{
5171 Extents size(width, height, 1);
5172 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005173 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5174 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005175}
5176
Olli Etuaho89664842018-08-24 14:45:36 +03005177void Context::texStorage3DMultisample(TextureType target,
5178 GLsizei samples,
5179 GLenum internalformat,
5180 GLsizei width,
5181 GLsizei height,
5182 GLsizei depth,
5183 GLboolean fixedsamplelocations)
5184{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005185 Extents size(width, height, depth);
5186 Texture *texture = getTargetTexture(target);
5187 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5188 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005189}
5190
JiangYizhoubddc46b2016-12-09 09:50:51 +08005191void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5192{
JiangYizhou5b03f472017-01-09 10:22:53 +08005193 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5194 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005195 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005196 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005197
5198 switch (pname)
5199 {
5200 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005201 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005202 break;
5203 default:
5204 UNREACHABLE();
5205 }
5206}
5207
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005208void Context::getMultisamplefvRobust(GLenum pname,
5209 GLuint index,
5210 GLsizei bufSize,
5211 GLsizei *length,
5212 GLfloat *val)
5213{
5214 UNIMPLEMENTED();
5215}
5216
Jamie Madille8fb6402017-02-14 17:56:40 -05005217void Context::renderbufferStorage(GLenum target,
5218 GLenum internalformat,
5219 GLsizei width,
5220 GLsizei height)
5221{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005222 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5223 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5224
Jamie Madille8fb6402017-02-14 17:56:40 -05005225 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005226 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005227}
5228
5229void Context::renderbufferStorageMultisample(GLenum target,
5230 GLsizei samples,
5231 GLenum internalformat,
5232 GLsizei width,
5233 GLsizei height)
5234{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005235 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5236 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005237
5238 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005239 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005240 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005241}
5242
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005243void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5244{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005245 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005246 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005247}
5248
JiangYizhoue18e6392017-02-20 10:32:23 +08005249void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5250{
5251 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5252 QueryFramebufferParameteriv(framebuffer, pname, params);
5253}
5254
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005255void Context::getFramebufferParameterivRobust(GLenum target,
5256 GLenum pname,
5257 GLsizei bufSize,
5258 GLsizei *length,
5259 GLint *params)
5260{
5261 UNIMPLEMENTED();
5262}
5263
Jiajia Qin5451d532017-11-16 17:16:34 +08005264void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005265{
5266 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005267 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005268}
5269
Jamie Madilldec86232018-07-11 09:01:18 -04005270bool Context::getScratchBuffer(size_t requstedSizeBytes,
5271 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005272{
Jamie Madilldec86232018-07-11 09:01:18 -04005273 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005274}
5275
Jamie Madilldec86232018-07-11 09:01:18 -04005276bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5277 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005278{
Jamie Madilldec86232018-07-11 09:01:18 -04005279 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005280}
5281
Xinghua Cao10a4d432017-11-28 14:46:26 +08005282Error Context::prepareForDispatch()
5283{
Geoff Langa8cb2872018-03-09 16:09:40 -05005284 ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005285
5286 if (isRobustResourceInitEnabled())
5287 {
5288 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5289 }
5290
5291 return NoError();
5292}
5293
Xinghua Cao2b396592017-03-29 15:36:04 +08005294void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5295{
5296 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5297 {
5298 return;
5299 }
5300
Xinghua Cao10a4d432017-11-28 14:46:26 +08005301 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005302 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005303}
5304
Jiajia Qin5451d532017-11-16 17:16:34 +08005305void Context::dispatchComputeIndirect(GLintptr indirect)
5306{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005307 ANGLE_CONTEXT_TRY(prepareForDispatch());
5308 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005309}
5310
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005311void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005312 GLsizei levels,
5313 GLenum internalFormat,
5314 GLsizei width,
5315 GLsizei height)
5316{
5317 Extents size(width, height, 1);
5318 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005319 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005320}
5321
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005322void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005323 GLsizei levels,
5324 GLenum internalFormat,
5325 GLsizei width,
5326 GLsizei height,
5327 GLsizei depth)
5328{
5329 Extents size(width, height, depth);
5330 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005331 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005332}
5333
Jiajia Qin5451d532017-11-16 17:16:34 +08005334void Context::memoryBarrier(GLbitfield barriers)
5335{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005336 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005337}
5338
5339void Context::memoryBarrierByRegion(GLbitfield barriers)
5340{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005341 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005342}
5343
Jamie Madillc1d770e2017-04-13 17:31:24 -04005344GLenum Context::checkFramebufferStatus(GLenum target)
5345{
5346 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5347 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005348 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005349}
5350
5351void Context::compileShader(GLuint shader)
5352{
5353 Shader *shaderObject = GetValidShader(this, shader);
5354 if (!shaderObject)
5355 {
5356 return;
5357 }
5358 shaderObject->compile(this);
5359}
5360
5361void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5362{
5363 for (int i = 0; i < n; i++)
5364 {
5365 deleteBuffer(buffers[i]);
5366 }
5367}
5368
5369void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5370{
5371 for (int i = 0; i < n; i++)
5372 {
5373 if (framebuffers[i] != 0)
5374 {
5375 deleteFramebuffer(framebuffers[i]);
5376 }
5377 }
5378}
5379
5380void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5381{
5382 for (int i = 0; i < n; i++)
5383 {
5384 deleteRenderbuffer(renderbuffers[i]);
5385 }
5386}
5387
5388void Context::deleteTextures(GLsizei n, const GLuint *textures)
5389{
5390 for (int i = 0; i < n; i++)
5391 {
5392 if (textures[i] != 0)
5393 {
5394 deleteTexture(textures[i]);
5395 }
5396 }
5397}
5398
5399void Context::detachShader(GLuint program, GLuint shader)
5400{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005401 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005402 ASSERT(programObject);
5403
5404 Shader *shaderObject = getShader(shader);
5405 ASSERT(shaderObject);
5406
5407 programObject->detachShader(this, shaderObject);
5408}
5409
5410void Context::genBuffers(GLsizei n, GLuint *buffers)
5411{
5412 for (int i = 0; i < n; i++)
5413 {
5414 buffers[i] = createBuffer();
5415 }
5416}
5417
5418void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5419{
5420 for (int i = 0; i < n; i++)
5421 {
5422 framebuffers[i] = createFramebuffer();
5423 }
5424}
5425
5426void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5427{
5428 for (int i = 0; i < n; i++)
5429 {
5430 renderbuffers[i] = createRenderbuffer();
5431 }
5432}
5433
5434void Context::genTextures(GLsizei n, GLuint *textures)
5435{
5436 for (int i = 0; i < n; i++)
5437 {
5438 textures[i] = createTexture();
5439 }
5440}
5441
5442void Context::getActiveAttrib(GLuint program,
5443 GLuint index,
5444 GLsizei bufsize,
5445 GLsizei *length,
5446 GLint *size,
5447 GLenum *type,
5448 GLchar *name)
5449{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005450 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005451 ASSERT(programObject);
5452 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5453}
5454
5455void Context::getActiveUniform(GLuint program,
5456 GLuint index,
5457 GLsizei bufsize,
5458 GLsizei *length,
5459 GLint *size,
5460 GLenum *type,
5461 GLchar *name)
5462{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005463 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005464 ASSERT(programObject);
5465 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5466}
5467
5468void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5469{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005470 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005471 ASSERT(programObject);
5472 programObject->getAttachedShaders(maxcount, count, shaders);
5473}
5474
5475GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5476{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005477 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005478 ASSERT(programObject);
5479 return programObject->getAttributeLocation(name);
5480}
5481
5482void Context::getBooleanv(GLenum pname, GLboolean *params)
5483{
5484 GLenum nativeType;
5485 unsigned int numParams = 0;
5486 getQueryParameterInfo(pname, &nativeType, &numParams);
5487
5488 if (nativeType == GL_BOOL)
5489 {
5490 getBooleanvImpl(pname, params);
5491 }
5492 else
5493 {
5494 CastStateValues(this, nativeType, pname, numParams, params);
5495 }
5496}
5497
Brandon Jones59770802018-04-02 13:18:42 -07005498void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5499{
5500 getBooleanv(pname, params);
5501}
5502
Jamie Madillc1d770e2017-04-13 17:31:24 -04005503void Context::getFloatv(GLenum pname, GLfloat *params)
5504{
5505 GLenum nativeType;
5506 unsigned int numParams = 0;
5507 getQueryParameterInfo(pname, &nativeType, &numParams);
5508
5509 if (nativeType == GL_FLOAT)
5510 {
5511 getFloatvImpl(pname, params);
5512 }
5513 else
5514 {
5515 CastStateValues(this, nativeType, pname, numParams, params);
5516 }
5517}
5518
Brandon Jones59770802018-04-02 13:18:42 -07005519void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5520{
5521 getFloatv(pname, params);
5522}
5523
Jamie Madillc1d770e2017-04-13 17:31:24 -04005524void Context::getIntegerv(GLenum pname, GLint *params)
5525{
5526 GLenum nativeType;
5527 unsigned int numParams = 0;
5528 getQueryParameterInfo(pname, &nativeType, &numParams);
5529
5530 if (nativeType == GL_INT)
5531 {
5532 getIntegervImpl(pname, params);
5533 }
5534 else
5535 {
5536 CastStateValues(this, nativeType, pname, numParams, params);
5537 }
5538}
5539
Brandon Jones59770802018-04-02 13:18:42 -07005540void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5541{
5542 getIntegerv(pname, data);
5543}
5544
Jamie Madillc1d770e2017-04-13 17:31:24 -04005545void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5546{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005547 // Don't resolve link if checking the link completion status.
5548 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5549 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005550 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005551 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005552}
5553
Brandon Jones59770802018-04-02 13:18:42 -07005554void Context::getProgramivRobust(GLuint program,
5555 GLenum pname,
5556 GLsizei bufSize,
5557 GLsizei *length,
5558 GLint *params)
5559{
5560 getProgramiv(program, pname, params);
5561}
5562
Jiajia Qin5451d532017-11-16 17:16:34 +08005563void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5564{
5565 UNIMPLEMENTED();
5566}
5567
Jamie Madillbe849e42017-05-02 15:49:00 -04005568void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005569{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005570 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005571 ASSERT(programObject);
5572 programObject->getInfoLog(bufsize, length, infolog);
5573}
5574
Jiajia Qin5451d532017-11-16 17:16:34 +08005575void Context::getProgramPipelineInfoLog(GLuint pipeline,
5576 GLsizei bufSize,
5577 GLsizei *length,
5578 GLchar *infoLog)
5579{
5580 UNIMPLEMENTED();
5581}
5582
Jamie Madillc1d770e2017-04-13 17:31:24 -04005583void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5584{
5585 Shader *shaderObject = getShader(shader);
5586 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005587 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005588}
5589
Brandon Jones59770802018-04-02 13:18:42 -07005590void Context::getShaderivRobust(GLuint shader,
5591 GLenum pname,
5592 GLsizei bufSize,
5593 GLsizei *length,
5594 GLint *params)
5595{
5596 getShaderiv(shader, pname, params);
5597}
5598
Jamie Madillc1d770e2017-04-13 17:31:24 -04005599void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5600{
5601 Shader *shaderObject = getShader(shader);
5602 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005603 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005604}
5605
5606void Context::getShaderPrecisionFormat(GLenum shadertype,
5607 GLenum precisiontype,
5608 GLint *range,
5609 GLint *precision)
5610{
5611 // TODO(jmadill): Compute shaders.
5612
5613 switch (shadertype)
5614 {
5615 case GL_VERTEX_SHADER:
5616 switch (precisiontype)
5617 {
5618 case GL_LOW_FLOAT:
5619 mCaps.vertexLowpFloat.get(range, precision);
5620 break;
5621 case GL_MEDIUM_FLOAT:
5622 mCaps.vertexMediumpFloat.get(range, precision);
5623 break;
5624 case GL_HIGH_FLOAT:
5625 mCaps.vertexHighpFloat.get(range, precision);
5626 break;
5627
5628 case GL_LOW_INT:
5629 mCaps.vertexLowpInt.get(range, precision);
5630 break;
5631 case GL_MEDIUM_INT:
5632 mCaps.vertexMediumpInt.get(range, precision);
5633 break;
5634 case GL_HIGH_INT:
5635 mCaps.vertexHighpInt.get(range, precision);
5636 break;
5637
5638 default:
5639 UNREACHABLE();
5640 return;
5641 }
5642 break;
5643
5644 case GL_FRAGMENT_SHADER:
5645 switch (precisiontype)
5646 {
5647 case GL_LOW_FLOAT:
5648 mCaps.fragmentLowpFloat.get(range, precision);
5649 break;
5650 case GL_MEDIUM_FLOAT:
5651 mCaps.fragmentMediumpFloat.get(range, precision);
5652 break;
5653 case GL_HIGH_FLOAT:
5654 mCaps.fragmentHighpFloat.get(range, precision);
5655 break;
5656
5657 case GL_LOW_INT:
5658 mCaps.fragmentLowpInt.get(range, precision);
5659 break;
5660 case GL_MEDIUM_INT:
5661 mCaps.fragmentMediumpInt.get(range, precision);
5662 break;
5663 case GL_HIGH_INT:
5664 mCaps.fragmentHighpInt.get(range, precision);
5665 break;
5666
5667 default:
5668 UNREACHABLE();
5669 return;
5670 }
5671 break;
5672
5673 default:
5674 UNREACHABLE();
5675 return;
5676 }
5677}
5678
5679void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5680{
5681 Shader *shaderObject = getShader(shader);
5682 ASSERT(shaderObject);
5683 shaderObject->getSource(bufsize, length, source);
5684}
5685
5686void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5687{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005688 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005689 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005690 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005691}
5692
Brandon Jones59770802018-04-02 13:18:42 -07005693void Context::getUniformfvRobust(GLuint program,
5694 GLint location,
5695 GLsizei bufSize,
5696 GLsizei *length,
5697 GLfloat *params)
5698{
5699 getUniformfv(program, location, params);
5700}
5701
Jamie Madillc1d770e2017-04-13 17:31:24 -04005702void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5703{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005704 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005705 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005706 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005707}
5708
Brandon Jones59770802018-04-02 13:18:42 -07005709void Context::getUniformivRobust(GLuint program,
5710 GLint location,
5711 GLsizei bufSize,
5712 GLsizei *length,
5713 GLint *params)
5714{
5715 getUniformiv(program, location, params);
5716}
5717
Jamie Madillc1d770e2017-04-13 17:31:24 -04005718GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5719{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005720 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005721 ASSERT(programObject);
5722 return programObject->getUniformLocation(name);
5723}
5724
5725GLboolean Context::isBuffer(GLuint buffer)
5726{
5727 if (buffer == 0)
5728 {
5729 return GL_FALSE;
5730 }
5731
5732 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5733}
5734
5735GLboolean Context::isEnabled(GLenum cap)
5736{
5737 return mGLState.getEnableFeature(cap);
5738}
5739
5740GLboolean Context::isFramebuffer(GLuint framebuffer)
5741{
5742 if (framebuffer == 0)
5743 {
5744 return GL_FALSE;
5745 }
5746
5747 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5748}
5749
5750GLboolean Context::isProgram(GLuint program)
5751{
5752 if (program == 0)
5753 {
5754 return GL_FALSE;
5755 }
5756
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005757 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005758}
5759
5760GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5761{
5762 if (renderbuffer == 0)
5763 {
5764 return GL_FALSE;
5765 }
5766
5767 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5768}
5769
5770GLboolean Context::isShader(GLuint shader)
5771{
5772 if (shader == 0)
5773 {
5774 return GL_FALSE;
5775 }
5776
5777 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5778}
5779
5780GLboolean Context::isTexture(GLuint texture)
5781{
5782 if (texture == 0)
5783 {
5784 return GL_FALSE;
5785 }
5786
5787 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5788}
5789
5790void Context::linkProgram(GLuint program)
5791{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005792 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005793 ASSERT(programObject);
5794 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08005795
5796 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
5797 // don't need to worry that:
5798 // 1. Draw calls after link use the new executable code or the old one depending on the link
5799 // result.
5800 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
5801 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
5802 // ProgramD3D.
5803 if (programObject->isInUse())
5804 {
Jamie Madill785e8a02018-10-04 17:42:00 -04005805 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04005806 if (programObject->isLinked())
5807 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04005808 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04005809 }
jchen107ae70d82018-07-06 13:47:01 +08005810 mStateCache.onProgramExecutableChange(this);
5811 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005812}
5813
5814void Context::releaseShaderCompiler()
5815{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005816 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005817}
5818
5819void Context::shaderBinary(GLsizei n,
5820 const GLuint *shaders,
5821 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005822 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005823 GLsizei length)
5824{
5825 // No binary shader formats are supported.
5826 UNIMPLEMENTED();
5827}
5828
Olli Etuaho0ca09752018-09-24 11:00:50 +03005829void Context::bindFragDataLocationIndexed(GLuint program,
5830 GLuint colorNumber,
5831 GLuint index,
5832 const char *name)
5833{
5834 Program *programObject = getProgramNoResolveLink(program);
5835 programObject->bindFragmentOutputLocation(colorNumber, name);
5836 programObject->bindFragmentOutputIndex(index, name);
5837}
5838
5839void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
5840{
5841 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
5842}
5843
5844int Context::getFragDataIndex(GLuint program, const char *name)
5845{
5846 Program *programObject = getProgramResolveLink(program);
5847 return programObject->getFragDataIndex(name);
5848}
5849
5850int Context::getProgramResourceLocationIndex(GLuint program,
5851 GLenum programInterface,
5852 const char *name)
5853{
5854 Program *programObject = getProgramResolveLink(program);
5855 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
5856 return programObject->getFragDataIndex(name);
5857}
5858
Jamie Madillc1d770e2017-04-13 17:31:24 -04005859void Context::shaderSource(GLuint shader,
5860 GLsizei count,
5861 const GLchar *const *string,
5862 const GLint *length)
5863{
5864 Shader *shaderObject = getShader(shader);
5865 ASSERT(shaderObject);
5866 shaderObject->setSource(count, string, length);
5867}
5868
5869void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5870{
5871 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5872}
5873
5874void Context::stencilMask(GLuint mask)
5875{
5876 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5877}
5878
5879void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5880{
5881 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5882}
5883
5884void Context::uniform1f(GLint location, GLfloat x)
5885{
5886 Program *program = mGLState.getProgram();
5887 program->setUniform1fv(location, 1, &x);
5888}
5889
5890void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5891{
5892 Program *program = mGLState.getProgram();
5893 program->setUniform1fv(location, count, v);
5894}
5895
Jamie Madill7e4eff12018-08-08 15:49:26 -04005896void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005897{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005898 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04005899 {
5900 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04005901 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04005902 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005903}
5904
Jamie Madill7e4eff12018-08-08 15:49:26 -04005905void Context::uniform1i(GLint location, GLint x)
5906{
5907 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
5908}
5909
Jamie Madillc1d770e2017-04-13 17:31:24 -04005910void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5911{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005912 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005913}
5914
5915void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5916{
5917 GLfloat xy[2] = {x, y};
5918 Program *program = mGLState.getProgram();
5919 program->setUniform2fv(location, 1, xy);
5920}
5921
5922void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5923{
5924 Program *program = mGLState.getProgram();
5925 program->setUniform2fv(location, count, v);
5926}
5927
5928void Context::uniform2i(GLint location, GLint x, GLint y)
5929{
5930 GLint xy[2] = {x, y};
5931 Program *program = mGLState.getProgram();
5932 program->setUniform2iv(location, 1, xy);
5933}
5934
5935void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
5936{
5937 Program *program = mGLState.getProgram();
5938 program->setUniform2iv(location, count, v);
5939}
5940
5941void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5942{
5943 GLfloat xyz[3] = {x, y, z};
5944 Program *program = mGLState.getProgram();
5945 program->setUniform3fv(location, 1, xyz);
5946}
5947
5948void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
5949{
5950 Program *program = mGLState.getProgram();
5951 program->setUniform3fv(location, count, v);
5952}
5953
5954void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
5955{
5956 GLint xyz[3] = {x, y, z};
5957 Program *program = mGLState.getProgram();
5958 program->setUniform3iv(location, 1, xyz);
5959}
5960
5961void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
5962{
5963 Program *program = mGLState.getProgram();
5964 program->setUniform3iv(location, count, v);
5965}
5966
5967void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5968{
5969 GLfloat xyzw[4] = {x, y, z, w};
5970 Program *program = mGLState.getProgram();
5971 program->setUniform4fv(location, 1, xyzw);
5972}
5973
5974void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
5975{
5976 Program *program = mGLState.getProgram();
5977 program->setUniform4fv(location, count, v);
5978}
5979
5980void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5981{
5982 GLint xyzw[4] = {x, y, z, w};
5983 Program *program = mGLState.getProgram();
5984 program->setUniform4iv(location, 1, xyzw);
5985}
5986
5987void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
5988{
5989 Program *program = mGLState.getProgram();
5990 program->setUniform4iv(location, count, v);
5991}
5992
5993void Context::uniformMatrix2fv(GLint location,
5994 GLsizei count,
5995 GLboolean transpose,
5996 const GLfloat *value)
5997{
5998 Program *program = mGLState.getProgram();
5999 program->setUniformMatrix2fv(location, count, transpose, value);
6000}
6001
6002void Context::uniformMatrix3fv(GLint location,
6003 GLsizei count,
6004 GLboolean transpose,
6005 const GLfloat *value)
6006{
6007 Program *program = mGLState.getProgram();
6008 program->setUniformMatrix3fv(location, count, transpose, value);
6009}
6010
6011void Context::uniformMatrix4fv(GLint location,
6012 GLsizei count,
6013 GLboolean transpose,
6014 const GLfloat *value)
6015{
6016 Program *program = mGLState.getProgram();
6017 program->setUniformMatrix4fv(location, count, transpose, value);
6018}
6019
6020void Context::validateProgram(GLuint program)
6021{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006022 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006023 ASSERT(programObject);
6024 programObject->validate(mCaps);
6025}
6026
Jiajia Qin5451d532017-11-16 17:16:34 +08006027void Context::validateProgramPipeline(GLuint pipeline)
6028{
6029 UNIMPLEMENTED();
6030}
6031
Jamie Madilld04908b2017-06-09 14:15:35 -04006032void Context::getProgramBinary(GLuint program,
6033 GLsizei bufSize,
6034 GLsizei *length,
6035 GLenum *binaryFormat,
6036 void *binary)
6037{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006038 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006039 ASSERT(programObject != nullptr);
6040
6041 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
6042}
6043
6044void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6045{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006046 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006047 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006048
Jamie Madilld04908b2017-06-09 14:15:35 -04006049 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006050 if (programObject->isInUse())
6051 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006052 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006053 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006054 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006055}
6056
Jamie Madillff325f12017-08-26 15:06:05 -04006057void Context::uniform1ui(GLint location, GLuint v0)
6058{
6059 Program *program = mGLState.getProgram();
6060 program->setUniform1uiv(location, 1, &v0);
6061}
6062
6063void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6064{
6065 Program *program = mGLState.getProgram();
6066 const GLuint xy[] = {v0, v1};
6067 program->setUniform2uiv(location, 1, xy);
6068}
6069
6070void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6071{
6072 Program *program = mGLState.getProgram();
6073 const GLuint xyz[] = {v0, v1, v2};
6074 program->setUniform3uiv(location, 1, xyz);
6075}
6076
6077void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6078{
6079 Program *program = mGLState.getProgram();
6080 const GLuint xyzw[] = {v0, v1, v2, v3};
6081 program->setUniform4uiv(location, 1, xyzw);
6082}
6083
6084void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6085{
6086 Program *program = mGLState.getProgram();
6087 program->setUniform1uiv(location, count, value);
6088}
6089void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6090{
6091 Program *program = mGLState.getProgram();
6092 program->setUniform2uiv(location, count, value);
6093}
6094
6095void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6096{
6097 Program *program = mGLState.getProgram();
6098 program->setUniform3uiv(location, count, value);
6099}
6100
6101void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6102{
6103 Program *program = mGLState.getProgram();
6104 program->setUniform4uiv(location, count, value);
6105}
6106
Jamie Madillf0e04492017-08-26 15:28:42 -04006107void Context::genQueries(GLsizei n, GLuint *ids)
6108{
6109 for (GLsizei i = 0; i < n; i++)
6110 {
6111 GLuint handle = mQueryHandleAllocator.allocate();
6112 mQueryMap.assign(handle, nullptr);
6113 ids[i] = handle;
6114 }
6115}
6116
6117void Context::deleteQueries(GLsizei n, const GLuint *ids)
6118{
6119 for (int i = 0; i < n; i++)
6120 {
6121 GLuint query = ids[i];
6122
6123 Query *queryObject = nullptr;
6124 if (mQueryMap.erase(query, &queryObject))
6125 {
6126 mQueryHandleAllocator.release(query);
6127 if (queryObject)
6128 {
6129 queryObject->release(this);
6130 }
6131 }
6132 }
6133}
6134
6135GLboolean Context::isQuery(GLuint id)
6136{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006137 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006138}
6139
Jamie Madillc8c95812017-08-26 18:40:09 -04006140void Context::uniformMatrix2x3fv(GLint location,
6141 GLsizei count,
6142 GLboolean transpose,
6143 const GLfloat *value)
6144{
6145 Program *program = mGLState.getProgram();
6146 program->setUniformMatrix2x3fv(location, count, transpose, value);
6147}
6148
6149void Context::uniformMatrix3x2fv(GLint location,
6150 GLsizei count,
6151 GLboolean transpose,
6152 const GLfloat *value)
6153{
6154 Program *program = mGLState.getProgram();
6155 program->setUniformMatrix3x2fv(location, count, transpose, value);
6156}
6157
6158void Context::uniformMatrix2x4fv(GLint location,
6159 GLsizei count,
6160 GLboolean transpose,
6161 const GLfloat *value)
6162{
6163 Program *program = mGLState.getProgram();
6164 program->setUniformMatrix2x4fv(location, count, transpose, value);
6165}
6166
6167void Context::uniformMatrix4x2fv(GLint location,
6168 GLsizei count,
6169 GLboolean transpose,
6170 const GLfloat *value)
6171{
6172 Program *program = mGLState.getProgram();
6173 program->setUniformMatrix4x2fv(location, count, transpose, value);
6174}
6175
6176void Context::uniformMatrix3x4fv(GLint location,
6177 GLsizei count,
6178 GLboolean transpose,
6179 const GLfloat *value)
6180{
6181 Program *program = mGLState.getProgram();
6182 program->setUniformMatrix3x4fv(location, count, transpose, value);
6183}
6184
6185void Context::uniformMatrix4x3fv(GLint location,
6186 GLsizei count,
6187 GLboolean transpose,
6188 const GLfloat *value)
6189{
6190 Program *program = mGLState.getProgram();
6191 program->setUniformMatrix4x3fv(location, count, transpose, value);
6192}
6193
Jamie Madilld7576732017-08-26 18:49:50 -04006194void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6195{
6196 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6197 {
6198 GLuint vertexArray = arrays[arrayIndex];
6199
6200 if (arrays[arrayIndex] != 0)
6201 {
6202 VertexArray *vertexArrayObject = nullptr;
6203 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6204 {
6205 if (vertexArrayObject != nullptr)
6206 {
6207 detachVertexArray(vertexArray);
6208 vertexArrayObject->onDestroy(this);
6209 }
6210
6211 mVertexArrayHandleAllocator.release(vertexArray);
6212 }
6213 }
6214 }
6215}
6216
6217void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6218{
6219 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6220 {
6221 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6222 mVertexArrayMap.assign(vertexArray, nullptr);
6223 arrays[arrayIndex] = vertexArray;
6224 }
6225}
6226
6227bool Context::isVertexArray(GLuint array)
6228{
6229 if (array == 0)
6230 {
6231 return GL_FALSE;
6232 }
6233
6234 VertexArray *vao = getVertexArray(array);
6235 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6236}
6237
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006238void Context::endTransformFeedback()
6239{
6240 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6241 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006242 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006243}
6244
6245void Context::transformFeedbackVaryings(GLuint program,
6246 GLsizei count,
6247 const GLchar *const *varyings,
6248 GLenum bufferMode)
6249{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006250 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006251 ASSERT(programObject);
6252 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6253}
6254
6255void Context::getTransformFeedbackVarying(GLuint program,
6256 GLuint index,
6257 GLsizei bufSize,
6258 GLsizei *length,
6259 GLsizei *size,
6260 GLenum *type,
6261 GLchar *name)
6262{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006263 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006264 ASSERT(programObject);
6265 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6266}
6267
6268void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6269{
6270 for (int i = 0; i < n; i++)
6271 {
6272 GLuint transformFeedback = ids[i];
6273 if (transformFeedback == 0)
6274 {
6275 continue;
6276 }
6277
6278 TransformFeedback *transformFeedbackObject = nullptr;
6279 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6280 {
6281 if (transformFeedbackObject != nullptr)
6282 {
6283 detachTransformFeedback(transformFeedback);
6284 transformFeedbackObject->release(this);
6285 }
6286
6287 mTransformFeedbackHandleAllocator.release(transformFeedback);
6288 }
6289 }
6290}
6291
6292void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6293{
6294 for (int i = 0; i < n; i++)
6295 {
6296 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6297 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6298 ids[i] = transformFeedback;
6299 }
6300}
6301
6302bool Context::isTransformFeedback(GLuint id)
6303{
6304 if (id == 0)
6305 {
6306 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6307 // returns FALSE
6308 return GL_FALSE;
6309 }
6310
6311 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6312 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6313}
6314
6315void Context::pauseTransformFeedback()
6316{
6317 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6318 transformFeedback->pause();
6319}
6320
6321void Context::resumeTransformFeedback()
6322{
6323 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6324 transformFeedback->resume();
6325}
6326
Jamie Madill12e957f2017-08-26 21:42:26 -04006327void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6328{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006329 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006330 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006331}
6332
Brandon Jones59770802018-04-02 13:18:42 -07006333void Context::getUniformuivRobust(GLuint program,
6334 GLint location,
6335 GLsizei bufSize,
6336 GLsizei *length,
6337 GLuint *params)
6338{
6339 getUniformuiv(program, location, params);
6340}
6341
Jamie Madill12e957f2017-08-26 21:42:26 -04006342GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6343{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006344 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006345 return programObject->getFragDataLocation(name);
6346}
6347
6348void Context::getUniformIndices(GLuint program,
6349 GLsizei uniformCount,
6350 const GLchar *const *uniformNames,
6351 GLuint *uniformIndices)
6352{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006353 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006354 if (!programObject->isLinked())
6355 {
6356 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6357 {
6358 uniformIndices[uniformId] = GL_INVALID_INDEX;
6359 }
6360 }
6361 else
6362 {
6363 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6364 {
6365 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6366 }
6367 }
6368}
6369
6370void Context::getActiveUniformsiv(GLuint program,
6371 GLsizei uniformCount,
6372 const GLuint *uniformIndices,
6373 GLenum pname,
6374 GLint *params)
6375{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006376 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006377 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6378 {
6379 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006380 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006381 }
6382}
6383
6384GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6385{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006386 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006387 return programObject->getUniformBlockIndex(uniformBlockName);
6388}
6389
6390void Context::getActiveUniformBlockiv(GLuint program,
6391 GLuint uniformBlockIndex,
6392 GLenum pname,
6393 GLint *params)
6394{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006395 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006396 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6397}
6398
Brandon Jones59770802018-04-02 13:18:42 -07006399void Context::getActiveUniformBlockivRobust(GLuint program,
6400 GLuint uniformBlockIndex,
6401 GLenum pname,
6402 GLsizei bufSize,
6403 GLsizei *length,
6404 GLint *params)
6405{
6406 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6407}
6408
Jamie Madill12e957f2017-08-26 21:42:26 -04006409void Context::getActiveUniformBlockName(GLuint program,
6410 GLuint uniformBlockIndex,
6411 GLsizei bufSize,
6412 GLsizei *length,
6413 GLchar *uniformBlockName)
6414{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006415 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006416 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6417}
6418
6419void Context::uniformBlockBinding(GLuint program,
6420 GLuint uniformBlockIndex,
6421 GLuint uniformBlockBinding)
6422{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006423 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006424 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006425
6426 if (programObject->isInUse())
6427 {
6428 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006429 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006430 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006431}
6432
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006433GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6434{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006435 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6436 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006437
Jamie Madill70b5bb02017-08-28 13:32:37 -04006438 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006439 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006440 if (error.isError())
6441 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006442 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006443 handleError(error);
6444 return nullptr;
6445 }
6446
Jamie Madill70b5bb02017-08-28 13:32:37 -04006447 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006448}
6449
6450GLboolean Context::isSync(GLsync sync)
6451{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006452 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006453}
6454
6455GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6456{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006457 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006458
6459 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006460 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006461 return result;
6462}
6463
6464void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6465{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006466 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006467 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006468}
6469
6470void Context::getInteger64v(GLenum pname, GLint64 *params)
6471{
6472 GLenum nativeType = GL_NONE;
6473 unsigned int numParams = 0;
6474 getQueryParameterInfo(pname, &nativeType, &numParams);
6475
6476 if (nativeType == GL_INT_64_ANGLEX)
6477 {
6478 getInteger64vImpl(pname, params);
6479 }
6480 else
6481 {
6482 CastStateValues(this, nativeType, pname, numParams, params);
6483 }
6484}
6485
Brandon Jones59770802018-04-02 13:18:42 -07006486void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6487{
6488 getInteger64v(pname, data);
6489}
6490
Corentin Wallez336129f2017-10-17 15:55:40 -04006491void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006492{
6493 Buffer *buffer = mGLState.getTargetBuffer(target);
6494 QueryBufferParameteri64v(buffer, pname, params);
6495}
6496
Brandon Jones59770802018-04-02 13:18:42 -07006497void Context::getBufferParameteri64vRobust(BufferBinding target,
6498 GLenum pname,
6499 GLsizei bufSize,
6500 GLsizei *length,
6501 GLint64 *params)
6502{
6503 getBufferParameteri64v(target, pname, params);
6504}
6505
Jamie Madill3ef140a2017-08-26 23:11:21 -04006506void Context::genSamplers(GLsizei count, GLuint *samplers)
6507{
6508 for (int i = 0; i < count; i++)
6509 {
6510 samplers[i] = mState.mSamplers->createSampler();
6511 }
6512}
6513
6514void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6515{
6516 for (int i = 0; i < count; i++)
6517 {
6518 GLuint sampler = samplers[i];
6519
6520 if (mState.mSamplers->getSampler(sampler))
6521 {
6522 detachSampler(sampler);
6523 }
6524
6525 mState.mSamplers->deleteObject(this, sampler);
6526 }
6527}
6528
6529void Context::getInternalformativ(GLenum target,
6530 GLenum internalformat,
6531 GLenum pname,
6532 GLsizei bufSize,
6533 GLint *params)
6534{
6535 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6536 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6537}
6538
Brandon Jones59770802018-04-02 13:18:42 -07006539void Context::getInternalformativRobust(GLenum target,
6540 GLenum internalformat,
6541 GLenum pname,
6542 GLsizei bufSize,
6543 GLsizei *length,
6544 GLint *params)
6545{
6546 getInternalformativ(target, internalformat, pname, bufSize, params);
6547}
6548
Jiajia Qin5451d532017-11-16 17:16:34 +08006549void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6550{
6551 programUniform1iv(program, location, 1, &v0);
6552}
6553
6554void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6555{
6556 GLint xy[2] = {v0, v1};
6557 programUniform2iv(program, location, 1, xy);
6558}
6559
6560void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6561{
6562 GLint xyz[3] = {v0, v1, v2};
6563 programUniform3iv(program, location, 1, xyz);
6564}
6565
6566void Context::programUniform4i(GLuint program,
6567 GLint location,
6568 GLint v0,
6569 GLint v1,
6570 GLint v2,
6571 GLint v3)
6572{
6573 GLint xyzw[4] = {v0, v1, v2, v3};
6574 programUniform4iv(program, location, 1, xyzw);
6575}
6576
6577void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6578{
6579 programUniform1uiv(program, location, 1, &v0);
6580}
6581
6582void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6583{
6584 GLuint xy[2] = {v0, v1};
6585 programUniform2uiv(program, location, 1, xy);
6586}
6587
6588void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6589{
6590 GLuint xyz[3] = {v0, v1, v2};
6591 programUniform3uiv(program, location, 1, xyz);
6592}
6593
6594void Context::programUniform4ui(GLuint program,
6595 GLint location,
6596 GLuint v0,
6597 GLuint v1,
6598 GLuint v2,
6599 GLuint v3)
6600{
6601 GLuint xyzw[4] = {v0, v1, v2, v3};
6602 programUniform4uiv(program, location, 1, xyzw);
6603}
6604
6605void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6606{
6607 programUniform1fv(program, location, 1, &v0);
6608}
6609
6610void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6611{
6612 GLfloat xy[2] = {v0, v1};
6613 programUniform2fv(program, location, 1, xy);
6614}
6615
6616void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6617{
6618 GLfloat xyz[3] = {v0, v1, v2};
6619 programUniform3fv(program, location, 1, xyz);
6620}
6621
6622void Context::programUniform4f(GLuint program,
6623 GLint location,
6624 GLfloat v0,
6625 GLfloat v1,
6626 GLfloat v2,
6627 GLfloat v3)
6628{
6629 GLfloat xyzw[4] = {v0, v1, v2, v3};
6630 programUniform4fv(program, location, 1, xyzw);
6631}
6632
Jamie Madill81c2e252017-09-09 23:32:46 -04006633void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6634{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006635 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006636 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006637 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006638}
6639
Jiajia Qin5451d532017-11-16 17:16:34 +08006640void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6641{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006642 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006643 ASSERT(programObject);
6644 programObject->setUniform2iv(location, count, value);
6645}
6646
6647void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6648{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006649 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006650 ASSERT(programObject);
6651 programObject->setUniform3iv(location, count, value);
6652}
6653
6654void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6655{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006656 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006657 ASSERT(programObject);
6658 programObject->setUniform4iv(location, count, value);
6659}
6660
6661void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6662{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006663 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006664 ASSERT(programObject);
6665 programObject->setUniform1uiv(location, count, value);
6666}
6667
6668void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6669{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006670 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006671 ASSERT(programObject);
6672 programObject->setUniform2uiv(location, count, value);
6673}
6674
6675void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6676{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006677 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006678 ASSERT(programObject);
6679 programObject->setUniform3uiv(location, count, value);
6680}
6681
6682void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6683{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006684 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006685 ASSERT(programObject);
6686 programObject->setUniform4uiv(location, count, value);
6687}
6688
6689void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6690{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006691 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006692 ASSERT(programObject);
6693 programObject->setUniform1fv(location, count, value);
6694}
6695
6696void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6697{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006698 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006699 ASSERT(programObject);
6700 programObject->setUniform2fv(location, count, value);
6701}
6702
6703void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6704{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006705 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006706 ASSERT(programObject);
6707 programObject->setUniform3fv(location, count, value);
6708}
6709
6710void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6711{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006712 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006713 ASSERT(programObject);
6714 programObject->setUniform4fv(location, count, value);
6715}
6716
6717void Context::programUniformMatrix2fv(GLuint program,
6718 GLint location,
6719 GLsizei count,
6720 GLboolean transpose,
6721 const GLfloat *value)
6722{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006723 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006724 ASSERT(programObject);
6725 programObject->setUniformMatrix2fv(location, count, transpose, value);
6726}
6727
6728void Context::programUniformMatrix3fv(GLuint program,
6729 GLint location,
6730 GLsizei count,
6731 GLboolean transpose,
6732 const GLfloat *value)
6733{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006734 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006735 ASSERT(programObject);
6736 programObject->setUniformMatrix3fv(location, count, transpose, value);
6737}
6738
6739void Context::programUniformMatrix4fv(GLuint program,
6740 GLint location,
6741 GLsizei count,
6742 GLboolean transpose,
6743 const GLfloat *value)
6744{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006745 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006746 ASSERT(programObject);
6747 programObject->setUniformMatrix4fv(location, count, transpose, value);
6748}
6749
6750void Context::programUniformMatrix2x3fv(GLuint program,
6751 GLint location,
6752 GLsizei count,
6753 GLboolean transpose,
6754 const GLfloat *value)
6755{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006756 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006757 ASSERT(programObject);
6758 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6759}
6760
6761void Context::programUniformMatrix3x2fv(GLuint program,
6762 GLint location,
6763 GLsizei count,
6764 GLboolean transpose,
6765 const GLfloat *value)
6766{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006767 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006768 ASSERT(programObject);
6769 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6770}
6771
6772void Context::programUniformMatrix2x4fv(GLuint program,
6773 GLint location,
6774 GLsizei count,
6775 GLboolean transpose,
6776 const GLfloat *value)
6777{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006778 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006779 ASSERT(programObject);
6780 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6781}
6782
6783void Context::programUniformMatrix4x2fv(GLuint program,
6784 GLint location,
6785 GLsizei count,
6786 GLboolean transpose,
6787 const GLfloat *value)
6788{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006789 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006790 ASSERT(programObject);
6791 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6792}
6793
6794void Context::programUniformMatrix3x4fv(GLuint program,
6795 GLint location,
6796 GLsizei count,
6797 GLboolean transpose,
6798 const GLfloat *value)
6799{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006800 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006801 ASSERT(programObject);
6802 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6803}
6804
6805void Context::programUniformMatrix4x3fv(GLuint program,
6806 GLint location,
6807 GLsizei count,
6808 GLboolean transpose,
6809 const GLfloat *value)
6810{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006811 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006812 ASSERT(programObject);
6813 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6814}
6815
Jamie Madill81c2e252017-09-09 23:32:46 -04006816void Context::onTextureChange(const Texture *texture)
6817{
6818 // Conservatively assume all textures are dirty.
6819 // TODO(jmadill): More fine-grained update.
6820 mGLState.setObjectDirty(GL_TEXTURE);
6821}
6822
James Darpiniane8a93c62018-01-04 18:02:24 -08006823bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6824{
6825 return mGLState.isCurrentTransformFeedback(tf);
6826}
James Darpiniane8a93c62018-01-04 18:02:24 -08006827
Yunchao Hea336b902017-08-02 16:05:21 +08006828void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6829{
6830 for (int i = 0; i < count; i++)
6831 {
6832 pipelines[i] = createProgramPipeline();
6833 }
6834}
6835
6836void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6837{
6838 for (int i = 0; i < count; i++)
6839 {
6840 if (pipelines[i] != 0)
6841 {
6842 deleteProgramPipeline(pipelines[i]);
6843 }
6844 }
6845}
6846
6847GLboolean Context::isProgramPipeline(GLuint pipeline)
6848{
6849 if (pipeline == 0)
6850 {
6851 return GL_FALSE;
6852 }
6853
6854 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6855}
6856
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006857void Context::finishFenceNV(GLuint fence)
6858{
6859 FenceNV *fenceObject = getFenceNV(fence);
6860
6861 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04006862 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006863}
6864
6865void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6866{
6867 FenceNV *fenceObject = getFenceNV(fence);
6868
6869 ASSERT(fenceObject && fenceObject->isSet());
6870
6871 switch (pname)
6872 {
6873 case GL_FENCE_STATUS_NV:
6874 {
6875 // GL_NV_fence spec:
6876 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6877 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6878 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6879 GLboolean status = GL_TRUE;
6880 if (fenceObject->getStatus() != GL_TRUE)
6881 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006882 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006883 }
6884 *params = status;
6885 break;
6886 }
6887
6888 case GL_FENCE_CONDITION_NV:
6889 {
6890 *params = static_cast<GLint>(fenceObject->getCondition());
6891 break;
6892 }
6893
6894 default:
6895 UNREACHABLE();
6896 }
6897}
6898
6899void Context::getTranslatedShaderSource(GLuint shader,
6900 GLsizei bufsize,
6901 GLsizei *length,
6902 GLchar *source)
6903{
6904 Shader *shaderObject = getShader(shader);
6905 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08006906 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006907}
6908
6909void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6910{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006911 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006912 ASSERT(programObject);
6913
6914 programObject->getUniformfv(this, location, params);
6915}
6916
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006917void Context::getnUniformfvRobust(GLuint program,
6918 GLint location,
6919 GLsizei bufSize,
6920 GLsizei *length,
6921 GLfloat *params)
6922{
6923 UNIMPLEMENTED();
6924}
6925
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006926void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
6927{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006928 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006929 ASSERT(programObject);
6930
6931 programObject->getUniformiv(this, location, params);
6932}
6933
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006934void Context::getnUniformivRobust(GLuint program,
6935 GLint location,
6936 GLsizei bufSize,
6937 GLsizei *length,
6938 GLint *params)
6939{
6940 UNIMPLEMENTED();
6941}
6942
6943void Context::getnUniformuivRobust(GLuint program,
6944 GLint location,
6945 GLsizei bufSize,
6946 GLsizei *length,
6947 GLuint *params)
6948{
6949 UNIMPLEMENTED();
6950}
6951
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006952GLboolean Context::isFenceNV(GLuint fence)
6953{
6954 FenceNV *fenceObject = getFenceNV(fence);
6955
6956 if (fenceObject == nullptr)
6957 {
6958 return GL_FALSE;
6959 }
6960
6961 // GL_NV_fence spec:
6962 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
6963 // existing fence.
6964 return fenceObject->isSet();
6965}
6966
6967void Context::readnPixels(GLint x,
6968 GLint y,
6969 GLsizei width,
6970 GLsizei height,
6971 GLenum format,
6972 GLenum type,
6973 GLsizei bufSize,
6974 void *data)
6975{
6976 return readPixels(x, y, width, height, format, type, data);
6977}
6978
Jamie Madill007530e2017-12-28 14:27:04 -05006979void Context::setFenceNV(GLuint fence, GLenum condition)
6980{
6981 ASSERT(condition == GL_ALL_COMPLETED_NV);
6982
6983 FenceNV *fenceObject = getFenceNV(fence);
6984 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04006985 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05006986}
6987
6988GLboolean Context::testFenceNV(GLuint fence)
6989{
6990 FenceNV *fenceObject = getFenceNV(fence);
6991
6992 ASSERT(fenceObject != nullptr);
6993 ASSERT(fenceObject->isSet() == GL_TRUE);
6994
6995 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04006996 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05006997 if (error.isError())
6998 {
6999 handleError(error);
7000 return GL_TRUE;
7001 }
7002
7003 return result;
7004}
7005
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007006void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007007{
7008 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007009 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05007010 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007011}
7012
Jamie Madillfa920eb2018-01-04 11:45:50 -05007013void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007014{
7015 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007016 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05007017 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
7018}
7019
Jamie Madillfa920eb2018-01-04 11:45:50 -05007020void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7021{
7022 UNIMPLEMENTED();
7023}
7024
Jamie Madill5b772312018-03-08 20:28:32 -05007025bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7026{
7027 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7028 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7029 // to the fact that it is stored internally as a float, and so would require conversion
7030 // if returned from Context::getIntegerv. Since this conversion is already implemented
7031 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7032 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7033 // application.
7034 switch (pname)
7035 {
7036 case GL_COMPRESSED_TEXTURE_FORMATS:
7037 {
7038 *type = GL_INT;
7039 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7040 return true;
7041 }
7042 case GL_SHADER_BINARY_FORMATS:
7043 {
7044 *type = GL_INT;
7045 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7046 return true;
7047 }
7048
7049 case GL_MAX_VERTEX_ATTRIBS:
7050 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7051 case GL_MAX_VARYING_VECTORS:
7052 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7053 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7054 case GL_MAX_TEXTURE_IMAGE_UNITS:
7055 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7056 case GL_MAX_RENDERBUFFER_SIZE:
7057 case GL_NUM_SHADER_BINARY_FORMATS:
7058 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7059 case GL_ARRAY_BUFFER_BINDING:
7060 case GL_FRAMEBUFFER_BINDING:
7061 case GL_RENDERBUFFER_BINDING:
7062 case GL_CURRENT_PROGRAM:
7063 case GL_PACK_ALIGNMENT:
7064 case GL_UNPACK_ALIGNMENT:
7065 case GL_GENERATE_MIPMAP_HINT:
7066 case GL_RED_BITS:
7067 case GL_GREEN_BITS:
7068 case GL_BLUE_BITS:
7069 case GL_ALPHA_BITS:
7070 case GL_DEPTH_BITS:
7071 case GL_STENCIL_BITS:
7072 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7073 case GL_CULL_FACE_MODE:
7074 case GL_FRONT_FACE:
7075 case GL_ACTIVE_TEXTURE:
7076 case GL_STENCIL_FUNC:
7077 case GL_STENCIL_VALUE_MASK:
7078 case GL_STENCIL_REF:
7079 case GL_STENCIL_FAIL:
7080 case GL_STENCIL_PASS_DEPTH_FAIL:
7081 case GL_STENCIL_PASS_DEPTH_PASS:
7082 case GL_STENCIL_BACK_FUNC:
7083 case GL_STENCIL_BACK_VALUE_MASK:
7084 case GL_STENCIL_BACK_REF:
7085 case GL_STENCIL_BACK_FAIL:
7086 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7087 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7088 case GL_DEPTH_FUNC:
7089 case GL_BLEND_SRC_RGB:
7090 case GL_BLEND_SRC_ALPHA:
7091 case GL_BLEND_DST_RGB:
7092 case GL_BLEND_DST_ALPHA:
7093 case GL_BLEND_EQUATION_RGB:
7094 case GL_BLEND_EQUATION_ALPHA:
7095 case GL_STENCIL_WRITEMASK:
7096 case GL_STENCIL_BACK_WRITEMASK:
7097 case GL_STENCIL_CLEAR_VALUE:
7098 case GL_SUBPIXEL_BITS:
7099 case GL_MAX_TEXTURE_SIZE:
7100 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7101 case GL_SAMPLE_BUFFERS:
7102 case GL_SAMPLES:
7103 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7104 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7105 case GL_TEXTURE_BINDING_2D:
7106 case GL_TEXTURE_BINDING_CUBE_MAP:
7107 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7108 {
7109 *type = GL_INT;
7110 *numParams = 1;
7111 return true;
7112 }
7113 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7114 {
7115 if (!getExtensions().packReverseRowOrder)
7116 {
7117 return false;
7118 }
7119 *type = GL_INT;
7120 *numParams = 1;
7121 return true;
7122 }
7123 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7124 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7125 {
7126 if (!getExtensions().textureRectangle)
7127 {
7128 return false;
7129 }
7130 *type = GL_INT;
7131 *numParams = 1;
7132 return true;
7133 }
7134 case GL_MAX_DRAW_BUFFERS_EXT:
7135 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7136 {
7137 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7138 {
7139 return false;
7140 }
7141 *type = GL_INT;
7142 *numParams = 1;
7143 return true;
7144 }
7145 case GL_MAX_VIEWPORT_DIMS:
7146 {
7147 *type = GL_INT;
7148 *numParams = 2;
7149 return true;
7150 }
7151 case GL_VIEWPORT:
7152 case GL_SCISSOR_BOX:
7153 {
7154 *type = GL_INT;
7155 *numParams = 4;
7156 return true;
7157 }
7158 case GL_SHADER_COMPILER:
7159 case GL_SAMPLE_COVERAGE_INVERT:
7160 case GL_DEPTH_WRITEMASK:
7161 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7162 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7163 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7164 // bool-natural
7165 case GL_SAMPLE_COVERAGE:
7166 case GL_SCISSOR_TEST:
7167 case GL_STENCIL_TEST:
7168 case GL_DEPTH_TEST:
7169 case GL_BLEND:
7170 case GL_DITHER:
7171 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7172 {
7173 *type = GL_BOOL;
7174 *numParams = 1;
7175 return true;
7176 }
7177 case GL_COLOR_WRITEMASK:
7178 {
7179 *type = GL_BOOL;
7180 *numParams = 4;
7181 return true;
7182 }
7183 case GL_POLYGON_OFFSET_FACTOR:
7184 case GL_POLYGON_OFFSET_UNITS:
7185 case GL_SAMPLE_COVERAGE_VALUE:
7186 case GL_DEPTH_CLEAR_VALUE:
7187 case GL_LINE_WIDTH:
7188 {
7189 *type = GL_FLOAT;
7190 *numParams = 1;
7191 return true;
7192 }
7193 case GL_ALIASED_LINE_WIDTH_RANGE:
7194 case GL_ALIASED_POINT_SIZE_RANGE:
7195 case GL_DEPTH_RANGE:
7196 {
7197 *type = GL_FLOAT;
7198 *numParams = 2;
7199 return true;
7200 }
7201 case GL_COLOR_CLEAR_VALUE:
7202 case GL_BLEND_COLOR:
7203 {
7204 *type = GL_FLOAT;
7205 *numParams = 4;
7206 return true;
7207 }
7208 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7209 if (!getExtensions().textureFilterAnisotropic)
7210 {
7211 return false;
7212 }
7213 *type = GL_FLOAT;
7214 *numParams = 1;
7215 return true;
7216 case GL_TIMESTAMP_EXT:
7217 if (!getExtensions().disjointTimerQuery)
7218 {
7219 return false;
7220 }
7221 *type = GL_INT_64_ANGLEX;
7222 *numParams = 1;
7223 return true;
7224 case GL_GPU_DISJOINT_EXT:
7225 if (!getExtensions().disjointTimerQuery)
7226 {
7227 return false;
7228 }
7229 *type = GL_INT;
7230 *numParams = 1;
7231 return true;
7232 case GL_COVERAGE_MODULATION_CHROMIUM:
7233 if (!getExtensions().framebufferMixedSamples)
7234 {
7235 return false;
7236 }
7237 *type = GL_INT;
7238 *numParams = 1;
7239 return true;
7240 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7241 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7242 {
7243 return false;
7244 }
7245 *type = GL_INT;
7246 *numParams = 1;
7247 return true;
7248 }
7249
7250 if (getExtensions().debug)
7251 {
7252 switch (pname)
7253 {
7254 case GL_DEBUG_LOGGED_MESSAGES:
7255 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7256 case GL_DEBUG_GROUP_STACK_DEPTH:
7257 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7258 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7259 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7260 case GL_MAX_LABEL_LENGTH:
7261 *type = GL_INT;
7262 *numParams = 1;
7263 return true;
7264
7265 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7266 case GL_DEBUG_OUTPUT:
7267 *type = GL_BOOL;
7268 *numParams = 1;
7269 return true;
7270 }
7271 }
7272
7273 if (getExtensions().multisampleCompatibility)
7274 {
7275 switch (pname)
7276 {
7277 case GL_MULTISAMPLE_EXT:
7278 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7279 *type = GL_BOOL;
7280 *numParams = 1;
7281 return true;
7282 }
7283 }
7284
7285 if (getExtensions().pathRendering)
7286 {
7287 switch (pname)
7288 {
7289 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7290 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7291 *type = GL_FLOAT;
7292 *numParams = 16;
7293 return true;
7294 }
7295 }
7296
7297 if (getExtensions().bindGeneratesResource)
7298 {
7299 switch (pname)
7300 {
7301 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7302 *type = GL_BOOL;
7303 *numParams = 1;
7304 return true;
7305 }
7306 }
7307
7308 if (getExtensions().clientArrays)
7309 {
7310 switch (pname)
7311 {
7312 case GL_CLIENT_ARRAYS_ANGLE:
7313 *type = GL_BOOL;
7314 *numParams = 1;
7315 return true;
7316 }
7317 }
7318
7319 if (getExtensions().sRGBWriteControl)
7320 {
7321 switch (pname)
7322 {
7323 case GL_FRAMEBUFFER_SRGB_EXT:
7324 *type = GL_BOOL;
7325 *numParams = 1;
7326 return true;
7327 }
7328 }
7329
7330 if (getExtensions().robustResourceInitialization &&
7331 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7332 {
7333 *type = GL_BOOL;
7334 *numParams = 1;
7335 return true;
7336 }
7337
7338 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7339 {
7340 *type = GL_BOOL;
7341 *numParams = 1;
7342 return true;
7343 }
7344
jchen1082af6202018-06-22 10:59:52 +08007345 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7346 {
7347 *type = GL_INT;
7348 *numParams = 1;
7349 return true;
7350 }
7351
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007352 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7353 {
7354 *type = GL_INT;
7355 *numParams = 1;
7356 return true;
7357 }
7358
Jamie Madill5b772312018-03-08 20:28:32 -05007359 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7360 switch (pname)
7361 {
7362 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7363 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7364 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7365 {
7366 return false;
7367 }
7368 *type = GL_INT;
7369 *numParams = 1;
7370 return true;
7371
7372 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7373 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7374 {
7375 return false;
7376 }
7377 *type = GL_INT;
7378 *numParams = 1;
7379 return true;
7380
7381 case GL_PROGRAM_BINARY_FORMATS_OES:
7382 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7383 {
7384 return false;
7385 }
7386 *type = GL_INT;
7387 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7388 return true;
7389
7390 case GL_PACK_ROW_LENGTH:
7391 case GL_PACK_SKIP_ROWS:
7392 case GL_PACK_SKIP_PIXELS:
7393 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7394 {
7395 return false;
7396 }
7397 *type = GL_INT;
7398 *numParams = 1;
7399 return true;
7400 case GL_UNPACK_ROW_LENGTH:
7401 case GL_UNPACK_SKIP_ROWS:
7402 case GL_UNPACK_SKIP_PIXELS:
7403 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7404 {
7405 return false;
7406 }
7407 *type = GL_INT;
7408 *numParams = 1;
7409 return true;
7410 case GL_VERTEX_ARRAY_BINDING:
7411 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7412 {
7413 return false;
7414 }
7415 *type = GL_INT;
7416 *numParams = 1;
7417 return true;
7418 case GL_PIXEL_PACK_BUFFER_BINDING:
7419 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7420 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7421 {
7422 return false;
7423 }
7424 *type = GL_INT;
7425 *numParams = 1;
7426 return true;
7427 case GL_MAX_SAMPLES:
7428 {
7429 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7430 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7431 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7432 {
7433 return false;
7434 }
7435 *type = GL_INT;
7436 *numParams = 1;
7437 return true;
7438
7439 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7440 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7441 {
7442 return false;
7443 }
7444 *type = GL_INT;
7445 *numParams = 1;
7446 return true;
7447 }
7448 }
7449
7450 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7451 {
7452 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7453 {
7454 return false;
7455 }
7456 *type = GL_INT;
7457 *numParams = 1;
7458 return true;
7459 }
7460
7461 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7462 {
7463 *type = GL_INT;
7464 *numParams = 1;
7465 return true;
7466 }
7467
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007468 if (getClientVersion() < Version(2, 0))
7469 {
7470 switch (pname)
7471 {
7472 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007473 case GL_CLIENT_ACTIVE_TEXTURE:
7474 case GL_MATRIX_MODE:
7475 case GL_MAX_TEXTURE_UNITS:
7476 case GL_MAX_MODELVIEW_STACK_DEPTH:
7477 case GL_MAX_PROJECTION_STACK_DEPTH:
7478 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007479 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007480 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007481 case GL_VERTEX_ARRAY_STRIDE:
7482 case GL_NORMAL_ARRAY_STRIDE:
7483 case GL_COLOR_ARRAY_STRIDE:
7484 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7485 case GL_VERTEX_ARRAY_SIZE:
7486 case GL_COLOR_ARRAY_SIZE:
7487 case GL_TEXTURE_COORD_ARRAY_SIZE:
7488 case GL_VERTEX_ARRAY_TYPE:
7489 case GL_NORMAL_ARRAY_TYPE:
7490 case GL_COLOR_ARRAY_TYPE:
7491 case GL_TEXTURE_COORD_ARRAY_TYPE:
7492 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7493 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7494 case GL_COLOR_ARRAY_BUFFER_BINDING:
7495 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7496 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7497 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7498 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007499 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007500 case GL_MODELVIEW_STACK_DEPTH:
7501 case GL_PROJECTION_STACK_DEPTH:
7502 case GL_TEXTURE_STACK_DEPTH:
7503 case GL_LOGIC_OP_MODE:
7504 case GL_BLEND_SRC:
7505 case GL_BLEND_DST:
7506 case GL_PERSPECTIVE_CORRECTION_HINT:
7507 case GL_POINT_SMOOTH_HINT:
7508 case GL_LINE_SMOOTH_HINT:
7509 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007510 *type = GL_INT;
7511 *numParams = 1;
7512 return true;
7513 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007514 case GL_FOG_DENSITY:
7515 case GL_FOG_START:
7516 case GL_FOG_END:
7517 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007518 case GL_POINT_SIZE:
7519 case GL_POINT_SIZE_MIN:
7520 case GL_POINT_SIZE_MAX:
7521 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007522 *type = GL_FLOAT;
7523 *numParams = 1;
7524 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007525 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007526 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007527 *type = GL_FLOAT;
7528 *numParams = 2;
7529 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007530 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007531 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007532 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007533 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007534 *type = GL_FLOAT;
7535 *numParams = 4;
7536 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007537 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007538 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007539 *type = GL_FLOAT;
7540 *numParams = 3;
7541 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007542 case GL_MODELVIEW_MATRIX:
7543 case GL_PROJECTION_MATRIX:
7544 case GL_TEXTURE_MATRIX:
7545 *type = GL_FLOAT;
7546 *numParams = 16;
7547 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007548 case GL_LIGHT_MODEL_TWO_SIDE:
7549 *type = GL_BOOL;
7550 *numParams = 1;
7551 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007552 }
7553 }
7554
Jamie Madill5b772312018-03-08 20:28:32 -05007555 if (getClientVersion() < Version(3, 0))
7556 {
7557 return false;
7558 }
7559
7560 // Check for ES3.0+ parameter names
7561 switch (pname)
7562 {
7563 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7564 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7565 case GL_UNIFORM_BUFFER_BINDING:
7566 case GL_TRANSFORM_FEEDBACK_BINDING:
7567 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7568 case GL_COPY_READ_BUFFER_BINDING:
7569 case GL_COPY_WRITE_BUFFER_BINDING:
7570 case GL_SAMPLER_BINDING:
7571 case GL_READ_BUFFER:
7572 case GL_TEXTURE_BINDING_3D:
7573 case GL_TEXTURE_BINDING_2D_ARRAY:
7574 case GL_MAX_3D_TEXTURE_SIZE:
7575 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7576 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7577 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7578 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7579 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7580 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7581 case GL_MAX_VARYING_COMPONENTS:
7582 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7583 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7584 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7585 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7586 case GL_NUM_EXTENSIONS:
7587 case GL_MAJOR_VERSION:
7588 case GL_MINOR_VERSION:
7589 case GL_MAX_ELEMENTS_INDICES:
7590 case GL_MAX_ELEMENTS_VERTICES:
7591 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7592 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7593 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7594 case GL_UNPACK_IMAGE_HEIGHT:
7595 case GL_UNPACK_SKIP_IMAGES:
7596 {
7597 *type = GL_INT;
7598 *numParams = 1;
7599 return true;
7600 }
7601
7602 case GL_MAX_ELEMENT_INDEX:
7603 case GL_MAX_UNIFORM_BLOCK_SIZE:
7604 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7605 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7606 case GL_MAX_SERVER_WAIT_TIMEOUT:
7607 {
7608 *type = GL_INT_64_ANGLEX;
7609 *numParams = 1;
7610 return true;
7611 }
7612
7613 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7614 case GL_TRANSFORM_FEEDBACK_PAUSED:
7615 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7616 case GL_RASTERIZER_DISCARD:
7617 {
7618 *type = GL_BOOL;
7619 *numParams = 1;
7620 return true;
7621 }
7622
7623 case GL_MAX_TEXTURE_LOD_BIAS:
7624 {
7625 *type = GL_FLOAT;
7626 *numParams = 1;
7627 return true;
7628 }
7629 }
7630
7631 if (getExtensions().requestExtension)
7632 {
7633 switch (pname)
7634 {
7635 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7636 *type = GL_INT;
7637 *numParams = 1;
7638 return true;
7639 }
7640 }
7641
7642 if (getClientVersion() < Version(3, 1))
7643 {
7644 return false;
7645 }
7646
7647 switch (pname)
7648 {
7649 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7650 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7651 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7652 case GL_MAX_FRAMEBUFFER_WIDTH:
7653 case GL_MAX_FRAMEBUFFER_HEIGHT:
7654 case GL_MAX_FRAMEBUFFER_SAMPLES:
7655 case GL_MAX_SAMPLE_MASK_WORDS:
7656 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7657 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7658 case GL_MAX_INTEGER_SAMPLES:
7659 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7660 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7661 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7662 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7663 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7664 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7665 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7666 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7667 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7668 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7669 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7670 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7671 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7672 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7673 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7674 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7675 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7676 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7677 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7678 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7679 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7680 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7681 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7682 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7683 case GL_MAX_UNIFORM_LOCATIONS:
7684 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7685 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7686 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7687 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7688 case GL_MAX_IMAGE_UNITS:
7689 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7690 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7691 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7692 case GL_SHADER_STORAGE_BUFFER_BINDING:
7693 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7694 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007695 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007696 *type = GL_INT;
7697 *numParams = 1;
7698 return true;
7699 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7700 *type = GL_INT_64_ANGLEX;
7701 *numParams = 1;
7702 return true;
7703 case GL_SAMPLE_MASK:
7704 *type = GL_BOOL;
7705 *numParams = 1;
7706 return true;
7707 }
7708
7709 if (getExtensions().geometryShader)
7710 {
7711 switch (pname)
7712 {
7713 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7714 case GL_LAYER_PROVOKING_VERTEX_EXT:
7715 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7716 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7717 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7718 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7719 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7720 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7721 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7722 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7723 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7724 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7725 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7726 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7727 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7728 *type = GL_INT;
7729 *numParams = 1;
7730 return true;
7731 }
7732 }
7733
7734 return false;
7735}
7736
7737bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7738{
7739 if (getClientVersion() < Version(3, 0))
7740 {
7741 return false;
7742 }
7743
7744 switch (target)
7745 {
7746 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7747 case GL_UNIFORM_BUFFER_BINDING:
7748 {
7749 *type = GL_INT;
7750 *numParams = 1;
7751 return true;
7752 }
7753 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7754 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7755 case GL_UNIFORM_BUFFER_START:
7756 case GL_UNIFORM_BUFFER_SIZE:
7757 {
7758 *type = GL_INT_64_ANGLEX;
7759 *numParams = 1;
7760 return true;
7761 }
7762 }
7763
7764 if (getClientVersion() < Version(3, 1))
7765 {
7766 return false;
7767 }
7768
7769 switch (target)
7770 {
7771 case GL_IMAGE_BINDING_LAYERED:
7772 {
7773 *type = GL_BOOL;
7774 *numParams = 1;
7775 return true;
7776 }
7777 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7778 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7779 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7780 case GL_SHADER_STORAGE_BUFFER_BINDING:
7781 case GL_VERTEX_BINDING_BUFFER:
7782 case GL_VERTEX_BINDING_DIVISOR:
7783 case GL_VERTEX_BINDING_OFFSET:
7784 case GL_VERTEX_BINDING_STRIDE:
7785 case GL_SAMPLE_MASK_VALUE:
7786 case GL_IMAGE_BINDING_NAME:
7787 case GL_IMAGE_BINDING_LEVEL:
7788 case GL_IMAGE_BINDING_LAYER:
7789 case GL_IMAGE_BINDING_ACCESS:
7790 case GL_IMAGE_BINDING_FORMAT:
7791 {
7792 *type = GL_INT;
7793 *numParams = 1;
7794 return true;
7795 }
7796 case GL_ATOMIC_COUNTER_BUFFER_START:
7797 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7798 case GL_SHADER_STORAGE_BUFFER_START:
7799 case GL_SHADER_STORAGE_BUFFER_SIZE:
7800 {
7801 *type = GL_INT_64_ANGLEX;
7802 *numParams = 1;
7803 return true;
7804 }
7805 }
7806
7807 return false;
7808}
7809
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007810Program *Context::getProgramResolveLink(GLuint handle) const
7811{
7812 Program *program = mState.mShaderPrograms->getProgram(handle);
7813 if (program)
7814 {
Jamie Madill785e8a02018-10-04 17:42:00 -04007815 program->resolveLink(this);
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007816 }
7817 return program;
7818}
7819
7820Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05007821{
7822 return mState.mShaderPrograms->getProgram(handle);
7823}
7824
7825Shader *Context::getShader(GLuint handle) const
7826{
7827 return mState.mShaderPrograms->getShader(handle);
7828}
7829
Jamie Madill5b772312018-03-08 20:28:32 -05007830bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7831{
7832 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7833}
7834
7835bool Context::isFramebufferGenerated(GLuint framebuffer) const
7836{
7837 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7838}
7839
7840bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7841{
7842 return mState.mPipelines->isHandleGenerated(pipeline);
7843}
7844
7845bool Context::usingDisplayTextureShareGroup() const
7846{
7847 return mDisplayTextureShareGroup;
7848}
7849
7850GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7851{
7852 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7853 internalformat == GL_DEPTH_STENCIL
7854 ? GL_DEPTH24_STENCIL8
7855 : internalformat;
7856}
7857
jchen1082af6202018-06-22 10:59:52 +08007858void Context::maxShaderCompilerThreads(GLuint count)
7859{
jchen107ae70d82018-07-06 13:47:01 +08007860 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08007861 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08007862 // A count of zero specifies a request for no parallel compiling or linking.
7863 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
7864 {
7865 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
7866 }
7867 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08007868}
7869
Jamie Madill2eb65032018-07-30 10:25:57 -04007870bool Context::isGLES1() const
7871{
7872 return mState.getClientVersion() < Version(2, 0);
7873}
7874
Jamie Madilla11819d2018-07-30 10:26:01 -04007875void Context::onSubjectStateChange(const Context *context,
7876 angle::SubjectIndex index,
7877 angle::SubjectMessage message)
7878{
Jamie Madilla11819d2018-07-30 10:26:01 -04007879 switch (index)
7880 {
7881 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007882 switch (message)
7883 {
7884 case angle::SubjectMessage::CONTENTS_CHANGED:
7885 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
7886 mStateCache.onVertexArrayBufferContentsChange(this);
7887 break;
7888 case angle::SubjectMessage::RESOURCE_MAPPED:
7889 case angle::SubjectMessage::RESOURCE_UNMAPPED:
7890 case angle::SubjectMessage::BINDING_CHANGED:
7891 mStateCache.onVertexArrayBufferStateChange(this);
7892 break;
7893 default:
7894 break;
7895 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007896 break;
7897
7898 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007899 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7900 {
7901 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
7902 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007903 break;
7904
7905 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007906 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7907 {
7908 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
7909 }
7910 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04007911 break;
7912
7913 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04007914 if (index < kTextureMaxSubjectIndex)
7915 {
7916 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04007917 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007918 }
Jamie Madille25b8002018-09-20 13:39:49 -04007919 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04007920 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04007921 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04007922 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007923 }
Jamie Madille25b8002018-09-20 13:39:49 -04007924 else
7925 {
7926 ASSERT(index < kSamplerMaxSubjectIndex);
7927 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
7928 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007929 break;
7930 }
7931}
7932
Jamie Madill6b873dd2018-07-12 23:56:30 -04007933// ErrorSet implementation.
7934ErrorSet::ErrorSet(Context *context) : mContext(context)
7935{
7936}
7937
7938ErrorSet::~ErrorSet() = default;
7939
Jamie Madill306b6c12018-07-27 08:12:49 -04007940void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04007941{
7942 // This internal enum is used to filter internal errors that are already handled.
7943 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
7944 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
7945 {
7946 return;
7947 }
7948
7949 if (ANGLE_UNLIKELY(error.isError()))
7950 {
7951 GLenum code = error.getCode();
7952 mErrors.insert(code);
Jamie Madill785e8a02018-10-04 17:42:00 -04007953
Jamie Madill6b873dd2018-07-12 23:56:30 -04007954 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
7955 {
7956 mContext->markContextLost();
7957 }
7958
7959 ASSERT(!error.getMessage().empty());
7960 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
7961 error.getID(), GL_DEBUG_SEVERITY_HIGH,
7962 error.getMessage());
7963 }
7964}
7965
Jamie Madillabfbc0f2018-10-09 12:48:52 -04007966void ErrorSet::handleError(GLenum errorCode,
7967 const char *message,
7968 const char *file,
7969 const char *function,
7970 unsigned int line)
7971{
7972 // TODO(jmadill): Handle error directly instead of creating object. http://anglebug.com/2491
7973 std::stringstream errorStream;
7974 errorStream << "Front-end Error: " << gl::FmtHex(errorCode) << ", in " << file << ", "
7975 << function << ":" << line << ". " << message;
7976
7977 handleError(gl::Error(errorCode, errorCode, errorStream.str()));
7978}
7979
Jamie Madill6b873dd2018-07-12 23:56:30 -04007980bool ErrorSet::empty() const
7981{
7982 return mErrors.empty();
7983}
7984
7985GLenum ErrorSet::popError()
7986{
7987 ASSERT(!empty());
7988 GLenum error = *mErrors.begin();
7989 mErrors.erase(mErrors.begin());
7990 return error;
7991}
Jamie Madilldc358af2018-07-31 11:22:13 -04007992
7993// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04007994StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007995 : mCachedHasAnyEnabledClientAttrib(false),
7996 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04007997 mCachedInstancedVertexElementLimit(0),
7998 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madilldc358af2018-07-31 11:22:13 -04007999{
8000}
8001
8002StateCache::~StateCache() = default;
8003
Jamie Madillac66f982018-10-09 18:30:01 -04008004void StateCache::initialize(Context *context)
8005{
8006 updateValidDrawModes(context);
8007 updateValidBindTextureTypes(context);
8008}
8009
Jamie Madilldc358af2018-07-31 11:22:13 -04008010void StateCache::updateActiveAttribsMask(Context *context)
8011{
8012 bool isGLES1 = context->isGLES1();
8013 const State &glState = context->getGLState();
8014
8015 if (!isGLES1 && !glState.getProgram())
8016 {
8017 mCachedActiveBufferedAttribsMask = AttributesMask();
8018 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008019 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008020 return;
8021 }
8022
8023 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8024 : glState.getProgram()->getActiveAttribLocationsMask();
8025
8026 const VertexArray *vao = glState.getVertexArray();
8027 ASSERT(vao);
8028
8029 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8030 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008031 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008032
Jamie Madill0a17e482018-08-31 17:19:11 -04008033 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8034 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008035 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008036 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8037}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008038
8039void StateCache::updateVertexElementLimits(Context *context)
8040{
8041 const VertexArray *vao = context->getGLState().getVertexArray();
8042
8043 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8044 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8045
8046 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8047 // If there are no buffered attributes then we should not limit the draw call count.
8048 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8049 {
8050 return;
8051 }
8052
8053 const auto &vertexAttribs = vao->getVertexAttributes();
8054 const auto &vertexBindings = vao->getVertexBindings();
8055
8056 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8057 {
8058 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8059 ASSERT(attrib.enabled);
8060
8061 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8062 ASSERT(context->isGLES1() ||
8063 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8064
8065 GLint64 limit = attrib.getCachedElementLimit();
8066 if (binding.getDivisor() > 0)
8067 {
8068 mCachedInstancedVertexElementLimit =
8069 std::min(mCachedInstancedVertexElementLimit, limit);
8070 }
8071 else
8072 {
8073 mCachedNonInstancedVertexElementLimit =
8074 std::min(mCachedNonInstancedVertexElementLimit, limit);
8075 }
8076 }
8077}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008078
Jamie Madilld84b6732018-09-06 15:54:35 -04008079void StateCache::updateBasicDrawStatesError()
8080{
8081 mCachedBasicDrawStatesError = kInvalidPointer;
8082}
8083
8084intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8085{
8086 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8087 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8088 return mCachedBasicDrawStatesError;
8089}
8090
Jamie Madillc43cdad2018-08-08 15:49:25 -04008091void StateCache::onVertexArrayBindingChange(Context *context)
8092{
8093 updateActiveAttribsMask(context);
8094 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008095 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008096}
8097
8098void StateCache::onProgramExecutableChange(Context *context)
8099{
8100 updateActiveAttribsMask(context);
8101 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008102 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008103 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008104}
8105
Jamie Madilld84b6732018-09-06 15:54:35 -04008106void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008107{
8108 updateVertexElementLimits(context);
8109}
8110
Jamie Madilld84b6732018-09-06 15:54:35 -04008111void StateCache::onVertexArrayBufferContentsChange(Context *context)
8112{
8113 updateVertexElementLimits(context);
8114 updateBasicDrawStatesError();
8115}
8116
Jamie Madillc43cdad2018-08-08 15:49:25 -04008117void StateCache::onVertexArrayStateChange(Context *context)
8118{
8119 updateActiveAttribsMask(context);
8120 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008121 updateBasicDrawStatesError();
8122}
8123
8124void StateCache::onVertexArrayBufferStateChange(Context *context)
8125{
8126 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008127}
8128
8129void StateCache::onGLES1ClientStateChange(Context *context)
8130{
8131 updateActiveAttribsMask(context);
8132}
Jamie Madilld84b6732018-09-06 15:54:35 -04008133
8134void StateCache::onDrawFramebufferChange(Context *context)
8135{
8136 updateBasicDrawStatesError();
8137}
8138
8139void StateCache::onContextCapChange(Context *context)
8140{
8141 updateBasicDrawStatesError();
8142}
8143
8144void StateCache::onStencilStateChange(Context *context)
8145{
8146 updateBasicDrawStatesError();
8147}
8148
8149void StateCache::onDefaultVertexAttributeChange(Context *context)
8150{
8151 updateBasicDrawStatesError();
8152}
8153
8154void StateCache::onActiveTextureChange(Context *context)
8155{
8156 updateBasicDrawStatesError();
8157}
8158
8159void StateCache::onQueryChange(Context *context)
8160{
8161 updateBasicDrawStatesError();
8162}
8163
8164void StateCache::onTransformFeedbackChange(Context *context)
8165{
8166 updateBasicDrawStatesError();
8167}
8168
8169void StateCache::onUniformBufferStateChange(Context *context)
8170{
8171 updateBasicDrawStatesError();
8172}
8173
8174void StateCache::onBufferBindingChange(Context *context)
8175{
8176 updateBasicDrawStatesError();
8177}
Jamie Madill526a6f62018-09-12 11:03:05 -04008178
8179void StateCache::updateValidDrawModes(Context *context)
8180{
8181 Program *program = context->getGLState().getProgram();
8182 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8183 {
8184 mCachedValidDrawModes = {{
8185 true, /* Points */
8186 true, /* Lines */
8187 true, /* LineLoop */
8188 true, /* LineStrip */
8189 true, /* Triangles */
8190 true, /* TriangleStrip */
8191 true, /* TriangleFan */
8192 false, /* LinesAdjacency */
8193 false, /* LineStripAdjacency */
8194 false, /* TrianglesAdjacency */
8195 false, /* TriangleStripAdjacency */
8196 false, /* InvalidEnum */
8197 }};
8198 }
8199 else
8200 {
8201 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8202
8203 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8204
8205 mCachedValidDrawModes = {{
8206 gsMode == PrimitiveMode::Points, /* Points */
8207 gsMode == PrimitiveMode::Lines, /* Lines */
8208 gsMode == PrimitiveMode::Lines, /* LineLoop */
8209 gsMode == PrimitiveMode::Lines, /* LineStrip */
8210 gsMode == PrimitiveMode::Triangles, /* Triangles */
8211 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8212 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8213 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8214 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8215 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8216 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8217 false, /* InvalidEnum */
8218 }};
8219 }
8220}
Jamie Madillac66f982018-10-09 18:30:01 -04008221
8222void StateCache::updateValidBindTextureTypes(Context *context)
8223{
8224 const Extensions &exts = context->getExtensions();
8225 bool isGLES3 = context->getClientMajorVersion() >= 3;
8226 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8227
8228 mCachedValidBindTextureTypes = {{
8229 true, /* _2D */
8230 isGLES3, /* _2DArray */
8231 isGLES31, /* _2DMultisample */
8232 exts.textureStorageMultisample2DArray, /* _2DMultisampleArray */
8233 isGLES3, /* _3D */
8234 exts.eglImageExternal || exts.eglStreamConsumerExternal, /* External */
8235 exts.textureRectangle, /* Rectangle */
8236 true, /* CubeMap */
8237 false, /* InvalidEnum */
8238
8239 }};
8240}
Jamie Madillc29968b2016-01-20 11:17:23 -05008241} // namespace gl