blob: bafb7fba463b8c634dabc3d9e8c20099d911eb8b [file] [log] [blame]
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001//
Geoff Langeeba6e12014-02-03 13:12:30 -05002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Context.cpp: Implements the gl::Context class, managing all GL state and performing
8// rendering operations. It is the GLES2 specific implementation of EGLContext.
9
Geoff Lang2b5420c2014-11-19 14:20:15 -050010#include "libANGLE/Context.h"
apatrick@chromium.org144f2802012-07-12 01:42:34 +000011
Jamie Madill231c7f52017-04-26 13:45:37 -040012#include <string.h>
Jamie Madillb9293972015-02-19 11:07:54 -050013#include <iterator>
14#include <sstream>
Sami Väisänend59ca052016-06-21 16:10:00 +030015#include <vector>
Jamie Madillb9293972015-02-19 11:07:54 -050016
Tobin Ehlisd7890bc2018-06-29 11:57:22 -060017#include "common/PackedEnums.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030018#include "common/matrix_utils.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040019#include "common/platform.h"
Jamie Madillb9293972015-02-19 11:07:54 -050020#include "common/utilities.h"
Geoff Langc339c4e2016-11-29 10:37:36 -050021#include "common/version.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050022#include "libANGLE/Buffer.h"
Jamie Madillb9293972015-02-19 11:07:54 -050023#include "libANGLE/Compiler.h"
Jamie Madill948bbe52017-06-01 13:10:42 -040024#include "libANGLE/Display.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050025#include "libANGLE/Fence.h"
26#include "libANGLE/Framebuffer.h"
27#include "libANGLE/FramebufferAttachment.h"
Lingfeng Yang461b09a2018-04-23 09:02:09 -070028#include "libANGLE/GLES1Renderer.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030029#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050030#include "libANGLE/Program.h"
Yunchao Hea336b902017-08-02 16:05:21 +080031#include "libANGLE/ProgramPipeline.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050032#include "libANGLE/Query.h"
Jamie Madillb9293972015-02-19 11:07:54 -050033#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050034#include "libANGLE/ResourceManager.h"
35#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050036#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050037#include "libANGLE/Texture.h"
38#include "libANGLE/TransformFeedback.h"
39#include "libANGLE/VertexArray.h"
Kenneth Russellf2f6f652016-10-05 19:53:23 -070040#include "libANGLE/Workarounds.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040041#include "libANGLE/formatutils.h"
Martin Radev66fb8202016-07-28 11:45:20 +030042#include "libANGLE/queryconversions.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040043#include "libANGLE/queryutils.h"
Jamie Madill6d32cef2018-08-14 02:34:28 -040044#include "libANGLE/renderer/BufferImpl.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040045#include "libANGLE/renderer/ContextImpl.h"
46#include "libANGLE/renderer/EGLImplFactory.h"
Jamie Madill7b62cf92017-11-02 15:20:49 -040047#include "libANGLE/renderer/Format.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040048#include "libANGLE/validationES.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000049
Geoff Langf6db0982015-08-25 13:04:00 -040050namespace
51{
52
Jamie Madillb6664922017-07-25 12:55:04 -040053#define ANGLE_HANDLE_ERR(X) \
54 handleError(X); \
55 return;
56#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
57
Ian Ewell3ffd78b2016-01-22 16:09:42 -050058template <typename T>
Geoff Lang4ddf5af2016-12-01 14:30:44 -050059std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030060 GLsizei numPaths,
61 const void *paths,
62 GLuint pathBase)
63{
64 std::vector<gl::Path *> ret;
65 ret.reserve(numPaths);
66
67 const auto *nameArray = static_cast<const T *>(paths);
68
69 for (GLsizei i = 0; i < numPaths; ++i)
70 {
71 const GLuint pathName = nameArray[i] + pathBase;
72
73 ret.push_back(resourceManager.getPath(pathName));
74 }
75
76 return ret;
77}
78
Geoff Lang4ddf5af2016-12-01 14:30:44 -050079std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030080 GLsizei numPaths,
81 GLenum pathNameType,
82 const void *paths,
83 GLuint pathBase)
84{
85 switch (pathNameType)
86 {
87 case GL_UNSIGNED_BYTE:
88 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
89
90 case GL_BYTE:
91 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
92
93 case GL_UNSIGNED_SHORT:
94 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
95
96 case GL_SHORT:
97 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
98
99 case GL_UNSIGNED_INT:
100 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
101
102 case GL_INT:
103 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
104 }
105
106 UNREACHABLE();
107 return std::vector<gl::Path *>();
108}
109
110template <typename T>
Jamie Madill5188a272018-07-25 10:53:56 -0400111gl::Error GetQueryObjectParameter(const gl::Context *context,
112 gl::Query *query,
113 GLenum pname,
114 T *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500115{
Geoff Lang2186c382016-10-14 10:54:54 -0400116 ASSERT(query != nullptr);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500117
118 switch (pname)
119 {
120 case GL_QUERY_RESULT_EXT:
Jamie Madill5188a272018-07-25 10:53:56 -0400121 return query->getResult(context, params);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500122 case GL_QUERY_RESULT_AVAILABLE_EXT:
123 {
124 bool available;
Jamie Madill5188a272018-07-25 10:53:56 -0400125 gl::Error error = query->isResultAvailable(context, &available);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500126 if (!error.isError())
127 {
jchen10a99ed552017-09-22 08:10:32 +0800128 *params = gl::CastFromStateValue<T>(pname, static_cast<GLuint>(available));
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500129 }
130 return error;
131 }
132 default:
133 UNREACHABLE();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500134 return gl::InternalError() << "Unreachable Error";
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500135 }
136}
137
Jamie Madill956ab4d2018-10-10 16:13:03 -0400138ANGLE_INLINE void MarkTransformFeedbackBufferUsage(const gl::Context *context,
139 gl::TransformFeedback *transformFeedback,
140 GLsizei count,
141 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -0400142{
Geoff Lang1a683462015-09-29 15:09:59 -0400143 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400144 {
Jamie Madill09463932018-04-04 05:26:59 -0400145 transformFeedback->onVerticesDrawn(context, count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -0400146 }
147}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500148
149// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300150EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500151{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400152 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500153}
154
Martin Radev1be913c2016-07-11 17:59:16 +0300155EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
156{
157 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
158}
159
Geoff Langeb66a6e2016-10-31 13:06:12 -0400160gl::Version GetClientVersion(const egl::AttributeMap &attribs)
161{
162 return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
163}
164
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500165GLenum GetResetStrategy(const egl::AttributeMap &attribs)
166{
Lingfeng Yangb27b03a2018-02-19 13:38:48 -0800167 EGLAttrib attrib =
168 attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500169 switch (attrib)
170 {
171 case EGL_NO_RESET_NOTIFICATION:
172 return GL_NO_RESET_NOTIFICATION_EXT;
173 case EGL_LOSE_CONTEXT_ON_RESET:
174 return GL_LOSE_CONTEXT_ON_RESET_EXT;
175 default:
176 UNREACHABLE();
177 return GL_NONE;
178 }
179}
180
181bool GetRobustAccess(const egl::AttributeMap &attribs)
182{
Geoff Lang077f20a2016-11-01 10:08:02 -0400183 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
184 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
185 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500186}
187
188bool GetDebug(const egl::AttributeMap &attribs)
189{
Geoff Lang077f20a2016-11-01 10:08:02 -0400190 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
191 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500192}
193
194bool GetNoError(const egl::AttributeMap &attribs)
195{
196 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
197}
198
Geoff Langc287ea62016-09-16 14:46:51 -0400199bool GetWebGLContext(const egl::AttributeMap &attribs)
200{
Jamie Madill4230d482018-09-14 10:14:45 -0400201 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
Geoff Langc287ea62016-09-16 14:46:51 -0400202}
203
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400204bool GetExtensionsEnabled(const egl::AttributeMap &attribs, bool webGLContext)
205{
206 // If the context is WebGL, extensions are disabled by default
207 EGLAttrib defaultValue = webGLContext ? EGL_FALSE : EGL_TRUE;
208 return (attribs.get(EGL_EXTENSIONS_ENABLED_ANGLE, defaultValue) == EGL_TRUE);
209}
210
Geoff Langf41a7152016-09-19 15:11:17 -0400211bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
212{
Jamie Madill4230d482018-09-14 10:14:45 -0400213 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
Geoff Langf41a7152016-09-19 15:11:17 -0400214}
215
Geoff Langfeb8c682017-02-13 16:07:35 -0500216bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
217{
218 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
219}
220
Geoff Langb433e872017-10-05 14:01:47 -0400221bool GetRobustResourceInit(const egl::AttributeMap &attribs)
222{
223 return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
224}
225
Martin Radev9d901792016-07-15 15:58:58 +0300226std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
227{
228 std::string labelName;
229 if (label != nullptr)
230 {
231 size_t labelLength = length < 0 ? strlen(label) : length;
232 labelName = std::string(label, labelLength);
233 }
234 return labelName;
235}
236
237void GetObjectLabelBase(const std::string &objectLabel,
238 GLsizei bufSize,
239 GLsizei *length,
240 GLchar *label)
241{
242 size_t writeLength = objectLabel.length();
243 if (label != nullptr && bufSize > 0)
244 {
245 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
246 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
247 label[writeLength] = '\0';
248 }
249
250 if (length != nullptr)
251 {
252 *length = static_cast<GLsizei>(writeLength);
253 }
254}
255
Jamie Madill0f80ed82017-09-19 00:24:56 -0400256template <typename CapT, typename MaxT>
257void LimitCap(CapT *cap, MaxT maximum)
258{
259 *cap = std::min(*cap, static_cast<CapT>(maximum));
260}
261
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600262constexpr angle::PackedEnumMap<gl::PrimitiveMode, GLsizei> kMinimumPrimitiveCounts = {{
Jamie Madill526a6f62018-09-12 11:03:05 -0400263 1, /* Points */
264 2, /* Lines */
265 2, /* LineLoop */
266 2, /* LineStrip */
267 3, /* Triangles */
268 3, /* TriangleStrip */
269 3, /* TriangleFan */
270 2, /* LinesAdjacency */
271 2, /* LineStripAdjacency */
272 3, /* TrianglesAdjacency */
273 3, /* TriangleStripAdjacency */
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600274}};
275// Indices above are code-gen'd so make sure they don't change
276// if any of these static asserts are hit, must update kMinimumPrimitiveCounts abouve
277static_assert(static_cast<gl::PrimitiveMode>(0) == gl::PrimitiveMode::Points,
278 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
279static_assert(static_cast<gl::PrimitiveMode>(1) == gl::PrimitiveMode::Lines,
280 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
281static_assert(static_cast<gl::PrimitiveMode>(2) == gl::PrimitiveMode::LineLoop,
282 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
283static_assert(static_cast<gl::PrimitiveMode>(3) == gl::PrimitiveMode::LineStrip,
284 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
285static_assert(static_cast<gl::PrimitiveMode>(4) == gl::PrimitiveMode::Triangles,
286 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
287static_assert(static_cast<gl::PrimitiveMode>(5) == gl::PrimitiveMode::TriangleStrip,
288 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
289static_assert(static_cast<gl::PrimitiveMode>(6) == gl::PrimitiveMode::TriangleFan,
290 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
291static_assert(static_cast<gl::PrimitiveMode>(7) == gl::PrimitiveMode::LinesAdjacency,
292 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
293static_assert(static_cast<gl::PrimitiveMode>(8) == gl::PrimitiveMode::LineStripAdjacency,
294 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
295static_assert(static_cast<gl::PrimitiveMode>(9) == gl::PrimitiveMode::TrianglesAdjacency,
296 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
297static_assert(static_cast<gl::PrimitiveMode>(10) == gl::PrimitiveMode::TriangleStripAdjacency,
298 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
299static_assert(static_cast<gl::PrimitiveMode>(11) == gl::PrimitiveMode::EnumCount,
300 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
301
Jamie Madill6d32cef2018-08-14 02:34:28 -0400302enum SubjectIndexes : angle::SubjectIndex
303{
304 kTexture0SubjectIndex = 0,
305 kTextureMaxSubjectIndex = kTexture0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
306 kUniformBuffer0SubjectIndex = kTextureMaxSubjectIndex,
307 kUniformBufferMaxSubjectIndex =
308 kUniformBuffer0SubjectIndex + gl::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS,
Jamie Madille25b8002018-09-20 13:39:49 -0400309 kSampler0SubjectIndex = kUniformBufferMaxSubjectIndex,
310 kSamplerMaxSubjectIndex = kSampler0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
311 kVertexArraySubjectIndex = kSamplerMaxSubjectIndex,
Jamie Madill6d32cef2018-08-14 02:34:28 -0400312 kReadFramebufferSubjectIndex,
313 kDrawFramebufferSubjectIndex
314};
Geoff Langf6db0982015-08-25 13:04:00 -0400315} // anonymous namespace
316
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000317namespace gl
318{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000319
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400320Context::Context(rx::EGLImplFactory *implFactory,
321 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400322 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500323 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400324 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500325 const egl::AttributeMap &attribs,
Brandon Jones2b0cdcc2018-05-02 08:02:50 -0700326 const egl::DisplayExtensions &displayExtensions,
327 const egl::ClientExtensions &clientExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500328 : mState(reinterpret_cast<ContextID>(this),
329 shareContext ? &shareContext->mState : nullptr,
330 shareTextures,
331 GetClientVersion(attribs),
332 &mGLState,
333 mCaps,
334 mTextureCaps,
335 mExtensions,
336 mLimitations),
337 mSkipValidation(GetNoError(attribs)),
338 mDisplayTextureShareGroup(shareTextures != nullptr),
339 mSavedArgsType(nullptr),
Geoff Lang3cacf692018-06-20 16:49:57 -0400340 mImplementation(implFactory->createContext(mState, config, shareContext, attribs)),
Geoff Lang75359662018-04-11 01:42:27 -0400341 mLabel(nullptr),
Jamie Madill2f348d22017-06-05 10:50:59 -0400342 mCompiler(),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400343 mGLState(GetDebug(attribs),
344 GetBindGeneratesResource(attribs),
345 GetClientArraysEnabled(attribs),
346 GetRobustResourceInit(attribs),
347 memoryProgramCache != nullptr),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400348 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500349 mClientType(EGL_OPENGL_ES_API),
Jamie Madill6b873dd2018-07-12 23:56:30 -0400350 mErrors(this),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500351 mHasBeenCurrent(false),
352 mContextLost(false),
353 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700354 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500355 mResetStrategy(GetResetStrategy(attribs)),
356 mRobustAccess(GetRobustAccess(attribs)),
Geoff Lang33f11fb2018-05-07 13:42:47 -0400357 mSurfacelessSupported(displayExtensions.surfacelessContext),
358 mExplicitContextAvailable(clientExtensions.explicitContext),
Jamie Madill61e16b42017-06-19 11:13:23 -0400359 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
360 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madille14951e2017-03-09 18:55:16 -0500361 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400362 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400363 mMemoryProgramCache(memoryProgramCache),
Jamie Madilla11819d2018-07-30 10:26:01 -0400364 mVertexArrayObserverBinding(this, kVertexArraySubjectIndex),
365 mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex),
366 mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400367 mScratchBuffer(1000u),
jchen107ae70d82018-07-06 13:47:01 +0800368 mZeroFilledBuffer(1000u),
369 mThreadPool(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000370{
Jamie Madill5b772312018-03-08 20:28:32 -0500371 // Needed to solve a Clang warning of unused variables.
Jamie Madillc6dbc252018-04-30 19:07:56 -0400372 ANGLE_UNUSED_VARIABLE(mSavedArgsType);
373 ANGLE_UNUSED_VARIABLE(mParamsBuffer);
Jamie Madill6d32cef2018-08-14 02:34:28 -0400374
375 for (angle::SubjectIndex uboIndex = kUniformBuffer0SubjectIndex;
376 uboIndex < kUniformBufferMaxSubjectIndex; ++uboIndex)
377 {
378 mUniformBufferObserverBindings.emplace_back(this, uboIndex);
379 }
Jamie Madille25b8002018-09-20 13:39:49 -0400380
381 for (angle::SubjectIndex samplerIndex = kSampler0SubjectIndex;
382 samplerIndex < kSamplerMaxSubjectIndex; ++samplerIndex)
383 {
384 mSamplerObserverBindings.emplace_back(this, samplerIndex);
385 }
Geoff Lang33f11fb2018-05-07 13:42:47 -0400386}
Jamie Madill5b772312018-03-08 20:28:32 -0500387
Geoff Lang33f11fb2018-05-07 13:42:47 -0400388void Context::initialize()
389{
390 mImplementation->setMemoryProgramCache(mMemoryProgramCache);
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400391
Geoff Lang33f11fb2018-05-07 13:42:47 -0400392 initCaps();
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700393 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400394
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400395 mGLState.initialize(this);
Régis Fénéon83107972015-02-05 12:57:44 +0100396
Shannon Woods53a94a82014-06-24 15:20:36 -0400397 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400398
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000399 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400400 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000401 // and cube map texture state vectors respectively associated with them.
402 // In order that access to these initial textures not be lost, they are treated as texture
403 // objects all of whose names are 0.
404
Corentin Wallez99d492c2018-02-27 15:17:10 -0500405 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800406 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500407
Corentin Wallez99d492c2018-02-27 15:17:10 -0500408 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800409 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400410
Geoff Langeb66a6e2016-10-31 13:06:12 -0400411 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400412 {
413 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500414 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800415 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400416
Corentin Wallez99d492c2018-02-27 15:17:10 -0500417 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800418 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400419 }
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 {
Jamie Madill1c7f08c2018-10-10 16:13:02 -0400596 zeroTexture->onDestroy(this);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800597 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
Jamie Madilla139f012018-10-10 16:13:03 -04002631void Context::validationError(GLenum errorCode, const char *message)
2632{
2633 mErrors.validationError(errorCode, message);
2634}
2635
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002636// Get one of the recorded errors and clear its flag, if any.
2637// [OpenGL ES 2.0.24] section 2.5 page 13.
2638GLenum Context::getError()
2639{
Geoff Langda5777c2014-07-11 09:52:58 -04002640 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002641 {
Geoff Langda5777c2014-07-11 09:52:58 -04002642 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002643 }
Geoff Langda5777c2014-07-11 09:52:58 -04002644 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002645 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002646 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002647 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002648}
2649
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002650// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002651void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002652{
2653 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002654 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002655 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002656 mContextLostForced = true;
2657 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002658 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002659}
2660
Jamie Madillfa920eb2018-01-04 11:45:50 -05002661GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002662{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002663 // Even if the application doesn't want to know about resets, we want to know
2664 // as it will allow us to skip all the calls.
2665 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002666 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002667 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002668 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002669 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002670 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002671
2672 // EXT_robustness, section 2.6: If the reset notification behavior is
2673 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2674 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2675 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002676 }
2677
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002678 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2679 // status should be returned at least once, and GL_NO_ERROR should be returned
2680 // once the device has finished resetting.
2681 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002682 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002683 ASSERT(mResetStatus == GL_NO_ERROR);
2684 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002685
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002686 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002687 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002688 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002689 }
2690 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002691 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002692 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002693 // If markContextLost was used to mark the context lost then
2694 // assume that is not recoverable, and continue to report the
2695 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002696 mResetStatus = mImplementation->getResetStatus();
2697 }
Jamie Madill893ab082014-05-16 16:56:10 -04002698
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002699 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002700}
2701
2702bool Context::isResetNotificationEnabled()
2703{
2704 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2705}
2706
Corentin Walleze3b10e82015-05-20 11:06:25 -04002707const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002708{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002709 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002710}
2711
2712EGLenum Context::getClientType() const
2713{
2714 return mClientType;
2715}
2716
2717EGLenum Context::getRenderBuffer() const
2718{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002719 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2720 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002721 {
2722 return EGL_NONE;
2723 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002724
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002725 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002726 ASSERT(backAttachment != nullptr);
2727 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002728}
2729
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002730VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002731{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002732 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002733 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2734 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002735 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002736 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2737 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002738
Jamie Madill96a483b2017-06-27 16:49:21 -04002739 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002740 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002741
2742 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002743}
2744
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002745TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002746{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002747 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002748 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2749 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002750 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002751 transformFeedback =
2752 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002753 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002754 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002755 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002756
2757 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002758}
2759
2760bool Context::isVertexArrayGenerated(GLuint vertexArray)
2761{
Jamie Madill96a483b2017-06-27 16:49:21 -04002762 ASSERT(mVertexArrayMap.contains(0));
2763 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002764}
2765
2766bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2767{
Jamie Madill96a483b2017-06-27 16:49:21 -04002768 ASSERT(mTransformFeedbackMap.contains(0));
2769 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002770}
2771
Shannon Woods53a94a82014-06-24 15:20:36 -04002772void Context::detachTexture(GLuint texture)
2773{
2774 // Simple pass-through to State's detachTexture method, as textures do not require
2775 // allocation map management either here or in the resource manager at detach time.
2776 // Zero textures are held by the Context, and we don't attempt to request them from
2777 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002778 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002779}
2780
James Darpinian4d9d4832018-03-13 12:43:28 -07002781void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002782{
Yuly Novikov5807a532015-12-03 13:01:22 -05002783 // Simple pass-through to State's detachBuffer method, since
2784 // only buffer attachments to container objects that are bound to the current context
2785 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002786
Yuly Novikov5807a532015-12-03 13:01:22 -05002787 // [OpenGL ES 3.2] section 5.1.2 page 45:
2788 // Attachments to unbound container objects, such as
2789 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2790 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002791 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002792}
2793
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002794void Context::detachFramebuffer(GLuint framebuffer)
2795{
Shannon Woods53a94a82014-06-24 15:20:36 -04002796 // Framebuffer detachment is handled by Context, because 0 is a valid
2797 // Framebuffer object, and a pointer to it must be passed from Context
2798 // to State at binding time.
2799
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002800 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002801 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2802 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2803 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002804
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002805 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002806 {
2807 bindReadFramebuffer(0);
2808 }
2809
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002810 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002811 {
2812 bindDrawFramebuffer(0);
2813 }
2814}
2815
2816void Context::detachRenderbuffer(GLuint renderbuffer)
2817{
Jamie Madilla02315b2017-02-23 14:14:47 -05002818 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002819}
2820
Jamie Madill57a89722013-07-02 11:57:03 -04002821void Context::detachVertexArray(GLuint vertexArray)
2822{
Jamie Madill77a72f62015-04-14 11:18:32 -04002823 // Vertex array detachment is handled by Context, because 0 is a valid
2824 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002825 // binding time.
2826
Jamie Madill57a89722013-07-02 11:57:03 -04002827 // [OpenGL ES 3.0.2] section 2.10 page 43:
2828 // If a vertex array object that is currently bound is deleted, the binding
2829 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002830 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002831 {
2832 bindVertexArray(0);
2833 }
2834}
2835
Geoff Langc8058452014-02-03 12:04:11 -05002836void Context::detachTransformFeedback(GLuint transformFeedback)
2837{
Corentin Walleza2257da2016-04-19 16:43:12 -04002838 // Transform feedback detachment is handled by Context, because 0 is a valid
2839 // transform feedback, and a pointer to it must be passed from Context to State at
2840 // binding time.
2841
2842 // The OpenGL specification doesn't mention what should happen when the currently bound
2843 // transform feedback object is deleted. Since it is a container object, we treat it like
2844 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002845 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002846 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002847 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002848 }
Geoff Langc8058452014-02-03 12:04:11 -05002849}
2850
Jamie Madilldc356042013-07-19 16:36:57 -04002851void Context::detachSampler(GLuint sampler)
2852{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002853 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002854}
2855
Yunchao Hea336b902017-08-02 16:05:21 +08002856void Context::detachProgramPipeline(GLuint pipeline)
2857{
2858 mGLState.detachProgramPipeline(this, pipeline);
2859}
2860
Jamie Madill3ef140a2017-08-26 23:11:21 -04002861void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002862{
Shaodde78e82017-05-22 14:13:27 +08002863 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002864 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002865}
2866
Jamie Madille29d1672013-07-19 16:36:57 -04002867void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2868{
Geoff Langc1984ed2016-10-07 12:41:00 -04002869 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002870 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002871 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002872}
Jamie Madille29d1672013-07-19 16:36:57 -04002873
Geoff Langc1984ed2016-10-07 12:41:00 -04002874void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2875{
2876 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002877 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002878 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002879}
2880
Brandon Jones59770802018-04-02 13:18:42 -07002881void Context::samplerParameterivRobust(GLuint sampler,
2882 GLenum pname,
2883 GLsizei bufSize,
2884 const GLint *param)
2885{
2886 samplerParameteriv(sampler, pname, param);
2887}
2888
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002889void Context::samplerParameterIivRobust(GLuint sampler,
2890 GLenum pname,
2891 GLsizei bufSize,
2892 const GLint *param)
2893{
2894 UNIMPLEMENTED();
2895}
2896
2897void Context::samplerParameterIuivRobust(GLuint sampler,
2898 GLenum pname,
2899 GLsizei bufSize,
2900 const GLuint *param)
2901{
2902 UNIMPLEMENTED();
2903}
2904
Jamie Madille29d1672013-07-19 16:36:57 -04002905void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2906{
Geoff Langc1984ed2016-10-07 12:41:00 -04002907 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002908 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002909 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002910}
2911
Geoff Langc1984ed2016-10-07 12:41:00 -04002912void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002913{
Geoff Langc1984ed2016-10-07 12:41:00 -04002914 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002915 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002916 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002917}
2918
Brandon Jones59770802018-04-02 13:18:42 -07002919void Context::samplerParameterfvRobust(GLuint sampler,
2920 GLenum pname,
2921 GLsizei bufSize,
2922 const GLfloat *param)
2923{
2924 samplerParameterfv(sampler, pname, param);
2925}
2926
Geoff Langc1984ed2016-10-07 12:41:00 -04002927void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002928{
Geoff Langc1984ed2016-10-07 12:41:00 -04002929 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002930 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002931 QuerySamplerParameteriv(samplerObject, pname, params);
2932}
Jamie Madill9675b802013-07-19 16:36:59 -04002933
Brandon Jones59770802018-04-02 13:18:42 -07002934void Context::getSamplerParameterivRobust(GLuint sampler,
2935 GLenum pname,
2936 GLsizei bufSize,
2937 GLsizei *length,
2938 GLint *params)
2939{
2940 getSamplerParameteriv(sampler, pname, params);
2941}
2942
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002943void Context::getSamplerParameterIivRobust(GLuint sampler,
2944 GLenum pname,
2945 GLsizei bufSize,
2946 GLsizei *length,
2947 GLint *params)
2948{
2949 UNIMPLEMENTED();
2950}
2951
2952void Context::getSamplerParameterIuivRobust(GLuint sampler,
2953 GLenum pname,
2954 GLsizei bufSize,
2955 GLsizei *length,
2956 GLuint *params)
2957{
2958 UNIMPLEMENTED();
2959}
2960
Geoff Langc1984ed2016-10-07 12:41:00 -04002961void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2962{
2963 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002964 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002965 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04002966}
2967
Brandon Jones59770802018-04-02 13:18:42 -07002968void Context::getSamplerParameterfvRobust(GLuint sampler,
2969 GLenum pname,
2970 GLsizei bufSize,
2971 GLsizei *length,
2972 GLfloat *params)
2973{
2974 getSamplerParameterfv(sampler, pname, params);
2975}
2976
Olli Etuahof0fee072016-03-30 15:11:58 +03002977void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2978{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002979 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08002980 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002981}
2982
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002983void Context::initRendererString()
2984{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002985 std::ostringstream rendererString;
2986 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002987 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002988 rendererString << ")";
2989
Geoff Langcec35902014-04-16 10:52:36 -04002990 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002991}
2992
Geoff Langc339c4e2016-11-29 10:37:36 -05002993void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002994{
Geoff Langc339c4e2016-11-29 10:37:36 -05002995 const Version &clientVersion = getClientVersion();
2996
2997 std::ostringstream versionString;
2998 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2999 << ANGLE_VERSION_STRING << ")";
3000 mVersionString = MakeStaticString(versionString.str());
3001
3002 std::ostringstream shadingLanguageVersionString;
3003 shadingLanguageVersionString << "OpenGL ES GLSL ES "
3004 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
3005 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
3006 << ")";
3007 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003008}
3009
Geoff Langcec35902014-04-16 10:52:36 -04003010void Context::initExtensionStrings()
3011{
Geoff Langc339c4e2016-11-29 10:37:36 -05003012 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
3013 std::ostringstream combinedStringStream;
3014 std::copy(strings.begin(), strings.end(),
3015 std::ostream_iterator<const char *>(combinedStringStream, " "));
3016 return MakeStaticString(combinedStringStream.str());
3017 };
3018
3019 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003020 for (const auto &extensionString : mExtensions.getStrings())
3021 {
3022 mExtensionStrings.push_back(MakeStaticString(extensionString));
3023 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003024 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003025
Geoff Langc339c4e2016-11-29 10:37:36 -05003026 mRequestableExtensionStrings.clear();
3027 for (const auto &extensionInfo : GetExtensionInfoMap())
3028 {
3029 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003030 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003031 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003032 {
3033 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3034 }
3035 }
3036 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003037}
3038
Geoff Langc339c4e2016-11-29 10:37:36 -05003039const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003040{
Geoff Langc339c4e2016-11-29 10:37:36 -05003041 switch (name)
3042 {
3043 case GL_VENDOR:
3044 return reinterpret_cast<const GLubyte *>("Google Inc.");
3045
3046 case GL_RENDERER:
3047 return reinterpret_cast<const GLubyte *>(mRendererString);
3048
3049 case GL_VERSION:
3050 return reinterpret_cast<const GLubyte *>(mVersionString);
3051
3052 case GL_SHADING_LANGUAGE_VERSION:
3053 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3054
3055 case GL_EXTENSIONS:
3056 return reinterpret_cast<const GLubyte *>(mExtensionString);
3057
3058 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3059 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3060
3061 default:
3062 UNREACHABLE();
3063 return nullptr;
3064 }
Geoff Langcec35902014-04-16 10:52:36 -04003065}
3066
Geoff Langc339c4e2016-11-29 10:37:36 -05003067const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003068{
Geoff Langc339c4e2016-11-29 10:37:36 -05003069 switch (name)
3070 {
3071 case GL_EXTENSIONS:
3072 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3073
3074 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3075 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3076
3077 default:
3078 UNREACHABLE();
3079 return nullptr;
3080 }
Geoff Langcec35902014-04-16 10:52:36 -04003081}
3082
3083size_t Context::getExtensionStringCount() const
3084{
3085 return mExtensionStrings.size();
3086}
3087
Geoff Lang111a99e2017-10-17 10:58:41 -04003088bool Context::isExtensionRequestable(const char *name)
3089{
3090 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3091 auto extension = extensionInfos.find(name);
3092
Geoff Lang111a99e2017-10-17 10:58:41 -04003093 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003094 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003095}
3096
Geoff Langc339c4e2016-11-29 10:37:36 -05003097void Context::requestExtension(const char *name)
3098{
3099 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3100 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3101 const auto &extension = extensionInfos.at(name);
3102 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003103 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003104
3105 if (mExtensions.*(extension.ExtensionsMember))
3106 {
3107 // Extension already enabled
3108 return;
3109 }
3110
3111 mExtensions.*(extension.ExtensionsMember) = true;
3112 updateCaps();
3113 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003114
Jamie Madill2f348d22017-06-05 10:50:59 -04003115 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3116 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003117
Jamie Madill81c2e252017-09-09 23:32:46 -04003118 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3119 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003120 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003121 for (auto &zeroTexture : mZeroTextures)
3122 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003123 if (zeroTexture.get() != nullptr)
3124 {
3125 zeroTexture->signalDirty(this, InitState::Initialized);
3126 }
Geoff Lang9aded172017-04-05 11:07:56 -04003127 }
3128
Jamie Madillb983a4b2018-08-01 11:34:51 -04003129 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003130}
3131
3132size_t Context::getRequestableExtensionStringCount() const
3133{
3134 return mRequestableExtensionStrings.size();
3135}
3136
Jamie Madill493f9572018-05-24 19:52:15 -04003137void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003138{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003139 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003140 ASSERT(transformFeedback != nullptr);
3141 ASSERT(!transformFeedback->isPaused());
3142
Jamie Madill6c1f6712017-02-14 19:08:04 -05003143 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003144 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003145}
3146
3147bool Context::hasActiveTransformFeedback(GLuint program) const
3148{
3149 for (auto pair : mTransformFeedbackMap)
3150 {
3151 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3152 {
3153 return true;
3154 }
3155 }
3156 return false;
3157}
3158
Geoff Lang33f11fb2018-05-07 13:42:47 -04003159Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003160{
3161 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3162
jchen1082af6202018-06-22 10:59:52 +08003163 // Explicitly enable GL_KHR_parallel_shader_compile
3164 supportedExtensions.parallelShaderCompile = true;
3165
Geoff Langb0f917f2017-12-05 13:41:54 -05003166 if (getClientVersion() < ES_2_0)
3167 {
3168 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003169 supportedExtensions.pointSizeArray = true;
3170 supportedExtensions.textureCubeMap = true;
3171 supportedExtensions.pointSprite = true;
3172 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003173 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003174 }
3175
3176 if (getClientVersion() < ES_3_0)
3177 {
3178 // Disable ES3+ extensions
3179 supportedExtensions.colorBufferFloat = false;
3180 supportedExtensions.eglImageExternalEssl3 = false;
3181 supportedExtensions.textureNorm16 = false;
3182 supportedExtensions.multiview = false;
3183 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003184 supportedExtensions.copyTexture3d = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003185 }
3186
3187 if (getClientVersion() < ES_3_1)
3188 {
3189 // Disable ES3.1+ extensions
3190 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003191
3192 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3193 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003194 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003195 }
3196
3197 if (getClientVersion() > ES_2_0)
3198 {
3199 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3200 // supportedExtensions.sRGB = false;
3201 }
3202
3203 // Some extensions are always available because they are implemented in the GL layer.
3204 supportedExtensions.bindUniformLocation = true;
3205 supportedExtensions.vertexArrayObject = true;
3206 supportedExtensions.bindGeneratesResource = true;
3207 supportedExtensions.clientArrays = true;
3208 supportedExtensions.requestExtension = true;
3209
3210 // Enable the no error extension if the context was created with the flag.
3211 supportedExtensions.noError = mSkipValidation;
3212
3213 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003214 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003215
3216 // Explicitly enable GL_KHR_debug
3217 supportedExtensions.debug = true;
3218 supportedExtensions.maxDebugMessageLength = 1024;
3219 supportedExtensions.maxDebugLoggedMessages = 1024;
3220 supportedExtensions.maxDebugGroupStackDepth = 1024;
3221 supportedExtensions.maxLabelLength = 1024;
3222
3223 // Explicitly enable GL_ANGLE_robust_client_memory
3224 supportedExtensions.robustClientMemory = true;
3225
3226 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003227 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003228
3229 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3230 // supports it.
3231 supportedExtensions.robustBufferAccessBehavior =
3232 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3233
3234 // Enable the cache control query unconditionally.
3235 supportedExtensions.programCacheControl = true;
3236
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003237 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003238 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003239 {
3240 // GL_ANGLE_explicit_context_gles1
3241 supportedExtensions.explicitContextGles1 = true;
3242 // GL_ANGLE_explicit_context
3243 supportedExtensions.explicitContext = true;
3244 }
3245
Geoff Langb0f917f2017-12-05 13:41:54 -05003246 return supportedExtensions;
3247}
3248
Geoff Lang33f11fb2018-05-07 13:42:47 -04003249void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003250{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003251 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003252
Geoff Lang33f11fb2018-05-07 13:42:47 -04003253 mSupportedExtensions = generateSupportedExtensions();
3254 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003255
3256 mLimitations = mImplementation->getNativeLimitations();
3257
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003258 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3259 if (getClientVersion() < Version(2, 0))
3260 {
3261 mCaps.maxMultitextureUnits = 4;
3262 mCaps.maxClipPlanes = 6;
3263 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003264 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3265 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3266 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003267 mCaps.minSmoothPointSize = 1.0f;
3268 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003269 mCaps.minSmoothLineWidth = 1.0f;
3270 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003271 }
3272
Luc Ferronad2ae932018-06-11 15:31:17 -04003273 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003274 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003275
Luc Ferronad2ae932018-06-11 15:31:17 -04003276 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3277
Jamie Madill0f80ed82017-09-19 00:24:56 -04003278 if (getClientVersion() < ES_3_1)
3279 {
3280 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3281 }
3282 else
3283 {
3284 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3285 }
Geoff Lang301d1612014-07-09 10:34:37 -04003286
Jiawei Shao54aafe52018-04-27 14:54:57 +08003287 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3288 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003289 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3290
Jamie Madill0f80ed82017-09-19 00:24:56 -04003291 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3292 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3293
3294 // Limit textures as well, so we can use fast bitsets with texture bindings.
3295 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003296 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3297 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3298 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3299 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003300
Jiawei Shaodb342272017-09-27 10:21:45 +08003301 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3302
Geoff Langc287ea62016-09-16 14:46:51 -04003303 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003304 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003305 for (const auto &extensionInfo : GetExtensionInfoMap())
3306 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003307 // If the user has requested that extensions start disabled and they are requestable,
3308 // disable them.
3309 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003310 {
3311 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3312 }
3313 }
3314
3315 // Generate texture caps
3316 updateCaps();
3317}
3318
3319void Context::updateCaps()
3320{
Geoff Lang900013c2014-07-07 11:32:19 -04003321 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003322 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003323
Jamie Madill7b62cf92017-11-02 15:20:49 -04003324 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003325 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003326 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003327 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003328
Geoff Lang0d8b7242015-09-09 14:56:53 -04003329 // Update the format caps based on the client version and extensions.
3330 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3331 // ES3.
3332 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003333 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003334 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003335 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003336 formatCaps.textureAttachment =
3337 formatCaps.textureAttachment &&
3338 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3339 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3340 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003341
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003342 // OpenGL ES does not support multisampling with non-rendererable formats
3343 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003344 if (!formatCaps.renderbuffer ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003345 (getClientVersion() < ES_3_1 &&
3346 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003347 {
Geoff Langd87878e2014-09-19 15:42:59 -04003348 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003349 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003350 else
3351 {
3352 // We may have limited the max samples for some required renderbuffer formats due to
3353 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3354 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3355
3356 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3357 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3358 // exception of signed and unsigned integer formats."
3359 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3360 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3361 {
3362 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3363 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3364 }
3365
3366 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3367 if (getClientVersion() >= ES_3_1)
3368 {
3369 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3370 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3371 // the exception that the signed and unsigned integer formats are required only to
3372 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3373 // multisamples, which must be at least one."
3374 if (formatInfo.componentType == GL_INT ||
3375 formatInfo.componentType == GL_UNSIGNED_INT)
3376 {
3377 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3378 }
3379
3380 // GLES 3.1 section 19.3.1.
3381 if (formatCaps.texturable)
3382 {
3383 if (formatInfo.depthBits > 0)
3384 {
3385 mCaps.maxDepthTextureSamples =
3386 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3387 }
3388 else if (formatInfo.redBits > 0)
3389 {
3390 mCaps.maxColorTextureSamples =
3391 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3392 }
3393 }
3394 }
3395 }
Geoff Langd87878e2014-09-19 15:42:59 -04003396
3397 if (formatCaps.texturable && formatInfo.compressed)
3398 {
Geoff Langca271392017-04-05 12:30:00 -04003399 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003400 }
3401
Geoff Langca271392017-04-05 12:30:00 -04003402 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003403 }
Jamie Madill32447362017-06-28 14:53:52 -04003404
3405 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003406 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003407 {
3408 mMemoryProgramCache = nullptr;
3409 }
Corentin Walleze4477002017-12-01 14:39:58 -05003410
3411 // Compute which buffer types are allowed
3412 mValidBufferBindings.reset();
3413 mValidBufferBindings.set(BufferBinding::ElementArray);
3414 mValidBufferBindings.set(BufferBinding::Array);
3415
3416 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3417 {
3418 mValidBufferBindings.set(BufferBinding::PixelPack);
3419 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3420 }
3421
3422 if (getClientVersion() >= ES_3_0)
3423 {
3424 mValidBufferBindings.set(BufferBinding::CopyRead);
3425 mValidBufferBindings.set(BufferBinding::CopyWrite);
3426 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3427 mValidBufferBindings.set(BufferBinding::Uniform);
3428 }
3429
3430 if (getClientVersion() >= ES_3_1)
3431 {
3432 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3433 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3434 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3435 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3436 }
jchen107ae70d82018-07-06 13:47:01 +08003437
3438 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003439
3440 // Reinitialize state cache after extension changes.
3441 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003442}
3443
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003444void Context::initWorkarounds()
3445{
Jamie Madill761b02c2017-06-23 16:27:06 -04003446 // Apply back-end workarounds.
3447 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3448
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003449 // Lose the context upon out of memory error if the application is
3450 // expecting to watch for those events.
3451 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
3452}
3453
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003454// Return true if the draw is a no-op, else return false.
3455// A no-op draw occurs if the count of vertices is less than the minimum required to
3456// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3457bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3458{
3459 return count < kMinimumPrimitiveCounts[mode];
3460}
3461
3462bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3463{
3464 return (instanceCount == 0) || noopDraw(mode, count);
3465}
3466
Jamie Madill6f755b22018-10-09 12:48:54 -04003467angle::Result Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003468{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003469 if (mGLES1Renderer)
3470 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003471 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003472 }
3473
Geoff Lang9bf86f02018-07-26 11:46:34 -04003474 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003475
3476 if (isRobustResourceInitEnabled())
3477 {
3478 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3479 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3480 }
3481
Geoff Langa8cb2872018-03-09 16:09:40 -05003482 ANGLE_TRY(syncDirtyBits());
Jamie Madill6f755b22018-10-09 12:48:54 -04003483 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003484}
3485
3486Error Context::prepareForClear(GLbitfield mask)
3487{
Geoff Langa8cb2872018-03-09 16:09:40 -05003488 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003489 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003490 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003491 return NoError();
3492}
3493
3494Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3495{
Geoff Langa8cb2872018-03-09 16:09:40 -05003496 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003497 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3498 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003499 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003500 return NoError();
3501}
3502
Geoff Langa8cb2872018-03-09 16:09:40 -05003503Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003504{
Geoff Langa8cb2872018-03-09 16:09:40 -05003505 ANGLE_TRY(syncDirtyObjects(objectMask));
3506 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003507 return NoError();
3508}
3509
Jamie Madill6f755b22018-10-09 12:48:54 -04003510angle::Result Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003511{
3512 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003513 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003514 mGLState.clearDirtyBits();
Jamie Madill6f755b22018-10-09 12:48:54 -04003515 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003516}
3517
Jamie Madill6f755b22018-10-09 12:48:54 -04003518angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003519{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003520 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003521 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003522 mGLState.clearDirtyBits(dirtyBits);
Jamie Madill6f755b22018-10-09 12:48:54 -04003523 return angle::Result::Continue();
Jamie Madill1b94d432015-08-07 13:23:23 -04003524}
Jamie Madillc29968b2016-01-20 11:17:23 -05003525
Jamie Madill6f755b22018-10-09 12:48:54 -04003526angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003527{
3528 return mGLState.syncDirtyObjects(this, objectMask);
3529}
3530
Jamie Madillc29968b2016-01-20 11:17:23 -05003531void Context::blitFramebuffer(GLint srcX0,
3532 GLint srcY0,
3533 GLint srcX1,
3534 GLint srcY1,
3535 GLint dstX0,
3536 GLint dstY0,
3537 GLint dstX1,
3538 GLint dstY1,
3539 GLbitfield mask,
3540 GLenum filter)
3541{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003542 if (mask == 0)
3543 {
3544 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3545 // buffers are copied.
3546 return;
3547 }
3548
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003549 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003550 ASSERT(drawFramebuffer);
3551
3552 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3553 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3554
Jamie Madillbc918e72018-03-08 09:47:21 -05003555 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003556
Jamie Madillc564c072017-06-01 12:45:42 -04003557 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003558}
Jamie Madillc29968b2016-01-20 11:17:23 -05003559
3560void Context::clear(GLbitfield mask)
3561{
Geoff Langd4fff502017-09-22 11:28:28 -04003562 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3563 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003564}
3565
3566void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3567{
Olli Etuaho78df3362018-10-05 16:43:27 +03003568 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3569 const FramebufferAttachment *attachment = nullptr;
3570 if (buffer == GL_DEPTH)
3571 {
3572 attachment = framebufferObject->getDepthbuffer();
3573 }
3574 if (buffer == GL_COLOR &&
3575 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3576 {
3577 attachment = framebufferObject->getColorbuffer(drawbuffer);
3578 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003579 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3580 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003581 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003582 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003583 return;
3584 }
Geoff Langd4fff502017-09-22 11:28:28 -04003585 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003586 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003587}
3588
3589void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3590{
Olli Etuaho78df3362018-10-05 16:43:27 +03003591 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3592 const FramebufferAttachment *attachment = nullptr;
3593 if (buffer == GL_COLOR &&
3594 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3595 {
3596 attachment = framebufferObject->getColorbuffer(drawbuffer);
3597 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003598 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3599 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003600 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003601 {
3602 return;
3603 }
Geoff Langd4fff502017-09-22 11:28:28 -04003604 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003605 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003606}
3607
3608void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3609{
Olli Etuaho78df3362018-10-05 16:43:27 +03003610 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3611 const FramebufferAttachment *attachment = nullptr;
3612 if (buffer == GL_STENCIL)
3613 {
3614 attachment = framebufferObject->getStencilbuffer();
3615 }
3616 if (buffer == GL_COLOR &&
3617 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3618 {
3619 attachment = framebufferObject->getColorbuffer(drawbuffer);
3620 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003621 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3622 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003623 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003624 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003625 return;
3626 }
Geoff Langd4fff502017-09-22 11:28:28 -04003627 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003628 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003629}
3630
3631void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3632{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003633 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003634 ASSERT(framebufferObject);
3635
3636 // If a buffer is not present, the clear has no effect
3637 if (framebufferObject->getDepthbuffer() == nullptr &&
3638 framebufferObject->getStencilbuffer() == nullptr)
3639 {
3640 return;
3641 }
3642
Geoff Langd4fff502017-09-22 11:28:28 -04003643 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3644 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003645}
3646
3647void Context::readPixels(GLint x,
3648 GLint y,
3649 GLsizei width,
3650 GLsizei height,
3651 GLenum format,
3652 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003653 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003654{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003655 if (width == 0 || height == 0)
3656 {
3657 return;
3658 }
3659
Jamie Madillbc918e72018-03-08 09:47:21 -05003660 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003661
Jamie Madillb6664922017-07-25 12:55:04 -04003662 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3663 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003664
3665 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003666 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003667}
3668
Brandon Jones59770802018-04-02 13:18:42 -07003669void Context::readPixelsRobust(GLint x,
3670 GLint y,
3671 GLsizei width,
3672 GLsizei height,
3673 GLenum format,
3674 GLenum type,
3675 GLsizei bufSize,
3676 GLsizei *length,
3677 GLsizei *columns,
3678 GLsizei *rows,
3679 void *pixels)
3680{
3681 readPixels(x, y, width, height, format, type, pixels);
3682}
3683
3684void Context::readnPixelsRobust(GLint x,
3685 GLint y,
3686 GLsizei width,
3687 GLsizei height,
3688 GLenum format,
3689 GLenum type,
3690 GLsizei bufSize,
3691 GLsizei *length,
3692 GLsizei *columns,
3693 GLsizei *rows,
3694 void *data)
3695{
3696 readPixels(x, y, width, height, format, type, data);
3697}
3698
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003699void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003700 GLint level,
3701 GLenum internalformat,
3702 GLint x,
3703 GLint y,
3704 GLsizei width,
3705 GLsizei height,
3706 GLint border)
3707{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003708 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003709 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003710
Jamie Madillc29968b2016-01-20 11:17:23 -05003711 Rectangle sourceArea(x, y, width, height);
3712
Jamie Madill05b35b22017-10-03 09:01:44 -04003713 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003714 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003715 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003716}
3717
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003718void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003719 GLint level,
3720 GLint xoffset,
3721 GLint yoffset,
3722 GLint x,
3723 GLint y,
3724 GLsizei width,
3725 GLsizei height)
3726{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003727 if (width == 0 || height == 0)
3728 {
3729 return;
3730 }
3731
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003732 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003733 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003734
Jamie Madillc29968b2016-01-20 11:17:23 -05003735 Offset destOffset(xoffset, yoffset, 0);
3736 Rectangle sourceArea(x, y, width, height);
3737
Jamie Madill05b35b22017-10-03 09:01:44 -04003738 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003739 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003740 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003741}
3742
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003743void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003744 GLint level,
3745 GLint xoffset,
3746 GLint yoffset,
3747 GLint zoffset,
3748 GLint x,
3749 GLint y,
3750 GLsizei width,
3751 GLsizei height)
3752{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003753 if (width == 0 || height == 0)
3754 {
3755 return;
3756 }
3757
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003758 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003759 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003760
Jamie Madillc29968b2016-01-20 11:17:23 -05003761 Offset destOffset(xoffset, yoffset, zoffset);
3762 Rectangle sourceArea(x, y, width, height);
3763
Jamie Madill05b35b22017-10-03 09:01:44 -04003764 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3765 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003766 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3767 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003768}
3769
3770void Context::framebufferTexture2D(GLenum target,
3771 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003772 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003773 GLuint texture,
3774 GLint level)
3775{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003776 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003777 ASSERT(framebuffer);
3778
3779 if (texture != 0)
3780 {
3781 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003782 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003783 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003784 }
3785 else
3786 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003787 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003788 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003789
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003790 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003791}
3792
3793void Context::framebufferRenderbuffer(GLenum target,
3794 GLenum attachment,
3795 GLenum renderbuffertarget,
3796 GLuint renderbuffer)
3797{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003798 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003799 ASSERT(framebuffer);
3800
3801 if (renderbuffer != 0)
3802 {
3803 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003804
Jamie Madillcc129372018-04-12 09:13:18 -04003805 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003806 renderbufferObject);
3807 }
3808 else
3809 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003810 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003811 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003812
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003813 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003814}
3815
3816void Context::framebufferTextureLayer(GLenum target,
3817 GLenum attachment,
3818 GLuint texture,
3819 GLint level,
3820 GLint layer)
3821{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003822 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003823 ASSERT(framebuffer);
3824
3825 if (texture != 0)
3826 {
3827 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003828 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003829 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003830 }
3831 else
3832 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003833 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003834 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003835
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003836 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003837}
3838
Brandon Jones59770802018-04-02 13:18:42 -07003839void Context::framebufferTextureMultiviewLayered(GLenum target,
3840 GLenum attachment,
3841 GLuint texture,
3842 GLint level,
3843 GLint baseViewIndex,
3844 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003845{
Martin Radev82ef7742017-08-08 17:44:58 +03003846 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3847 ASSERT(framebuffer);
3848
3849 if (texture != 0)
3850 {
3851 Texture *textureObj = getTexture(texture);
3852
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003853 ImageIndex index;
3854 if (textureObj->getType() == TextureType::_2DArray)
3855 {
3856 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3857 }
3858 else
3859 {
3860 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3861 ASSERT(level == 0);
3862 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3863 }
Martin Radev82ef7742017-08-08 17:44:58 +03003864 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3865 numViews, baseViewIndex);
3866 }
3867 else
3868 {
3869 framebuffer->resetAttachment(this, attachment);
3870 }
3871
3872 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003873}
3874
Brandon Jones59770802018-04-02 13:18:42 -07003875void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3876 GLenum attachment,
3877 GLuint texture,
3878 GLint level,
3879 GLsizei numViews,
3880 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003881{
Martin Radev5dae57b2017-07-14 16:15:55 +03003882 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3883 ASSERT(framebuffer);
3884
3885 if (texture != 0)
3886 {
3887 Texture *textureObj = getTexture(texture);
3888
3889 ImageIndex index = ImageIndex::Make2D(level);
3890 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3891 textureObj, numViews, viewportOffsets);
3892 }
3893 else
3894 {
3895 framebuffer->resetAttachment(this, attachment);
3896 }
3897
3898 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003899}
3900
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003901void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3902{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003903 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3904 ASSERT(framebuffer);
3905
3906 if (texture != 0)
3907 {
3908 Texture *textureObj = getTexture(texture);
3909
3910 ImageIndex index = ImageIndex::MakeFromType(
3911 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3912 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3913 }
3914 else
3915 {
3916 framebuffer->resetAttachment(this, attachment);
3917 }
3918
3919 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003920}
3921
Jamie Madillc29968b2016-01-20 11:17:23 -05003922void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3923{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003924 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003925 ASSERT(framebuffer);
3926 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003927 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003928 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003929}
3930
3931void Context::readBuffer(GLenum mode)
3932{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003933 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003934 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003935 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003936}
3937
3938void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3939{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003940 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003941 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003942
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003943 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003944 ASSERT(framebuffer);
3945
3946 // The specification isn't clear what should be done when the framebuffer isn't complete.
3947 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003948 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003949}
3950
3951void Context::invalidateFramebuffer(GLenum target,
3952 GLsizei numAttachments,
3953 const GLenum *attachments)
3954{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003955 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003956 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003957
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003958 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003959 ASSERT(framebuffer);
3960
Jamie Madill427064d2018-04-13 16:20:34 -04003961 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003962 {
Jamie Madill437fa652016-05-03 15:13:24 -04003963 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003964 }
Jamie Madill437fa652016-05-03 15:13:24 -04003965
Jamie Madill4928b7c2017-06-20 12:57:39 -04003966 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003967}
3968
3969void Context::invalidateSubFramebuffer(GLenum target,
3970 GLsizei numAttachments,
3971 const GLenum *attachments,
3972 GLint x,
3973 GLint y,
3974 GLsizei width,
3975 GLsizei height)
3976{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003977 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003978 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003979
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003980 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003981 ASSERT(framebuffer);
3982
Jamie Madill427064d2018-04-13 16:20:34 -04003983 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003984 {
Jamie Madill437fa652016-05-03 15:13:24 -04003985 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003986 }
Jamie Madill437fa652016-05-03 15:13:24 -04003987
3988 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003989 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003990}
3991
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003992void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003993 GLint level,
3994 GLint internalformat,
3995 GLsizei width,
3996 GLsizei height,
3997 GLint border,
3998 GLenum format,
3999 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004000 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004001{
Jamie Madillbc918e72018-03-08 09:47:21 -05004002 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004003
4004 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004005 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004006 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004007 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004008}
4009
Brandon Jones59770802018-04-02 13:18:42 -07004010void Context::texImage2DRobust(TextureTarget target,
4011 GLint level,
4012 GLint internalformat,
4013 GLsizei width,
4014 GLsizei height,
4015 GLint border,
4016 GLenum format,
4017 GLenum type,
4018 GLsizei bufSize,
4019 const void *pixels)
4020{
4021 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4022}
4023
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004024void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004025 GLint level,
4026 GLint internalformat,
4027 GLsizei width,
4028 GLsizei height,
4029 GLsizei depth,
4030 GLint border,
4031 GLenum format,
4032 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004033 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004034{
Jamie Madillbc918e72018-03-08 09:47:21 -05004035 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004036
4037 Extents size(width, height, depth);
4038 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004039 handleError(texture->setImage(this, mGLState.getUnpackState(),
4040 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004041 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004042}
4043
Brandon Jones59770802018-04-02 13:18:42 -07004044void Context::texImage3DRobust(TextureType target,
4045 GLint level,
4046 GLint internalformat,
4047 GLsizei width,
4048 GLsizei height,
4049 GLsizei depth,
4050 GLint border,
4051 GLenum format,
4052 GLenum type,
4053 GLsizei bufSize,
4054 const void *pixels)
4055{
4056 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4057}
4058
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004059void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004060 GLint level,
4061 GLint xoffset,
4062 GLint yoffset,
4063 GLsizei width,
4064 GLsizei height,
4065 GLenum format,
4066 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004067 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004068{
4069 // Zero sized uploads are valid but no-ops
4070 if (width == 0 || height == 0)
4071 {
4072 return;
4073 }
4074
Jamie Madillbc918e72018-03-08 09:47:21 -05004075 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004076
4077 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004078 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004079
4080 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4081
4082 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4083 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004084}
4085
Brandon Jones59770802018-04-02 13:18:42 -07004086void Context::texSubImage2DRobust(TextureTarget target,
4087 GLint level,
4088 GLint xoffset,
4089 GLint yoffset,
4090 GLsizei width,
4091 GLsizei height,
4092 GLenum format,
4093 GLenum type,
4094 GLsizei bufSize,
4095 const void *pixels)
4096{
4097 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4098}
4099
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004100void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004101 GLint level,
4102 GLint xoffset,
4103 GLint yoffset,
4104 GLint zoffset,
4105 GLsizei width,
4106 GLsizei height,
4107 GLsizei depth,
4108 GLenum format,
4109 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004110 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004111{
4112 // Zero sized uploads are valid but no-ops
4113 if (width == 0 || height == 0 || depth == 0)
4114 {
4115 return;
4116 }
4117
Jamie Madillbc918e72018-03-08 09:47:21 -05004118 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004119
4120 Box area(xoffset, yoffset, zoffset, width, height, depth);
4121 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004122
4123 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4124
4125 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004126 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004127 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004128}
4129
Brandon Jones59770802018-04-02 13:18:42 -07004130void Context::texSubImage3DRobust(TextureType target,
4131 GLint level,
4132 GLint xoffset,
4133 GLint yoffset,
4134 GLint zoffset,
4135 GLsizei width,
4136 GLsizei height,
4137 GLsizei depth,
4138 GLenum format,
4139 GLenum type,
4140 GLsizei bufSize,
4141 const void *pixels)
4142{
4143 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4144 pixels);
4145}
4146
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004147void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004148 GLint level,
4149 GLenum internalformat,
4150 GLsizei width,
4151 GLsizei height,
4152 GLint border,
4153 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004154 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004155{
Jamie Madillbc918e72018-03-08 09:47:21 -05004156 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004157
4158 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004159 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004160 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4161 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004162 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004163}
4164
Brandon Jones59770802018-04-02 13:18:42 -07004165void Context::compressedTexImage2DRobust(TextureTarget target,
4166 GLint level,
4167 GLenum internalformat,
4168 GLsizei width,
4169 GLsizei height,
4170 GLint border,
4171 GLsizei imageSize,
4172 GLsizei dataSize,
4173 const GLvoid *data)
4174{
4175 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4176}
4177
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004178void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004179 GLint level,
4180 GLenum internalformat,
4181 GLsizei width,
4182 GLsizei height,
4183 GLsizei depth,
4184 GLint border,
4185 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004186 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004187{
Jamie Madillbc918e72018-03-08 09:47:21 -05004188 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004189
4190 Extents size(width, height, depth);
4191 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004192 handleError(texture->setCompressedImage(
4193 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004194 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004195}
4196
Brandon Jones59770802018-04-02 13:18:42 -07004197void Context::compressedTexImage3DRobust(TextureType target,
4198 GLint level,
4199 GLenum internalformat,
4200 GLsizei width,
4201 GLsizei height,
4202 GLsizei depth,
4203 GLint border,
4204 GLsizei imageSize,
4205 GLsizei dataSize,
4206 const GLvoid *data)
4207{
4208 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4209 data);
4210}
4211
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004212void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004213 GLint level,
4214 GLint xoffset,
4215 GLint yoffset,
4216 GLsizei width,
4217 GLsizei height,
4218 GLenum format,
4219 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004220 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004221{
Jamie Madillbc918e72018-03-08 09:47:21 -05004222 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004223
4224 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004225 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004226 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4227 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004228 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004229}
4230
Brandon Jones59770802018-04-02 13:18:42 -07004231void Context::compressedTexSubImage2DRobust(TextureTarget target,
4232 GLint level,
4233 GLint xoffset,
4234 GLint yoffset,
4235 GLsizei width,
4236 GLsizei height,
4237 GLenum format,
4238 GLsizei imageSize,
4239 GLsizei dataSize,
4240 const GLvoid *data)
4241{
4242 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4243 data);
4244}
4245
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004246void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004247 GLint level,
4248 GLint xoffset,
4249 GLint yoffset,
4250 GLint zoffset,
4251 GLsizei width,
4252 GLsizei height,
4253 GLsizei depth,
4254 GLenum format,
4255 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004256 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004257{
4258 // Zero sized uploads are valid but no-ops
4259 if (width == 0 || height == 0)
4260 {
4261 return;
4262 }
4263
Jamie Madillbc918e72018-03-08 09:47:21 -05004264 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004265
4266 Box area(xoffset, yoffset, zoffset, width, height, depth);
4267 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004268 handleError(texture->setCompressedSubImage(
4269 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004270 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004271}
4272
Brandon Jones59770802018-04-02 13:18:42 -07004273void Context::compressedTexSubImage3DRobust(TextureType target,
4274 GLint level,
4275 GLint xoffset,
4276 GLint yoffset,
4277 GLint zoffset,
4278 GLsizei width,
4279 GLsizei height,
4280 GLsizei depth,
4281 GLenum format,
4282 GLsizei imageSize,
4283 GLsizei dataSize,
4284 const GLvoid *data)
4285{
4286 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4287 imageSize, data);
4288}
4289
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004290void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004291{
4292 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004293 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004294}
4295
Jamie Madill007530e2017-12-28 14:27:04 -05004296void Context::copyTexture(GLuint sourceId,
4297 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004298 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004299 GLuint destId,
4300 GLint destLevel,
4301 GLint internalFormat,
4302 GLenum destType,
4303 GLboolean unpackFlipY,
4304 GLboolean unpackPremultiplyAlpha,
4305 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004306{
Jamie Madillbc918e72018-03-08 09:47:21 -05004307 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004308
4309 gl::Texture *sourceTexture = getTexture(sourceId);
4310 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004311 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4312 sourceLevel, ConvertToBool(unpackFlipY),
4313 ConvertToBool(unpackPremultiplyAlpha),
4314 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004315}
4316
Jamie Madill007530e2017-12-28 14:27:04 -05004317void Context::copySubTexture(GLuint sourceId,
4318 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004319 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004320 GLuint destId,
4321 GLint destLevel,
4322 GLint xoffset,
4323 GLint yoffset,
4324 GLint x,
4325 GLint y,
4326 GLsizei width,
4327 GLsizei height,
4328 GLboolean unpackFlipY,
4329 GLboolean unpackPremultiplyAlpha,
4330 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004331{
4332 // Zero sized copies are valid but no-ops
4333 if (width == 0 || height == 0)
4334 {
4335 return;
4336 }
4337
Jamie Madillbc918e72018-03-08 09:47:21 -05004338 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004339
4340 gl::Texture *sourceTexture = getTexture(sourceId);
4341 gl::Texture *destTexture = getTexture(destId);
4342 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004343 Box box(x, y, 0, width, height, 1);
4344 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4345 ConvertToBool(unpackFlipY),
4346 ConvertToBool(unpackPremultiplyAlpha),
4347 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4348}
4349
4350void Context::copyTexture3D(GLuint sourceId,
4351 GLint sourceLevel,
4352 TextureTarget destTarget,
4353 GLuint destId,
4354 GLint destLevel,
4355 GLint internalFormat,
4356 GLenum destType,
4357 GLboolean unpackFlipY,
4358 GLboolean unpackPremultiplyAlpha,
4359 GLboolean unpackUnmultiplyAlpha)
4360{
4361 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4362
4363 Texture *sourceTexture = getTexture(sourceId);
4364 Texture *destTexture = getTexture(destId);
4365 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4366 sourceLevel, ConvertToBool(unpackFlipY),
4367 ConvertToBool(unpackPremultiplyAlpha),
4368 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4369}
4370
4371void Context::copySubTexture3D(GLuint sourceId,
4372 GLint sourceLevel,
4373 TextureTarget destTarget,
4374 GLuint destId,
4375 GLint destLevel,
4376 GLint xoffset,
4377 GLint yoffset,
4378 GLint zoffset,
4379 GLint x,
4380 GLint y,
4381 GLint z,
4382 GLsizei width,
4383 GLsizei height,
4384 GLsizei depth,
4385 GLboolean unpackFlipY,
4386 GLboolean unpackPremultiplyAlpha,
4387 GLboolean unpackUnmultiplyAlpha)
4388{
4389 // Zero sized copies are valid but no-ops
4390 if (width == 0 || height == 0 || depth == 0)
4391 {
4392 return;
4393 }
4394
4395 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4396
4397 Texture *sourceTexture = getTexture(sourceId);
4398 Texture *destTexture = getTexture(destId);
4399 Offset offset(xoffset, yoffset, zoffset);
4400 Box box(x, y, z, width, height, depth);
4401 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004402 ConvertToBool(unpackFlipY),
4403 ConvertToBool(unpackPremultiplyAlpha),
4404 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004405}
4406
Jamie Madill007530e2017-12-28 14:27:04 -05004407void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004408{
Jamie Madillbc918e72018-03-08 09:47:21 -05004409 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004410
4411 gl::Texture *sourceTexture = getTexture(sourceId);
4412 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004413 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004414}
4415
Corentin Wallez336129f2017-10-17 15:55:40 -04004416void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004417{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004418 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004419 ASSERT(buffer);
4420
Geoff Lang496c02d2016-10-20 11:38:11 -07004421 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004422}
4423
Brandon Jones59770802018-04-02 13:18:42 -07004424void Context::getBufferPointervRobust(BufferBinding target,
4425 GLenum pname,
4426 GLsizei bufSize,
4427 GLsizei *length,
4428 void **params)
4429{
4430 getBufferPointerv(target, pname, params);
4431}
4432
Corentin Wallez336129f2017-10-17 15:55:40 -04004433void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004434{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004435 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004436 ASSERT(buffer);
4437
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004438 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004439 if (error.isError())
4440 {
Jamie Madill437fa652016-05-03 15:13:24 -04004441 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004442 return nullptr;
4443 }
4444
4445 return buffer->getMapPointer();
4446}
4447
Corentin Wallez336129f2017-10-17 15:55:40 -04004448GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004449{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004450 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004451 ASSERT(buffer);
4452
4453 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004454 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004455 if (error.isError())
4456 {
Jamie Madill437fa652016-05-03 15:13:24 -04004457 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004458 return GL_FALSE;
4459 }
4460
4461 return result;
4462}
4463
Corentin Wallez336129f2017-10-17 15:55:40 -04004464void *Context::mapBufferRange(BufferBinding target,
4465 GLintptr offset,
4466 GLsizeiptr length,
4467 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004468{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004469 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004470 ASSERT(buffer);
4471
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004472 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004473 if (error.isError())
4474 {
Jamie Madill437fa652016-05-03 15:13:24 -04004475 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004476 return nullptr;
4477 }
4478
4479 return buffer->getMapPointer();
4480}
4481
Corentin Wallez336129f2017-10-17 15:55:40 -04004482void Context::flushMappedBufferRange(BufferBinding /*target*/,
4483 GLintptr /*offset*/,
4484 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004485{
4486 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4487}
4488
Jamie Madillbc918e72018-03-08 09:47:21 -05004489Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004490{
Geoff Langa8cb2872018-03-09 16:09:40 -05004491 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004492}
4493
Jamie Madillbc918e72018-03-08 09:47:21 -05004494Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004495{
Geoff Langa8cb2872018-03-09 16:09:40 -05004496 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004497}
4498
Jamie Madillbc918e72018-03-08 09:47:21 -05004499Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004500{
Geoff Langa8cb2872018-03-09 16:09:40 -05004501 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004502}
4503
Geoff Lang9bf86f02018-07-26 11:46:34 -04004504Error Context::syncStateForPathOperation()
4505{
4506 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4507
4508 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4509 ANGLE_TRY(syncDirtyBits());
4510
4511 return NoError();
4512}
4513
Jiajia Qin5451d532017-11-16 17:16:34 +08004514void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4515{
4516 UNIMPLEMENTED();
4517}
4518
Jamie Madillc20ab272016-06-09 07:20:46 -07004519void Context::activeTexture(GLenum texture)
4520{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004521 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004522}
4523
Jamie Madill876429b2017-04-20 15:46:24 -04004524void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004525{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004526 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004527}
4528
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004529void Context::blendEquation(GLenum mode)
4530{
4531 mGLState.setBlendEquation(mode, mode);
4532}
4533
Jamie Madillc20ab272016-06-09 07:20:46 -07004534void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4535{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004536 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004537}
4538
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004539void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4540{
4541 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4542}
4543
Jamie Madillc20ab272016-06-09 07:20:46 -07004544void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4545{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004546 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004547}
4548
Jamie Madill876429b2017-04-20 15:46:24 -04004549void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004550{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004551 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004552}
4553
Jamie Madill876429b2017-04-20 15:46:24 -04004554void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004555{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004556 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07004557}
4558
4559void Context::clearStencil(GLint s)
4560{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004561 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004562}
4563
4564void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4565{
Geoff Lang92019432017-11-20 13:09:34 -05004566 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4567 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004568}
4569
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004570void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004571{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004572 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004573}
4574
4575void Context::depthFunc(GLenum func)
4576{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004577 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004578}
4579
4580void Context::depthMask(GLboolean flag)
4581{
Geoff Lang92019432017-11-20 13:09:34 -05004582 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004583}
4584
Jamie Madill876429b2017-04-20 15:46:24 -04004585void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004586{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004587 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07004588}
4589
4590void Context::disable(GLenum cap)
4591{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004592 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004593 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004594}
4595
4596void Context::disableVertexAttribArray(GLuint index)
4597{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004598 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004599 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004600}
4601
4602void Context::enable(GLenum cap)
4603{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004604 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004605 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004606}
4607
4608void Context::enableVertexAttribArray(GLuint index)
4609{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004610 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004611 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004612}
4613
4614void Context::frontFace(GLenum mode)
4615{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004616 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004617}
4618
4619void Context::hint(GLenum target, GLenum mode)
4620{
4621 switch (target)
4622 {
4623 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004624 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004625 break;
4626
4627 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004628 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004629 break;
4630
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004631 case GL_PERSPECTIVE_CORRECTION_HINT:
4632 case GL_POINT_SMOOTH_HINT:
4633 case GL_LINE_SMOOTH_HINT:
4634 case GL_FOG_HINT:
4635 mGLState.gles1().setHint(target, mode);
4636 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004637 default:
4638 UNREACHABLE();
4639 return;
4640 }
4641}
4642
4643void Context::lineWidth(GLfloat width)
4644{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004645 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004646}
4647
4648void Context::pixelStorei(GLenum pname, GLint param)
4649{
4650 switch (pname)
4651 {
4652 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004653 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004654 break;
4655
4656 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004657 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004658 break;
4659
4660 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004661 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004662 break;
4663
4664 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004665 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004666 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004667 break;
4668
4669 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004670 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004671 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004672 break;
4673
4674 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004675 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004676 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004677 break;
4678
4679 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004680 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004681 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004682 break;
4683
4684 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004685 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004686 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004687 break;
4688
4689 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004690 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004691 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004692 break;
4693
4694 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004695 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004696 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004697 break;
4698
4699 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004700 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004701 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004702 break;
4703
4704 default:
4705 UNREACHABLE();
4706 return;
4707 }
4708}
4709
4710void Context::polygonOffset(GLfloat factor, GLfloat units)
4711{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004712 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004713}
4714
Jamie Madill876429b2017-04-20 15:46:24 -04004715void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004716{
Geoff Lang92019432017-11-20 13:09:34 -05004717 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004718}
4719
Jiawei Shaodb342272017-09-27 10:21:45 +08004720void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4721{
4722 mGLState.setSampleMaskParams(maskNumber, mask);
4723}
4724
Jamie Madillc20ab272016-06-09 07:20:46 -07004725void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4726{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004727 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004728}
4729
4730void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4731{
4732 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4733 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004734 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004735 }
4736
4737 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4738 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004739 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004740 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004741
4742 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004743}
4744
4745void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4746{
4747 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4748 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004749 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004750 }
4751
4752 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4753 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004754 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004755 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004756
4757 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004758}
4759
4760void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4761{
4762 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4763 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004764 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004765 }
4766
4767 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4768 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004769 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004770 }
4771}
4772
4773void Context::vertexAttrib1f(GLuint index, GLfloat x)
4774{
4775 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004776 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004777 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004778}
4779
4780void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4781{
4782 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004783 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004784 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004785}
4786
4787void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4788{
4789 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004790 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004791 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004792}
4793
4794void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4795{
4796 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004797 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004798 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004799}
4800
4801void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4802{
4803 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004804 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004805 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004806}
4807
4808void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4809{
4810 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004811 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004812 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004813}
4814
4815void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4816{
4817 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004818 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004819 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004820}
4821
4822void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4823{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004824 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004825 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004826}
4827
4828void Context::vertexAttribPointer(GLuint index,
4829 GLint size,
4830 GLenum type,
4831 GLboolean normalized,
4832 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004833 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004834{
Corentin Wallez336129f2017-10-17 15:55:40 -04004835 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004836 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004837 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004838}
4839
Shao80957d92017-02-20 21:25:59 +08004840void Context::vertexAttribFormat(GLuint attribIndex,
4841 GLint size,
4842 GLenum type,
4843 GLboolean normalized,
4844 GLuint relativeOffset)
4845{
Geoff Lang92019432017-11-20 13:09:34 -05004846 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004847 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004848 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004849}
4850
4851void Context::vertexAttribIFormat(GLuint attribIndex,
4852 GLint size,
4853 GLenum type,
4854 GLuint relativeOffset)
4855{
4856 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004857 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004858}
4859
4860void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4861{
Shaodde78e82017-05-22 14:13:27 +08004862 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004863 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004864}
4865
Jiajia Qin5451d532017-11-16 17:16:34 +08004866void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004867{
4868 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004869 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004870}
4871
Jamie Madillc20ab272016-06-09 07:20:46 -07004872void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4873{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004874 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004875}
4876
4877void Context::vertexAttribIPointer(GLuint index,
4878 GLint size,
4879 GLenum type,
4880 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004881 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004882{
Corentin Wallez336129f2017-10-17 15:55:40 -04004883 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4884 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004885 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004886}
4887
4888void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4889{
4890 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004891 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004892 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004893}
4894
4895void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4896{
4897 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004898 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004899 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004900}
4901
4902void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4903{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004904 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004905 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004906}
4907
4908void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4909{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004910 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004911 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004912}
4913
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004914void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4915{
4916 const VertexAttribCurrentValueData &currentValues =
4917 getGLState().getVertexAttribCurrentValue(index);
4918 const VertexArray *vao = getGLState().getVertexArray();
4919 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4920 currentValues, pname, params);
4921}
4922
Brandon Jones59770802018-04-02 13:18:42 -07004923void Context::getVertexAttribivRobust(GLuint index,
4924 GLenum pname,
4925 GLsizei bufSize,
4926 GLsizei *length,
4927 GLint *params)
4928{
4929 getVertexAttribiv(index, pname, params);
4930}
4931
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004932void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4933{
4934 const VertexAttribCurrentValueData &currentValues =
4935 getGLState().getVertexAttribCurrentValue(index);
4936 const VertexArray *vao = getGLState().getVertexArray();
4937 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4938 currentValues, pname, params);
4939}
4940
Brandon Jones59770802018-04-02 13:18:42 -07004941void Context::getVertexAttribfvRobust(GLuint index,
4942 GLenum pname,
4943 GLsizei bufSize,
4944 GLsizei *length,
4945 GLfloat *params)
4946{
4947 getVertexAttribfv(index, pname, params);
4948}
4949
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004950void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4951{
4952 const VertexAttribCurrentValueData &currentValues =
4953 getGLState().getVertexAttribCurrentValue(index);
4954 const VertexArray *vao = getGLState().getVertexArray();
4955 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4956 currentValues, pname, params);
4957}
4958
Brandon Jones59770802018-04-02 13:18:42 -07004959void Context::getVertexAttribIivRobust(GLuint index,
4960 GLenum pname,
4961 GLsizei bufSize,
4962 GLsizei *length,
4963 GLint *params)
4964{
4965 getVertexAttribIiv(index, pname, params);
4966}
4967
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004968void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4969{
4970 const VertexAttribCurrentValueData &currentValues =
4971 getGLState().getVertexAttribCurrentValue(index);
4972 const VertexArray *vao = getGLState().getVertexArray();
4973 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4974 currentValues, pname, params);
4975}
4976
Brandon Jones59770802018-04-02 13:18:42 -07004977void Context::getVertexAttribIuivRobust(GLuint index,
4978 GLenum pname,
4979 GLsizei bufSize,
4980 GLsizei *length,
4981 GLuint *params)
4982{
4983 getVertexAttribIuiv(index, pname, params);
4984}
4985
Jamie Madill876429b2017-04-20 15:46:24 -04004986void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004987{
4988 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4989 QueryVertexAttribPointerv(attrib, pname, pointer);
4990}
4991
Brandon Jones59770802018-04-02 13:18:42 -07004992void Context::getVertexAttribPointervRobust(GLuint index,
4993 GLenum pname,
4994 GLsizei bufSize,
4995 GLsizei *length,
4996 void **pointer)
4997{
4998 getVertexAttribPointerv(index, pname, pointer);
4999}
5000
Jamie Madillc20ab272016-06-09 07:20:46 -07005001void Context::debugMessageControl(GLenum source,
5002 GLenum type,
5003 GLenum severity,
5004 GLsizei count,
5005 const GLuint *ids,
5006 GLboolean enabled)
5007{
5008 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005009 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05005010 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07005011}
5012
5013void Context::debugMessageInsert(GLenum source,
5014 GLenum type,
5015 GLuint id,
5016 GLenum severity,
5017 GLsizei length,
5018 const GLchar *buf)
5019{
5020 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005021 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005022}
5023
5024void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5025{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005026 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005027}
5028
5029GLuint Context::getDebugMessageLog(GLuint count,
5030 GLsizei bufSize,
5031 GLenum *sources,
5032 GLenum *types,
5033 GLuint *ids,
5034 GLenum *severities,
5035 GLsizei *lengths,
5036 GLchar *messageLog)
5037{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005038 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5039 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005040}
5041
5042void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5043{
5044 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005045 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005046 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005047}
5048
5049void Context::popDebugGroup()
5050{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005051 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005052 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005053}
5054
Corentin Wallez336129f2017-10-17 15:55:40 -04005055void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005056{
5057 Buffer *buffer = mGLState.getTargetBuffer(target);
5058 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005059 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005060}
5061
Corentin Wallez336129f2017-10-17 15:55:40 -04005062void Context::bufferSubData(BufferBinding target,
5063 GLintptr offset,
5064 GLsizeiptr size,
5065 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005066{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005067 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005068 {
5069 return;
5070 }
5071
5072 Buffer *buffer = mGLState.getTargetBuffer(target);
5073 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005074 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005075}
5076
Jamie Madillef300b12016-10-07 15:12:09 -04005077void Context::attachShader(GLuint program, GLuint shader)
5078{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005079 Program *programObject = mState.mShaderPrograms->getProgram(program);
5080 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005081 ASSERT(programObject && shaderObject);
5082 programObject->attachShader(shaderObject);
5083}
5084
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005085const Workarounds &Context::getWorkarounds() const
5086{
5087 return mWorkarounds;
5088}
5089
Corentin Wallez336129f2017-10-17 15:55:40 -04005090void Context::copyBufferSubData(BufferBinding readTarget,
5091 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005092 GLintptr readOffset,
5093 GLintptr writeOffset,
5094 GLsizeiptr size)
5095{
5096 // if size is zero, the copy is a successful no-op
5097 if (size == 0)
5098 {
5099 return;
5100 }
5101
5102 // TODO(jmadill): cache these.
5103 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5104 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5105
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005106 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005107}
5108
Jamie Madill01a80ee2016-11-07 12:06:18 -05005109void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5110{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005111 // Ideally we could share the program query with the validation layer if possible.
5112 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005113 ASSERT(programObject);
5114 programObject->bindAttributeLocation(index, name);
5115}
5116
Corentin Wallez336129f2017-10-17 15:55:40 -04005117void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005118{
Corentin Wallez336129f2017-10-17 15:55:40 -04005119 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5120 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005121 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005122}
5123
Corentin Wallez336129f2017-10-17 15:55:40 -04005124void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005125{
5126 bindBufferRange(target, index, buffer, 0, 0);
5127}
5128
Corentin Wallez336129f2017-10-17 15:55:40 -04005129void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005130 GLuint index,
5131 GLuint buffer,
5132 GLintptr offset,
5133 GLsizeiptr size)
5134{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005135 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5136 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5137 if (target == BufferBinding::Uniform)
5138 {
5139 mUniformBufferObserverBindings[index].bind(object ? object->getImplementation() : nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04005140 mStateCache.onUniformBufferStateChange(this);
5141 }
5142 else
5143 {
5144 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005145 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005146}
5147
Jamie Madill01a80ee2016-11-07 12:06:18 -05005148void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5149{
5150 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5151 {
5152 bindReadFramebuffer(framebuffer);
5153 }
5154
5155 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5156 {
5157 bindDrawFramebuffer(framebuffer);
5158 }
5159}
5160
5161void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5162{
5163 ASSERT(target == GL_RENDERBUFFER);
5164 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005165 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005166 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005167}
5168
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005169void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005170 GLsizei samples,
5171 GLenum internalformat,
5172 GLsizei width,
5173 GLsizei height,
5174 GLboolean fixedsamplelocations)
5175{
5176 Extents size(width, height, 1);
5177 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005178 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5179 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005180}
5181
Olli Etuaho89664842018-08-24 14:45:36 +03005182void Context::texStorage3DMultisample(TextureType target,
5183 GLsizei samples,
5184 GLenum internalformat,
5185 GLsizei width,
5186 GLsizei height,
5187 GLsizei depth,
5188 GLboolean fixedsamplelocations)
5189{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005190 Extents size(width, height, depth);
5191 Texture *texture = getTargetTexture(target);
5192 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5193 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005194}
5195
JiangYizhoubddc46b2016-12-09 09:50:51 +08005196void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5197{
JiangYizhou5b03f472017-01-09 10:22:53 +08005198 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5199 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005200 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005201 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005202
5203 switch (pname)
5204 {
5205 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005206 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005207 break;
5208 default:
5209 UNREACHABLE();
5210 }
5211}
5212
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005213void Context::getMultisamplefvRobust(GLenum pname,
5214 GLuint index,
5215 GLsizei bufSize,
5216 GLsizei *length,
5217 GLfloat *val)
5218{
5219 UNIMPLEMENTED();
5220}
5221
Jamie Madille8fb6402017-02-14 17:56:40 -05005222void Context::renderbufferStorage(GLenum target,
5223 GLenum internalformat,
5224 GLsizei width,
5225 GLsizei height)
5226{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005227 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5228 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5229
Jamie Madille8fb6402017-02-14 17:56:40 -05005230 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005231 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005232}
5233
5234void Context::renderbufferStorageMultisample(GLenum target,
5235 GLsizei samples,
5236 GLenum internalformat,
5237 GLsizei width,
5238 GLsizei height)
5239{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005240 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5241 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005242
5243 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005244 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005245 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005246}
5247
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005248void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5249{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005250 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005251 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005252}
5253
JiangYizhoue18e6392017-02-20 10:32:23 +08005254void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5255{
5256 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5257 QueryFramebufferParameteriv(framebuffer, pname, params);
5258}
5259
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005260void Context::getFramebufferParameterivRobust(GLenum target,
5261 GLenum pname,
5262 GLsizei bufSize,
5263 GLsizei *length,
5264 GLint *params)
5265{
5266 UNIMPLEMENTED();
5267}
5268
Jiajia Qin5451d532017-11-16 17:16:34 +08005269void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005270{
5271 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005272 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005273}
5274
Jamie Madilldec86232018-07-11 09:01:18 -04005275bool Context::getScratchBuffer(size_t requstedSizeBytes,
5276 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005277{
Jamie Madilldec86232018-07-11 09:01:18 -04005278 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005279}
5280
Jamie Madilldec86232018-07-11 09:01:18 -04005281bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5282 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005283{
Jamie Madilldec86232018-07-11 09:01:18 -04005284 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005285}
5286
Xinghua Cao10a4d432017-11-28 14:46:26 +08005287Error Context::prepareForDispatch()
5288{
Geoff Langa8cb2872018-03-09 16:09:40 -05005289 ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005290
5291 if (isRobustResourceInitEnabled())
5292 {
5293 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5294 }
5295
5296 return NoError();
5297}
5298
Xinghua Cao2b396592017-03-29 15:36:04 +08005299void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5300{
5301 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5302 {
5303 return;
5304 }
5305
Xinghua Cao10a4d432017-11-28 14:46:26 +08005306 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005307 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005308}
5309
Jiajia Qin5451d532017-11-16 17:16:34 +08005310void Context::dispatchComputeIndirect(GLintptr indirect)
5311{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005312 ANGLE_CONTEXT_TRY(prepareForDispatch());
5313 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005314}
5315
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005316void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005317 GLsizei levels,
5318 GLenum internalFormat,
5319 GLsizei width,
5320 GLsizei height)
5321{
5322 Extents size(width, height, 1);
5323 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005324 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005325}
5326
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005327void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005328 GLsizei levels,
5329 GLenum internalFormat,
5330 GLsizei width,
5331 GLsizei height,
5332 GLsizei depth)
5333{
5334 Extents size(width, height, depth);
5335 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005336 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005337}
5338
Jiajia Qin5451d532017-11-16 17:16:34 +08005339void Context::memoryBarrier(GLbitfield barriers)
5340{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005341 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005342}
5343
5344void Context::memoryBarrierByRegion(GLbitfield barriers)
5345{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005346 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005347}
5348
Jamie Madillc1d770e2017-04-13 17:31:24 -04005349GLenum Context::checkFramebufferStatus(GLenum target)
5350{
5351 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5352 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005353 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005354}
5355
5356void Context::compileShader(GLuint shader)
5357{
5358 Shader *shaderObject = GetValidShader(this, shader);
5359 if (!shaderObject)
5360 {
5361 return;
5362 }
5363 shaderObject->compile(this);
5364}
5365
5366void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5367{
5368 for (int i = 0; i < n; i++)
5369 {
5370 deleteBuffer(buffers[i]);
5371 }
5372}
5373
5374void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5375{
5376 for (int i = 0; i < n; i++)
5377 {
5378 if (framebuffers[i] != 0)
5379 {
5380 deleteFramebuffer(framebuffers[i]);
5381 }
5382 }
5383}
5384
5385void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5386{
5387 for (int i = 0; i < n; i++)
5388 {
5389 deleteRenderbuffer(renderbuffers[i]);
5390 }
5391}
5392
5393void Context::deleteTextures(GLsizei n, const GLuint *textures)
5394{
5395 for (int i = 0; i < n; i++)
5396 {
5397 if (textures[i] != 0)
5398 {
5399 deleteTexture(textures[i]);
5400 }
5401 }
5402}
5403
5404void Context::detachShader(GLuint program, GLuint shader)
5405{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005406 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005407 ASSERT(programObject);
5408
5409 Shader *shaderObject = getShader(shader);
5410 ASSERT(shaderObject);
5411
5412 programObject->detachShader(this, shaderObject);
5413}
5414
5415void Context::genBuffers(GLsizei n, GLuint *buffers)
5416{
5417 for (int i = 0; i < n; i++)
5418 {
5419 buffers[i] = createBuffer();
5420 }
5421}
5422
5423void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5424{
5425 for (int i = 0; i < n; i++)
5426 {
5427 framebuffers[i] = createFramebuffer();
5428 }
5429}
5430
5431void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5432{
5433 for (int i = 0; i < n; i++)
5434 {
5435 renderbuffers[i] = createRenderbuffer();
5436 }
5437}
5438
5439void Context::genTextures(GLsizei n, GLuint *textures)
5440{
5441 for (int i = 0; i < n; i++)
5442 {
5443 textures[i] = createTexture();
5444 }
5445}
5446
5447void Context::getActiveAttrib(GLuint program,
5448 GLuint index,
5449 GLsizei bufsize,
5450 GLsizei *length,
5451 GLint *size,
5452 GLenum *type,
5453 GLchar *name)
5454{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005455 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005456 ASSERT(programObject);
5457 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5458}
5459
5460void Context::getActiveUniform(GLuint program,
5461 GLuint index,
5462 GLsizei bufsize,
5463 GLsizei *length,
5464 GLint *size,
5465 GLenum *type,
5466 GLchar *name)
5467{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005468 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005469 ASSERT(programObject);
5470 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5471}
5472
5473void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5474{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005475 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005476 ASSERT(programObject);
5477 programObject->getAttachedShaders(maxcount, count, shaders);
5478}
5479
5480GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5481{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005482 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005483 ASSERT(programObject);
5484 return programObject->getAttributeLocation(name);
5485}
5486
5487void Context::getBooleanv(GLenum pname, GLboolean *params)
5488{
5489 GLenum nativeType;
5490 unsigned int numParams = 0;
5491 getQueryParameterInfo(pname, &nativeType, &numParams);
5492
5493 if (nativeType == GL_BOOL)
5494 {
5495 getBooleanvImpl(pname, params);
5496 }
5497 else
5498 {
5499 CastStateValues(this, nativeType, pname, numParams, params);
5500 }
5501}
5502
Brandon Jones59770802018-04-02 13:18:42 -07005503void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5504{
5505 getBooleanv(pname, params);
5506}
5507
Jamie Madillc1d770e2017-04-13 17:31:24 -04005508void Context::getFloatv(GLenum pname, GLfloat *params)
5509{
5510 GLenum nativeType;
5511 unsigned int numParams = 0;
5512 getQueryParameterInfo(pname, &nativeType, &numParams);
5513
5514 if (nativeType == GL_FLOAT)
5515 {
5516 getFloatvImpl(pname, params);
5517 }
5518 else
5519 {
5520 CastStateValues(this, nativeType, pname, numParams, params);
5521 }
5522}
5523
Brandon Jones59770802018-04-02 13:18:42 -07005524void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5525{
5526 getFloatv(pname, params);
5527}
5528
Jamie Madillc1d770e2017-04-13 17:31:24 -04005529void Context::getIntegerv(GLenum pname, GLint *params)
5530{
5531 GLenum nativeType;
5532 unsigned int numParams = 0;
5533 getQueryParameterInfo(pname, &nativeType, &numParams);
5534
5535 if (nativeType == GL_INT)
5536 {
5537 getIntegervImpl(pname, params);
5538 }
5539 else
5540 {
5541 CastStateValues(this, nativeType, pname, numParams, params);
5542 }
5543}
5544
Brandon Jones59770802018-04-02 13:18:42 -07005545void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5546{
5547 getIntegerv(pname, data);
5548}
5549
Jamie Madillc1d770e2017-04-13 17:31:24 -04005550void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5551{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005552 // Don't resolve link if checking the link completion status.
5553 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5554 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005555 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005556 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005557}
5558
Brandon Jones59770802018-04-02 13:18:42 -07005559void Context::getProgramivRobust(GLuint program,
5560 GLenum pname,
5561 GLsizei bufSize,
5562 GLsizei *length,
5563 GLint *params)
5564{
5565 getProgramiv(program, pname, params);
5566}
5567
Jiajia Qin5451d532017-11-16 17:16:34 +08005568void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5569{
5570 UNIMPLEMENTED();
5571}
5572
Jamie Madillbe849e42017-05-02 15:49:00 -04005573void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005574{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005575 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005576 ASSERT(programObject);
5577 programObject->getInfoLog(bufsize, length, infolog);
5578}
5579
Jiajia Qin5451d532017-11-16 17:16:34 +08005580void Context::getProgramPipelineInfoLog(GLuint pipeline,
5581 GLsizei bufSize,
5582 GLsizei *length,
5583 GLchar *infoLog)
5584{
5585 UNIMPLEMENTED();
5586}
5587
Jamie Madillc1d770e2017-04-13 17:31:24 -04005588void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5589{
5590 Shader *shaderObject = getShader(shader);
5591 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005592 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005593}
5594
Brandon Jones59770802018-04-02 13:18:42 -07005595void Context::getShaderivRobust(GLuint shader,
5596 GLenum pname,
5597 GLsizei bufSize,
5598 GLsizei *length,
5599 GLint *params)
5600{
5601 getShaderiv(shader, pname, params);
5602}
5603
Jamie Madillc1d770e2017-04-13 17:31:24 -04005604void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5605{
5606 Shader *shaderObject = getShader(shader);
5607 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005608 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005609}
5610
5611void Context::getShaderPrecisionFormat(GLenum shadertype,
5612 GLenum precisiontype,
5613 GLint *range,
5614 GLint *precision)
5615{
5616 // TODO(jmadill): Compute shaders.
5617
5618 switch (shadertype)
5619 {
5620 case GL_VERTEX_SHADER:
5621 switch (precisiontype)
5622 {
5623 case GL_LOW_FLOAT:
5624 mCaps.vertexLowpFloat.get(range, precision);
5625 break;
5626 case GL_MEDIUM_FLOAT:
5627 mCaps.vertexMediumpFloat.get(range, precision);
5628 break;
5629 case GL_HIGH_FLOAT:
5630 mCaps.vertexHighpFloat.get(range, precision);
5631 break;
5632
5633 case GL_LOW_INT:
5634 mCaps.vertexLowpInt.get(range, precision);
5635 break;
5636 case GL_MEDIUM_INT:
5637 mCaps.vertexMediumpInt.get(range, precision);
5638 break;
5639 case GL_HIGH_INT:
5640 mCaps.vertexHighpInt.get(range, precision);
5641 break;
5642
5643 default:
5644 UNREACHABLE();
5645 return;
5646 }
5647 break;
5648
5649 case GL_FRAGMENT_SHADER:
5650 switch (precisiontype)
5651 {
5652 case GL_LOW_FLOAT:
5653 mCaps.fragmentLowpFloat.get(range, precision);
5654 break;
5655 case GL_MEDIUM_FLOAT:
5656 mCaps.fragmentMediumpFloat.get(range, precision);
5657 break;
5658 case GL_HIGH_FLOAT:
5659 mCaps.fragmentHighpFloat.get(range, precision);
5660 break;
5661
5662 case GL_LOW_INT:
5663 mCaps.fragmentLowpInt.get(range, precision);
5664 break;
5665 case GL_MEDIUM_INT:
5666 mCaps.fragmentMediumpInt.get(range, precision);
5667 break;
5668 case GL_HIGH_INT:
5669 mCaps.fragmentHighpInt.get(range, precision);
5670 break;
5671
5672 default:
5673 UNREACHABLE();
5674 return;
5675 }
5676 break;
5677
5678 default:
5679 UNREACHABLE();
5680 return;
5681 }
5682}
5683
5684void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5685{
5686 Shader *shaderObject = getShader(shader);
5687 ASSERT(shaderObject);
5688 shaderObject->getSource(bufsize, length, source);
5689}
5690
5691void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5692{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005693 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005694 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005695 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005696}
5697
Brandon Jones59770802018-04-02 13:18:42 -07005698void Context::getUniformfvRobust(GLuint program,
5699 GLint location,
5700 GLsizei bufSize,
5701 GLsizei *length,
5702 GLfloat *params)
5703{
5704 getUniformfv(program, location, params);
5705}
5706
Jamie Madillc1d770e2017-04-13 17:31:24 -04005707void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5708{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005709 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005710 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005711 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005712}
5713
Brandon Jones59770802018-04-02 13:18:42 -07005714void Context::getUniformivRobust(GLuint program,
5715 GLint location,
5716 GLsizei bufSize,
5717 GLsizei *length,
5718 GLint *params)
5719{
5720 getUniformiv(program, location, params);
5721}
5722
Jamie Madillc1d770e2017-04-13 17:31:24 -04005723GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5724{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005725 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005726 ASSERT(programObject);
5727 return programObject->getUniformLocation(name);
5728}
5729
5730GLboolean Context::isBuffer(GLuint buffer)
5731{
5732 if (buffer == 0)
5733 {
5734 return GL_FALSE;
5735 }
5736
5737 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5738}
5739
5740GLboolean Context::isEnabled(GLenum cap)
5741{
5742 return mGLState.getEnableFeature(cap);
5743}
5744
5745GLboolean Context::isFramebuffer(GLuint framebuffer)
5746{
5747 if (framebuffer == 0)
5748 {
5749 return GL_FALSE;
5750 }
5751
5752 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5753}
5754
5755GLboolean Context::isProgram(GLuint program)
5756{
5757 if (program == 0)
5758 {
5759 return GL_FALSE;
5760 }
5761
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005762 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005763}
5764
5765GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5766{
5767 if (renderbuffer == 0)
5768 {
5769 return GL_FALSE;
5770 }
5771
5772 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5773}
5774
5775GLboolean Context::isShader(GLuint shader)
5776{
5777 if (shader == 0)
5778 {
5779 return GL_FALSE;
5780 }
5781
5782 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5783}
5784
5785GLboolean Context::isTexture(GLuint texture)
5786{
5787 if (texture == 0)
5788 {
5789 return GL_FALSE;
5790 }
5791
5792 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5793}
5794
5795void Context::linkProgram(GLuint program)
5796{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005797 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005798 ASSERT(programObject);
5799 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08005800
5801 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
5802 // don't need to worry that:
5803 // 1. Draw calls after link use the new executable code or the old one depending on the link
5804 // result.
5805 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
5806 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
5807 // ProgramD3D.
5808 if (programObject->isInUse())
5809 {
Jamie Madill785e8a02018-10-04 17:42:00 -04005810 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04005811 if (programObject->isLinked())
5812 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04005813 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04005814 }
jchen107ae70d82018-07-06 13:47:01 +08005815 mStateCache.onProgramExecutableChange(this);
5816 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005817}
5818
5819void Context::releaseShaderCompiler()
5820{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005821 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005822}
5823
5824void Context::shaderBinary(GLsizei n,
5825 const GLuint *shaders,
5826 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005827 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005828 GLsizei length)
5829{
5830 // No binary shader formats are supported.
5831 UNIMPLEMENTED();
5832}
5833
Olli Etuaho0ca09752018-09-24 11:00:50 +03005834void Context::bindFragDataLocationIndexed(GLuint program,
5835 GLuint colorNumber,
5836 GLuint index,
5837 const char *name)
5838{
5839 Program *programObject = getProgramNoResolveLink(program);
5840 programObject->bindFragmentOutputLocation(colorNumber, name);
5841 programObject->bindFragmentOutputIndex(index, name);
5842}
5843
5844void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
5845{
5846 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
5847}
5848
5849int Context::getFragDataIndex(GLuint program, const char *name)
5850{
5851 Program *programObject = getProgramResolveLink(program);
5852 return programObject->getFragDataIndex(name);
5853}
5854
5855int Context::getProgramResourceLocationIndex(GLuint program,
5856 GLenum programInterface,
5857 const char *name)
5858{
5859 Program *programObject = getProgramResolveLink(program);
5860 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
5861 return programObject->getFragDataIndex(name);
5862}
5863
Jamie Madillc1d770e2017-04-13 17:31:24 -04005864void Context::shaderSource(GLuint shader,
5865 GLsizei count,
5866 const GLchar *const *string,
5867 const GLint *length)
5868{
5869 Shader *shaderObject = getShader(shader);
5870 ASSERT(shaderObject);
5871 shaderObject->setSource(count, string, length);
5872}
5873
5874void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5875{
5876 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5877}
5878
5879void Context::stencilMask(GLuint mask)
5880{
5881 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5882}
5883
5884void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5885{
5886 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5887}
5888
5889void Context::uniform1f(GLint location, GLfloat x)
5890{
5891 Program *program = mGLState.getProgram();
5892 program->setUniform1fv(location, 1, &x);
5893}
5894
5895void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5896{
5897 Program *program = mGLState.getProgram();
5898 program->setUniform1fv(location, count, v);
5899}
5900
Jamie Madill7e4eff12018-08-08 15:49:26 -04005901void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005902{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005903 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04005904 {
5905 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04005906 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04005907 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005908}
5909
Jamie Madill7e4eff12018-08-08 15:49:26 -04005910void Context::uniform1i(GLint location, GLint x)
5911{
5912 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
5913}
5914
Jamie Madillc1d770e2017-04-13 17:31:24 -04005915void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5916{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005917 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005918}
5919
5920void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5921{
5922 GLfloat xy[2] = {x, y};
5923 Program *program = mGLState.getProgram();
5924 program->setUniform2fv(location, 1, xy);
5925}
5926
5927void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5928{
5929 Program *program = mGLState.getProgram();
5930 program->setUniform2fv(location, count, v);
5931}
5932
5933void Context::uniform2i(GLint location, GLint x, GLint y)
5934{
5935 GLint xy[2] = {x, y};
5936 Program *program = mGLState.getProgram();
5937 program->setUniform2iv(location, 1, xy);
5938}
5939
5940void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
5941{
5942 Program *program = mGLState.getProgram();
5943 program->setUniform2iv(location, count, v);
5944}
5945
5946void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5947{
5948 GLfloat xyz[3] = {x, y, z};
5949 Program *program = mGLState.getProgram();
5950 program->setUniform3fv(location, 1, xyz);
5951}
5952
5953void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
5954{
5955 Program *program = mGLState.getProgram();
5956 program->setUniform3fv(location, count, v);
5957}
5958
5959void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
5960{
5961 GLint xyz[3] = {x, y, z};
5962 Program *program = mGLState.getProgram();
5963 program->setUniform3iv(location, 1, xyz);
5964}
5965
5966void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
5967{
5968 Program *program = mGLState.getProgram();
5969 program->setUniform3iv(location, count, v);
5970}
5971
5972void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5973{
5974 GLfloat xyzw[4] = {x, y, z, w};
5975 Program *program = mGLState.getProgram();
5976 program->setUniform4fv(location, 1, xyzw);
5977}
5978
5979void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
5980{
5981 Program *program = mGLState.getProgram();
5982 program->setUniform4fv(location, count, v);
5983}
5984
5985void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5986{
5987 GLint xyzw[4] = {x, y, z, w};
5988 Program *program = mGLState.getProgram();
5989 program->setUniform4iv(location, 1, xyzw);
5990}
5991
5992void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
5993{
5994 Program *program = mGLState.getProgram();
5995 program->setUniform4iv(location, count, v);
5996}
5997
5998void Context::uniformMatrix2fv(GLint location,
5999 GLsizei count,
6000 GLboolean transpose,
6001 const GLfloat *value)
6002{
6003 Program *program = mGLState.getProgram();
6004 program->setUniformMatrix2fv(location, count, transpose, value);
6005}
6006
6007void Context::uniformMatrix3fv(GLint location,
6008 GLsizei count,
6009 GLboolean transpose,
6010 const GLfloat *value)
6011{
6012 Program *program = mGLState.getProgram();
6013 program->setUniformMatrix3fv(location, count, transpose, value);
6014}
6015
6016void Context::uniformMatrix4fv(GLint location,
6017 GLsizei count,
6018 GLboolean transpose,
6019 const GLfloat *value)
6020{
6021 Program *program = mGLState.getProgram();
6022 program->setUniformMatrix4fv(location, count, transpose, value);
6023}
6024
6025void Context::validateProgram(GLuint program)
6026{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006027 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006028 ASSERT(programObject);
6029 programObject->validate(mCaps);
6030}
6031
Jiajia Qin5451d532017-11-16 17:16:34 +08006032void Context::validateProgramPipeline(GLuint pipeline)
6033{
6034 UNIMPLEMENTED();
6035}
6036
Jamie Madilld04908b2017-06-09 14:15:35 -04006037void Context::getProgramBinary(GLuint program,
6038 GLsizei bufSize,
6039 GLsizei *length,
6040 GLenum *binaryFormat,
6041 void *binary)
6042{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006043 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006044 ASSERT(programObject != nullptr);
6045
6046 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
6047}
6048
6049void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6050{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006051 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006052 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006053
Jamie Madilld04908b2017-06-09 14:15:35 -04006054 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006055 if (programObject->isInUse())
6056 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006057 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006058 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006059 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006060}
6061
Jamie Madillff325f12017-08-26 15:06:05 -04006062void Context::uniform1ui(GLint location, GLuint v0)
6063{
6064 Program *program = mGLState.getProgram();
6065 program->setUniform1uiv(location, 1, &v0);
6066}
6067
6068void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6069{
6070 Program *program = mGLState.getProgram();
6071 const GLuint xy[] = {v0, v1};
6072 program->setUniform2uiv(location, 1, xy);
6073}
6074
6075void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6076{
6077 Program *program = mGLState.getProgram();
6078 const GLuint xyz[] = {v0, v1, v2};
6079 program->setUniform3uiv(location, 1, xyz);
6080}
6081
6082void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6083{
6084 Program *program = mGLState.getProgram();
6085 const GLuint xyzw[] = {v0, v1, v2, v3};
6086 program->setUniform4uiv(location, 1, xyzw);
6087}
6088
6089void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6090{
6091 Program *program = mGLState.getProgram();
6092 program->setUniform1uiv(location, count, value);
6093}
6094void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6095{
6096 Program *program = mGLState.getProgram();
6097 program->setUniform2uiv(location, count, value);
6098}
6099
6100void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6101{
6102 Program *program = mGLState.getProgram();
6103 program->setUniform3uiv(location, count, value);
6104}
6105
6106void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6107{
6108 Program *program = mGLState.getProgram();
6109 program->setUniform4uiv(location, count, value);
6110}
6111
Jamie Madillf0e04492017-08-26 15:28:42 -04006112void Context::genQueries(GLsizei n, GLuint *ids)
6113{
6114 for (GLsizei i = 0; i < n; i++)
6115 {
6116 GLuint handle = mQueryHandleAllocator.allocate();
6117 mQueryMap.assign(handle, nullptr);
6118 ids[i] = handle;
6119 }
6120}
6121
6122void Context::deleteQueries(GLsizei n, const GLuint *ids)
6123{
6124 for (int i = 0; i < n; i++)
6125 {
6126 GLuint query = ids[i];
6127
6128 Query *queryObject = nullptr;
6129 if (mQueryMap.erase(query, &queryObject))
6130 {
6131 mQueryHandleAllocator.release(query);
6132 if (queryObject)
6133 {
6134 queryObject->release(this);
6135 }
6136 }
6137 }
6138}
6139
6140GLboolean Context::isQuery(GLuint id)
6141{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006142 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006143}
6144
Jamie Madillc8c95812017-08-26 18:40:09 -04006145void Context::uniformMatrix2x3fv(GLint location,
6146 GLsizei count,
6147 GLboolean transpose,
6148 const GLfloat *value)
6149{
6150 Program *program = mGLState.getProgram();
6151 program->setUniformMatrix2x3fv(location, count, transpose, value);
6152}
6153
6154void Context::uniformMatrix3x2fv(GLint location,
6155 GLsizei count,
6156 GLboolean transpose,
6157 const GLfloat *value)
6158{
6159 Program *program = mGLState.getProgram();
6160 program->setUniformMatrix3x2fv(location, count, transpose, value);
6161}
6162
6163void Context::uniformMatrix2x4fv(GLint location,
6164 GLsizei count,
6165 GLboolean transpose,
6166 const GLfloat *value)
6167{
6168 Program *program = mGLState.getProgram();
6169 program->setUniformMatrix2x4fv(location, count, transpose, value);
6170}
6171
6172void Context::uniformMatrix4x2fv(GLint location,
6173 GLsizei count,
6174 GLboolean transpose,
6175 const GLfloat *value)
6176{
6177 Program *program = mGLState.getProgram();
6178 program->setUniformMatrix4x2fv(location, count, transpose, value);
6179}
6180
6181void Context::uniformMatrix3x4fv(GLint location,
6182 GLsizei count,
6183 GLboolean transpose,
6184 const GLfloat *value)
6185{
6186 Program *program = mGLState.getProgram();
6187 program->setUniformMatrix3x4fv(location, count, transpose, value);
6188}
6189
6190void Context::uniformMatrix4x3fv(GLint location,
6191 GLsizei count,
6192 GLboolean transpose,
6193 const GLfloat *value)
6194{
6195 Program *program = mGLState.getProgram();
6196 program->setUniformMatrix4x3fv(location, count, transpose, value);
6197}
6198
Jamie Madilld7576732017-08-26 18:49:50 -04006199void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6200{
6201 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6202 {
6203 GLuint vertexArray = arrays[arrayIndex];
6204
6205 if (arrays[arrayIndex] != 0)
6206 {
6207 VertexArray *vertexArrayObject = nullptr;
6208 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6209 {
6210 if (vertexArrayObject != nullptr)
6211 {
6212 detachVertexArray(vertexArray);
6213 vertexArrayObject->onDestroy(this);
6214 }
6215
6216 mVertexArrayHandleAllocator.release(vertexArray);
6217 }
6218 }
6219 }
6220}
6221
6222void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6223{
6224 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6225 {
6226 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6227 mVertexArrayMap.assign(vertexArray, nullptr);
6228 arrays[arrayIndex] = vertexArray;
6229 }
6230}
6231
6232bool Context::isVertexArray(GLuint array)
6233{
6234 if (array == 0)
6235 {
6236 return GL_FALSE;
6237 }
6238
6239 VertexArray *vao = getVertexArray(array);
6240 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6241}
6242
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006243void Context::endTransformFeedback()
6244{
6245 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6246 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006247 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006248}
6249
6250void Context::transformFeedbackVaryings(GLuint program,
6251 GLsizei count,
6252 const GLchar *const *varyings,
6253 GLenum bufferMode)
6254{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006255 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006256 ASSERT(programObject);
6257 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6258}
6259
6260void Context::getTransformFeedbackVarying(GLuint program,
6261 GLuint index,
6262 GLsizei bufSize,
6263 GLsizei *length,
6264 GLsizei *size,
6265 GLenum *type,
6266 GLchar *name)
6267{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006268 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006269 ASSERT(programObject);
6270 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6271}
6272
6273void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6274{
6275 for (int i = 0; i < n; i++)
6276 {
6277 GLuint transformFeedback = ids[i];
6278 if (transformFeedback == 0)
6279 {
6280 continue;
6281 }
6282
6283 TransformFeedback *transformFeedbackObject = nullptr;
6284 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6285 {
6286 if (transformFeedbackObject != nullptr)
6287 {
6288 detachTransformFeedback(transformFeedback);
6289 transformFeedbackObject->release(this);
6290 }
6291
6292 mTransformFeedbackHandleAllocator.release(transformFeedback);
6293 }
6294 }
6295}
6296
6297void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6298{
6299 for (int i = 0; i < n; i++)
6300 {
6301 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6302 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6303 ids[i] = transformFeedback;
6304 }
6305}
6306
6307bool Context::isTransformFeedback(GLuint id)
6308{
6309 if (id == 0)
6310 {
6311 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6312 // returns FALSE
6313 return GL_FALSE;
6314 }
6315
6316 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6317 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6318}
6319
6320void Context::pauseTransformFeedback()
6321{
6322 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6323 transformFeedback->pause();
6324}
6325
6326void Context::resumeTransformFeedback()
6327{
6328 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6329 transformFeedback->resume();
6330}
6331
Jamie Madill12e957f2017-08-26 21:42:26 -04006332void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6333{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006334 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006335 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006336}
6337
Brandon Jones59770802018-04-02 13:18:42 -07006338void Context::getUniformuivRobust(GLuint program,
6339 GLint location,
6340 GLsizei bufSize,
6341 GLsizei *length,
6342 GLuint *params)
6343{
6344 getUniformuiv(program, location, params);
6345}
6346
Jamie Madill12e957f2017-08-26 21:42:26 -04006347GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6348{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006349 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006350 return programObject->getFragDataLocation(name);
6351}
6352
6353void Context::getUniformIndices(GLuint program,
6354 GLsizei uniformCount,
6355 const GLchar *const *uniformNames,
6356 GLuint *uniformIndices)
6357{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006358 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006359 if (!programObject->isLinked())
6360 {
6361 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6362 {
6363 uniformIndices[uniformId] = GL_INVALID_INDEX;
6364 }
6365 }
6366 else
6367 {
6368 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6369 {
6370 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6371 }
6372 }
6373}
6374
6375void Context::getActiveUniformsiv(GLuint program,
6376 GLsizei uniformCount,
6377 const GLuint *uniformIndices,
6378 GLenum pname,
6379 GLint *params)
6380{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006381 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006382 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6383 {
6384 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006385 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006386 }
6387}
6388
6389GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6390{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006391 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006392 return programObject->getUniformBlockIndex(uniformBlockName);
6393}
6394
6395void Context::getActiveUniformBlockiv(GLuint program,
6396 GLuint uniformBlockIndex,
6397 GLenum pname,
6398 GLint *params)
6399{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006400 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006401 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6402}
6403
Brandon Jones59770802018-04-02 13:18:42 -07006404void Context::getActiveUniformBlockivRobust(GLuint program,
6405 GLuint uniformBlockIndex,
6406 GLenum pname,
6407 GLsizei bufSize,
6408 GLsizei *length,
6409 GLint *params)
6410{
6411 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6412}
6413
Jamie Madill12e957f2017-08-26 21:42:26 -04006414void Context::getActiveUniformBlockName(GLuint program,
6415 GLuint uniformBlockIndex,
6416 GLsizei bufSize,
6417 GLsizei *length,
6418 GLchar *uniformBlockName)
6419{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006420 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006421 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6422}
6423
6424void Context::uniformBlockBinding(GLuint program,
6425 GLuint uniformBlockIndex,
6426 GLuint uniformBlockBinding)
6427{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006428 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006429 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006430
Jamie Madill956ab4d2018-10-10 16:13:03 -04006431 // Note: If the Program is shared between Contexts we would be better using Observer/Subject.
Jamie Madill70aeda42018-08-20 12:17:40 -04006432 if (programObject->isInUse())
6433 {
6434 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006435 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006436 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006437}
6438
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006439GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6440{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006441 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6442 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006443
Jamie Madill70b5bb02017-08-28 13:32:37 -04006444 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006445 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006446 if (error.isError())
6447 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006448 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006449 handleError(error);
6450 return nullptr;
6451 }
6452
Jamie Madill70b5bb02017-08-28 13:32:37 -04006453 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006454}
6455
6456GLboolean Context::isSync(GLsync sync)
6457{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006458 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006459}
6460
6461GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6462{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006463 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006464
6465 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006466 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006467 return result;
6468}
6469
6470void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6471{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006472 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006473 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006474}
6475
6476void Context::getInteger64v(GLenum pname, GLint64 *params)
6477{
6478 GLenum nativeType = GL_NONE;
6479 unsigned int numParams = 0;
6480 getQueryParameterInfo(pname, &nativeType, &numParams);
6481
6482 if (nativeType == GL_INT_64_ANGLEX)
6483 {
6484 getInteger64vImpl(pname, params);
6485 }
6486 else
6487 {
6488 CastStateValues(this, nativeType, pname, numParams, params);
6489 }
6490}
6491
Brandon Jones59770802018-04-02 13:18:42 -07006492void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6493{
6494 getInteger64v(pname, data);
6495}
6496
Corentin Wallez336129f2017-10-17 15:55:40 -04006497void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006498{
6499 Buffer *buffer = mGLState.getTargetBuffer(target);
6500 QueryBufferParameteri64v(buffer, pname, params);
6501}
6502
Brandon Jones59770802018-04-02 13:18:42 -07006503void Context::getBufferParameteri64vRobust(BufferBinding target,
6504 GLenum pname,
6505 GLsizei bufSize,
6506 GLsizei *length,
6507 GLint64 *params)
6508{
6509 getBufferParameteri64v(target, pname, params);
6510}
6511
Jamie Madill3ef140a2017-08-26 23:11:21 -04006512void Context::genSamplers(GLsizei count, GLuint *samplers)
6513{
6514 for (int i = 0; i < count; i++)
6515 {
6516 samplers[i] = mState.mSamplers->createSampler();
6517 }
6518}
6519
6520void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6521{
6522 for (int i = 0; i < count; i++)
6523 {
6524 GLuint sampler = samplers[i];
6525
6526 if (mState.mSamplers->getSampler(sampler))
6527 {
6528 detachSampler(sampler);
6529 }
6530
6531 mState.mSamplers->deleteObject(this, sampler);
6532 }
6533}
6534
6535void Context::getInternalformativ(GLenum target,
6536 GLenum internalformat,
6537 GLenum pname,
6538 GLsizei bufSize,
6539 GLint *params)
6540{
6541 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6542 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6543}
6544
Brandon Jones59770802018-04-02 13:18:42 -07006545void Context::getInternalformativRobust(GLenum target,
6546 GLenum internalformat,
6547 GLenum pname,
6548 GLsizei bufSize,
6549 GLsizei *length,
6550 GLint *params)
6551{
6552 getInternalformativ(target, internalformat, pname, bufSize, params);
6553}
6554
Jiajia Qin5451d532017-11-16 17:16:34 +08006555void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6556{
6557 programUniform1iv(program, location, 1, &v0);
6558}
6559
6560void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6561{
6562 GLint xy[2] = {v0, v1};
6563 programUniform2iv(program, location, 1, xy);
6564}
6565
6566void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6567{
6568 GLint xyz[3] = {v0, v1, v2};
6569 programUniform3iv(program, location, 1, xyz);
6570}
6571
6572void Context::programUniform4i(GLuint program,
6573 GLint location,
6574 GLint v0,
6575 GLint v1,
6576 GLint v2,
6577 GLint v3)
6578{
6579 GLint xyzw[4] = {v0, v1, v2, v3};
6580 programUniform4iv(program, location, 1, xyzw);
6581}
6582
6583void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6584{
6585 programUniform1uiv(program, location, 1, &v0);
6586}
6587
6588void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6589{
6590 GLuint xy[2] = {v0, v1};
6591 programUniform2uiv(program, location, 1, xy);
6592}
6593
6594void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6595{
6596 GLuint xyz[3] = {v0, v1, v2};
6597 programUniform3uiv(program, location, 1, xyz);
6598}
6599
6600void Context::programUniform4ui(GLuint program,
6601 GLint location,
6602 GLuint v0,
6603 GLuint v1,
6604 GLuint v2,
6605 GLuint v3)
6606{
6607 GLuint xyzw[4] = {v0, v1, v2, v3};
6608 programUniform4uiv(program, location, 1, xyzw);
6609}
6610
6611void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6612{
6613 programUniform1fv(program, location, 1, &v0);
6614}
6615
6616void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6617{
6618 GLfloat xy[2] = {v0, v1};
6619 programUniform2fv(program, location, 1, xy);
6620}
6621
6622void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6623{
6624 GLfloat xyz[3] = {v0, v1, v2};
6625 programUniform3fv(program, location, 1, xyz);
6626}
6627
6628void Context::programUniform4f(GLuint program,
6629 GLint location,
6630 GLfloat v0,
6631 GLfloat v1,
6632 GLfloat v2,
6633 GLfloat v3)
6634{
6635 GLfloat xyzw[4] = {v0, v1, v2, v3};
6636 programUniform4fv(program, location, 1, xyzw);
6637}
6638
Jamie Madill81c2e252017-09-09 23:32:46 -04006639void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6640{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006641 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006642 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006643 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006644}
6645
Jiajia Qin5451d532017-11-16 17:16:34 +08006646void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6647{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006648 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006649 ASSERT(programObject);
6650 programObject->setUniform2iv(location, count, value);
6651}
6652
6653void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6654{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006655 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006656 ASSERT(programObject);
6657 programObject->setUniform3iv(location, count, value);
6658}
6659
6660void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6661{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006662 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006663 ASSERT(programObject);
6664 programObject->setUniform4iv(location, count, value);
6665}
6666
6667void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6668{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006669 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006670 ASSERT(programObject);
6671 programObject->setUniform1uiv(location, count, value);
6672}
6673
6674void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6675{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006676 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006677 ASSERT(programObject);
6678 programObject->setUniform2uiv(location, count, value);
6679}
6680
6681void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6682{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006683 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006684 ASSERT(programObject);
6685 programObject->setUniform3uiv(location, count, value);
6686}
6687
6688void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6689{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006690 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006691 ASSERT(programObject);
6692 programObject->setUniform4uiv(location, count, value);
6693}
6694
6695void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6696{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006697 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006698 ASSERT(programObject);
6699 programObject->setUniform1fv(location, count, value);
6700}
6701
6702void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6703{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006704 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006705 ASSERT(programObject);
6706 programObject->setUniform2fv(location, count, value);
6707}
6708
6709void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6710{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006711 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006712 ASSERT(programObject);
6713 programObject->setUniform3fv(location, count, value);
6714}
6715
6716void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6717{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006718 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006719 ASSERT(programObject);
6720 programObject->setUniform4fv(location, count, value);
6721}
6722
6723void Context::programUniformMatrix2fv(GLuint program,
6724 GLint location,
6725 GLsizei count,
6726 GLboolean transpose,
6727 const GLfloat *value)
6728{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006729 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006730 ASSERT(programObject);
6731 programObject->setUniformMatrix2fv(location, count, transpose, value);
6732}
6733
6734void Context::programUniformMatrix3fv(GLuint program,
6735 GLint location,
6736 GLsizei count,
6737 GLboolean transpose,
6738 const GLfloat *value)
6739{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006740 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006741 ASSERT(programObject);
6742 programObject->setUniformMatrix3fv(location, count, transpose, value);
6743}
6744
6745void Context::programUniformMatrix4fv(GLuint program,
6746 GLint location,
6747 GLsizei count,
6748 GLboolean transpose,
6749 const GLfloat *value)
6750{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006751 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006752 ASSERT(programObject);
6753 programObject->setUniformMatrix4fv(location, count, transpose, value);
6754}
6755
6756void Context::programUniformMatrix2x3fv(GLuint program,
6757 GLint location,
6758 GLsizei count,
6759 GLboolean transpose,
6760 const GLfloat *value)
6761{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006762 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006763 ASSERT(programObject);
6764 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6765}
6766
6767void Context::programUniformMatrix3x2fv(GLuint program,
6768 GLint location,
6769 GLsizei count,
6770 GLboolean transpose,
6771 const GLfloat *value)
6772{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006773 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006774 ASSERT(programObject);
6775 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6776}
6777
6778void Context::programUniformMatrix2x4fv(GLuint program,
6779 GLint location,
6780 GLsizei count,
6781 GLboolean transpose,
6782 const GLfloat *value)
6783{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006784 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006785 ASSERT(programObject);
6786 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6787}
6788
6789void Context::programUniformMatrix4x2fv(GLuint program,
6790 GLint location,
6791 GLsizei count,
6792 GLboolean transpose,
6793 const GLfloat *value)
6794{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006795 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006796 ASSERT(programObject);
6797 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6798}
6799
6800void Context::programUniformMatrix3x4fv(GLuint program,
6801 GLint location,
6802 GLsizei count,
6803 GLboolean transpose,
6804 const GLfloat *value)
6805{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006806 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006807 ASSERT(programObject);
6808 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6809}
6810
6811void Context::programUniformMatrix4x3fv(GLuint program,
6812 GLint location,
6813 GLsizei count,
6814 GLboolean transpose,
6815 const GLfloat *value)
6816{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006817 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006818 ASSERT(programObject);
6819 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6820}
6821
Jamie Madill81c2e252017-09-09 23:32:46 -04006822void Context::onTextureChange(const Texture *texture)
6823{
6824 // Conservatively assume all textures are dirty.
6825 // TODO(jmadill): More fine-grained update.
6826 mGLState.setObjectDirty(GL_TEXTURE);
6827}
6828
James Darpiniane8a93c62018-01-04 18:02:24 -08006829bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6830{
6831 return mGLState.isCurrentTransformFeedback(tf);
6832}
James Darpiniane8a93c62018-01-04 18:02:24 -08006833
Yunchao Hea336b902017-08-02 16:05:21 +08006834void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6835{
6836 for (int i = 0; i < count; i++)
6837 {
6838 pipelines[i] = createProgramPipeline();
6839 }
6840}
6841
6842void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6843{
6844 for (int i = 0; i < count; i++)
6845 {
6846 if (pipelines[i] != 0)
6847 {
6848 deleteProgramPipeline(pipelines[i]);
6849 }
6850 }
6851}
6852
6853GLboolean Context::isProgramPipeline(GLuint pipeline)
6854{
6855 if (pipeline == 0)
6856 {
6857 return GL_FALSE;
6858 }
6859
6860 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6861}
6862
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006863void Context::finishFenceNV(GLuint fence)
6864{
6865 FenceNV *fenceObject = getFenceNV(fence);
6866
6867 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04006868 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006869}
6870
6871void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6872{
6873 FenceNV *fenceObject = getFenceNV(fence);
6874
6875 ASSERT(fenceObject && fenceObject->isSet());
6876
6877 switch (pname)
6878 {
6879 case GL_FENCE_STATUS_NV:
6880 {
6881 // GL_NV_fence spec:
6882 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6883 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6884 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6885 GLboolean status = GL_TRUE;
6886 if (fenceObject->getStatus() != GL_TRUE)
6887 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006888 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006889 }
6890 *params = status;
6891 break;
6892 }
6893
6894 case GL_FENCE_CONDITION_NV:
6895 {
6896 *params = static_cast<GLint>(fenceObject->getCondition());
6897 break;
6898 }
6899
6900 default:
6901 UNREACHABLE();
6902 }
6903}
6904
6905void Context::getTranslatedShaderSource(GLuint shader,
6906 GLsizei bufsize,
6907 GLsizei *length,
6908 GLchar *source)
6909{
6910 Shader *shaderObject = getShader(shader);
6911 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08006912 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006913}
6914
6915void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6916{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006917 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006918 ASSERT(programObject);
6919
6920 programObject->getUniformfv(this, location, params);
6921}
6922
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006923void Context::getnUniformfvRobust(GLuint program,
6924 GLint location,
6925 GLsizei bufSize,
6926 GLsizei *length,
6927 GLfloat *params)
6928{
6929 UNIMPLEMENTED();
6930}
6931
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006932void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
6933{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006934 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006935 ASSERT(programObject);
6936
6937 programObject->getUniformiv(this, location, params);
6938}
6939
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006940void Context::getnUniformivRobust(GLuint program,
6941 GLint location,
6942 GLsizei bufSize,
6943 GLsizei *length,
6944 GLint *params)
6945{
6946 UNIMPLEMENTED();
6947}
6948
6949void Context::getnUniformuivRobust(GLuint program,
6950 GLint location,
6951 GLsizei bufSize,
6952 GLsizei *length,
6953 GLuint *params)
6954{
6955 UNIMPLEMENTED();
6956}
6957
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006958GLboolean Context::isFenceNV(GLuint fence)
6959{
6960 FenceNV *fenceObject = getFenceNV(fence);
6961
6962 if (fenceObject == nullptr)
6963 {
6964 return GL_FALSE;
6965 }
6966
6967 // GL_NV_fence spec:
6968 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
6969 // existing fence.
6970 return fenceObject->isSet();
6971}
6972
6973void Context::readnPixels(GLint x,
6974 GLint y,
6975 GLsizei width,
6976 GLsizei height,
6977 GLenum format,
6978 GLenum type,
6979 GLsizei bufSize,
6980 void *data)
6981{
6982 return readPixels(x, y, width, height, format, type, data);
6983}
6984
Jamie Madill007530e2017-12-28 14:27:04 -05006985void Context::setFenceNV(GLuint fence, GLenum condition)
6986{
6987 ASSERT(condition == GL_ALL_COMPLETED_NV);
6988
6989 FenceNV *fenceObject = getFenceNV(fence);
6990 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04006991 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05006992}
6993
6994GLboolean Context::testFenceNV(GLuint fence)
6995{
6996 FenceNV *fenceObject = getFenceNV(fence);
6997
6998 ASSERT(fenceObject != nullptr);
6999 ASSERT(fenceObject->isSet() == GL_TRUE);
7000
7001 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04007002 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05007003 if (error.isError())
7004 {
7005 handleError(error);
7006 return GL_TRUE;
7007 }
7008
7009 return result;
7010}
7011
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007012void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007013{
7014 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007015 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05007016 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007017}
7018
Jamie Madillfa920eb2018-01-04 11:45:50 -05007019void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007020{
7021 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007022 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05007023 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
7024}
7025
Jamie Madillfa920eb2018-01-04 11:45:50 -05007026void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7027{
7028 UNIMPLEMENTED();
7029}
7030
Jamie Madill5b772312018-03-08 20:28:32 -05007031bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7032{
7033 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7034 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7035 // to the fact that it is stored internally as a float, and so would require conversion
7036 // if returned from Context::getIntegerv. Since this conversion is already implemented
7037 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7038 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7039 // application.
7040 switch (pname)
7041 {
7042 case GL_COMPRESSED_TEXTURE_FORMATS:
7043 {
7044 *type = GL_INT;
7045 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7046 return true;
7047 }
7048 case GL_SHADER_BINARY_FORMATS:
7049 {
7050 *type = GL_INT;
7051 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7052 return true;
7053 }
7054
7055 case GL_MAX_VERTEX_ATTRIBS:
7056 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7057 case GL_MAX_VARYING_VECTORS:
7058 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7059 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7060 case GL_MAX_TEXTURE_IMAGE_UNITS:
7061 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7062 case GL_MAX_RENDERBUFFER_SIZE:
7063 case GL_NUM_SHADER_BINARY_FORMATS:
7064 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7065 case GL_ARRAY_BUFFER_BINDING:
7066 case GL_FRAMEBUFFER_BINDING:
7067 case GL_RENDERBUFFER_BINDING:
7068 case GL_CURRENT_PROGRAM:
7069 case GL_PACK_ALIGNMENT:
7070 case GL_UNPACK_ALIGNMENT:
7071 case GL_GENERATE_MIPMAP_HINT:
7072 case GL_RED_BITS:
7073 case GL_GREEN_BITS:
7074 case GL_BLUE_BITS:
7075 case GL_ALPHA_BITS:
7076 case GL_DEPTH_BITS:
7077 case GL_STENCIL_BITS:
7078 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7079 case GL_CULL_FACE_MODE:
7080 case GL_FRONT_FACE:
7081 case GL_ACTIVE_TEXTURE:
7082 case GL_STENCIL_FUNC:
7083 case GL_STENCIL_VALUE_MASK:
7084 case GL_STENCIL_REF:
7085 case GL_STENCIL_FAIL:
7086 case GL_STENCIL_PASS_DEPTH_FAIL:
7087 case GL_STENCIL_PASS_DEPTH_PASS:
7088 case GL_STENCIL_BACK_FUNC:
7089 case GL_STENCIL_BACK_VALUE_MASK:
7090 case GL_STENCIL_BACK_REF:
7091 case GL_STENCIL_BACK_FAIL:
7092 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7093 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7094 case GL_DEPTH_FUNC:
7095 case GL_BLEND_SRC_RGB:
7096 case GL_BLEND_SRC_ALPHA:
7097 case GL_BLEND_DST_RGB:
7098 case GL_BLEND_DST_ALPHA:
7099 case GL_BLEND_EQUATION_RGB:
7100 case GL_BLEND_EQUATION_ALPHA:
7101 case GL_STENCIL_WRITEMASK:
7102 case GL_STENCIL_BACK_WRITEMASK:
7103 case GL_STENCIL_CLEAR_VALUE:
7104 case GL_SUBPIXEL_BITS:
7105 case GL_MAX_TEXTURE_SIZE:
7106 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7107 case GL_SAMPLE_BUFFERS:
7108 case GL_SAMPLES:
7109 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7110 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7111 case GL_TEXTURE_BINDING_2D:
7112 case GL_TEXTURE_BINDING_CUBE_MAP:
7113 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7114 {
7115 *type = GL_INT;
7116 *numParams = 1;
7117 return true;
7118 }
7119 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7120 {
7121 if (!getExtensions().packReverseRowOrder)
7122 {
7123 return false;
7124 }
7125 *type = GL_INT;
7126 *numParams = 1;
7127 return true;
7128 }
7129 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7130 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7131 {
7132 if (!getExtensions().textureRectangle)
7133 {
7134 return false;
7135 }
7136 *type = GL_INT;
7137 *numParams = 1;
7138 return true;
7139 }
7140 case GL_MAX_DRAW_BUFFERS_EXT:
7141 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7142 {
7143 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7144 {
7145 return false;
7146 }
7147 *type = GL_INT;
7148 *numParams = 1;
7149 return true;
7150 }
7151 case GL_MAX_VIEWPORT_DIMS:
7152 {
7153 *type = GL_INT;
7154 *numParams = 2;
7155 return true;
7156 }
7157 case GL_VIEWPORT:
7158 case GL_SCISSOR_BOX:
7159 {
7160 *type = GL_INT;
7161 *numParams = 4;
7162 return true;
7163 }
7164 case GL_SHADER_COMPILER:
7165 case GL_SAMPLE_COVERAGE_INVERT:
7166 case GL_DEPTH_WRITEMASK:
7167 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7168 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7169 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7170 // bool-natural
7171 case GL_SAMPLE_COVERAGE:
7172 case GL_SCISSOR_TEST:
7173 case GL_STENCIL_TEST:
7174 case GL_DEPTH_TEST:
7175 case GL_BLEND:
7176 case GL_DITHER:
7177 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7178 {
7179 *type = GL_BOOL;
7180 *numParams = 1;
7181 return true;
7182 }
7183 case GL_COLOR_WRITEMASK:
7184 {
7185 *type = GL_BOOL;
7186 *numParams = 4;
7187 return true;
7188 }
7189 case GL_POLYGON_OFFSET_FACTOR:
7190 case GL_POLYGON_OFFSET_UNITS:
7191 case GL_SAMPLE_COVERAGE_VALUE:
7192 case GL_DEPTH_CLEAR_VALUE:
7193 case GL_LINE_WIDTH:
7194 {
7195 *type = GL_FLOAT;
7196 *numParams = 1;
7197 return true;
7198 }
7199 case GL_ALIASED_LINE_WIDTH_RANGE:
7200 case GL_ALIASED_POINT_SIZE_RANGE:
7201 case GL_DEPTH_RANGE:
7202 {
7203 *type = GL_FLOAT;
7204 *numParams = 2;
7205 return true;
7206 }
7207 case GL_COLOR_CLEAR_VALUE:
7208 case GL_BLEND_COLOR:
7209 {
7210 *type = GL_FLOAT;
7211 *numParams = 4;
7212 return true;
7213 }
7214 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7215 if (!getExtensions().textureFilterAnisotropic)
7216 {
7217 return false;
7218 }
7219 *type = GL_FLOAT;
7220 *numParams = 1;
7221 return true;
7222 case GL_TIMESTAMP_EXT:
7223 if (!getExtensions().disjointTimerQuery)
7224 {
7225 return false;
7226 }
7227 *type = GL_INT_64_ANGLEX;
7228 *numParams = 1;
7229 return true;
7230 case GL_GPU_DISJOINT_EXT:
7231 if (!getExtensions().disjointTimerQuery)
7232 {
7233 return false;
7234 }
7235 *type = GL_INT;
7236 *numParams = 1;
7237 return true;
7238 case GL_COVERAGE_MODULATION_CHROMIUM:
7239 if (!getExtensions().framebufferMixedSamples)
7240 {
7241 return false;
7242 }
7243 *type = GL_INT;
7244 *numParams = 1;
7245 return true;
7246 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7247 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7248 {
7249 return false;
7250 }
7251 *type = GL_INT;
7252 *numParams = 1;
7253 return true;
7254 }
7255
7256 if (getExtensions().debug)
7257 {
7258 switch (pname)
7259 {
7260 case GL_DEBUG_LOGGED_MESSAGES:
7261 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7262 case GL_DEBUG_GROUP_STACK_DEPTH:
7263 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7264 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7265 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7266 case GL_MAX_LABEL_LENGTH:
7267 *type = GL_INT;
7268 *numParams = 1;
7269 return true;
7270
7271 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7272 case GL_DEBUG_OUTPUT:
7273 *type = GL_BOOL;
7274 *numParams = 1;
7275 return true;
7276 }
7277 }
7278
7279 if (getExtensions().multisampleCompatibility)
7280 {
7281 switch (pname)
7282 {
7283 case GL_MULTISAMPLE_EXT:
7284 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7285 *type = GL_BOOL;
7286 *numParams = 1;
7287 return true;
7288 }
7289 }
7290
7291 if (getExtensions().pathRendering)
7292 {
7293 switch (pname)
7294 {
7295 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7296 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7297 *type = GL_FLOAT;
7298 *numParams = 16;
7299 return true;
7300 }
7301 }
7302
7303 if (getExtensions().bindGeneratesResource)
7304 {
7305 switch (pname)
7306 {
7307 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7308 *type = GL_BOOL;
7309 *numParams = 1;
7310 return true;
7311 }
7312 }
7313
7314 if (getExtensions().clientArrays)
7315 {
7316 switch (pname)
7317 {
7318 case GL_CLIENT_ARRAYS_ANGLE:
7319 *type = GL_BOOL;
7320 *numParams = 1;
7321 return true;
7322 }
7323 }
7324
7325 if (getExtensions().sRGBWriteControl)
7326 {
7327 switch (pname)
7328 {
7329 case GL_FRAMEBUFFER_SRGB_EXT:
7330 *type = GL_BOOL;
7331 *numParams = 1;
7332 return true;
7333 }
7334 }
7335
7336 if (getExtensions().robustResourceInitialization &&
7337 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7338 {
7339 *type = GL_BOOL;
7340 *numParams = 1;
7341 return true;
7342 }
7343
7344 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7345 {
7346 *type = GL_BOOL;
7347 *numParams = 1;
7348 return true;
7349 }
7350
jchen1082af6202018-06-22 10:59:52 +08007351 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7352 {
7353 *type = GL_INT;
7354 *numParams = 1;
7355 return true;
7356 }
7357
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007358 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7359 {
7360 *type = GL_INT;
7361 *numParams = 1;
7362 return true;
7363 }
7364
Jamie Madill5b772312018-03-08 20:28:32 -05007365 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7366 switch (pname)
7367 {
7368 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7369 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7370 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7371 {
7372 return false;
7373 }
7374 *type = GL_INT;
7375 *numParams = 1;
7376 return true;
7377
7378 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7379 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7380 {
7381 return false;
7382 }
7383 *type = GL_INT;
7384 *numParams = 1;
7385 return true;
7386
7387 case GL_PROGRAM_BINARY_FORMATS_OES:
7388 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7389 {
7390 return false;
7391 }
7392 *type = GL_INT;
7393 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7394 return true;
7395
7396 case GL_PACK_ROW_LENGTH:
7397 case GL_PACK_SKIP_ROWS:
7398 case GL_PACK_SKIP_PIXELS:
7399 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7400 {
7401 return false;
7402 }
7403 *type = GL_INT;
7404 *numParams = 1;
7405 return true;
7406 case GL_UNPACK_ROW_LENGTH:
7407 case GL_UNPACK_SKIP_ROWS:
7408 case GL_UNPACK_SKIP_PIXELS:
7409 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7410 {
7411 return false;
7412 }
7413 *type = GL_INT;
7414 *numParams = 1;
7415 return true;
7416 case GL_VERTEX_ARRAY_BINDING:
7417 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7418 {
7419 return false;
7420 }
7421 *type = GL_INT;
7422 *numParams = 1;
7423 return true;
7424 case GL_PIXEL_PACK_BUFFER_BINDING:
7425 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7426 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7427 {
7428 return false;
7429 }
7430 *type = GL_INT;
7431 *numParams = 1;
7432 return true;
7433 case GL_MAX_SAMPLES:
7434 {
7435 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7436 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7437 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7438 {
7439 return false;
7440 }
7441 *type = GL_INT;
7442 *numParams = 1;
7443 return true;
7444
7445 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7446 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7447 {
7448 return false;
7449 }
7450 *type = GL_INT;
7451 *numParams = 1;
7452 return true;
7453 }
7454 }
7455
7456 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7457 {
7458 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7459 {
7460 return false;
7461 }
7462 *type = GL_INT;
7463 *numParams = 1;
7464 return true;
7465 }
7466
7467 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7468 {
7469 *type = GL_INT;
7470 *numParams = 1;
7471 return true;
7472 }
7473
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007474 if (getClientVersion() < Version(2, 0))
7475 {
7476 switch (pname)
7477 {
7478 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007479 case GL_CLIENT_ACTIVE_TEXTURE:
7480 case GL_MATRIX_MODE:
7481 case GL_MAX_TEXTURE_UNITS:
7482 case GL_MAX_MODELVIEW_STACK_DEPTH:
7483 case GL_MAX_PROJECTION_STACK_DEPTH:
7484 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007485 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007486 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007487 case GL_VERTEX_ARRAY_STRIDE:
7488 case GL_NORMAL_ARRAY_STRIDE:
7489 case GL_COLOR_ARRAY_STRIDE:
7490 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7491 case GL_VERTEX_ARRAY_SIZE:
7492 case GL_COLOR_ARRAY_SIZE:
7493 case GL_TEXTURE_COORD_ARRAY_SIZE:
7494 case GL_VERTEX_ARRAY_TYPE:
7495 case GL_NORMAL_ARRAY_TYPE:
7496 case GL_COLOR_ARRAY_TYPE:
7497 case GL_TEXTURE_COORD_ARRAY_TYPE:
7498 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7499 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7500 case GL_COLOR_ARRAY_BUFFER_BINDING:
7501 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7502 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7503 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7504 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007505 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007506 case GL_MODELVIEW_STACK_DEPTH:
7507 case GL_PROJECTION_STACK_DEPTH:
7508 case GL_TEXTURE_STACK_DEPTH:
7509 case GL_LOGIC_OP_MODE:
7510 case GL_BLEND_SRC:
7511 case GL_BLEND_DST:
7512 case GL_PERSPECTIVE_CORRECTION_HINT:
7513 case GL_POINT_SMOOTH_HINT:
7514 case GL_LINE_SMOOTH_HINT:
7515 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007516 *type = GL_INT;
7517 *numParams = 1;
7518 return true;
7519 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007520 case GL_FOG_DENSITY:
7521 case GL_FOG_START:
7522 case GL_FOG_END:
7523 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007524 case GL_POINT_SIZE:
7525 case GL_POINT_SIZE_MIN:
7526 case GL_POINT_SIZE_MAX:
7527 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007528 *type = GL_FLOAT;
7529 *numParams = 1;
7530 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007531 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007532 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007533 *type = GL_FLOAT;
7534 *numParams = 2;
7535 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007536 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007537 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007538 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007539 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007540 *type = GL_FLOAT;
7541 *numParams = 4;
7542 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007543 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007544 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007545 *type = GL_FLOAT;
7546 *numParams = 3;
7547 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007548 case GL_MODELVIEW_MATRIX:
7549 case GL_PROJECTION_MATRIX:
7550 case GL_TEXTURE_MATRIX:
7551 *type = GL_FLOAT;
7552 *numParams = 16;
7553 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007554 case GL_LIGHT_MODEL_TWO_SIDE:
7555 *type = GL_BOOL;
7556 *numParams = 1;
7557 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007558 }
7559 }
7560
Jamie Madill5b772312018-03-08 20:28:32 -05007561 if (getClientVersion() < Version(3, 0))
7562 {
7563 return false;
7564 }
7565
7566 // Check for ES3.0+ parameter names
7567 switch (pname)
7568 {
7569 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7570 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7571 case GL_UNIFORM_BUFFER_BINDING:
7572 case GL_TRANSFORM_FEEDBACK_BINDING:
7573 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7574 case GL_COPY_READ_BUFFER_BINDING:
7575 case GL_COPY_WRITE_BUFFER_BINDING:
7576 case GL_SAMPLER_BINDING:
7577 case GL_READ_BUFFER:
7578 case GL_TEXTURE_BINDING_3D:
7579 case GL_TEXTURE_BINDING_2D_ARRAY:
7580 case GL_MAX_3D_TEXTURE_SIZE:
7581 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7582 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7583 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7584 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7585 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7586 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7587 case GL_MAX_VARYING_COMPONENTS:
7588 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7589 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7590 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7591 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7592 case GL_NUM_EXTENSIONS:
7593 case GL_MAJOR_VERSION:
7594 case GL_MINOR_VERSION:
7595 case GL_MAX_ELEMENTS_INDICES:
7596 case GL_MAX_ELEMENTS_VERTICES:
7597 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7598 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7599 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7600 case GL_UNPACK_IMAGE_HEIGHT:
7601 case GL_UNPACK_SKIP_IMAGES:
7602 {
7603 *type = GL_INT;
7604 *numParams = 1;
7605 return true;
7606 }
7607
7608 case GL_MAX_ELEMENT_INDEX:
7609 case GL_MAX_UNIFORM_BLOCK_SIZE:
7610 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7611 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7612 case GL_MAX_SERVER_WAIT_TIMEOUT:
7613 {
7614 *type = GL_INT_64_ANGLEX;
7615 *numParams = 1;
7616 return true;
7617 }
7618
7619 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7620 case GL_TRANSFORM_FEEDBACK_PAUSED:
7621 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7622 case GL_RASTERIZER_DISCARD:
7623 {
7624 *type = GL_BOOL;
7625 *numParams = 1;
7626 return true;
7627 }
7628
7629 case GL_MAX_TEXTURE_LOD_BIAS:
7630 {
7631 *type = GL_FLOAT;
7632 *numParams = 1;
7633 return true;
7634 }
7635 }
7636
7637 if (getExtensions().requestExtension)
7638 {
7639 switch (pname)
7640 {
7641 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7642 *type = GL_INT;
7643 *numParams = 1;
7644 return true;
7645 }
7646 }
7647
7648 if (getClientVersion() < Version(3, 1))
7649 {
7650 return false;
7651 }
7652
7653 switch (pname)
7654 {
7655 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7656 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7657 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7658 case GL_MAX_FRAMEBUFFER_WIDTH:
7659 case GL_MAX_FRAMEBUFFER_HEIGHT:
7660 case GL_MAX_FRAMEBUFFER_SAMPLES:
7661 case GL_MAX_SAMPLE_MASK_WORDS:
7662 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7663 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7664 case GL_MAX_INTEGER_SAMPLES:
7665 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7666 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7667 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7668 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7669 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7670 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7671 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7672 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7673 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7674 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7675 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7676 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7677 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7678 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7679 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7680 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7681 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7682 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7683 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7684 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7685 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7686 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7687 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7688 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7689 case GL_MAX_UNIFORM_LOCATIONS:
7690 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7691 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7692 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7693 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7694 case GL_MAX_IMAGE_UNITS:
7695 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7696 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7697 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7698 case GL_SHADER_STORAGE_BUFFER_BINDING:
7699 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7700 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007701 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007702 *type = GL_INT;
7703 *numParams = 1;
7704 return true;
7705 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7706 *type = GL_INT_64_ANGLEX;
7707 *numParams = 1;
7708 return true;
7709 case GL_SAMPLE_MASK:
7710 *type = GL_BOOL;
7711 *numParams = 1;
7712 return true;
7713 }
7714
7715 if (getExtensions().geometryShader)
7716 {
7717 switch (pname)
7718 {
7719 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7720 case GL_LAYER_PROVOKING_VERTEX_EXT:
7721 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7722 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7723 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7724 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7725 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7726 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7727 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7728 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7729 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7730 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7731 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7732 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7733 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7734 *type = GL_INT;
7735 *numParams = 1;
7736 return true;
7737 }
7738 }
7739
7740 return false;
7741}
7742
7743bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7744{
7745 if (getClientVersion() < Version(3, 0))
7746 {
7747 return false;
7748 }
7749
7750 switch (target)
7751 {
7752 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7753 case GL_UNIFORM_BUFFER_BINDING:
7754 {
7755 *type = GL_INT;
7756 *numParams = 1;
7757 return true;
7758 }
7759 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7760 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7761 case GL_UNIFORM_BUFFER_START:
7762 case GL_UNIFORM_BUFFER_SIZE:
7763 {
7764 *type = GL_INT_64_ANGLEX;
7765 *numParams = 1;
7766 return true;
7767 }
7768 }
7769
7770 if (getClientVersion() < Version(3, 1))
7771 {
7772 return false;
7773 }
7774
7775 switch (target)
7776 {
7777 case GL_IMAGE_BINDING_LAYERED:
7778 {
7779 *type = GL_BOOL;
7780 *numParams = 1;
7781 return true;
7782 }
7783 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7784 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7785 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7786 case GL_SHADER_STORAGE_BUFFER_BINDING:
7787 case GL_VERTEX_BINDING_BUFFER:
7788 case GL_VERTEX_BINDING_DIVISOR:
7789 case GL_VERTEX_BINDING_OFFSET:
7790 case GL_VERTEX_BINDING_STRIDE:
7791 case GL_SAMPLE_MASK_VALUE:
7792 case GL_IMAGE_BINDING_NAME:
7793 case GL_IMAGE_BINDING_LEVEL:
7794 case GL_IMAGE_BINDING_LAYER:
7795 case GL_IMAGE_BINDING_ACCESS:
7796 case GL_IMAGE_BINDING_FORMAT:
7797 {
7798 *type = GL_INT;
7799 *numParams = 1;
7800 return true;
7801 }
7802 case GL_ATOMIC_COUNTER_BUFFER_START:
7803 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7804 case GL_SHADER_STORAGE_BUFFER_START:
7805 case GL_SHADER_STORAGE_BUFFER_SIZE:
7806 {
7807 *type = GL_INT_64_ANGLEX;
7808 *numParams = 1;
7809 return true;
7810 }
7811 }
7812
7813 return false;
7814}
7815
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007816Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05007817{
7818 return mState.mShaderPrograms->getProgram(handle);
7819}
7820
7821Shader *Context::getShader(GLuint handle) const
7822{
7823 return mState.mShaderPrograms->getShader(handle);
7824}
7825
Jamie Madill5b772312018-03-08 20:28:32 -05007826bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7827{
7828 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7829}
7830
7831bool Context::isFramebufferGenerated(GLuint framebuffer) const
7832{
7833 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7834}
7835
7836bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7837{
7838 return mState.mPipelines->isHandleGenerated(pipeline);
7839}
7840
7841bool Context::usingDisplayTextureShareGroup() const
7842{
7843 return mDisplayTextureShareGroup;
7844}
7845
7846GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7847{
7848 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7849 internalformat == GL_DEPTH_STENCIL
7850 ? GL_DEPTH24_STENCIL8
7851 : internalformat;
7852}
7853
jchen1082af6202018-06-22 10:59:52 +08007854void Context::maxShaderCompilerThreads(GLuint count)
7855{
jchen107ae70d82018-07-06 13:47:01 +08007856 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08007857 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08007858 // A count of zero specifies a request for no parallel compiling or linking.
7859 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
7860 {
7861 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
7862 }
7863 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08007864}
7865
Jamie Madill2eb65032018-07-30 10:25:57 -04007866bool Context::isGLES1() const
7867{
7868 return mState.getClientVersion() < Version(2, 0);
7869}
7870
Jamie Madilla11819d2018-07-30 10:26:01 -04007871void Context::onSubjectStateChange(const Context *context,
7872 angle::SubjectIndex index,
7873 angle::SubjectMessage message)
7874{
Jamie Madilla11819d2018-07-30 10:26:01 -04007875 switch (index)
7876 {
7877 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007878 switch (message)
7879 {
7880 case angle::SubjectMessage::CONTENTS_CHANGED:
7881 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
7882 mStateCache.onVertexArrayBufferContentsChange(this);
7883 break;
7884 case angle::SubjectMessage::RESOURCE_MAPPED:
7885 case angle::SubjectMessage::RESOURCE_UNMAPPED:
7886 case angle::SubjectMessage::BINDING_CHANGED:
7887 mStateCache.onVertexArrayBufferStateChange(this);
7888 break;
7889 default:
7890 break;
7891 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007892 break;
7893
7894 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007895 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7896 {
7897 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
7898 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007899 break;
7900
7901 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007902 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7903 {
7904 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
7905 }
7906 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04007907 break;
7908
7909 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04007910 if (index < kTextureMaxSubjectIndex)
7911 {
7912 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04007913 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007914 }
Jamie Madille25b8002018-09-20 13:39:49 -04007915 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04007916 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04007917 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04007918 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007919 }
Jamie Madille25b8002018-09-20 13:39:49 -04007920 else
7921 {
7922 ASSERT(index < kSamplerMaxSubjectIndex);
7923 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
7924 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007925 break;
7926 }
7927}
7928
Jamie Madill6b873dd2018-07-12 23:56:30 -04007929// ErrorSet implementation.
7930ErrorSet::ErrorSet(Context *context) : mContext(context)
7931{
7932}
7933
7934ErrorSet::~ErrorSet() = default;
7935
Jamie Madill306b6c12018-07-27 08:12:49 -04007936void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04007937{
7938 // This internal enum is used to filter internal errors that are already handled.
7939 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
7940 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
7941 {
7942 return;
7943 }
7944
7945 if (ANGLE_UNLIKELY(error.isError()))
7946 {
7947 GLenum code = error.getCode();
7948 mErrors.insert(code);
Jamie Madill785e8a02018-10-04 17:42:00 -04007949
Jamie Madill6b873dd2018-07-12 23:56:30 -04007950 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
7951 {
7952 mContext->markContextLost();
7953 }
7954
7955 ASSERT(!error.getMessage().empty());
7956 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
7957 error.getID(), GL_DEBUG_SEVERITY_HIGH,
7958 error.getMessage());
7959 }
7960}
7961
Jamie Madillabfbc0f2018-10-09 12:48:52 -04007962void ErrorSet::handleError(GLenum errorCode,
7963 const char *message,
7964 const char *file,
7965 const char *function,
7966 unsigned int line)
7967{
7968 // TODO(jmadill): Handle error directly instead of creating object. http://anglebug.com/2491
7969 std::stringstream errorStream;
7970 errorStream << "Front-end Error: " << gl::FmtHex(errorCode) << ", in " << file << ", "
7971 << function << ":" << line << ". " << message;
7972
7973 handleError(gl::Error(errorCode, errorCode, errorStream.str()));
7974}
7975
Jamie Madilla139f012018-10-10 16:13:03 -04007976void ErrorSet::validationError(GLenum errorCode, const char *message)
7977{
7978 handleError(gl::Error(errorCode, message));
7979}
7980
Jamie Madill6b873dd2018-07-12 23:56:30 -04007981bool ErrorSet::empty() const
7982{
7983 return mErrors.empty();
7984}
7985
7986GLenum ErrorSet::popError()
7987{
7988 ASSERT(!empty());
7989 GLenum error = *mErrors.begin();
7990 mErrors.erase(mErrors.begin());
7991 return error;
7992}
Jamie Madilldc358af2018-07-31 11:22:13 -04007993
7994// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04007995StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007996 : mCachedHasAnyEnabledClientAttrib(false),
7997 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04007998 mCachedInstancedVertexElementLimit(0),
7999 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madilldc358af2018-07-31 11:22:13 -04008000{
8001}
8002
8003StateCache::~StateCache() = default;
8004
Jamie Madillac66f982018-10-09 18:30:01 -04008005void StateCache::initialize(Context *context)
8006{
8007 updateValidDrawModes(context);
8008 updateValidBindTextureTypes(context);
8009}
8010
Jamie Madilldc358af2018-07-31 11:22:13 -04008011void StateCache::updateActiveAttribsMask(Context *context)
8012{
8013 bool isGLES1 = context->isGLES1();
8014 const State &glState = context->getGLState();
8015
8016 if (!isGLES1 && !glState.getProgram())
8017 {
8018 mCachedActiveBufferedAttribsMask = AttributesMask();
8019 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008020 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008021 return;
8022 }
8023
8024 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8025 : glState.getProgram()->getActiveAttribLocationsMask();
8026
8027 const VertexArray *vao = glState.getVertexArray();
8028 ASSERT(vao);
8029
8030 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8031 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008032 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008033
Jamie Madill0a17e482018-08-31 17:19:11 -04008034 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8035 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008036 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008037 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8038}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008039
8040void StateCache::updateVertexElementLimits(Context *context)
8041{
8042 const VertexArray *vao = context->getGLState().getVertexArray();
8043
8044 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8045 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8046
8047 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8048 // If there are no buffered attributes then we should not limit the draw call count.
8049 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8050 {
8051 return;
8052 }
8053
8054 const auto &vertexAttribs = vao->getVertexAttributes();
8055 const auto &vertexBindings = vao->getVertexBindings();
8056
8057 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8058 {
8059 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8060 ASSERT(attrib.enabled);
8061
8062 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8063 ASSERT(context->isGLES1() ||
8064 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8065
8066 GLint64 limit = attrib.getCachedElementLimit();
8067 if (binding.getDivisor() > 0)
8068 {
8069 mCachedInstancedVertexElementLimit =
8070 std::min(mCachedInstancedVertexElementLimit, limit);
8071 }
8072 else
8073 {
8074 mCachedNonInstancedVertexElementLimit =
8075 std::min(mCachedNonInstancedVertexElementLimit, limit);
8076 }
8077 }
8078}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008079
Jamie Madilld84b6732018-09-06 15:54:35 -04008080void StateCache::updateBasicDrawStatesError()
8081{
8082 mCachedBasicDrawStatesError = kInvalidPointer;
8083}
8084
8085intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8086{
8087 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8088 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8089 return mCachedBasicDrawStatesError;
8090}
8091
Jamie Madillc43cdad2018-08-08 15:49:25 -04008092void StateCache::onVertexArrayBindingChange(Context *context)
8093{
8094 updateActiveAttribsMask(context);
8095 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008096 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008097}
8098
8099void StateCache::onProgramExecutableChange(Context *context)
8100{
8101 updateActiveAttribsMask(context);
8102 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008103 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008104 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008105}
8106
Jamie Madilld84b6732018-09-06 15:54:35 -04008107void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008108{
8109 updateVertexElementLimits(context);
8110}
8111
Jamie Madilld84b6732018-09-06 15:54:35 -04008112void StateCache::onVertexArrayBufferContentsChange(Context *context)
8113{
8114 updateVertexElementLimits(context);
8115 updateBasicDrawStatesError();
8116}
8117
Jamie Madillc43cdad2018-08-08 15:49:25 -04008118void StateCache::onVertexArrayStateChange(Context *context)
8119{
8120 updateActiveAttribsMask(context);
8121 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008122 updateBasicDrawStatesError();
8123}
8124
8125void StateCache::onVertexArrayBufferStateChange(Context *context)
8126{
8127 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008128}
8129
8130void StateCache::onGLES1ClientStateChange(Context *context)
8131{
8132 updateActiveAttribsMask(context);
8133}
Jamie Madilld84b6732018-09-06 15:54:35 -04008134
8135void StateCache::onDrawFramebufferChange(Context *context)
8136{
8137 updateBasicDrawStatesError();
8138}
8139
8140void StateCache::onContextCapChange(Context *context)
8141{
8142 updateBasicDrawStatesError();
8143}
8144
8145void StateCache::onStencilStateChange(Context *context)
8146{
8147 updateBasicDrawStatesError();
8148}
8149
8150void StateCache::onDefaultVertexAttributeChange(Context *context)
8151{
8152 updateBasicDrawStatesError();
8153}
8154
8155void StateCache::onActiveTextureChange(Context *context)
8156{
8157 updateBasicDrawStatesError();
8158}
8159
8160void StateCache::onQueryChange(Context *context)
8161{
8162 updateBasicDrawStatesError();
8163}
8164
8165void StateCache::onTransformFeedbackChange(Context *context)
8166{
8167 updateBasicDrawStatesError();
8168}
8169
8170void StateCache::onUniformBufferStateChange(Context *context)
8171{
8172 updateBasicDrawStatesError();
8173}
8174
8175void StateCache::onBufferBindingChange(Context *context)
8176{
8177 updateBasicDrawStatesError();
8178}
Jamie Madill526a6f62018-09-12 11:03:05 -04008179
8180void StateCache::updateValidDrawModes(Context *context)
8181{
8182 Program *program = context->getGLState().getProgram();
8183 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8184 {
8185 mCachedValidDrawModes = {{
8186 true, /* Points */
8187 true, /* Lines */
8188 true, /* LineLoop */
8189 true, /* LineStrip */
8190 true, /* Triangles */
8191 true, /* TriangleStrip */
8192 true, /* TriangleFan */
8193 false, /* LinesAdjacency */
8194 false, /* LineStripAdjacency */
8195 false, /* TrianglesAdjacency */
8196 false, /* TriangleStripAdjacency */
8197 false, /* InvalidEnum */
8198 }};
8199 }
8200 else
8201 {
8202 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8203
8204 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8205
8206 mCachedValidDrawModes = {{
8207 gsMode == PrimitiveMode::Points, /* Points */
8208 gsMode == PrimitiveMode::Lines, /* Lines */
8209 gsMode == PrimitiveMode::Lines, /* LineLoop */
8210 gsMode == PrimitiveMode::Lines, /* LineStrip */
8211 gsMode == PrimitiveMode::Triangles, /* Triangles */
8212 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8213 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8214 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8215 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8216 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8217 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8218 false, /* InvalidEnum */
8219 }};
8220 }
8221}
Jamie Madillac66f982018-10-09 18:30:01 -04008222
8223void StateCache::updateValidBindTextureTypes(Context *context)
8224{
8225 const Extensions &exts = context->getExtensions();
8226 bool isGLES3 = context->getClientMajorVersion() >= 3;
8227 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8228
8229 mCachedValidBindTextureTypes = {{
8230 true, /* _2D */
8231 isGLES3, /* _2DArray */
8232 isGLES31, /* _2DMultisample */
8233 exts.textureStorageMultisample2DArray, /* _2DMultisampleArray */
8234 isGLES3, /* _3D */
8235 exts.eglImageExternal || exts.eglStreamConsumerExternal, /* External */
8236 exts.textureRectangle, /* Rectangle */
8237 true, /* CubeMap */
8238 false, /* InvalidEnum */
8239
8240 }};
8241}
Jamie Madillc29968b2016-01-20 11:17:23 -05008242} // namespace gl