blob: 3b6b22a5f5a3faf49fe412d323f4e3221ff4a44a [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 Lang79b91402018-10-04 15:11:30 -04003246 supportedExtensions.memorySize = true;
3247
Geoff Langb0f917f2017-12-05 13:41:54 -05003248 return supportedExtensions;
3249}
3250
Geoff Lang33f11fb2018-05-07 13:42:47 -04003251void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003252{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003253 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003254
Geoff Lang33f11fb2018-05-07 13:42:47 -04003255 mSupportedExtensions = generateSupportedExtensions();
3256 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003257
3258 mLimitations = mImplementation->getNativeLimitations();
3259
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003260 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3261 if (getClientVersion() < Version(2, 0))
3262 {
3263 mCaps.maxMultitextureUnits = 4;
3264 mCaps.maxClipPlanes = 6;
3265 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003266 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3267 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3268 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003269 mCaps.minSmoothPointSize = 1.0f;
3270 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003271 mCaps.minSmoothLineWidth = 1.0f;
3272 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003273 }
3274
Luc Ferronad2ae932018-06-11 15:31:17 -04003275 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003276 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003277
Luc Ferronad2ae932018-06-11 15:31:17 -04003278 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3279
Jamie Madill0f80ed82017-09-19 00:24:56 -04003280 if (getClientVersion() < ES_3_1)
3281 {
3282 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3283 }
3284 else
3285 {
3286 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3287 }
Geoff Lang301d1612014-07-09 10:34:37 -04003288
Jiawei Shao54aafe52018-04-27 14:54:57 +08003289 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3290 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003291 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3292
Jamie Madill0f80ed82017-09-19 00:24:56 -04003293 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3294 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3295
3296 // Limit textures as well, so we can use fast bitsets with texture bindings.
3297 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003298 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3299 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3300 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3301 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003302
Jiawei Shaodb342272017-09-27 10:21:45 +08003303 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3304
Geoff Langc287ea62016-09-16 14:46:51 -04003305 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003306 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003307 for (const auto &extensionInfo : GetExtensionInfoMap())
3308 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003309 // If the user has requested that extensions start disabled and they are requestable,
3310 // disable them.
3311 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003312 {
3313 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3314 }
3315 }
3316
3317 // Generate texture caps
3318 updateCaps();
3319}
3320
3321void Context::updateCaps()
3322{
Geoff Lang900013c2014-07-07 11:32:19 -04003323 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003324 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003325
Jamie Madill7b62cf92017-11-02 15:20:49 -04003326 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003327 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003328 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003329 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003330
Geoff Lang0d8b7242015-09-09 14:56:53 -04003331 // Update the format caps based on the client version and extensions.
3332 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3333 // ES3.
3334 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003335 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003336 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003337 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003338 formatCaps.textureAttachment =
3339 formatCaps.textureAttachment &&
3340 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3341 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3342 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003343
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003344 // OpenGL ES does not support multisampling with non-rendererable formats
3345 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003346 if (!formatCaps.renderbuffer ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003347 (getClientVersion() < ES_3_1 &&
3348 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003349 {
Geoff Langd87878e2014-09-19 15:42:59 -04003350 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003351 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003352 else
3353 {
3354 // We may have limited the max samples for some required renderbuffer formats due to
3355 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3356 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3357
3358 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3359 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3360 // exception of signed and unsigned integer formats."
3361 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3362 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3363 {
3364 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3365 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3366 }
3367
3368 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3369 if (getClientVersion() >= ES_3_1)
3370 {
3371 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3372 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3373 // the exception that the signed and unsigned integer formats are required only to
3374 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3375 // multisamples, which must be at least one."
3376 if (formatInfo.componentType == GL_INT ||
3377 formatInfo.componentType == GL_UNSIGNED_INT)
3378 {
3379 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3380 }
3381
3382 // GLES 3.1 section 19.3.1.
3383 if (formatCaps.texturable)
3384 {
3385 if (formatInfo.depthBits > 0)
3386 {
3387 mCaps.maxDepthTextureSamples =
3388 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3389 }
3390 else if (formatInfo.redBits > 0)
3391 {
3392 mCaps.maxColorTextureSamples =
3393 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3394 }
3395 }
3396 }
3397 }
Geoff Langd87878e2014-09-19 15:42:59 -04003398
3399 if (formatCaps.texturable && formatInfo.compressed)
3400 {
Geoff Langca271392017-04-05 12:30:00 -04003401 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003402 }
3403
Geoff Langca271392017-04-05 12:30:00 -04003404 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003405 }
Jamie Madill32447362017-06-28 14:53:52 -04003406
3407 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003408 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003409 {
3410 mMemoryProgramCache = nullptr;
3411 }
Corentin Walleze4477002017-12-01 14:39:58 -05003412
3413 // Compute which buffer types are allowed
3414 mValidBufferBindings.reset();
3415 mValidBufferBindings.set(BufferBinding::ElementArray);
3416 mValidBufferBindings.set(BufferBinding::Array);
3417
3418 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3419 {
3420 mValidBufferBindings.set(BufferBinding::PixelPack);
3421 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3422 }
3423
3424 if (getClientVersion() >= ES_3_0)
3425 {
3426 mValidBufferBindings.set(BufferBinding::CopyRead);
3427 mValidBufferBindings.set(BufferBinding::CopyWrite);
3428 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3429 mValidBufferBindings.set(BufferBinding::Uniform);
3430 }
3431
3432 if (getClientVersion() >= ES_3_1)
3433 {
3434 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3435 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3436 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3437 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3438 }
jchen107ae70d82018-07-06 13:47:01 +08003439
3440 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003441
3442 // Reinitialize state cache after extension changes.
3443 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003444}
3445
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003446void Context::initWorkarounds()
3447{
Jamie Madill761b02c2017-06-23 16:27:06 -04003448 // Apply back-end workarounds.
3449 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3450
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003451 // Lose the context upon out of memory error if the application is
3452 // expecting to watch for those events.
3453 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
3454}
3455
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003456// Return true if the draw is a no-op, else return false.
3457// A no-op draw occurs if the count of vertices is less than the minimum required to
3458// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3459bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3460{
3461 return count < kMinimumPrimitiveCounts[mode];
3462}
3463
3464bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3465{
3466 return (instanceCount == 0) || noopDraw(mode, count);
3467}
3468
Jamie Madill6f755b22018-10-09 12:48:54 -04003469angle::Result Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003470{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003471 if (mGLES1Renderer)
3472 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003473 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003474 }
3475
Geoff Lang9bf86f02018-07-26 11:46:34 -04003476 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003477
3478 if (isRobustResourceInitEnabled())
3479 {
3480 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3481 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3482 }
3483
Geoff Langa8cb2872018-03-09 16:09:40 -05003484 ANGLE_TRY(syncDirtyBits());
Jamie Madill6f755b22018-10-09 12:48:54 -04003485 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003486}
3487
3488Error Context::prepareForClear(GLbitfield mask)
3489{
Geoff Langa8cb2872018-03-09 16:09:40 -05003490 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003491 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003492 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003493 return NoError();
3494}
3495
3496Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3497{
Geoff Langa8cb2872018-03-09 16:09:40 -05003498 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003499 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3500 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003501 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003502 return NoError();
3503}
3504
Geoff Langa8cb2872018-03-09 16:09:40 -05003505Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003506{
Geoff Langa8cb2872018-03-09 16:09:40 -05003507 ANGLE_TRY(syncDirtyObjects(objectMask));
3508 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003509 return NoError();
3510}
3511
Jamie Madill6f755b22018-10-09 12:48:54 -04003512angle::Result Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003513{
3514 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003515 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003516 mGLState.clearDirtyBits();
Jamie Madill6f755b22018-10-09 12:48:54 -04003517 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003518}
3519
Jamie Madill6f755b22018-10-09 12:48:54 -04003520angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003521{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003522 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003523 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003524 mGLState.clearDirtyBits(dirtyBits);
Jamie Madill6f755b22018-10-09 12:48:54 -04003525 return angle::Result::Continue();
Jamie Madill1b94d432015-08-07 13:23:23 -04003526}
Jamie Madillc29968b2016-01-20 11:17:23 -05003527
Jamie Madill6f755b22018-10-09 12:48:54 -04003528angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003529{
3530 return mGLState.syncDirtyObjects(this, objectMask);
3531}
3532
Jamie Madillc29968b2016-01-20 11:17:23 -05003533void Context::blitFramebuffer(GLint srcX0,
3534 GLint srcY0,
3535 GLint srcX1,
3536 GLint srcY1,
3537 GLint dstX0,
3538 GLint dstY0,
3539 GLint dstX1,
3540 GLint dstY1,
3541 GLbitfield mask,
3542 GLenum filter)
3543{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003544 if (mask == 0)
3545 {
3546 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3547 // buffers are copied.
3548 return;
3549 }
3550
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003551 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003552 ASSERT(drawFramebuffer);
3553
3554 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3555 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3556
Jamie Madillbc918e72018-03-08 09:47:21 -05003557 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003558
Jamie Madillc564c072017-06-01 12:45:42 -04003559 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003560}
Jamie Madillc29968b2016-01-20 11:17:23 -05003561
3562void Context::clear(GLbitfield mask)
3563{
Geoff Langd4fff502017-09-22 11:28:28 -04003564 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3565 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003566}
3567
3568void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3569{
Olli Etuaho78df3362018-10-05 16:43:27 +03003570 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3571 const FramebufferAttachment *attachment = nullptr;
3572 if (buffer == GL_DEPTH)
3573 {
3574 attachment = framebufferObject->getDepthbuffer();
3575 }
3576 if (buffer == GL_COLOR &&
3577 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3578 {
3579 attachment = framebufferObject->getColorbuffer(drawbuffer);
3580 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003581 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3582 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003583 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003584 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003585 return;
3586 }
Geoff Langd4fff502017-09-22 11:28:28 -04003587 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003588 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003589}
3590
3591void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3592{
Olli Etuaho78df3362018-10-05 16:43:27 +03003593 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3594 const FramebufferAttachment *attachment = nullptr;
3595 if (buffer == GL_COLOR &&
3596 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3597 {
3598 attachment = framebufferObject->getColorbuffer(drawbuffer);
3599 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003600 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3601 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003602 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003603 {
3604 return;
3605 }
Geoff Langd4fff502017-09-22 11:28:28 -04003606 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003607 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003608}
3609
3610void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3611{
Olli Etuaho78df3362018-10-05 16:43:27 +03003612 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3613 const FramebufferAttachment *attachment = nullptr;
3614 if (buffer == GL_STENCIL)
3615 {
3616 attachment = framebufferObject->getStencilbuffer();
3617 }
3618 if (buffer == GL_COLOR &&
3619 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3620 {
3621 attachment = framebufferObject->getColorbuffer(drawbuffer);
3622 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003623 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3624 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003625 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003626 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003627 return;
3628 }
Geoff Langd4fff502017-09-22 11:28:28 -04003629 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003630 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003631}
3632
3633void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3634{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003635 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003636 ASSERT(framebufferObject);
3637
3638 // If a buffer is not present, the clear has no effect
3639 if (framebufferObject->getDepthbuffer() == nullptr &&
3640 framebufferObject->getStencilbuffer() == nullptr)
3641 {
3642 return;
3643 }
3644
Geoff Langd4fff502017-09-22 11:28:28 -04003645 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3646 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003647}
3648
3649void Context::readPixels(GLint x,
3650 GLint y,
3651 GLsizei width,
3652 GLsizei height,
3653 GLenum format,
3654 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003655 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003656{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003657 if (width == 0 || height == 0)
3658 {
3659 return;
3660 }
3661
Jamie Madillbc918e72018-03-08 09:47:21 -05003662 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003663
Jamie Madillb6664922017-07-25 12:55:04 -04003664 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3665 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003666
3667 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003668 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003669}
3670
Brandon Jones59770802018-04-02 13:18:42 -07003671void Context::readPixelsRobust(GLint x,
3672 GLint y,
3673 GLsizei width,
3674 GLsizei height,
3675 GLenum format,
3676 GLenum type,
3677 GLsizei bufSize,
3678 GLsizei *length,
3679 GLsizei *columns,
3680 GLsizei *rows,
3681 void *pixels)
3682{
3683 readPixels(x, y, width, height, format, type, pixels);
3684}
3685
3686void Context::readnPixelsRobust(GLint x,
3687 GLint y,
3688 GLsizei width,
3689 GLsizei height,
3690 GLenum format,
3691 GLenum type,
3692 GLsizei bufSize,
3693 GLsizei *length,
3694 GLsizei *columns,
3695 GLsizei *rows,
3696 void *data)
3697{
3698 readPixels(x, y, width, height, format, type, data);
3699}
3700
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003701void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003702 GLint level,
3703 GLenum internalformat,
3704 GLint x,
3705 GLint y,
3706 GLsizei width,
3707 GLsizei height,
3708 GLint border)
3709{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003710 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003711 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003712
Jamie Madillc29968b2016-01-20 11:17:23 -05003713 Rectangle sourceArea(x, y, width, height);
3714
Jamie Madill05b35b22017-10-03 09:01:44 -04003715 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003716 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003717 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003718}
3719
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003720void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003721 GLint level,
3722 GLint xoffset,
3723 GLint yoffset,
3724 GLint x,
3725 GLint y,
3726 GLsizei width,
3727 GLsizei height)
3728{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003729 if (width == 0 || height == 0)
3730 {
3731 return;
3732 }
3733
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003734 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003735 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003736
Jamie Madillc29968b2016-01-20 11:17:23 -05003737 Offset destOffset(xoffset, yoffset, 0);
3738 Rectangle sourceArea(x, y, width, height);
3739
Jamie Madill05b35b22017-10-03 09:01:44 -04003740 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003741 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003742 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003743}
3744
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003745void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003746 GLint level,
3747 GLint xoffset,
3748 GLint yoffset,
3749 GLint zoffset,
3750 GLint x,
3751 GLint y,
3752 GLsizei width,
3753 GLsizei height)
3754{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003755 if (width == 0 || height == 0)
3756 {
3757 return;
3758 }
3759
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003760 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003761 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003762
Jamie Madillc29968b2016-01-20 11:17:23 -05003763 Offset destOffset(xoffset, yoffset, zoffset);
3764 Rectangle sourceArea(x, y, width, height);
3765
Jamie Madill05b35b22017-10-03 09:01:44 -04003766 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3767 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003768 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3769 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003770}
3771
3772void Context::framebufferTexture2D(GLenum target,
3773 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003774 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003775 GLuint texture,
3776 GLint level)
3777{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003778 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003779 ASSERT(framebuffer);
3780
3781 if (texture != 0)
3782 {
3783 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003784 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003785 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003786 }
3787 else
3788 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003789 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003790 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003791
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003792 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003793}
3794
3795void Context::framebufferRenderbuffer(GLenum target,
3796 GLenum attachment,
3797 GLenum renderbuffertarget,
3798 GLuint renderbuffer)
3799{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003800 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003801 ASSERT(framebuffer);
3802
3803 if (renderbuffer != 0)
3804 {
3805 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003806
Jamie Madillcc129372018-04-12 09:13:18 -04003807 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003808 renderbufferObject);
3809 }
3810 else
3811 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003812 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003813 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003814
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003815 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003816}
3817
3818void Context::framebufferTextureLayer(GLenum target,
3819 GLenum attachment,
3820 GLuint texture,
3821 GLint level,
3822 GLint layer)
3823{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003824 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003825 ASSERT(framebuffer);
3826
3827 if (texture != 0)
3828 {
3829 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003830 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003831 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003832 }
3833 else
3834 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003835 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003836 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003837
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003838 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003839}
3840
Brandon Jones59770802018-04-02 13:18:42 -07003841void Context::framebufferTextureMultiviewLayered(GLenum target,
3842 GLenum attachment,
3843 GLuint texture,
3844 GLint level,
3845 GLint baseViewIndex,
3846 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003847{
Martin Radev82ef7742017-08-08 17:44:58 +03003848 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3849 ASSERT(framebuffer);
3850
3851 if (texture != 0)
3852 {
3853 Texture *textureObj = getTexture(texture);
3854
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003855 ImageIndex index;
3856 if (textureObj->getType() == TextureType::_2DArray)
3857 {
3858 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3859 }
3860 else
3861 {
3862 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3863 ASSERT(level == 0);
3864 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3865 }
Martin Radev82ef7742017-08-08 17:44:58 +03003866 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3867 numViews, baseViewIndex);
3868 }
3869 else
3870 {
3871 framebuffer->resetAttachment(this, attachment);
3872 }
3873
3874 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003875}
3876
Brandon Jones59770802018-04-02 13:18:42 -07003877void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3878 GLenum attachment,
3879 GLuint texture,
3880 GLint level,
3881 GLsizei numViews,
3882 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003883{
Martin Radev5dae57b2017-07-14 16:15:55 +03003884 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3885 ASSERT(framebuffer);
3886
3887 if (texture != 0)
3888 {
3889 Texture *textureObj = getTexture(texture);
3890
3891 ImageIndex index = ImageIndex::Make2D(level);
3892 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3893 textureObj, numViews, viewportOffsets);
3894 }
3895 else
3896 {
3897 framebuffer->resetAttachment(this, attachment);
3898 }
3899
3900 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003901}
3902
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003903void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3904{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003905 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3906 ASSERT(framebuffer);
3907
3908 if (texture != 0)
3909 {
3910 Texture *textureObj = getTexture(texture);
3911
3912 ImageIndex index = ImageIndex::MakeFromType(
3913 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3914 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3915 }
3916 else
3917 {
3918 framebuffer->resetAttachment(this, attachment);
3919 }
3920
3921 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003922}
3923
Jamie Madillc29968b2016-01-20 11:17:23 -05003924void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3925{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003926 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003927 ASSERT(framebuffer);
3928 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003929 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003930 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003931}
3932
3933void Context::readBuffer(GLenum mode)
3934{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003935 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003936 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003937 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003938}
3939
3940void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3941{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003942 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003943 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003944
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003945 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003946 ASSERT(framebuffer);
3947
3948 // The specification isn't clear what should be done when the framebuffer isn't complete.
3949 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003950 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003951}
3952
3953void Context::invalidateFramebuffer(GLenum target,
3954 GLsizei numAttachments,
3955 const GLenum *attachments)
3956{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003957 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003958 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003959
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003960 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003961 ASSERT(framebuffer);
3962
Jamie Madill427064d2018-04-13 16:20:34 -04003963 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003964 {
Jamie Madill437fa652016-05-03 15:13:24 -04003965 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003966 }
Jamie Madill437fa652016-05-03 15:13:24 -04003967
Jamie Madill4928b7c2017-06-20 12:57:39 -04003968 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003969}
3970
3971void Context::invalidateSubFramebuffer(GLenum target,
3972 GLsizei numAttachments,
3973 const GLenum *attachments,
3974 GLint x,
3975 GLint y,
3976 GLsizei width,
3977 GLsizei height)
3978{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003979 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003980 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003981
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003982 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003983 ASSERT(framebuffer);
3984
Jamie Madill427064d2018-04-13 16:20:34 -04003985 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003986 {
Jamie Madill437fa652016-05-03 15:13:24 -04003987 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003988 }
Jamie Madill437fa652016-05-03 15:13:24 -04003989
3990 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003991 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003992}
3993
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003994void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003995 GLint level,
3996 GLint internalformat,
3997 GLsizei width,
3998 GLsizei height,
3999 GLint border,
4000 GLenum format,
4001 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004002 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004003{
Jamie Madillbc918e72018-03-08 09:47:21 -05004004 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004005
4006 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004007 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004008 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004009 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004010}
4011
Brandon Jones59770802018-04-02 13:18:42 -07004012void Context::texImage2DRobust(TextureTarget target,
4013 GLint level,
4014 GLint internalformat,
4015 GLsizei width,
4016 GLsizei height,
4017 GLint border,
4018 GLenum format,
4019 GLenum type,
4020 GLsizei bufSize,
4021 const void *pixels)
4022{
4023 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4024}
4025
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004026void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004027 GLint level,
4028 GLint internalformat,
4029 GLsizei width,
4030 GLsizei height,
4031 GLsizei depth,
4032 GLint border,
4033 GLenum format,
4034 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004035 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004036{
Jamie Madillbc918e72018-03-08 09:47:21 -05004037 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004038
4039 Extents size(width, height, depth);
4040 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004041 handleError(texture->setImage(this, mGLState.getUnpackState(),
4042 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004043 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004044}
4045
Brandon Jones59770802018-04-02 13:18:42 -07004046void Context::texImage3DRobust(TextureType target,
4047 GLint level,
4048 GLint internalformat,
4049 GLsizei width,
4050 GLsizei height,
4051 GLsizei depth,
4052 GLint border,
4053 GLenum format,
4054 GLenum type,
4055 GLsizei bufSize,
4056 const void *pixels)
4057{
4058 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4059}
4060
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004061void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004062 GLint level,
4063 GLint xoffset,
4064 GLint yoffset,
4065 GLsizei width,
4066 GLsizei height,
4067 GLenum format,
4068 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004069 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004070{
4071 // Zero sized uploads are valid but no-ops
4072 if (width == 0 || height == 0)
4073 {
4074 return;
4075 }
4076
Jamie Madillbc918e72018-03-08 09:47:21 -05004077 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004078
4079 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004080 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004081
4082 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4083
4084 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4085 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004086}
4087
Brandon Jones59770802018-04-02 13:18:42 -07004088void Context::texSubImage2DRobust(TextureTarget target,
4089 GLint level,
4090 GLint xoffset,
4091 GLint yoffset,
4092 GLsizei width,
4093 GLsizei height,
4094 GLenum format,
4095 GLenum type,
4096 GLsizei bufSize,
4097 const void *pixels)
4098{
4099 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4100}
4101
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004102void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004103 GLint level,
4104 GLint xoffset,
4105 GLint yoffset,
4106 GLint zoffset,
4107 GLsizei width,
4108 GLsizei height,
4109 GLsizei depth,
4110 GLenum format,
4111 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004112 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004113{
4114 // Zero sized uploads are valid but no-ops
4115 if (width == 0 || height == 0 || depth == 0)
4116 {
4117 return;
4118 }
4119
Jamie Madillbc918e72018-03-08 09:47:21 -05004120 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004121
4122 Box area(xoffset, yoffset, zoffset, width, height, depth);
4123 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004124
4125 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4126
4127 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004128 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004129 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004130}
4131
Brandon Jones59770802018-04-02 13:18:42 -07004132void Context::texSubImage3DRobust(TextureType target,
4133 GLint level,
4134 GLint xoffset,
4135 GLint yoffset,
4136 GLint zoffset,
4137 GLsizei width,
4138 GLsizei height,
4139 GLsizei depth,
4140 GLenum format,
4141 GLenum type,
4142 GLsizei bufSize,
4143 const void *pixels)
4144{
4145 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4146 pixels);
4147}
4148
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004149void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004150 GLint level,
4151 GLenum internalformat,
4152 GLsizei width,
4153 GLsizei height,
4154 GLint border,
4155 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004156 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004157{
Jamie Madillbc918e72018-03-08 09:47:21 -05004158 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004159
4160 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004161 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004162 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4163 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004164 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004165}
4166
Brandon Jones59770802018-04-02 13:18:42 -07004167void Context::compressedTexImage2DRobust(TextureTarget target,
4168 GLint level,
4169 GLenum internalformat,
4170 GLsizei width,
4171 GLsizei height,
4172 GLint border,
4173 GLsizei imageSize,
4174 GLsizei dataSize,
4175 const GLvoid *data)
4176{
4177 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4178}
4179
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004180void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004181 GLint level,
4182 GLenum internalformat,
4183 GLsizei width,
4184 GLsizei height,
4185 GLsizei depth,
4186 GLint border,
4187 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004188 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004189{
Jamie Madillbc918e72018-03-08 09:47:21 -05004190 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004191
4192 Extents size(width, height, depth);
4193 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004194 handleError(texture->setCompressedImage(
4195 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004196 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004197}
4198
Brandon Jones59770802018-04-02 13:18:42 -07004199void Context::compressedTexImage3DRobust(TextureType target,
4200 GLint level,
4201 GLenum internalformat,
4202 GLsizei width,
4203 GLsizei height,
4204 GLsizei depth,
4205 GLint border,
4206 GLsizei imageSize,
4207 GLsizei dataSize,
4208 const GLvoid *data)
4209{
4210 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4211 data);
4212}
4213
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004214void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004215 GLint level,
4216 GLint xoffset,
4217 GLint yoffset,
4218 GLsizei width,
4219 GLsizei height,
4220 GLenum format,
4221 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004222 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004223{
Jamie Madillbc918e72018-03-08 09:47:21 -05004224 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004225
4226 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004227 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004228 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4229 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004230 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004231}
4232
Brandon Jones59770802018-04-02 13:18:42 -07004233void Context::compressedTexSubImage2DRobust(TextureTarget target,
4234 GLint level,
4235 GLint xoffset,
4236 GLint yoffset,
4237 GLsizei width,
4238 GLsizei height,
4239 GLenum format,
4240 GLsizei imageSize,
4241 GLsizei dataSize,
4242 const GLvoid *data)
4243{
4244 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4245 data);
4246}
4247
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004248void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004249 GLint level,
4250 GLint xoffset,
4251 GLint yoffset,
4252 GLint zoffset,
4253 GLsizei width,
4254 GLsizei height,
4255 GLsizei depth,
4256 GLenum format,
4257 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004258 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004259{
4260 // Zero sized uploads are valid but no-ops
4261 if (width == 0 || height == 0)
4262 {
4263 return;
4264 }
4265
Jamie Madillbc918e72018-03-08 09:47:21 -05004266 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004267
4268 Box area(xoffset, yoffset, zoffset, width, height, depth);
4269 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004270 handleError(texture->setCompressedSubImage(
4271 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004272 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004273}
4274
Brandon Jones59770802018-04-02 13:18:42 -07004275void Context::compressedTexSubImage3DRobust(TextureType target,
4276 GLint level,
4277 GLint xoffset,
4278 GLint yoffset,
4279 GLint zoffset,
4280 GLsizei width,
4281 GLsizei height,
4282 GLsizei depth,
4283 GLenum format,
4284 GLsizei imageSize,
4285 GLsizei dataSize,
4286 const GLvoid *data)
4287{
4288 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4289 imageSize, data);
4290}
4291
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004292void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004293{
4294 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004295 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004296}
4297
Jamie Madill007530e2017-12-28 14:27:04 -05004298void Context::copyTexture(GLuint sourceId,
4299 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004300 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004301 GLuint destId,
4302 GLint destLevel,
4303 GLint internalFormat,
4304 GLenum destType,
4305 GLboolean unpackFlipY,
4306 GLboolean unpackPremultiplyAlpha,
4307 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004308{
Jamie Madillbc918e72018-03-08 09:47:21 -05004309 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004310
4311 gl::Texture *sourceTexture = getTexture(sourceId);
4312 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004313 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4314 sourceLevel, ConvertToBool(unpackFlipY),
4315 ConvertToBool(unpackPremultiplyAlpha),
4316 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004317}
4318
Jamie Madill007530e2017-12-28 14:27:04 -05004319void Context::copySubTexture(GLuint sourceId,
4320 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004321 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004322 GLuint destId,
4323 GLint destLevel,
4324 GLint xoffset,
4325 GLint yoffset,
4326 GLint x,
4327 GLint y,
4328 GLsizei width,
4329 GLsizei height,
4330 GLboolean unpackFlipY,
4331 GLboolean unpackPremultiplyAlpha,
4332 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004333{
4334 // Zero sized copies are valid but no-ops
4335 if (width == 0 || height == 0)
4336 {
4337 return;
4338 }
4339
Jamie Madillbc918e72018-03-08 09:47:21 -05004340 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004341
4342 gl::Texture *sourceTexture = getTexture(sourceId);
4343 gl::Texture *destTexture = getTexture(destId);
4344 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004345 Box box(x, y, 0, width, height, 1);
4346 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4347 ConvertToBool(unpackFlipY),
4348 ConvertToBool(unpackPremultiplyAlpha),
4349 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4350}
4351
4352void Context::copyTexture3D(GLuint sourceId,
4353 GLint sourceLevel,
4354 TextureTarget destTarget,
4355 GLuint destId,
4356 GLint destLevel,
4357 GLint internalFormat,
4358 GLenum destType,
4359 GLboolean unpackFlipY,
4360 GLboolean unpackPremultiplyAlpha,
4361 GLboolean unpackUnmultiplyAlpha)
4362{
4363 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4364
4365 Texture *sourceTexture = getTexture(sourceId);
4366 Texture *destTexture = getTexture(destId);
4367 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4368 sourceLevel, ConvertToBool(unpackFlipY),
4369 ConvertToBool(unpackPremultiplyAlpha),
4370 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4371}
4372
4373void Context::copySubTexture3D(GLuint sourceId,
4374 GLint sourceLevel,
4375 TextureTarget destTarget,
4376 GLuint destId,
4377 GLint destLevel,
4378 GLint xoffset,
4379 GLint yoffset,
4380 GLint zoffset,
4381 GLint x,
4382 GLint y,
4383 GLint z,
4384 GLsizei width,
4385 GLsizei height,
4386 GLsizei depth,
4387 GLboolean unpackFlipY,
4388 GLboolean unpackPremultiplyAlpha,
4389 GLboolean unpackUnmultiplyAlpha)
4390{
4391 // Zero sized copies are valid but no-ops
4392 if (width == 0 || height == 0 || depth == 0)
4393 {
4394 return;
4395 }
4396
4397 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4398
4399 Texture *sourceTexture = getTexture(sourceId);
4400 Texture *destTexture = getTexture(destId);
4401 Offset offset(xoffset, yoffset, zoffset);
4402 Box box(x, y, z, width, height, depth);
4403 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004404 ConvertToBool(unpackFlipY),
4405 ConvertToBool(unpackPremultiplyAlpha),
4406 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004407}
4408
Jamie Madill007530e2017-12-28 14:27:04 -05004409void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004410{
Jamie Madillbc918e72018-03-08 09:47:21 -05004411 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004412
4413 gl::Texture *sourceTexture = getTexture(sourceId);
4414 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004415 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004416}
4417
Corentin Wallez336129f2017-10-17 15:55:40 -04004418void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004419{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004420 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004421 ASSERT(buffer);
4422
Geoff Lang496c02d2016-10-20 11:38:11 -07004423 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004424}
4425
Brandon Jones59770802018-04-02 13:18:42 -07004426void Context::getBufferPointervRobust(BufferBinding target,
4427 GLenum pname,
4428 GLsizei bufSize,
4429 GLsizei *length,
4430 void **params)
4431{
4432 getBufferPointerv(target, pname, params);
4433}
4434
Corentin Wallez336129f2017-10-17 15:55:40 -04004435void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004436{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004437 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004438 ASSERT(buffer);
4439
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004440 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004441 if (error.isError())
4442 {
Jamie Madill437fa652016-05-03 15:13:24 -04004443 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004444 return nullptr;
4445 }
4446
4447 return buffer->getMapPointer();
4448}
4449
Corentin Wallez336129f2017-10-17 15:55:40 -04004450GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004451{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004452 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004453 ASSERT(buffer);
4454
4455 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004456 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004457 if (error.isError())
4458 {
Jamie Madill437fa652016-05-03 15:13:24 -04004459 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004460 return GL_FALSE;
4461 }
4462
4463 return result;
4464}
4465
Corentin Wallez336129f2017-10-17 15:55:40 -04004466void *Context::mapBufferRange(BufferBinding target,
4467 GLintptr offset,
4468 GLsizeiptr length,
4469 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004470{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004471 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004472 ASSERT(buffer);
4473
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004474 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004475 if (error.isError())
4476 {
Jamie Madill437fa652016-05-03 15:13:24 -04004477 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004478 return nullptr;
4479 }
4480
4481 return buffer->getMapPointer();
4482}
4483
Corentin Wallez336129f2017-10-17 15:55:40 -04004484void Context::flushMappedBufferRange(BufferBinding /*target*/,
4485 GLintptr /*offset*/,
4486 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004487{
4488 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4489}
4490
Jamie Madillbc918e72018-03-08 09:47:21 -05004491Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004492{
Geoff Langa8cb2872018-03-09 16:09:40 -05004493 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004494}
4495
Jamie Madillbc918e72018-03-08 09:47:21 -05004496Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004497{
Geoff Langa8cb2872018-03-09 16:09:40 -05004498 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004499}
4500
Jamie Madillbc918e72018-03-08 09:47:21 -05004501Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004502{
Geoff Langa8cb2872018-03-09 16:09:40 -05004503 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004504}
4505
Geoff Lang9bf86f02018-07-26 11:46:34 -04004506Error Context::syncStateForPathOperation()
4507{
4508 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4509
4510 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4511 ANGLE_TRY(syncDirtyBits());
4512
4513 return NoError();
4514}
4515
Jiajia Qin5451d532017-11-16 17:16:34 +08004516void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4517{
4518 UNIMPLEMENTED();
4519}
4520
Jamie Madillc20ab272016-06-09 07:20:46 -07004521void Context::activeTexture(GLenum texture)
4522{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004523 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004524}
4525
Jamie Madill876429b2017-04-20 15:46:24 -04004526void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004527{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004528 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004529}
4530
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004531void Context::blendEquation(GLenum mode)
4532{
4533 mGLState.setBlendEquation(mode, mode);
4534}
4535
Jamie Madillc20ab272016-06-09 07:20:46 -07004536void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4537{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004538 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004539}
4540
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004541void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4542{
4543 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4544}
4545
Jamie Madillc20ab272016-06-09 07:20:46 -07004546void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4547{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004548 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004549}
4550
Jamie Madill876429b2017-04-20 15:46:24 -04004551void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004552{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004553 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004554}
4555
Jamie Madill876429b2017-04-20 15:46:24 -04004556void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004557{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004558 mGLState.setDepthClearValue(clamp01(depth));
Jamie Madillc20ab272016-06-09 07:20:46 -07004559}
4560
4561void Context::clearStencil(GLint s)
4562{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004563 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004564}
4565
4566void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4567{
Geoff Lang92019432017-11-20 13:09:34 -05004568 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4569 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004570}
4571
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004572void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004573{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004574 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004575}
4576
4577void Context::depthFunc(GLenum func)
4578{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004579 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004580}
4581
4582void Context::depthMask(GLboolean flag)
4583{
Geoff Lang92019432017-11-20 13:09:34 -05004584 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004585}
4586
Jamie Madill876429b2017-04-20 15:46:24 -04004587void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004588{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004589 mGLState.setDepthRange(clamp01(zNear), clamp01(zFar));
Jamie Madillc20ab272016-06-09 07:20:46 -07004590}
4591
4592void Context::disable(GLenum cap)
4593{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004594 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004595 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004596}
4597
4598void Context::disableVertexAttribArray(GLuint index)
4599{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004600 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004601 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004602}
4603
4604void Context::enable(GLenum cap)
4605{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004606 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004607 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004608}
4609
4610void Context::enableVertexAttribArray(GLuint index)
4611{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004612 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004613 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004614}
4615
4616void Context::frontFace(GLenum mode)
4617{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004618 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004619}
4620
4621void Context::hint(GLenum target, GLenum mode)
4622{
4623 switch (target)
4624 {
4625 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004626 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004627 break;
4628
4629 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004630 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004631 break;
4632
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004633 case GL_PERSPECTIVE_CORRECTION_HINT:
4634 case GL_POINT_SMOOTH_HINT:
4635 case GL_LINE_SMOOTH_HINT:
4636 case GL_FOG_HINT:
4637 mGLState.gles1().setHint(target, mode);
4638 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004639 default:
4640 UNREACHABLE();
4641 return;
4642 }
4643}
4644
4645void Context::lineWidth(GLfloat width)
4646{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004647 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004648}
4649
4650void Context::pixelStorei(GLenum pname, GLint param)
4651{
4652 switch (pname)
4653 {
4654 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004655 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004656 break;
4657
4658 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004659 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004660 break;
4661
4662 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004663 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004664 break;
4665
4666 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004667 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004668 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004669 break;
4670
4671 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004672 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004673 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004674 break;
4675
4676 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004677 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004678 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004679 break;
4680
4681 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004682 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004683 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004684 break;
4685
4686 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004687 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004688 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004689 break;
4690
4691 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004692 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004693 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004694 break;
4695
4696 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004697 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004698 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004699 break;
4700
4701 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004702 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004703 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004704 break;
4705
4706 default:
4707 UNREACHABLE();
4708 return;
4709 }
4710}
4711
4712void Context::polygonOffset(GLfloat factor, GLfloat units)
4713{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004714 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004715}
4716
Jamie Madill876429b2017-04-20 15:46:24 -04004717void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004718{
Geoff Lang92019432017-11-20 13:09:34 -05004719 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004720}
4721
Jiawei Shaodb342272017-09-27 10:21:45 +08004722void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4723{
4724 mGLState.setSampleMaskParams(maskNumber, mask);
4725}
4726
Jamie Madillc20ab272016-06-09 07:20:46 -07004727void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4728{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004729 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004730}
4731
4732void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4733{
4734 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4735 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004736 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004737 }
4738
4739 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4740 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004741 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004742 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004743
4744 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004745}
4746
4747void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4748{
4749 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4750 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004751 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004752 }
4753
4754 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4755 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004756 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004757 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004758
4759 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004760}
4761
4762void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4763{
4764 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4765 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004766 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004767 }
4768
4769 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4770 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004771 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004772 }
4773}
4774
4775void Context::vertexAttrib1f(GLuint index, GLfloat x)
4776{
4777 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004778 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004779 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004780}
4781
4782void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4783{
4784 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004785 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004786 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004787}
4788
4789void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4790{
4791 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004792 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004793 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004794}
4795
4796void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4797{
4798 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004799 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004800 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004801}
4802
4803void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4804{
4805 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004806 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004807 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004808}
4809
4810void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4811{
4812 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004813 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004814 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004815}
4816
4817void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4818{
4819 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004820 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004821 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004822}
4823
4824void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4825{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004826 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004827 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004828}
4829
4830void Context::vertexAttribPointer(GLuint index,
4831 GLint size,
4832 GLenum type,
4833 GLboolean normalized,
4834 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004835 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004836{
Corentin Wallez336129f2017-10-17 15:55:40 -04004837 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004838 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004839 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004840}
4841
Shao80957d92017-02-20 21:25:59 +08004842void Context::vertexAttribFormat(GLuint attribIndex,
4843 GLint size,
4844 GLenum type,
4845 GLboolean normalized,
4846 GLuint relativeOffset)
4847{
Geoff Lang92019432017-11-20 13:09:34 -05004848 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004849 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004850 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004851}
4852
4853void Context::vertexAttribIFormat(GLuint attribIndex,
4854 GLint size,
4855 GLenum type,
4856 GLuint relativeOffset)
4857{
4858 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004859 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004860}
4861
4862void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4863{
Shaodde78e82017-05-22 14:13:27 +08004864 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004865 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004866}
4867
Jiajia Qin5451d532017-11-16 17:16:34 +08004868void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004869{
4870 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004871 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004872}
4873
Jamie Madillc20ab272016-06-09 07:20:46 -07004874void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4875{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004876 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004877}
4878
4879void Context::vertexAttribIPointer(GLuint index,
4880 GLint size,
4881 GLenum type,
4882 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004883 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004884{
Corentin Wallez336129f2017-10-17 15:55:40 -04004885 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4886 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004887 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004888}
4889
4890void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4891{
4892 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004893 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004894 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004895}
4896
4897void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4898{
4899 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004900 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004901 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004902}
4903
4904void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4905{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004906 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004907 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004908}
4909
4910void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4911{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004912 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004913 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004914}
4915
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004916void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4917{
4918 const VertexAttribCurrentValueData &currentValues =
4919 getGLState().getVertexAttribCurrentValue(index);
4920 const VertexArray *vao = getGLState().getVertexArray();
4921 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4922 currentValues, pname, params);
4923}
4924
Brandon Jones59770802018-04-02 13:18:42 -07004925void Context::getVertexAttribivRobust(GLuint index,
4926 GLenum pname,
4927 GLsizei bufSize,
4928 GLsizei *length,
4929 GLint *params)
4930{
4931 getVertexAttribiv(index, pname, params);
4932}
4933
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004934void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4935{
4936 const VertexAttribCurrentValueData &currentValues =
4937 getGLState().getVertexAttribCurrentValue(index);
4938 const VertexArray *vao = getGLState().getVertexArray();
4939 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4940 currentValues, pname, params);
4941}
4942
Brandon Jones59770802018-04-02 13:18:42 -07004943void Context::getVertexAttribfvRobust(GLuint index,
4944 GLenum pname,
4945 GLsizei bufSize,
4946 GLsizei *length,
4947 GLfloat *params)
4948{
4949 getVertexAttribfv(index, pname, params);
4950}
4951
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004952void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4953{
4954 const VertexAttribCurrentValueData &currentValues =
4955 getGLState().getVertexAttribCurrentValue(index);
4956 const VertexArray *vao = getGLState().getVertexArray();
4957 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4958 currentValues, pname, params);
4959}
4960
Brandon Jones59770802018-04-02 13:18:42 -07004961void Context::getVertexAttribIivRobust(GLuint index,
4962 GLenum pname,
4963 GLsizei bufSize,
4964 GLsizei *length,
4965 GLint *params)
4966{
4967 getVertexAttribIiv(index, pname, params);
4968}
4969
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004970void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4971{
4972 const VertexAttribCurrentValueData &currentValues =
4973 getGLState().getVertexAttribCurrentValue(index);
4974 const VertexArray *vao = getGLState().getVertexArray();
4975 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4976 currentValues, pname, params);
4977}
4978
Brandon Jones59770802018-04-02 13:18:42 -07004979void Context::getVertexAttribIuivRobust(GLuint index,
4980 GLenum pname,
4981 GLsizei bufSize,
4982 GLsizei *length,
4983 GLuint *params)
4984{
4985 getVertexAttribIuiv(index, pname, params);
4986}
4987
Jamie Madill876429b2017-04-20 15:46:24 -04004988void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004989{
4990 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4991 QueryVertexAttribPointerv(attrib, pname, pointer);
4992}
4993
Brandon Jones59770802018-04-02 13:18:42 -07004994void Context::getVertexAttribPointervRobust(GLuint index,
4995 GLenum pname,
4996 GLsizei bufSize,
4997 GLsizei *length,
4998 void **pointer)
4999{
5000 getVertexAttribPointerv(index, pname, pointer);
5001}
5002
Jamie Madillc20ab272016-06-09 07:20:46 -07005003void Context::debugMessageControl(GLenum source,
5004 GLenum type,
5005 GLenum severity,
5006 GLsizei count,
5007 const GLuint *ids,
5008 GLboolean enabled)
5009{
5010 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005011 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05005012 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07005013}
5014
5015void Context::debugMessageInsert(GLenum source,
5016 GLenum type,
5017 GLuint id,
5018 GLenum severity,
5019 GLsizei length,
5020 const GLchar *buf)
5021{
5022 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005023 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005024}
5025
5026void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5027{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005028 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005029}
5030
5031GLuint Context::getDebugMessageLog(GLuint count,
5032 GLsizei bufSize,
5033 GLenum *sources,
5034 GLenum *types,
5035 GLuint *ids,
5036 GLenum *severities,
5037 GLsizei *lengths,
5038 GLchar *messageLog)
5039{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005040 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5041 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005042}
5043
5044void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5045{
5046 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005047 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005048 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005049}
5050
5051void Context::popDebugGroup()
5052{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005053 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005054 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005055}
5056
Corentin Wallez336129f2017-10-17 15:55:40 -04005057void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005058{
5059 Buffer *buffer = mGLState.getTargetBuffer(target);
5060 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005061 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005062}
5063
Corentin Wallez336129f2017-10-17 15:55:40 -04005064void Context::bufferSubData(BufferBinding target,
5065 GLintptr offset,
5066 GLsizeiptr size,
5067 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005068{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005069 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005070 {
5071 return;
5072 }
5073
5074 Buffer *buffer = mGLState.getTargetBuffer(target);
5075 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005076 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005077}
5078
Jamie Madillef300b12016-10-07 15:12:09 -04005079void Context::attachShader(GLuint program, GLuint shader)
5080{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005081 Program *programObject = mState.mShaderPrograms->getProgram(program);
5082 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005083 ASSERT(programObject && shaderObject);
5084 programObject->attachShader(shaderObject);
5085}
5086
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005087const Workarounds &Context::getWorkarounds() const
5088{
5089 return mWorkarounds;
5090}
5091
Corentin Wallez336129f2017-10-17 15:55:40 -04005092void Context::copyBufferSubData(BufferBinding readTarget,
5093 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005094 GLintptr readOffset,
5095 GLintptr writeOffset,
5096 GLsizeiptr size)
5097{
5098 // if size is zero, the copy is a successful no-op
5099 if (size == 0)
5100 {
5101 return;
5102 }
5103
5104 // TODO(jmadill): cache these.
5105 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5106 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5107
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005108 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005109}
5110
Jamie Madill01a80ee2016-11-07 12:06:18 -05005111void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5112{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005113 // Ideally we could share the program query with the validation layer if possible.
5114 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005115 ASSERT(programObject);
5116 programObject->bindAttributeLocation(index, name);
5117}
5118
Corentin Wallez336129f2017-10-17 15:55:40 -04005119void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005120{
Corentin Wallez336129f2017-10-17 15:55:40 -04005121 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5122 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005123 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005124}
5125
Corentin Wallez336129f2017-10-17 15:55:40 -04005126void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005127{
5128 bindBufferRange(target, index, buffer, 0, 0);
5129}
5130
Corentin Wallez336129f2017-10-17 15:55:40 -04005131void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005132 GLuint index,
5133 GLuint buffer,
5134 GLintptr offset,
5135 GLsizeiptr size)
5136{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005137 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5138 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5139 if (target == BufferBinding::Uniform)
5140 {
5141 mUniformBufferObserverBindings[index].bind(object ? object->getImplementation() : nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04005142 mStateCache.onUniformBufferStateChange(this);
5143 }
5144 else
5145 {
5146 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005147 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005148}
5149
Jamie Madill01a80ee2016-11-07 12:06:18 -05005150void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5151{
5152 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5153 {
5154 bindReadFramebuffer(framebuffer);
5155 }
5156
5157 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5158 {
5159 bindDrawFramebuffer(framebuffer);
5160 }
5161}
5162
5163void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5164{
5165 ASSERT(target == GL_RENDERBUFFER);
5166 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005167 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005168 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005169}
5170
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005171void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005172 GLsizei samples,
5173 GLenum internalformat,
5174 GLsizei width,
5175 GLsizei height,
5176 GLboolean fixedsamplelocations)
5177{
5178 Extents size(width, height, 1);
5179 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005180 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5181 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005182}
5183
Olli Etuaho89664842018-08-24 14:45:36 +03005184void Context::texStorage3DMultisample(TextureType target,
5185 GLsizei samples,
5186 GLenum internalformat,
5187 GLsizei width,
5188 GLsizei height,
5189 GLsizei depth,
5190 GLboolean fixedsamplelocations)
5191{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005192 Extents size(width, height, depth);
5193 Texture *texture = getTargetTexture(target);
5194 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5195 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005196}
5197
JiangYizhoubddc46b2016-12-09 09:50:51 +08005198void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5199{
JiangYizhou5b03f472017-01-09 10:22:53 +08005200 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5201 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005202 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005203 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005204
5205 switch (pname)
5206 {
5207 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005208 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005209 break;
5210 default:
5211 UNREACHABLE();
5212 }
5213}
5214
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005215void Context::getMultisamplefvRobust(GLenum pname,
5216 GLuint index,
5217 GLsizei bufSize,
5218 GLsizei *length,
5219 GLfloat *val)
5220{
5221 UNIMPLEMENTED();
5222}
5223
Jamie Madille8fb6402017-02-14 17:56:40 -05005224void Context::renderbufferStorage(GLenum target,
5225 GLenum internalformat,
5226 GLsizei width,
5227 GLsizei height)
5228{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005229 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5230 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5231
Jamie Madille8fb6402017-02-14 17:56:40 -05005232 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005233 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005234}
5235
5236void Context::renderbufferStorageMultisample(GLenum target,
5237 GLsizei samples,
5238 GLenum internalformat,
5239 GLsizei width,
5240 GLsizei height)
5241{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005242 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5243 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005244
5245 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005246 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005247 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005248}
5249
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005250void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5251{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005252 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005253 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005254}
5255
JiangYizhoue18e6392017-02-20 10:32:23 +08005256void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5257{
5258 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5259 QueryFramebufferParameteriv(framebuffer, pname, params);
5260}
5261
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005262void Context::getFramebufferParameterivRobust(GLenum target,
5263 GLenum pname,
5264 GLsizei bufSize,
5265 GLsizei *length,
5266 GLint *params)
5267{
5268 UNIMPLEMENTED();
5269}
5270
Jiajia Qin5451d532017-11-16 17:16:34 +08005271void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005272{
5273 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005274 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005275}
5276
Jamie Madilldec86232018-07-11 09:01:18 -04005277bool Context::getScratchBuffer(size_t requstedSizeBytes,
5278 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005279{
Jamie Madilldec86232018-07-11 09:01:18 -04005280 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005281}
5282
Jamie Madilldec86232018-07-11 09:01:18 -04005283bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5284 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005285{
Jamie Madilldec86232018-07-11 09:01:18 -04005286 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005287}
5288
Xinghua Cao10a4d432017-11-28 14:46:26 +08005289Error Context::prepareForDispatch()
5290{
Geoff Langa8cb2872018-03-09 16:09:40 -05005291 ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005292
5293 if (isRobustResourceInitEnabled())
5294 {
5295 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5296 }
5297
5298 return NoError();
5299}
5300
Xinghua Cao2b396592017-03-29 15:36:04 +08005301void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5302{
5303 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5304 {
5305 return;
5306 }
5307
Xinghua Cao10a4d432017-11-28 14:46:26 +08005308 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005309 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005310}
5311
Jiajia Qin5451d532017-11-16 17:16:34 +08005312void Context::dispatchComputeIndirect(GLintptr indirect)
5313{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005314 ANGLE_CONTEXT_TRY(prepareForDispatch());
5315 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005316}
5317
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005318void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005319 GLsizei levels,
5320 GLenum internalFormat,
5321 GLsizei width,
5322 GLsizei height)
5323{
5324 Extents size(width, height, 1);
5325 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005326 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005327}
5328
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005329void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005330 GLsizei levels,
5331 GLenum internalFormat,
5332 GLsizei width,
5333 GLsizei height,
5334 GLsizei depth)
5335{
5336 Extents size(width, height, depth);
5337 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005338 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005339}
5340
Jiajia Qin5451d532017-11-16 17:16:34 +08005341void Context::memoryBarrier(GLbitfield barriers)
5342{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005343 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005344}
5345
5346void Context::memoryBarrierByRegion(GLbitfield barriers)
5347{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005348 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005349}
5350
Jamie Madillc1d770e2017-04-13 17:31:24 -04005351GLenum Context::checkFramebufferStatus(GLenum target)
5352{
5353 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5354 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005355 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005356}
5357
5358void Context::compileShader(GLuint shader)
5359{
5360 Shader *shaderObject = GetValidShader(this, shader);
5361 if (!shaderObject)
5362 {
5363 return;
5364 }
5365 shaderObject->compile(this);
5366}
5367
5368void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5369{
5370 for (int i = 0; i < n; i++)
5371 {
5372 deleteBuffer(buffers[i]);
5373 }
5374}
5375
5376void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5377{
5378 for (int i = 0; i < n; i++)
5379 {
5380 if (framebuffers[i] != 0)
5381 {
5382 deleteFramebuffer(framebuffers[i]);
5383 }
5384 }
5385}
5386
5387void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5388{
5389 for (int i = 0; i < n; i++)
5390 {
5391 deleteRenderbuffer(renderbuffers[i]);
5392 }
5393}
5394
5395void Context::deleteTextures(GLsizei n, const GLuint *textures)
5396{
5397 for (int i = 0; i < n; i++)
5398 {
5399 if (textures[i] != 0)
5400 {
5401 deleteTexture(textures[i]);
5402 }
5403 }
5404}
5405
5406void Context::detachShader(GLuint program, GLuint shader)
5407{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005408 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005409 ASSERT(programObject);
5410
5411 Shader *shaderObject = getShader(shader);
5412 ASSERT(shaderObject);
5413
5414 programObject->detachShader(this, shaderObject);
5415}
5416
5417void Context::genBuffers(GLsizei n, GLuint *buffers)
5418{
5419 for (int i = 0; i < n; i++)
5420 {
5421 buffers[i] = createBuffer();
5422 }
5423}
5424
5425void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5426{
5427 for (int i = 0; i < n; i++)
5428 {
5429 framebuffers[i] = createFramebuffer();
5430 }
5431}
5432
5433void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5434{
5435 for (int i = 0; i < n; i++)
5436 {
5437 renderbuffers[i] = createRenderbuffer();
5438 }
5439}
5440
5441void Context::genTextures(GLsizei n, GLuint *textures)
5442{
5443 for (int i = 0; i < n; i++)
5444 {
5445 textures[i] = createTexture();
5446 }
5447}
5448
5449void Context::getActiveAttrib(GLuint program,
5450 GLuint index,
5451 GLsizei bufsize,
5452 GLsizei *length,
5453 GLint *size,
5454 GLenum *type,
5455 GLchar *name)
5456{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005457 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005458 ASSERT(programObject);
5459 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5460}
5461
5462void Context::getActiveUniform(GLuint program,
5463 GLuint index,
5464 GLsizei bufsize,
5465 GLsizei *length,
5466 GLint *size,
5467 GLenum *type,
5468 GLchar *name)
5469{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005470 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005471 ASSERT(programObject);
5472 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5473}
5474
5475void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5476{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005477 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005478 ASSERT(programObject);
5479 programObject->getAttachedShaders(maxcount, count, shaders);
5480}
5481
5482GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5483{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005484 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005485 ASSERT(programObject);
5486 return programObject->getAttributeLocation(name);
5487}
5488
5489void Context::getBooleanv(GLenum pname, GLboolean *params)
5490{
5491 GLenum nativeType;
5492 unsigned int numParams = 0;
5493 getQueryParameterInfo(pname, &nativeType, &numParams);
5494
5495 if (nativeType == GL_BOOL)
5496 {
5497 getBooleanvImpl(pname, params);
5498 }
5499 else
5500 {
5501 CastStateValues(this, nativeType, pname, numParams, params);
5502 }
5503}
5504
Brandon Jones59770802018-04-02 13:18:42 -07005505void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5506{
5507 getBooleanv(pname, params);
5508}
5509
Jamie Madillc1d770e2017-04-13 17:31:24 -04005510void Context::getFloatv(GLenum pname, GLfloat *params)
5511{
5512 GLenum nativeType;
5513 unsigned int numParams = 0;
5514 getQueryParameterInfo(pname, &nativeType, &numParams);
5515
5516 if (nativeType == GL_FLOAT)
5517 {
5518 getFloatvImpl(pname, params);
5519 }
5520 else
5521 {
5522 CastStateValues(this, nativeType, pname, numParams, params);
5523 }
5524}
5525
Brandon Jones59770802018-04-02 13:18:42 -07005526void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5527{
5528 getFloatv(pname, params);
5529}
5530
Jamie Madillc1d770e2017-04-13 17:31:24 -04005531void Context::getIntegerv(GLenum pname, GLint *params)
5532{
5533 GLenum nativeType;
5534 unsigned int numParams = 0;
5535 getQueryParameterInfo(pname, &nativeType, &numParams);
5536
5537 if (nativeType == GL_INT)
5538 {
5539 getIntegervImpl(pname, params);
5540 }
5541 else
5542 {
5543 CastStateValues(this, nativeType, pname, numParams, params);
5544 }
5545}
5546
Brandon Jones59770802018-04-02 13:18:42 -07005547void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5548{
5549 getIntegerv(pname, data);
5550}
5551
Jamie Madillc1d770e2017-04-13 17:31:24 -04005552void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5553{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005554 // Don't resolve link if checking the link completion status.
5555 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5556 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005557 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005558 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005559}
5560
Brandon Jones59770802018-04-02 13:18:42 -07005561void Context::getProgramivRobust(GLuint program,
5562 GLenum pname,
5563 GLsizei bufSize,
5564 GLsizei *length,
5565 GLint *params)
5566{
5567 getProgramiv(program, pname, params);
5568}
5569
Jiajia Qin5451d532017-11-16 17:16:34 +08005570void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5571{
5572 UNIMPLEMENTED();
5573}
5574
Jamie Madillbe849e42017-05-02 15:49:00 -04005575void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005576{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005577 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005578 ASSERT(programObject);
5579 programObject->getInfoLog(bufsize, length, infolog);
5580}
5581
Jiajia Qin5451d532017-11-16 17:16:34 +08005582void Context::getProgramPipelineInfoLog(GLuint pipeline,
5583 GLsizei bufSize,
5584 GLsizei *length,
5585 GLchar *infoLog)
5586{
5587 UNIMPLEMENTED();
5588}
5589
Jamie Madillc1d770e2017-04-13 17:31:24 -04005590void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5591{
5592 Shader *shaderObject = getShader(shader);
5593 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005594 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005595}
5596
Brandon Jones59770802018-04-02 13:18:42 -07005597void Context::getShaderivRobust(GLuint shader,
5598 GLenum pname,
5599 GLsizei bufSize,
5600 GLsizei *length,
5601 GLint *params)
5602{
5603 getShaderiv(shader, pname, params);
5604}
5605
Jamie Madillc1d770e2017-04-13 17:31:24 -04005606void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5607{
5608 Shader *shaderObject = getShader(shader);
5609 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005610 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005611}
5612
5613void Context::getShaderPrecisionFormat(GLenum shadertype,
5614 GLenum precisiontype,
5615 GLint *range,
5616 GLint *precision)
5617{
5618 // TODO(jmadill): Compute shaders.
5619
5620 switch (shadertype)
5621 {
5622 case GL_VERTEX_SHADER:
5623 switch (precisiontype)
5624 {
5625 case GL_LOW_FLOAT:
5626 mCaps.vertexLowpFloat.get(range, precision);
5627 break;
5628 case GL_MEDIUM_FLOAT:
5629 mCaps.vertexMediumpFloat.get(range, precision);
5630 break;
5631 case GL_HIGH_FLOAT:
5632 mCaps.vertexHighpFloat.get(range, precision);
5633 break;
5634
5635 case GL_LOW_INT:
5636 mCaps.vertexLowpInt.get(range, precision);
5637 break;
5638 case GL_MEDIUM_INT:
5639 mCaps.vertexMediumpInt.get(range, precision);
5640 break;
5641 case GL_HIGH_INT:
5642 mCaps.vertexHighpInt.get(range, precision);
5643 break;
5644
5645 default:
5646 UNREACHABLE();
5647 return;
5648 }
5649 break;
5650
5651 case GL_FRAGMENT_SHADER:
5652 switch (precisiontype)
5653 {
5654 case GL_LOW_FLOAT:
5655 mCaps.fragmentLowpFloat.get(range, precision);
5656 break;
5657 case GL_MEDIUM_FLOAT:
5658 mCaps.fragmentMediumpFloat.get(range, precision);
5659 break;
5660 case GL_HIGH_FLOAT:
5661 mCaps.fragmentHighpFloat.get(range, precision);
5662 break;
5663
5664 case GL_LOW_INT:
5665 mCaps.fragmentLowpInt.get(range, precision);
5666 break;
5667 case GL_MEDIUM_INT:
5668 mCaps.fragmentMediumpInt.get(range, precision);
5669 break;
5670 case GL_HIGH_INT:
5671 mCaps.fragmentHighpInt.get(range, precision);
5672 break;
5673
5674 default:
5675 UNREACHABLE();
5676 return;
5677 }
5678 break;
5679
5680 default:
5681 UNREACHABLE();
5682 return;
5683 }
5684}
5685
5686void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5687{
5688 Shader *shaderObject = getShader(shader);
5689 ASSERT(shaderObject);
5690 shaderObject->getSource(bufsize, length, source);
5691}
5692
5693void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5694{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005695 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005696 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005697 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005698}
5699
Brandon Jones59770802018-04-02 13:18:42 -07005700void Context::getUniformfvRobust(GLuint program,
5701 GLint location,
5702 GLsizei bufSize,
5703 GLsizei *length,
5704 GLfloat *params)
5705{
5706 getUniformfv(program, location, params);
5707}
5708
Jamie Madillc1d770e2017-04-13 17:31:24 -04005709void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5710{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005711 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005712 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005713 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005714}
5715
Brandon Jones59770802018-04-02 13:18:42 -07005716void Context::getUniformivRobust(GLuint program,
5717 GLint location,
5718 GLsizei bufSize,
5719 GLsizei *length,
5720 GLint *params)
5721{
5722 getUniformiv(program, location, params);
5723}
5724
Jamie Madillc1d770e2017-04-13 17:31:24 -04005725GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5726{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005727 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005728 ASSERT(programObject);
5729 return programObject->getUniformLocation(name);
5730}
5731
5732GLboolean Context::isBuffer(GLuint buffer)
5733{
5734 if (buffer == 0)
5735 {
5736 return GL_FALSE;
5737 }
5738
5739 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5740}
5741
5742GLboolean Context::isEnabled(GLenum cap)
5743{
5744 return mGLState.getEnableFeature(cap);
5745}
5746
5747GLboolean Context::isFramebuffer(GLuint framebuffer)
5748{
5749 if (framebuffer == 0)
5750 {
5751 return GL_FALSE;
5752 }
5753
5754 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5755}
5756
5757GLboolean Context::isProgram(GLuint program)
5758{
5759 if (program == 0)
5760 {
5761 return GL_FALSE;
5762 }
5763
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005764 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005765}
5766
5767GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5768{
5769 if (renderbuffer == 0)
5770 {
5771 return GL_FALSE;
5772 }
5773
5774 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5775}
5776
5777GLboolean Context::isShader(GLuint shader)
5778{
5779 if (shader == 0)
5780 {
5781 return GL_FALSE;
5782 }
5783
5784 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5785}
5786
5787GLboolean Context::isTexture(GLuint texture)
5788{
5789 if (texture == 0)
5790 {
5791 return GL_FALSE;
5792 }
5793
5794 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5795}
5796
5797void Context::linkProgram(GLuint program)
5798{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005799 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005800 ASSERT(programObject);
5801 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08005802
5803 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
5804 // don't need to worry that:
5805 // 1. Draw calls after link use the new executable code or the old one depending on the link
5806 // result.
5807 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
5808 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
5809 // ProgramD3D.
5810 if (programObject->isInUse())
5811 {
Jamie Madill785e8a02018-10-04 17:42:00 -04005812 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04005813 if (programObject->isLinked())
5814 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04005815 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04005816 }
jchen107ae70d82018-07-06 13:47:01 +08005817 mStateCache.onProgramExecutableChange(this);
5818 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005819}
5820
5821void Context::releaseShaderCompiler()
5822{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005823 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005824}
5825
5826void Context::shaderBinary(GLsizei n,
5827 const GLuint *shaders,
5828 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005829 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005830 GLsizei length)
5831{
5832 // No binary shader formats are supported.
5833 UNIMPLEMENTED();
5834}
5835
Olli Etuaho0ca09752018-09-24 11:00:50 +03005836void Context::bindFragDataLocationIndexed(GLuint program,
5837 GLuint colorNumber,
5838 GLuint index,
5839 const char *name)
5840{
5841 Program *programObject = getProgramNoResolveLink(program);
5842 programObject->bindFragmentOutputLocation(colorNumber, name);
5843 programObject->bindFragmentOutputIndex(index, name);
5844}
5845
5846void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
5847{
5848 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
5849}
5850
5851int Context::getFragDataIndex(GLuint program, const char *name)
5852{
5853 Program *programObject = getProgramResolveLink(program);
5854 return programObject->getFragDataIndex(name);
5855}
5856
5857int Context::getProgramResourceLocationIndex(GLuint program,
5858 GLenum programInterface,
5859 const char *name)
5860{
5861 Program *programObject = getProgramResolveLink(program);
5862 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
5863 return programObject->getFragDataIndex(name);
5864}
5865
Jamie Madillc1d770e2017-04-13 17:31:24 -04005866void Context::shaderSource(GLuint shader,
5867 GLsizei count,
5868 const GLchar *const *string,
5869 const GLint *length)
5870{
5871 Shader *shaderObject = getShader(shader);
5872 ASSERT(shaderObject);
5873 shaderObject->setSource(count, string, length);
5874}
5875
5876void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5877{
5878 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5879}
5880
5881void Context::stencilMask(GLuint mask)
5882{
5883 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5884}
5885
5886void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5887{
5888 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5889}
5890
5891void Context::uniform1f(GLint location, GLfloat x)
5892{
5893 Program *program = mGLState.getProgram();
5894 program->setUniform1fv(location, 1, &x);
5895}
5896
5897void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5898{
5899 Program *program = mGLState.getProgram();
5900 program->setUniform1fv(location, count, v);
5901}
5902
Jamie Madill7e4eff12018-08-08 15:49:26 -04005903void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005904{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005905 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04005906 {
5907 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04005908 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04005909 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005910}
5911
Jamie Madill7e4eff12018-08-08 15:49:26 -04005912void Context::uniform1i(GLint location, GLint x)
5913{
5914 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
5915}
5916
Jamie Madillc1d770e2017-04-13 17:31:24 -04005917void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5918{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005919 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005920}
5921
5922void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5923{
5924 GLfloat xy[2] = {x, y};
5925 Program *program = mGLState.getProgram();
5926 program->setUniform2fv(location, 1, xy);
5927}
5928
5929void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5930{
5931 Program *program = mGLState.getProgram();
5932 program->setUniform2fv(location, count, v);
5933}
5934
5935void Context::uniform2i(GLint location, GLint x, GLint y)
5936{
5937 GLint xy[2] = {x, y};
5938 Program *program = mGLState.getProgram();
5939 program->setUniform2iv(location, 1, xy);
5940}
5941
5942void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
5943{
5944 Program *program = mGLState.getProgram();
5945 program->setUniform2iv(location, count, v);
5946}
5947
5948void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5949{
5950 GLfloat xyz[3] = {x, y, z};
5951 Program *program = mGLState.getProgram();
5952 program->setUniform3fv(location, 1, xyz);
5953}
5954
5955void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
5956{
5957 Program *program = mGLState.getProgram();
5958 program->setUniform3fv(location, count, v);
5959}
5960
5961void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
5962{
5963 GLint xyz[3] = {x, y, z};
5964 Program *program = mGLState.getProgram();
5965 program->setUniform3iv(location, 1, xyz);
5966}
5967
5968void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
5969{
5970 Program *program = mGLState.getProgram();
5971 program->setUniform3iv(location, count, v);
5972}
5973
5974void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5975{
5976 GLfloat xyzw[4] = {x, y, z, w};
5977 Program *program = mGLState.getProgram();
5978 program->setUniform4fv(location, 1, xyzw);
5979}
5980
5981void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
5982{
5983 Program *program = mGLState.getProgram();
5984 program->setUniform4fv(location, count, v);
5985}
5986
5987void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5988{
5989 GLint xyzw[4] = {x, y, z, w};
5990 Program *program = mGLState.getProgram();
5991 program->setUniform4iv(location, 1, xyzw);
5992}
5993
5994void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
5995{
5996 Program *program = mGLState.getProgram();
5997 program->setUniform4iv(location, count, v);
5998}
5999
6000void Context::uniformMatrix2fv(GLint location,
6001 GLsizei count,
6002 GLboolean transpose,
6003 const GLfloat *value)
6004{
6005 Program *program = mGLState.getProgram();
6006 program->setUniformMatrix2fv(location, count, transpose, value);
6007}
6008
6009void Context::uniformMatrix3fv(GLint location,
6010 GLsizei count,
6011 GLboolean transpose,
6012 const GLfloat *value)
6013{
6014 Program *program = mGLState.getProgram();
6015 program->setUniformMatrix3fv(location, count, transpose, value);
6016}
6017
6018void Context::uniformMatrix4fv(GLint location,
6019 GLsizei count,
6020 GLboolean transpose,
6021 const GLfloat *value)
6022{
6023 Program *program = mGLState.getProgram();
6024 program->setUniformMatrix4fv(location, count, transpose, value);
6025}
6026
6027void Context::validateProgram(GLuint program)
6028{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006029 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006030 ASSERT(programObject);
6031 programObject->validate(mCaps);
6032}
6033
Jiajia Qin5451d532017-11-16 17:16:34 +08006034void Context::validateProgramPipeline(GLuint pipeline)
6035{
6036 UNIMPLEMENTED();
6037}
6038
Jamie Madilld04908b2017-06-09 14:15:35 -04006039void Context::getProgramBinary(GLuint program,
6040 GLsizei bufSize,
6041 GLsizei *length,
6042 GLenum *binaryFormat,
6043 void *binary)
6044{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006045 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006046 ASSERT(programObject != nullptr);
6047
6048 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
6049}
6050
6051void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6052{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006053 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006054 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006055
Jamie Madilld04908b2017-06-09 14:15:35 -04006056 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006057 if (programObject->isInUse())
6058 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006059 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006060 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006061 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006062}
6063
Jamie Madillff325f12017-08-26 15:06:05 -04006064void Context::uniform1ui(GLint location, GLuint v0)
6065{
6066 Program *program = mGLState.getProgram();
6067 program->setUniform1uiv(location, 1, &v0);
6068}
6069
6070void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6071{
6072 Program *program = mGLState.getProgram();
6073 const GLuint xy[] = {v0, v1};
6074 program->setUniform2uiv(location, 1, xy);
6075}
6076
6077void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6078{
6079 Program *program = mGLState.getProgram();
6080 const GLuint xyz[] = {v0, v1, v2};
6081 program->setUniform3uiv(location, 1, xyz);
6082}
6083
6084void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6085{
6086 Program *program = mGLState.getProgram();
6087 const GLuint xyzw[] = {v0, v1, v2, v3};
6088 program->setUniform4uiv(location, 1, xyzw);
6089}
6090
6091void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6092{
6093 Program *program = mGLState.getProgram();
6094 program->setUniform1uiv(location, count, value);
6095}
6096void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6097{
6098 Program *program = mGLState.getProgram();
6099 program->setUniform2uiv(location, count, value);
6100}
6101
6102void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6103{
6104 Program *program = mGLState.getProgram();
6105 program->setUniform3uiv(location, count, value);
6106}
6107
6108void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6109{
6110 Program *program = mGLState.getProgram();
6111 program->setUniform4uiv(location, count, value);
6112}
6113
Jamie Madillf0e04492017-08-26 15:28:42 -04006114void Context::genQueries(GLsizei n, GLuint *ids)
6115{
6116 for (GLsizei i = 0; i < n; i++)
6117 {
6118 GLuint handle = mQueryHandleAllocator.allocate();
6119 mQueryMap.assign(handle, nullptr);
6120 ids[i] = handle;
6121 }
6122}
6123
6124void Context::deleteQueries(GLsizei n, const GLuint *ids)
6125{
6126 for (int i = 0; i < n; i++)
6127 {
6128 GLuint query = ids[i];
6129
6130 Query *queryObject = nullptr;
6131 if (mQueryMap.erase(query, &queryObject))
6132 {
6133 mQueryHandleAllocator.release(query);
6134 if (queryObject)
6135 {
6136 queryObject->release(this);
6137 }
6138 }
6139 }
6140}
6141
6142GLboolean Context::isQuery(GLuint id)
6143{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006144 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006145}
6146
Jamie Madillc8c95812017-08-26 18:40:09 -04006147void Context::uniformMatrix2x3fv(GLint location,
6148 GLsizei count,
6149 GLboolean transpose,
6150 const GLfloat *value)
6151{
6152 Program *program = mGLState.getProgram();
6153 program->setUniformMatrix2x3fv(location, count, transpose, value);
6154}
6155
6156void Context::uniformMatrix3x2fv(GLint location,
6157 GLsizei count,
6158 GLboolean transpose,
6159 const GLfloat *value)
6160{
6161 Program *program = mGLState.getProgram();
6162 program->setUniformMatrix3x2fv(location, count, transpose, value);
6163}
6164
6165void Context::uniformMatrix2x4fv(GLint location,
6166 GLsizei count,
6167 GLboolean transpose,
6168 const GLfloat *value)
6169{
6170 Program *program = mGLState.getProgram();
6171 program->setUniformMatrix2x4fv(location, count, transpose, value);
6172}
6173
6174void Context::uniformMatrix4x2fv(GLint location,
6175 GLsizei count,
6176 GLboolean transpose,
6177 const GLfloat *value)
6178{
6179 Program *program = mGLState.getProgram();
6180 program->setUniformMatrix4x2fv(location, count, transpose, value);
6181}
6182
6183void Context::uniformMatrix3x4fv(GLint location,
6184 GLsizei count,
6185 GLboolean transpose,
6186 const GLfloat *value)
6187{
6188 Program *program = mGLState.getProgram();
6189 program->setUniformMatrix3x4fv(location, count, transpose, value);
6190}
6191
6192void Context::uniformMatrix4x3fv(GLint location,
6193 GLsizei count,
6194 GLboolean transpose,
6195 const GLfloat *value)
6196{
6197 Program *program = mGLState.getProgram();
6198 program->setUniformMatrix4x3fv(location, count, transpose, value);
6199}
6200
Jamie Madilld7576732017-08-26 18:49:50 -04006201void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6202{
6203 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6204 {
6205 GLuint vertexArray = arrays[arrayIndex];
6206
6207 if (arrays[arrayIndex] != 0)
6208 {
6209 VertexArray *vertexArrayObject = nullptr;
6210 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6211 {
6212 if (vertexArrayObject != nullptr)
6213 {
6214 detachVertexArray(vertexArray);
6215 vertexArrayObject->onDestroy(this);
6216 }
6217
6218 mVertexArrayHandleAllocator.release(vertexArray);
6219 }
6220 }
6221 }
6222}
6223
6224void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6225{
6226 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6227 {
6228 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6229 mVertexArrayMap.assign(vertexArray, nullptr);
6230 arrays[arrayIndex] = vertexArray;
6231 }
6232}
6233
6234bool Context::isVertexArray(GLuint array)
6235{
6236 if (array == 0)
6237 {
6238 return GL_FALSE;
6239 }
6240
6241 VertexArray *vao = getVertexArray(array);
6242 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6243}
6244
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006245void Context::endTransformFeedback()
6246{
6247 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6248 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006249 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006250}
6251
6252void Context::transformFeedbackVaryings(GLuint program,
6253 GLsizei count,
6254 const GLchar *const *varyings,
6255 GLenum bufferMode)
6256{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006257 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006258 ASSERT(programObject);
6259 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6260}
6261
6262void Context::getTransformFeedbackVarying(GLuint program,
6263 GLuint index,
6264 GLsizei bufSize,
6265 GLsizei *length,
6266 GLsizei *size,
6267 GLenum *type,
6268 GLchar *name)
6269{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006270 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006271 ASSERT(programObject);
6272 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6273}
6274
6275void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6276{
6277 for (int i = 0; i < n; i++)
6278 {
6279 GLuint transformFeedback = ids[i];
6280 if (transformFeedback == 0)
6281 {
6282 continue;
6283 }
6284
6285 TransformFeedback *transformFeedbackObject = nullptr;
6286 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6287 {
6288 if (transformFeedbackObject != nullptr)
6289 {
6290 detachTransformFeedback(transformFeedback);
6291 transformFeedbackObject->release(this);
6292 }
6293
6294 mTransformFeedbackHandleAllocator.release(transformFeedback);
6295 }
6296 }
6297}
6298
6299void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6300{
6301 for (int i = 0; i < n; i++)
6302 {
6303 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6304 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6305 ids[i] = transformFeedback;
6306 }
6307}
6308
6309bool Context::isTransformFeedback(GLuint id)
6310{
6311 if (id == 0)
6312 {
6313 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6314 // returns FALSE
6315 return GL_FALSE;
6316 }
6317
6318 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6319 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6320}
6321
6322void Context::pauseTransformFeedback()
6323{
6324 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6325 transformFeedback->pause();
6326}
6327
6328void Context::resumeTransformFeedback()
6329{
6330 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6331 transformFeedback->resume();
6332}
6333
Jamie Madill12e957f2017-08-26 21:42:26 -04006334void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6335{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006336 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006337 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006338}
6339
Brandon Jones59770802018-04-02 13:18:42 -07006340void Context::getUniformuivRobust(GLuint program,
6341 GLint location,
6342 GLsizei bufSize,
6343 GLsizei *length,
6344 GLuint *params)
6345{
6346 getUniformuiv(program, location, params);
6347}
6348
Jamie Madill12e957f2017-08-26 21:42:26 -04006349GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6350{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006351 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006352 return programObject->getFragDataLocation(name);
6353}
6354
6355void Context::getUniformIndices(GLuint program,
6356 GLsizei uniformCount,
6357 const GLchar *const *uniformNames,
6358 GLuint *uniformIndices)
6359{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006360 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006361 if (!programObject->isLinked())
6362 {
6363 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6364 {
6365 uniformIndices[uniformId] = GL_INVALID_INDEX;
6366 }
6367 }
6368 else
6369 {
6370 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6371 {
6372 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6373 }
6374 }
6375}
6376
6377void Context::getActiveUniformsiv(GLuint program,
6378 GLsizei uniformCount,
6379 const GLuint *uniformIndices,
6380 GLenum pname,
6381 GLint *params)
6382{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006383 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006384 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6385 {
6386 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006387 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006388 }
6389}
6390
6391GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6392{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006393 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006394 return programObject->getUniformBlockIndex(uniformBlockName);
6395}
6396
6397void Context::getActiveUniformBlockiv(GLuint program,
6398 GLuint uniformBlockIndex,
6399 GLenum pname,
6400 GLint *params)
6401{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006402 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006403 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6404}
6405
Brandon Jones59770802018-04-02 13:18:42 -07006406void Context::getActiveUniformBlockivRobust(GLuint program,
6407 GLuint uniformBlockIndex,
6408 GLenum pname,
6409 GLsizei bufSize,
6410 GLsizei *length,
6411 GLint *params)
6412{
6413 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6414}
6415
Jamie Madill12e957f2017-08-26 21:42:26 -04006416void Context::getActiveUniformBlockName(GLuint program,
6417 GLuint uniformBlockIndex,
6418 GLsizei bufSize,
6419 GLsizei *length,
6420 GLchar *uniformBlockName)
6421{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006422 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006423 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6424}
6425
6426void Context::uniformBlockBinding(GLuint program,
6427 GLuint uniformBlockIndex,
6428 GLuint uniformBlockBinding)
6429{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006430 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006431 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006432
Jamie Madill956ab4d2018-10-10 16:13:03 -04006433 // Note: If the Program is shared between Contexts we would be better using Observer/Subject.
Jamie Madill70aeda42018-08-20 12:17:40 -04006434 if (programObject->isInUse())
6435 {
6436 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006437 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006438 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006439}
6440
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006441GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6442{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006443 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6444 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006445
Jamie Madill70b5bb02017-08-28 13:32:37 -04006446 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006447 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006448 if (error.isError())
6449 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006450 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006451 handleError(error);
6452 return nullptr;
6453 }
6454
Jamie Madill70b5bb02017-08-28 13:32:37 -04006455 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006456}
6457
6458GLboolean Context::isSync(GLsync sync)
6459{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006460 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006461}
6462
6463GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6464{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006465 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006466
6467 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006468 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006469 return result;
6470}
6471
6472void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6473{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006474 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006475 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006476}
6477
6478void Context::getInteger64v(GLenum pname, GLint64 *params)
6479{
6480 GLenum nativeType = GL_NONE;
6481 unsigned int numParams = 0;
6482 getQueryParameterInfo(pname, &nativeType, &numParams);
6483
6484 if (nativeType == GL_INT_64_ANGLEX)
6485 {
6486 getInteger64vImpl(pname, params);
6487 }
6488 else
6489 {
6490 CastStateValues(this, nativeType, pname, numParams, params);
6491 }
6492}
6493
Brandon Jones59770802018-04-02 13:18:42 -07006494void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6495{
6496 getInteger64v(pname, data);
6497}
6498
Corentin Wallez336129f2017-10-17 15:55:40 -04006499void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006500{
6501 Buffer *buffer = mGLState.getTargetBuffer(target);
6502 QueryBufferParameteri64v(buffer, pname, params);
6503}
6504
Brandon Jones59770802018-04-02 13:18:42 -07006505void Context::getBufferParameteri64vRobust(BufferBinding target,
6506 GLenum pname,
6507 GLsizei bufSize,
6508 GLsizei *length,
6509 GLint64 *params)
6510{
6511 getBufferParameteri64v(target, pname, params);
6512}
6513
Jamie Madill3ef140a2017-08-26 23:11:21 -04006514void Context::genSamplers(GLsizei count, GLuint *samplers)
6515{
6516 for (int i = 0; i < count; i++)
6517 {
6518 samplers[i] = mState.mSamplers->createSampler();
6519 }
6520}
6521
6522void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6523{
6524 for (int i = 0; i < count; i++)
6525 {
6526 GLuint sampler = samplers[i];
6527
6528 if (mState.mSamplers->getSampler(sampler))
6529 {
6530 detachSampler(sampler);
6531 }
6532
6533 mState.mSamplers->deleteObject(this, sampler);
6534 }
6535}
6536
6537void Context::getInternalformativ(GLenum target,
6538 GLenum internalformat,
6539 GLenum pname,
6540 GLsizei bufSize,
6541 GLint *params)
6542{
6543 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6544 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6545}
6546
Brandon Jones59770802018-04-02 13:18:42 -07006547void Context::getInternalformativRobust(GLenum target,
6548 GLenum internalformat,
6549 GLenum pname,
6550 GLsizei bufSize,
6551 GLsizei *length,
6552 GLint *params)
6553{
6554 getInternalformativ(target, internalformat, pname, bufSize, params);
6555}
6556
Jiajia Qin5451d532017-11-16 17:16:34 +08006557void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6558{
6559 programUniform1iv(program, location, 1, &v0);
6560}
6561
6562void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6563{
6564 GLint xy[2] = {v0, v1};
6565 programUniform2iv(program, location, 1, xy);
6566}
6567
6568void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6569{
6570 GLint xyz[3] = {v0, v1, v2};
6571 programUniform3iv(program, location, 1, xyz);
6572}
6573
6574void Context::programUniform4i(GLuint program,
6575 GLint location,
6576 GLint v0,
6577 GLint v1,
6578 GLint v2,
6579 GLint v3)
6580{
6581 GLint xyzw[4] = {v0, v1, v2, v3};
6582 programUniform4iv(program, location, 1, xyzw);
6583}
6584
6585void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6586{
6587 programUniform1uiv(program, location, 1, &v0);
6588}
6589
6590void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6591{
6592 GLuint xy[2] = {v0, v1};
6593 programUniform2uiv(program, location, 1, xy);
6594}
6595
6596void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6597{
6598 GLuint xyz[3] = {v0, v1, v2};
6599 programUniform3uiv(program, location, 1, xyz);
6600}
6601
6602void Context::programUniform4ui(GLuint program,
6603 GLint location,
6604 GLuint v0,
6605 GLuint v1,
6606 GLuint v2,
6607 GLuint v3)
6608{
6609 GLuint xyzw[4] = {v0, v1, v2, v3};
6610 programUniform4uiv(program, location, 1, xyzw);
6611}
6612
6613void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6614{
6615 programUniform1fv(program, location, 1, &v0);
6616}
6617
6618void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6619{
6620 GLfloat xy[2] = {v0, v1};
6621 programUniform2fv(program, location, 1, xy);
6622}
6623
6624void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6625{
6626 GLfloat xyz[3] = {v0, v1, v2};
6627 programUniform3fv(program, location, 1, xyz);
6628}
6629
6630void Context::programUniform4f(GLuint program,
6631 GLint location,
6632 GLfloat v0,
6633 GLfloat v1,
6634 GLfloat v2,
6635 GLfloat v3)
6636{
6637 GLfloat xyzw[4] = {v0, v1, v2, v3};
6638 programUniform4fv(program, location, 1, xyzw);
6639}
6640
Jamie Madill81c2e252017-09-09 23:32:46 -04006641void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6642{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006643 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006644 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006645 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006646}
6647
Jiajia Qin5451d532017-11-16 17:16:34 +08006648void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6649{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006650 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006651 ASSERT(programObject);
6652 programObject->setUniform2iv(location, count, value);
6653}
6654
6655void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6656{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006657 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006658 ASSERT(programObject);
6659 programObject->setUniform3iv(location, count, value);
6660}
6661
6662void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6663{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006664 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006665 ASSERT(programObject);
6666 programObject->setUniform4iv(location, count, value);
6667}
6668
6669void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6670{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006671 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006672 ASSERT(programObject);
6673 programObject->setUniform1uiv(location, count, value);
6674}
6675
6676void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6677{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006678 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006679 ASSERT(programObject);
6680 programObject->setUniform2uiv(location, count, value);
6681}
6682
6683void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6684{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006685 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006686 ASSERT(programObject);
6687 programObject->setUniform3uiv(location, count, value);
6688}
6689
6690void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6691{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006692 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006693 ASSERT(programObject);
6694 programObject->setUniform4uiv(location, count, value);
6695}
6696
6697void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6698{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006699 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006700 ASSERT(programObject);
6701 programObject->setUniform1fv(location, count, value);
6702}
6703
6704void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6705{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006706 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006707 ASSERT(programObject);
6708 programObject->setUniform2fv(location, count, value);
6709}
6710
6711void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6712{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006713 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006714 ASSERT(programObject);
6715 programObject->setUniform3fv(location, count, value);
6716}
6717
6718void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6719{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006720 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006721 ASSERT(programObject);
6722 programObject->setUniform4fv(location, count, value);
6723}
6724
6725void Context::programUniformMatrix2fv(GLuint program,
6726 GLint location,
6727 GLsizei count,
6728 GLboolean transpose,
6729 const GLfloat *value)
6730{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006731 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006732 ASSERT(programObject);
6733 programObject->setUniformMatrix2fv(location, count, transpose, value);
6734}
6735
6736void Context::programUniformMatrix3fv(GLuint program,
6737 GLint location,
6738 GLsizei count,
6739 GLboolean transpose,
6740 const GLfloat *value)
6741{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006742 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006743 ASSERT(programObject);
6744 programObject->setUniformMatrix3fv(location, count, transpose, value);
6745}
6746
6747void Context::programUniformMatrix4fv(GLuint program,
6748 GLint location,
6749 GLsizei count,
6750 GLboolean transpose,
6751 const GLfloat *value)
6752{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006753 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006754 ASSERT(programObject);
6755 programObject->setUniformMatrix4fv(location, count, transpose, value);
6756}
6757
6758void Context::programUniformMatrix2x3fv(GLuint program,
6759 GLint location,
6760 GLsizei count,
6761 GLboolean transpose,
6762 const GLfloat *value)
6763{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006764 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006765 ASSERT(programObject);
6766 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6767}
6768
6769void Context::programUniformMatrix3x2fv(GLuint program,
6770 GLint location,
6771 GLsizei count,
6772 GLboolean transpose,
6773 const GLfloat *value)
6774{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006775 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006776 ASSERT(programObject);
6777 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6778}
6779
6780void Context::programUniformMatrix2x4fv(GLuint program,
6781 GLint location,
6782 GLsizei count,
6783 GLboolean transpose,
6784 const GLfloat *value)
6785{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006786 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006787 ASSERT(programObject);
6788 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6789}
6790
6791void Context::programUniformMatrix4x2fv(GLuint program,
6792 GLint location,
6793 GLsizei count,
6794 GLboolean transpose,
6795 const GLfloat *value)
6796{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006797 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006798 ASSERT(programObject);
6799 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6800}
6801
6802void Context::programUniformMatrix3x4fv(GLuint program,
6803 GLint location,
6804 GLsizei count,
6805 GLboolean transpose,
6806 const GLfloat *value)
6807{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006808 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006809 ASSERT(programObject);
6810 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6811}
6812
6813void Context::programUniformMatrix4x3fv(GLuint program,
6814 GLint location,
6815 GLsizei count,
6816 GLboolean transpose,
6817 const GLfloat *value)
6818{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006819 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006820 ASSERT(programObject);
6821 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6822}
6823
Jamie Madill81c2e252017-09-09 23:32:46 -04006824void Context::onTextureChange(const Texture *texture)
6825{
6826 // Conservatively assume all textures are dirty.
6827 // TODO(jmadill): More fine-grained update.
6828 mGLState.setObjectDirty(GL_TEXTURE);
6829}
6830
James Darpiniane8a93c62018-01-04 18:02:24 -08006831bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6832{
6833 return mGLState.isCurrentTransformFeedback(tf);
6834}
James Darpiniane8a93c62018-01-04 18:02:24 -08006835
Yunchao Hea336b902017-08-02 16:05:21 +08006836void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6837{
6838 for (int i = 0; i < count; i++)
6839 {
6840 pipelines[i] = createProgramPipeline();
6841 }
6842}
6843
6844void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6845{
6846 for (int i = 0; i < count; i++)
6847 {
6848 if (pipelines[i] != 0)
6849 {
6850 deleteProgramPipeline(pipelines[i]);
6851 }
6852 }
6853}
6854
6855GLboolean Context::isProgramPipeline(GLuint pipeline)
6856{
6857 if (pipeline == 0)
6858 {
6859 return GL_FALSE;
6860 }
6861
6862 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6863}
6864
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006865void Context::finishFenceNV(GLuint fence)
6866{
6867 FenceNV *fenceObject = getFenceNV(fence);
6868
6869 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04006870 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006871}
6872
6873void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6874{
6875 FenceNV *fenceObject = getFenceNV(fence);
6876
6877 ASSERT(fenceObject && fenceObject->isSet());
6878
6879 switch (pname)
6880 {
6881 case GL_FENCE_STATUS_NV:
6882 {
6883 // GL_NV_fence spec:
6884 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6885 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6886 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6887 GLboolean status = GL_TRUE;
6888 if (fenceObject->getStatus() != GL_TRUE)
6889 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006890 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006891 }
6892 *params = status;
6893 break;
6894 }
6895
6896 case GL_FENCE_CONDITION_NV:
6897 {
6898 *params = static_cast<GLint>(fenceObject->getCondition());
6899 break;
6900 }
6901
6902 default:
6903 UNREACHABLE();
6904 }
6905}
6906
6907void Context::getTranslatedShaderSource(GLuint shader,
6908 GLsizei bufsize,
6909 GLsizei *length,
6910 GLchar *source)
6911{
6912 Shader *shaderObject = getShader(shader);
6913 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08006914 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006915}
6916
6917void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6918{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006919 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006920 ASSERT(programObject);
6921
6922 programObject->getUniformfv(this, location, params);
6923}
6924
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006925void Context::getnUniformfvRobust(GLuint program,
6926 GLint location,
6927 GLsizei bufSize,
6928 GLsizei *length,
6929 GLfloat *params)
6930{
6931 UNIMPLEMENTED();
6932}
6933
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006934void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
6935{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006936 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006937 ASSERT(programObject);
6938
6939 programObject->getUniformiv(this, location, params);
6940}
6941
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006942void Context::getnUniformivRobust(GLuint program,
6943 GLint location,
6944 GLsizei bufSize,
6945 GLsizei *length,
6946 GLint *params)
6947{
6948 UNIMPLEMENTED();
6949}
6950
6951void Context::getnUniformuivRobust(GLuint program,
6952 GLint location,
6953 GLsizei bufSize,
6954 GLsizei *length,
6955 GLuint *params)
6956{
6957 UNIMPLEMENTED();
6958}
6959
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006960GLboolean Context::isFenceNV(GLuint fence)
6961{
6962 FenceNV *fenceObject = getFenceNV(fence);
6963
6964 if (fenceObject == nullptr)
6965 {
6966 return GL_FALSE;
6967 }
6968
6969 // GL_NV_fence spec:
6970 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
6971 // existing fence.
6972 return fenceObject->isSet();
6973}
6974
6975void Context::readnPixels(GLint x,
6976 GLint y,
6977 GLsizei width,
6978 GLsizei height,
6979 GLenum format,
6980 GLenum type,
6981 GLsizei bufSize,
6982 void *data)
6983{
6984 return readPixels(x, y, width, height, format, type, data);
6985}
6986
Jamie Madill007530e2017-12-28 14:27:04 -05006987void Context::setFenceNV(GLuint fence, GLenum condition)
6988{
6989 ASSERT(condition == GL_ALL_COMPLETED_NV);
6990
6991 FenceNV *fenceObject = getFenceNV(fence);
6992 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04006993 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05006994}
6995
6996GLboolean Context::testFenceNV(GLuint fence)
6997{
6998 FenceNV *fenceObject = getFenceNV(fence);
6999
7000 ASSERT(fenceObject != nullptr);
7001 ASSERT(fenceObject->isSet() == GL_TRUE);
7002
7003 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04007004 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05007005 if (error.isError())
7006 {
7007 handleError(error);
7008 return GL_TRUE;
7009 }
7010
7011 return result;
7012}
7013
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007014void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007015{
7016 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007017 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05007018 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007019}
7020
Jamie Madillfa920eb2018-01-04 11:45:50 -05007021void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007022{
7023 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007024 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05007025 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
7026}
7027
Jamie Madillfa920eb2018-01-04 11:45:50 -05007028void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7029{
7030 UNIMPLEMENTED();
7031}
7032
Jamie Madill5b772312018-03-08 20:28:32 -05007033bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7034{
7035 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7036 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7037 // to the fact that it is stored internally as a float, and so would require conversion
7038 // if returned from Context::getIntegerv. Since this conversion is already implemented
7039 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7040 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7041 // application.
7042 switch (pname)
7043 {
7044 case GL_COMPRESSED_TEXTURE_FORMATS:
7045 {
7046 *type = GL_INT;
7047 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7048 return true;
7049 }
7050 case GL_SHADER_BINARY_FORMATS:
7051 {
7052 *type = GL_INT;
7053 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7054 return true;
7055 }
7056
7057 case GL_MAX_VERTEX_ATTRIBS:
7058 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7059 case GL_MAX_VARYING_VECTORS:
7060 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7061 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7062 case GL_MAX_TEXTURE_IMAGE_UNITS:
7063 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7064 case GL_MAX_RENDERBUFFER_SIZE:
7065 case GL_NUM_SHADER_BINARY_FORMATS:
7066 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7067 case GL_ARRAY_BUFFER_BINDING:
7068 case GL_FRAMEBUFFER_BINDING:
7069 case GL_RENDERBUFFER_BINDING:
7070 case GL_CURRENT_PROGRAM:
7071 case GL_PACK_ALIGNMENT:
7072 case GL_UNPACK_ALIGNMENT:
7073 case GL_GENERATE_MIPMAP_HINT:
7074 case GL_RED_BITS:
7075 case GL_GREEN_BITS:
7076 case GL_BLUE_BITS:
7077 case GL_ALPHA_BITS:
7078 case GL_DEPTH_BITS:
7079 case GL_STENCIL_BITS:
7080 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7081 case GL_CULL_FACE_MODE:
7082 case GL_FRONT_FACE:
7083 case GL_ACTIVE_TEXTURE:
7084 case GL_STENCIL_FUNC:
7085 case GL_STENCIL_VALUE_MASK:
7086 case GL_STENCIL_REF:
7087 case GL_STENCIL_FAIL:
7088 case GL_STENCIL_PASS_DEPTH_FAIL:
7089 case GL_STENCIL_PASS_DEPTH_PASS:
7090 case GL_STENCIL_BACK_FUNC:
7091 case GL_STENCIL_BACK_VALUE_MASK:
7092 case GL_STENCIL_BACK_REF:
7093 case GL_STENCIL_BACK_FAIL:
7094 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7095 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7096 case GL_DEPTH_FUNC:
7097 case GL_BLEND_SRC_RGB:
7098 case GL_BLEND_SRC_ALPHA:
7099 case GL_BLEND_DST_RGB:
7100 case GL_BLEND_DST_ALPHA:
7101 case GL_BLEND_EQUATION_RGB:
7102 case GL_BLEND_EQUATION_ALPHA:
7103 case GL_STENCIL_WRITEMASK:
7104 case GL_STENCIL_BACK_WRITEMASK:
7105 case GL_STENCIL_CLEAR_VALUE:
7106 case GL_SUBPIXEL_BITS:
7107 case GL_MAX_TEXTURE_SIZE:
7108 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7109 case GL_SAMPLE_BUFFERS:
7110 case GL_SAMPLES:
7111 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7112 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7113 case GL_TEXTURE_BINDING_2D:
7114 case GL_TEXTURE_BINDING_CUBE_MAP:
7115 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7116 {
7117 *type = GL_INT;
7118 *numParams = 1;
7119 return true;
7120 }
7121 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7122 {
7123 if (!getExtensions().packReverseRowOrder)
7124 {
7125 return false;
7126 }
7127 *type = GL_INT;
7128 *numParams = 1;
7129 return true;
7130 }
7131 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7132 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7133 {
7134 if (!getExtensions().textureRectangle)
7135 {
7136 return false;
7137 }
7138 *type = GL_INT;
7139 *numParams = 1;
7140 return true;
7141 }
7142 case GL_MAX_DRAW_BUFFERS_EXT:
7143 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7144 {
7145 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7146 {
7147 return false;
7148 }
7149 *type = GL_INT;
7150 *numParams = 1;
7151 return true;
7152 }
7153 case GL_MAX_VIEWPORT_DIMS:
7154 {
7155 *type = GL_INT;
7156 *numParams = 2;
7157 return true;
7158 }
7159 case GL_VIEWPORT:
7160 case GL_SCISSOR_BOX:
7161 {
7162 *type = GL_INT;
7163 *numParams = 4;
7164 return true;
7165 }
7166 case GL_SHADER_COMPILER:
7167 case GL_SAMPLE_COVERAGE_INVERT:
7168 case GL_DEPTH_WRITEMASK:
7169 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7170 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7171 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7172 // bool-natural
7173 case GL_SAMPLE_COVERAGE:
7174 case GL_SCISSOR_TEST:
7175 case GL_STENCIL_TEST:
7176 case GL_DEPTH_TEST:
7177 case GL_BLEND:
7178 case GL_DITHER:
7179 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7180 {
7181 *type = GL_BOOL;
7182 *numParams = 1;
7183 return true;
7184 }
7185 case GL_COLOR_WRITEMASK:
7186 {
7187 *type = GL_BOOL;
7188 *numParams = 4;
7189 return true;
7190 }
7191 case GL_POLYGON_OFFSET_FACTOR:
7192 case GL_POLYGON_OFFSET_UNITS:
7193 case GL_SAMPLE_COVERAGE_VALUE:
7194 case GL_DEPTH_CLEAR_VALUE:
7195 case GL_LINE_WIDTH:
7196 {
7197 *type = GL_FLOAT;
7198 *numParams = 1;
7199 return true;
7200 }
7201 case GL_ALIASED_LINE_WIDTH_RANGE:
7202 case GL_ALIASED_POINT_SIZE_RANGE:
7203 case GL_DEPTH_RANGE:
7204 {
7205 *type = GL_FLOAT;
7206 *numParams = 2;
7207 return true;
7208 }
7209 case GL_COLOR_CLEAR_VALUE:
7210 case GL_BLEND_COLOR:
7211 {
7212 *type = GL_FLOAT;
7213 *numParams = 4;
7214 return true;
7215 }
7216 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7217 if (!getExtensions().textureFilterAnisotropic)
7218 {
7219 return false;
7220 }
7221 *type = GL_FLOAT;
7222 *numParams = 1;
7223 return true;
7224 case GL_TIMESTAMP_EXT:
7225 if (!getExtensions().disjointTimerQuery)
7226 {
7227 return false;
7228 }
7229 *type = GL_INT_64_ANGLEX;
7230 *numParams = 1;
7231 return true;
7232 case GL_GPU_DISJOINT_EXT:
7233 if (!getExtensions().disjointTimerQuery)
7234 {
7235 return false;
7236 }
7237 *type = GL_INT;
7238 *numParams = 1;
7239 return true;
7240 case GL_COVERAGE_MODULATION_CHROMIUM:
7241 if (!getExtensions().framebufferMixedSamples)
7242 {
7243 return false;
7244 }
7245 *type = GL_INT;
7246 *numParams = 1;
7247 return true;
7248 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7249 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7250 {
7251 return false;
7252 }
7253 *type = GL_INT;
7254 *numParams = 1;
7255 return true;
7256 }
7257
7258 if (getExtensions().debug)
7259 {
7260 switch (pname)
7261 {
7262 case GL_DEBUG_LOGGED_MESSAGES:
7263 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7264 case GL_DEBUG_GROUP_STACK_DEPTH:
7265 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7266 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7267 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7268 case GL_MAX_LABEL_LENGTH:
7269 *type = GL_INT;
7270 *numParams = 1;
7271 return true;
7272
7273 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7274 case GL_DEBUG_OUTPUT:
7275 *type = GL_BOOL;
7276 *numParams = 1;
7277 return true;
7278 }
7279 }
7280
7281 if (getExtensions().multisampleCompatibility)
7282 {
7283 switch (pname)
7284 {
7285 case GL_MULTISAMPLE_EXT:
7286 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7287 *type = GL_BOOL;
7288 *numParams = 1;
7289 return true;
7290 }
7291 }
7292
7293 if (getExtensions().pathRendering)
7294 {
7295 switch (pname)
7296 {
7297 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7298 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7299 *type = GL_FLOAT;
7300 *numParams = 16;
7301 return true;
7302 }
7303 }
7304
7305 if (getExtensions().bindGeneratesResource)
7306 {
7307 switch (pname)
7308 {
7309 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7310 *type = GL_BOOL;
7311 *numParams = 1;
7312 return true;
7313 }
7314 }
7315
7316 if (getExtensions().clientArrays)
7317 {
7318 switch (pname)
7319 {
7320 case GL_CLIENT_ARRAYS_ANGLE:
7321 *type = GL_BOOL;
7322 *numParams = 1;
7323 return true;
7324 }
7325 }
7326
7327 if (getExtensions().sRGBWriteControl)
7328 {
7329 switch (pname)
7330 {
7331 case GL_FRAMEBUFFER_SRGB_EXT:
7332 *type = GL_BOOL;
7333 *numParams = 1;
7334 return true;
7335 }
7336 }
7337
7338 if (getExtensions().robustResourceInitialization &&
7339 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7340 {
7341 *type = GL_BOOL;
7342 *numParams = 1;
7343 return true;
7344 }
7345
7346 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7347 {
7348 *type = GL_BOOL;
7349 *numParams = 1;
7350 return true;
7351 }
7352
jchen1082af6202018-06-22 10:59:52 +08007353 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7354 {
7355 *type = GL_INT;
7356 *numParams = 1;
7357 return true;
7358 }
7359
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007360 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7361 {
7362 *type = GL_INT;
7363 *numParams = 1;
7364 return true;
7365 }
7366
Jamie Madill5b772312018-03-08 20:28:32 -05007367 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7368 switch (pname)
7369 {
7370 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7371 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7372 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7373 {
7374 return false;
7375 }
7376 *type = GL_INT;
7377 *numParams = 1;
7378 return true;
7379
7380 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7381 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7382 {
7383 return false;
7384 }
7385 *type = GL_INT;
7386 *numParams = 1;
7387 return true;
7388
7389 case GL_PROGRAM_BINARY_FORMATS_OES:
7390 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7391 {
7392 return false;
7393 }
7394 *type = GL_INT;
7395 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7396 return true;
7397
7398 case GL_PACK_ROW_LENGTH:
7399 case GL_PACK_SKIP_ROWS:
7400 case GL_PACK_SKIP_PIXELS:
7401 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7402 {
7403 return false;
7404 }
7405 *type = GL_INT;
7406 *numParams = 1;
7407 return true;
7408 case GL_UNPACK_ROW_LENGTH:
7409 case GL_UNPACK_SKIP_ROWS:
7410 case GL_UNPACK_SKIP_PIXELS:
7411 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7412 {
7413 return false;
7414 }
7415 *type = GL_INT;
7416 *numParams = 1;
7417 return true;
7418 case GL_VERTEX_ARRAY_BINDING:
7419 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7420 {
7421 return false;
7422 }
7423 *type = GL_INT;
7424 *numParams = 1;
7425 return true;
7426 case GL_PIXEL_PACK_BUFFER_BINDING:
7427 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7428 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7429 {
7430 return false;
7431 }
7432 *type = GL_INT;
7433 *numParams = 1;
7434 return true;
7435 case GL_MAX_SAMPLES:
7436 {
7437 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7438 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7439 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7440 {
7441 return false;
7442 }
7443 *type = GL_INT;
7444 *numParams = 1;
7445 return true;
7446
7447 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7448 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7449 {
7450 return false;
7451 }
7452 *type = GL_INT;
7453 *numParams = 1;
7454 return true;
7455 }
7456 }
7457
7458 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7459 {
7460 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7461 {
7462 return false;
7463 }
7464 *type = GL_INT;
7465 *numParams = 1;
7466 return true;
7467 }
7468
7469 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7470 {
7471 *type = GL_INT;
7472 *numParams = 1;
7473 return true;
7474 }
7475
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007476 if (getClientVersion() < Version(2, 0))
7477 {
7478 switch (pname)
7479 {
7480 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007481 case GL_CLIENT_ACTIVE_TEXTURE:
7482 case GL_MATRIX_MODE:
7483 case GL_MAX_TEXTURE_UNITS:
7484 case GL_MAX_MODELVIEW_STACK_DEPTH:
7485 case GL_MAX_PROJECTION_STACK_DEPTH:
7486 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007487 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007488 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007489 case GL_VERTEX_ARRAY_STRIDE:
7490 case GL_NORMAL_ARRAY_STRIDE:
7491 case GL_COLOR_ARRAY_STRIDE:
7492 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7493 case GL_VERTEX_ARRAY_SIZE:
7494 case GL_COLOR_ARRAY_SIZE:
7495 case GL_TEXTURE_COORD_ARRAY_SIZE:
7496 case GL_VERTEX_ARRAY_TYPE:
7497 case GL_NORMAL_ARRAY_TYPE:
7498 case GL_COLOR_ARRAY_TYPE:
7499 case GL_TEXTURE_COORD_ARRAY_TYPE:
7500 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7501 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7502 case GL_COLOR_ARRAY_BUFFER_BINDING:
7503 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7504 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7505 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7506 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007507 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007508 case GL_MODELVIEW_STACK_DEPTH:
7509 case GL_PROJECTION_STACK_DEPTH:
7510 case GL_TEXTURE_STACK_DEPTH:
7511 case GL_LOGIC_OP_MODE:
7512 case GL_BLEND_SRC:
7513 case GL_BLEND_DST:
7514 case GL_PERSPECTIVE_CORRECTION_HINT:
7515 case GL_POINT_SMOOTH_HINT:
7516 case GL_LINE_SMOOTH_HINT:
7517 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007518 *type = GL_INT;
7519 *numParams = 1;
7520 return true;
7521 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007522 case GL_FOG_DENSITY:
7523 case GL_FOG_START:
7524 case GL_FOG_END:
7525 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007526 case GL_POINT_SIZE:
7527 case GL_POINT_SIZE_MIN:
7528 case GL_POINT_SIZE_MAX:
7529 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007530 *type = GL_FLOAT;
7531 *numParams = 1;
7532 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007533 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007534 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007535 *type = GL_FLOAT;
7536 *numParams = 2;
7537 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007538 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007539 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007540 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007541 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007542 *type = GL_FLOAT;
7543 *numParams = 4;
7544 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007545 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007546 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007547 *type = GL_FLOAT;
7548 *numParams = 3;
7549 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007550 case GL_MODELVIEW_MATRIX:
7551 case GL_PROJECTION_MATRIX:
7552 case GL_TEXTURE_MATRIX:
7553 *type = GL_FLOAT;
7554 *numParams = 16;
7555 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007556 case GL_LIGHT_MODEL_TWO_SIDE:
7557 *type = GL_BOOL;
7558 *numParams = 1;
7559 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007560 }
7561 }
7562
Jamie Madill5b772312018-03-08 20:28:32 -05007563 if (getClientVersion() < Version(3, 0))
7564 {
7565 return false;
7566 }
7567
7568 // Check for ES3.0+ parameter names
7569 switch (pname)
7570 {
7571 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7572 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7573 case GL_UNIFORM_BUFFER_BINDING:
7574 case GL_TRANSFORM_FEEDBACK_BINDING:
7575 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7576 case GL_COPY_READ_BUFFER_BINDING:
7577 case GL_COPY_WRITE_BUFFER_BINDING:
7578 case GL_SAMPLER_BINDING:
7579 case GL_READ_BUFFER:
7580 case GL_TEXTURE_BINDING_3D:
7581 case GL_TEXTURE_BINDING_2D_ARRAY:
7582 case GL_MAX_3D_TEXTURE_SIZE:
7583 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7584 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7585 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7586 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7587 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7588 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7589 case GL_MAX_VARYING_COMPONENTS:
7590 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7591 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7592 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7593 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7594 case GL_NUM_EXTENSIONS:
7595 case GL_MAJOR_VERSION:
7596 case GL_MINOR_VERSION:
7597 case GL_MAX_ELEMENTS_INDICES:
7598 case GL_MAX_ELEMENTS_VERTICES:
7599 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7600 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7601 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7602 case GL_UNPACK_IMAGE_HEIGHT:
7603 case GL_UNPACK_SKIP_IMAGES:
7604 {
7605 *type = GL_INT;
7606 *numParams = 1;
7607 return true;
7608 }
7609
7610 case GL_MAX_ELEMENT_INDEX:
7611 case GL_MAX_UNIFORM_BLOCK_SIZE:
7612 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7613 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7614 case GL_MAX_SERVER_WAIT_TIMEOUT:
7615 {
7616 *type = GL_INT_64_ANGLEX;
7617 *numParams = 1;
7618 return true;
7619 }
7620
7621 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7622 case GL_TRANSFORM_FEEDBACK_PAUSED:
7623 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7624 case GL_RASTERIZER_DISCARD:
7625 {
7626 *type = GL_BOOL;
7627 *numParams = 1;
7628 return true;
7629 }
7630
7631 case GL_MAX_TEXTURE_LOD_BIAS:
7632 {
7633 *type = GL_FLOAT;
7634 *numParams = 1;
7635 return true;
7636 }
7637 }
7638
7639 if (getExtensions().requestExtension)
7640 {
7641 switch (pname)
7642 {
7643 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7644 *type = GL_INT;
7645 *numParams = 1;
7646 return true;
7647 }
7648 }
7649
7650 if (getClientVersion() < Version(3, 1))
7651 {
7652 return false;
7653 }
7654
7655 switch (pname)
7656 {
7657 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7658 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7659 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7660 case GL_MAX_FRAMEBUFFER_WIDTH:
7661 case GL_MAX_FRAMEBUFFER_HEIGHT:
7662 case GL_MAX_FRAMEBUFFER_SAMPLES:
7663 case GL_MAX_SAMPLE_MASK_WORDS:
7664 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7665 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7666 case GL_MAX_INTEGER_SAMPLES:
7667 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7668 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7669 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7670 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7671 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7672 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7673 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7674 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7675 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7676 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7677 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7678 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7679 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7680 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7681 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7682 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7683 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7684 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7685 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7686 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7687 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7688 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7689 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7690 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7691 case GL_MAX_UNIFORM_LOCATIONS:
7692 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7693 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7694 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7695 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7696 case GL_MAX_IMAGE_UNITS:
7697 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7698 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7699 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7700 case GL_SHADER_STORAGE_BUFFER_BINDING:
7701 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7702 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007703 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007704 *type = GL_INT;
7705 *numParams = 1;
7706 return true;
7707 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7708 *type = GL_INT_64_ANGLEX;
7709 *numParams = 1;
7710 return true;
7711 case GL_SAMPLE_MASK:
7712 *type = GL_BOOL;
7713 *numParams = 1;
7714 return true;
7715 }
7716
7717 if (getExtensions().geometryShader)
7718 {
7719 switch (pname)
7720 {
7721 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7722 case GL_LAYER_PROVOKING_VERTEX_EXT:
7723 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7724 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7725 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7726 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7727 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7728 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7729 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7730 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7731 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7732 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7733 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7734 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7735 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7736 *type = GL_INT;
7737 *numParams = 1;
7738 return true;
7739 }
7740 }
7741
7742 return false;
7743}
7744
7745bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7746{
7747 if (getClientVersion() < Version(3, 0))
7748 {
7749 return false;
7750 }
7751
7752 switch (target)
7753 {
7754 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7755 case GL_UNIFORM_BUFFER_BINDING:
7756 {
7757 *type = GL_INT;
7758 *numParams = 1;
7759 return true;
7760 }
7761 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7762 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7763 case GL_UNIFORM_BUFFER_START:
7764 case GL_UNIFORM_BUFFER_SIZE:
7765 {
7766 *type = GL_INT_64_ANGLEX;
7767 *numParams = 1;
7768 return true;
7769 }
7770 }
7771
7772 if (getClientVersion() < Version(3, 1))
7773 {
7774 return false;
7775 }
7776
7777 switch (target)
7778 {
7779 case GL_IMAGE_BINDING_LAYERED:
7780 {
7781 *type = GL_BOOL;
7782 *numParams = 1;
7783 return true;
7784 }
7785 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7786 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7787 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7788 case GL_SHADER_STORAGE_BUFFER_BINDING:
7789 case GL_VERTEX_BINDING_BUFFER:
7790 case GL_VERTEX_BINDING_DIVISOR:
7791 case GL_VERTEX_BINDING_OFFSET:
7792 case GL_VERTEX_BINDING_STRIDE:
7793 case GL_SAMPLE_MASK_VALUE:
7794 case GL_IMAGE_BINDING_NAME:
7795 case GL_IMAGE_BINDING_LEVEL:
7796 case GL_IMAGE_BINDING_LAYER:
7797 case GL_IMAGE_BINDING_ACCESS:
7798 case GL_IMAGE_BINDING_FORMAT:
7799 {
7800 *type = GL_INT;
7801 *numParams = 1;
7802 return true;
7803 }
7804 case GL_ATOMIC_COUNTER_BUFFER_START:
7805 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7806 case GL_SHADER_STORAGE_BUFFER_START:
7807 case GL_SHADER_STORAGE_BUFFER_SIZE:
7808 {
7809 *type = GL_INT_64_ANGLEX;
7810 *numParams = 1;
7811 return true;
7812 }
7813 }
7814
7815 return false;
7816}
7817
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007818Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05007819{
7820 return mState.mShaderPrograms->getProgram(handle);
7821}
7822
7823Shader *Context::getShader(GLuint handle) const
7824{
7825 return mState.mShaderPrograms->getShader(handle);
7826}
7827
Jamie Madill5b772312018-03-08 20:28:32 -05007828bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7829{
7830 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7831}
7832
7833bool Context::isFramebufferGenerated(GLuint framebuffer) const
7834{
7835 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7836}
7837
7838bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7839{
7840 return mState.mPipelines->isHandleGenerated(pipeline);
7841}
7842
7843bool Context::usingDisplayTextureShareGroup() const
7844{
7845 return mDisplayTextureShareGroup;
7846}
7847
7848GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7849{
7850 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7851 internalformat == GL_DEPTH_STENCIL
7852 ? GL_DEPTH24_STENCIL8
7853 : internalformat;
7854}
7855
jchen1082af6202018-06-22 10:59:52 +08007856void Context::maxShaderCompilerThreads(GLuint count)
7857{
jchen107ae70d82018-07-06 13:47:01 +08007858 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08007859 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08007860 // A count of zero specifies a request for no parallel compiling or linking.
7861 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
7862 {
7863 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
7864 }
7865 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08007866}
7867
Jamie Madill2eb65032018-07-30 10:25:57 -04007868bool Context::isGLES1() const
7869{
7870 return mState.getClientVersion() < Version(2, 0);
7871}
7872
Jamie Madilla11819d2018-07-30 10:26:01 -04007873void Context::onSubjectStateChange(const Context *context,
7874 angle::SubjectIndex index,
7875 angle::SubjectMessage message)
7876{
Jamie Madilla11819d2018-07-30 10:26:01 -04007877 switch (index)
7878 {
7879 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007880 switch (message)
7881 {
7882 case angle::SubjectMessage::CONTENTS_CHANGED:
7883 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
7884 mStateCache.onVertexArrayBufferContentsChange(this);
7885 break;
7886 case angle::SubjectMessage::RESOURCE_MAPPED:
7887 case angle::SubjectMessage::RESOURCE_UNMAPPED:
7888 case angle::SubjectMessage::BINDING_CHANGED:
7889 mStateCache.onVertexArrayBufferStateChange(this);
7890 break;
7891 default:
7892 break;
7893 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007894 break;
7895
7896 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007897 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7898 {
7899 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
7900 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007901 break;
7902
7903 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007904 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7905 {
7906 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
7907 }
7908 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04007909 break;
7910
7911 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04007912 if (index < kTextureMaxSubjectIndex)
7913 {
7914 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04007915 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007916 }
Jamie Madille25b8002018-09-20 13:39:49 -04007917 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04007918 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04007919 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04007920 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007921 }
Jamie Madille25b8002018-09-20 13:39:49 -04007922 else
7923 {
7924 ASSERT(index < kSamplerMaxSubjectIndex);
7925 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
7926 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007927 break;
7928 }
7929}
7930
Jamie Madill6b873dd2018-07-12 23:56:30 -04007931// ErrorSet implementation.
7932ErrorSet::ErrorSet(Context *context) : mContext(context)
7933{
7934}
7935
7936ErrorSet::~ErrorSet() = default;
7937
Jamie Madill306b6c12018-07-27 08:12:49 -04007938void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04007939{
7940 // This internal enum is used to filter internal errors that are already handled.
7941 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
7942 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
7943 {
7944 return;
7945 }
7946
7947 if (ANGLE_UNLIKELY(error.isError()))
7948 {
7949 GLenum code = error.getCode();
7950 mErrors.insert(code);
Jamie Madill785e8a02018-10-04 17:42:00 -04007951
Jamie Madill6b873dd2018-07-12 23:56:30 -04007952 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
7953 {
7954 mContext->markContextLost();
7955 }
7956
7957 ASSERT(!error.getMessage().empty());
7958 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
7959 error.getID(), GL_DEBUG_SEVERITY_HIGH,
7960 error.getMessage());
7961 }
7962}
7963
Jamie Madillabfbc0f2018-10-09 12:48:52 -04007964void ErrorSet::handleError(GLenum errorCode,
7965 const char *message,
7966 const char *file,
7967 const char *function,
7968 unsigned int line)
7969{
7970 // TODO(jmadill): Handle error directly instead of creating object. http://anglebug.com/2491
7971 std::stringstream errorStream;
7972 errorStream << "Front-end Error: " << gl::FmtHex(errorCode) << ", in " << file << ", "
7973 << function << ":" << line << ". " << message;
7974
7975 handleError(gl::Error(errorCode, errorCode, errorStream.str()));
7976}
7977
Jamie Madilla139f012018-10-10 16:13:03 -04007978void ErrorSet::validationError(GLenum errorCode, const char *message)
7979{
7980 handleError(gl::Error(errorCode, message));
7981}
7982
Jamie Madill6b873dd2018-07-12 23:56:30 -04007983bool ErrorSet::empty() const
7984{
7985 return mErrors.empty();
7986}
7987
7988GLenum ErrorSet::popError()
7989{
7990 ASSERT(!empty());
7991 GLenum error = *mErrors.begin();
7992 mErrors.erase(mErrors.begin());
7993 return error;
7994}
Jamie Madilldc358af2018-07-31 11:22:13 -04007995
7996// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04007997StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007998 : mCachedHasAnyEnabledClientAttrib(false),
7999 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04008000 mCachedInstancedVertexElementLimit(0),
8001 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madilldc358af2018-07-31 11:22:13 -04008002{
8003}
8004
8005StateCache::~StateCache() = default;
8006
Jamie Madillac66f982018-10-09 18:30:01 -04008007void StateCache::initialize(Context *context)
8008{
8009 updateValidDrawModes(context);
8010 updateValidBindTextureTypes(context);
8011}
8012
Jamie Madilldc358af2018-07-31 11:22:13 -04008013void StateCache::updateActiveAttribsMask(Context *context)
8014{
8015 bool isGLES1 = context->isGLES1();
8016 const State &glState = context->getGLState();
8017
8018 if (!isGLES1 && !glState.getProgram())
8019 {
8020 mCachedActiveBufferedAttribsMask = AttributesMask();
8021 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008022 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008023 return;
8024 }
8025
8026 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8027 : glState.getProgram()->getActiveAttribLocationsMask();
8028
8029 const VertexArray *vao = glState.getVertexArray();
8030 ASSERT(vao);
8031
8032 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8033 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008034 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008035
Jamie Madill0a17e482018-08-31 17:19:11 -04008036 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8037 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008038 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008039 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8040}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008041
8042void StateCache::updateVertexElementLimits(Context *context)
8043{
8044 const VertexArray *vao = context->getGLState().getVertexArray();
8045
8046 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8047 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8048
8049 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8050 // If there are no buffered attributes then we should not limit the draw call count.
8051 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8052 {
8053 return;
8054 }
8055
8056 const auto &vertexAttribs = vao->getVertexAttributes();
8057 const auto &vertexBindings = vao->getVertexBindings();
8058
8059 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8060 {
8061 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8062 ASSERT(attrib.enabled);
8063
8064 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8065 ASSERT(context->isGLES1() ||
8066 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8067
8068 GLint64 limit = attrib.getCachedElementLimit();
8069 if (binding.getDivisor() > 0)
8070 {
8071 mCachedInstancedVertexElementLimit =
8072 std::min(mCachedInstancedVertexElementLimit, limit);
8073 }
8074 else
8075 {
8076 mCachedNonInstancedVertexElementLimit =
8077 std::min(mCachedNonInstancedVertexElementLimit, limit);
8078 }
8079 }
8080}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008081
Jamie Madilld84b6732018-09-06 15:54:35 -04008082void StateCache::updateBasicDrawStatesError()
8083{
8084 mCachedBasicDrawStatesError = kInvalidPointer;
8085}
8086
8087intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8088{
8089 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8090 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8091 return mCachedBasicDrawStatesError;
8092}
8093
Jamie Madillc43cdad2018-08-08 15:49:25 -04008094void StateCache::onVertexArrayBindingChange(Context *context)
8095{
8096 updateActiveAttribsMask(context);
8097 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008098 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008099}
8100
8101void StateCache::onProgramExecutableChange(Context *context)
8102{
8103 updateActiveAttribsMask(context);
8104 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008105 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008106 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008107}
8108
Jamie Madilld84b6732018-09-06 15:54:35 -04008109void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008110{
8111 updateVertexElementLimits(context);
8112}
8113
Jamie Madilld84b6732018-09-06 15:54:35 -04008114void StateCache::onVertexArrayBufferContentsChange(Context *context)
8115{
8116 updateVertexElementLimits(context);
8117 updateBasicDrawStatesError();
8118}
8119
Jamie Madillc43cdad2018-08-08 15:49:25 -04008120void StateCache::onVertexArrayStateChange(Context *context)
8121{
8122 updateActiveAttribsMask(context);
8123 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008124 updateBasicDrawStatesError();
8125}
8126
8127void StateCache::onVertexArrayBufferStateChange(Context *context)
8128{
8129 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008130}
8131
8132void StateCache::onGLES1ClientStateChange(Context *context)
8133{
8134 updateActiveAttribsMask(context);
8135}
Jamie Madilld84b6732018-09-06 15:54:35 -04008136
8137void StateCache::onDrawFramebufferChange(Context *context)
8138{
8139 updateBasicDrawStatesError();
8140}
8141
8142void StateCache::onContextCapChange(Context *context)
8143{
8144 updateBasicDrawStatesError();
8145}
8146
8147void StateCache::onStencilStateChange(Context *context)
8148{
8149 updateBasicDrawStatesError();
8150}
8151
8152void StateCache::onDefaultVertexAttributeChange(Context *context)
8153{
8154 updateBasicDrawStatesError();
8155}
8156
8157void StateCache::onActiveTextureChange(Context *context)
8158{
8159 updateBasicDrawStatesError();
8160}
8161
8162void StateCache::onQueryChange(Context *context)
8163{
8164 updateBasicDrawStatesError();
8165}
8166
8167void StateCache::onTransformFeedbackChange(Context *context)
8168{
8169 updateBasicDrawStatesError();
8170}
8171
8172void StateCache::onUniformBufferStateChange(Context *context)
8173{
8174 updateBasicDrawStatesError();
8175}
8176
8177void StateCache::onBufferBindingChange(Context *context)
8178{
8179 updateBasicDrawStatesError();
8180}
Jamie Madill526a6f62018-09-12 11:03:05 -04008181
8182void StateCache::updateValidDrawModes(Context *context)
8183{
8184 Program *program = context->getGLState().getProgram();
8185 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8186 {
8187 mCachedValidDrawModes = {{
8188 true, /* Points */
8189 true, /* Lines */
8190 true, /* LineLoop */
8191 true, /* LineStrip */
8192 true, /* Triangles */
8193 true, /* TriangleStrip */
8194 true, /* TriangleFan */
8195 false, /* LinesAdjacency */
8196 false, /* LineStripAdjacency */
8197 false, /* TrianglesAdjacency */
8198 false, /* TriangleStripAdjacency */
8199 false, /* InvalidEnum */
8200 }};
8201 }
8202 else
8203 {
8204 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8205
8206 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8207
8208 mCachedValidDrawModes = {{
8209 gsMode == PrimitiveMode::Points, /* Points */
8210 gsMode == PrimitiveMode::Lines, /* Lines */
8211 gsMode == PrimitiveMode::Lines, /* LineLoop */
8212 gsMode == PrimitiveMode::Lines, /* LineStrip */
8213 gsMode == PrimitiveMode::Triangles, /* Triangles */
8214 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8215 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8216 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8217 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8218 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8219 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8220 false, /* InvalidEnum */
8221 }};
8222 }
8223}
Jamie Madillac66f982018-10-09 18:30:01 -04008224
8225void StateCache::updateValidBindTextureTypes(Context *context)
8226{
8227 const Extensions &exts = context->getExtensions();
8228 bool isGLES3 = context->getClientMajorVersion() >= 3;
8229 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8230
8231 mCachedValidBindTextureTypes = {{
8232 true, /* _2D */
8233 isGLES3, /* _2DArray */
8234 isGLES31, /* _2DMultisample */
8235 exts.textureStorageMultisample2DArray, /* _2DMultisampleArray */
8236 isGLES3, /* _3D */
8237 exts.eglImageExternal || exts.eglStreamConsumerExternal, /* External */
8238 exts.textureRectangle, /* Rectangle */
8239 true, /* CubeMap */
8240 false, /* InvalidEnum */
8241
8242 }};
8243}
Jamie Madillc29968b2016-01-20 11:17:23 -05008244} // namespace gl