blob: 0d3095155962c761afee1e5dcc0bbc4567f43be6 [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 Madill231c7f52017-04-26 13:45:37 -040044#include "libANGLE/renderer/ContextImpl.h"
45#include "libANGLE/renderer/EGLImplFactory.h"
Jamie Madill7b62cf92017-11-02 15:20:49 -040046#include "libANGLE/renderer/Format.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040047#include "libANGLE/validationES.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000048
Geoff Langf6db0982015-08-25 13:04:00 -040049namespace
50{
51
Jamie Madillb6664922017-07-25 12:55:04 -040052#define ANGLE_HANDLE_ERR(X) \
53 handleError(X); \
54 return;
55#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
56
Ian Ewell3ffd78b2016-01-22 16:09:42 -050057template <typename T>
Geoff Lang4ddf5af2016-12-01 14:30:44 -050058std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030059 GLsizei numPaths,
60 const void *paths,
61 GLuint pathBase)
62{
63 std::vector<gl::Path *> ret;
64 ret.reserve(numPaths);
65
66 const auto *nameArray = static_cast<const T *>(paths);
67
68 for (GLsizei i = 0; i < numPaths; ++i)
69 {
70 const GLuint pathName = nameArray[i] + pathBase;
71
72 ret.push_back(resourceManager.getPath(pathName));
73 }
74
75 return ret;
76}
77
Geoff Lang4ddf5af2016-12-01 14:30:44 -050078std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030079 GLsizei numPaths,
80 GLenum pathNameType,
81 const void *paths,
82 GLuint pathBase)
83{
84 switch (pathNameType)
85 {
86 case GL_UNSIGNED_BYTE:
87 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
88
89 case GL_BYTE:
90 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
91
92 case GL_UNSIGNED_SHORT:
93 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
94
95 case GL_SHORT:
96 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
97
98 case GL_UNSIGNED_INT:
99 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
100
101 case GL_INT:
102 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
103 }
104
105 UNREACHABLE();
106 return std::vector<gl::Path *>();
107}
108
109template <typename T>
Jamie Madill5188a272018-07-25 10:53:56 -0400110gl::Error GetQueryObjectParameter(const gl::Context *context,
111 gl::Query *query,
112 GLenum pname,
113 T *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500114{
Geoff Lang2186c382016-10-14 10:54:54 -0400115 ASSERT(query != nullptr);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500116
117 switch (pname)
118 {
119 case GL_QUERY_RESULT_EXT:
Jamie Madill5188a272018-07-25 10:53:56 -0400120 return query->getResult(context, params);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500121 case GL_QUERY_RESULT_AVAILABLE_EXT:
122 {
123 bool available;
Jamie Madill5188a272018-07-25 10:53:56 -0400124 gl::Error error = query->isResultAvailable(context, &available);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500125 if (!error.isError())
126 {
jchen10a99ed552017-09-22 08:10:32 +0800127 *params = gl::CastFromStateValue<T>(pname, static_cast<GLuint>(available));
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500128 }
129 return error;
130 }
131 default:
132 UNREACHABLE();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500133 return gl::InternalError() << "Unreachable Error";
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500134 }
135}
136
Jamie Madill09463932018-04-04 05:26:59 -0400137void MarkTransformFeedbackBufferUsage(const gl::Context *context,
138 gl::TransformFeedback *transformFeedback,
James Darpinian30b604d2018-03-12 17:26:57 -0700139 GLsizei count,
140 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -0400141{
Geoff Lang1a683462015-09-29 15:09:59 -0400142 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400143 {
Jamie Madill09463932018-04-04 05:26:59 -0400144 transformFeedback->onVerticesDrawn(context, count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -0400145 }
146}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500147
148// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300149EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500150{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400151 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500152}
153
Martin Radev1be913c2016-07-11 17:59:16 +0300154EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
155{
156 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
157}
158
Geoff Langeb66a6e2016-10-31 13:06:12 -0400159gl::Version GetClientVersion(const egl::AttributeMap &attribs)
160{
161 return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
162}
163
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500164GLenum GetResetStrategy(const egl::AttributeMap &attribs)
165{
Lingfeng Yangb27b03a2018-02-19 13:38:48 -0800166 EGLAttrib attrib =
167 attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500168 switch (attrib)
169 {
170 case EGL_NO_RESET_NOTIFICATION:
171 return GL_NO_RESET_NOTIFICATION_EXT;
172 case EGL_LOSE_CONTEXT_ON_RESET:
173 return GL_LOSE_CONTEXT_ON_RESET_EXT;
174 default:
175 UNREACHABLE();
176 return GL_NONE;
177 }
178}
179
180bool GetRobustAccess(const egl::AttributeMap &attribs)
181{
Geoff Lang077f20a2016-11-01 10:08:02 -0400182 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
183 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
184 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500185}
186
187bool GetDebug(const egl::AttributeMap &attribs)
188{
Geoff Lang077f20a2016-11-01 10:08:02 -0400189 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
190 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500191}
192
193bool GetNoError(const egl::AttributeMap &attribs)
194{
195 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
196}
197
Geoff Langc287ea62016-09-16 14:46:51 -0400198bool GetWebGLContext(const egl::AttributeMap &attribs)
199{
200 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
201}
202
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400203bool GetExtensionsEnabled(const egl::AttributeMap &attribs, bool webGLContext)
204{
205 // If the context is WebGL, extensions are disabled by default
206 EGLAttrib defaultValue = webGLContext ? EGL_FALSE : EGL_TRUE;
207 return (attribs.get(EGL_EXTENSIONS_ENABLED_ANGLE, defaultValue) == EGL_TRUE);
208}
209
Geoff Langf41a7152016-09-19 15:11:17 -0400210bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
211{
212 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
213}
214
Geoff Langfeb8c682017-02-13 16:07:35 -0500215bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
216{
217 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
218}
219
Geoff Langb433e872017-10-05 14:01:47 -0400220bool GetRobustResourceInit(const egl::AttributeMap &attribs)
221{
222 return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
223}
224
Martin Radev9d901792016-07-15 15:58:58 +0300225std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
226{
227 std::string labelName;
228 if (label != nullptr)
229 {
230 size_t labelLength = length < 0 ? strlen(label) : length;
231 labelName = std::string(label, labelLength);
232 }
233 return labelName;
234}
235
236void GetObjectLabelBase(const std::string &objectLabel,
237 GLsizei bufSize,
238 GLsizei *length,
239 GLchar *label)
240{
241 size_t writeLength = objectLabel.length();
242 if (label != nullptr && bufSize > 0)
243 {
244 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
245 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
246 label[writeLength] = '\0';
247 }
248
249 if (length != nullptr)
250 {
251 *length = static_cast<GLsizei>(writeLength);
252 }
253}
254
Jamie Madill0f80ed82017-09-19 00:24:56 -0400255template <typename CapT, typename MaxT>
256void LimitCap(CapT *cap, MaxT maximum)
257{
258 *cap = std::min(*cap, static_cast<CapT>(maximum));
259}
260
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600261constexpr angle::PackedEnumMap<gl::PrimitiveMode, GLsizei> kMinimumPrimitiveCounts = {{
262 /* Points */ 1,
263 /* Lines */ 2,
264 /* LineLoop */ 2,
265 /* LineStrip */ 2,
266 /* Triangles */ 3,
267 /* TriangleStrip */ 3,
268 /* TriangleFan */ 3,
269 /* LinesAdjacency */ 2,
270 /* LineStripAdjacency */ 2,
271 /* TrianglesAdjacency */ 3,
272 /* TriangleStripAdjacency */ 3,
273}};
274// Indices above are code-gen'd so make sure they don't change
275// if any of these static asserts are hit, must update kMinimumPrimitiveCounts abouve
276static_assert(static_cast<gl::PrimitiveMode>(0) == gl::PrimitiveMode::Points,
277 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
278static_assert(static_cast<gl::PrimitiveMode>(1) == gl::PrimitiveMode::Lines,
279 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
280static_assert(static_cast<gl::PrimitiveMode>(2) == gl::PrimitiveMode::LineLoop,
281 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
282static_assert(static_cast<gl::PrimitiveMode>(3) == gl::PrimitiveMode::LineStrip,
283 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
284static_assert(static_cast<gl::PrimitiveMode>(4) == gl::PrimitiveMode::Triangles,
285 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
286static_assert(static_cast<gl::PrimitiveMode>(5) == gl::PrimitiveMode::TriangleStrip,
287 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
288static_assert(static_cast<gl::PrimitiveMode>(6) == gl::PrimitiveMode::TriangleFan,
289 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
290static_assert(static_cast<gl::PrimitiveMode>(7) == gl::PrimitiveMode::LinesAdjacency,
291 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
292static_assert(static_cast<gl::PrimitiveMode>(8) == gl::PrimitiveMode::LineStripAdjacency,
293 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
294static_assert(static_cast<gl::PrimitiveMode>(9) == gl::PrimitiveMode::TrianglesAdjacency,
295 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
296static_assert(static_cast<gl::PrimitiveMode>(10) == gl::PrimitiveMode::TriangleStripAdjacency,
297 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
298static_assert(static_cast<gl::PrimitiveMode>(11) == gl::PrimitiveMode::EnumCount,
299 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
300
Jamie Madilla11819d2018-07-30 10:26:01 -0400301constexpr angle::SubjectIndex kVertexArraySubjectIndex = 0;
302constexpr angle::SubjectIndex kReadFramebufferSubjectIndex = 1;
303constexpr angle::SubjectIndex kDrawFramebufferSubjectIndex = 2;
Geoff Langf6db0982015-08-25 13:04:00 -0400304} // anonymous namespace
305
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000306namespace gl
307{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000308
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400309Context::Context(rx::EGLImplFactory *implFactory,
310 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400311 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500312 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400313 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500314 const egl::AttributeMap &attribs,
Brandon Jones2b0cdcc2018-05-02 08:02:50 -0700315 const egl::DisplayExtensions &displayExtensions,
316 const egl::ClientExtensions &clientExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500317 : mState(reinterpret_cast<ContextID>(this),
318 shareContext ? &shareContext->mState : nullptr,
319 shareTextures,
320 GetClientVersion(attribs),
321 &mGLState,
322 mCaps,
323 mTextureCaps,
324 mExtensions,
325 mLimitations),
326 mSkipValidation(GetNoError(attribs)),
327 mDisplayTextureShareGroup(shareTextures != nullptr),
328 mSavedArgsType(nullptr),
Geoff Lang3cacf692018-06-20 16:49:57 -0400329 mImplementation(implFactory->createContext(mState, config, shareContext, attribs)),
Geoff Lang75359662018-04-11 01:42:27 -0400330 mLabel(nullptr),
Jamie Madill2f348d22017-06-05 10:50:59 -0400331 mCompiler(),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400332 mGLState(GetDebug(attribs),
333 GetBindGeneratesResource(attribs),
334 GetClientArraysEnabled(attribs),
335 GetRobustResourceInit(attribs),
336 memoryProgramCache != nullptr),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400337 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500338 mClientType(EGL_OPENGL_ES_API),
Jamie Madill6b873dd2018-07-12 23:56:30 -0400339 mErrors(this),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500340 mHasBeenCurrent(false),
341 mContextLost(false),
342 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700343 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500344 mResetStrategy(GetResetStrategy(attribs)),
345 mRobustAccess(GetRobustAccess(attribs)),
Geoff Lang33f11fb2018-05-07 13:42:47 -0400346 mSurfacelessSupported(displayExtensions.surfacelessContext),
347 mExplicitContextAvailable(clientExtensions.explicitContext),
Jamie Madill61e16b42017-06-19 11:13:23 -0400348 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
349 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madille14951e2017-03-09 18:55:16 -0500350 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400351 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400352 mMemoryProgramCache(memoryProgramCache),
Jamie Madilla11819d2018-07-30 10:26:01 -0400353 mVertexArrayObserverBinding(this, kVertexArraySubjectIndex),
354 mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex),
355 mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400356 mScratchBuffer(1000u),
357 mZeroFilledBuffer(1000u)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000358{
Jamie Madill5b772312018-03-08 20:28:32 -0500359 // Needed to solve a Clang warning of unused variables.
Jamie Madillc6dbc252018-04-30 19:07:56 -0400360 ANGLE_UNUSED_VARIABLE(mSavedArgsType);
361 ANGLE_UNUSED_VARIABLE(mParamsBuffer);
Geoff Lang33f11fb2018-05-07 13:42:47 -0400362}
Jamie Madill5b772312018-03-08 20:28:32 -0500363
Geoff Lang33f11fb2018-05-07 13:42:47 -0400364void Context::initialize()
365{
366 mImplementation->setMemoryProgramCache(mMemoryProgramCache);
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400367
Geoff Lang33f11fb2018-05-07 13:42:47 -0400368 initCaps();
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700369 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400370
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400371 mGLState.initialize(this);
Régis Fénéon83107972015-02-05 12:57:44 +0100372
Shannon Woods53a94a82014-06-24 15:20:36 -0400373 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400374
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000375 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400376 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000377 // and cube map texture state vectors respectively associated with them.
378 // In order that access to these initial textures not be lost, they are treated as texture
379 // objects all of whose names are 0.
380
Corentin Wallez99d492c2018-02-27 15:17:10 -0500381 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800382 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500383
Corentin Wallez99d492c2018-02-27 15:17:10 -0500384 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800385 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400386
Geoff Langeb66a6e2016-10-31 13:06:12 -0400387 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400388 {
389 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500390 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800391 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400392
Corentin Wallez99d492c2018-02-27 15:17:10 -0500393 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800394 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400395 }
Geoff Lang3b573612016-10-31 14:08:10 -0400396 if (getClientVersion() >= Version(3, 1))
397 {
398 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500399 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800400 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800401
Jiajia Qin6eafb042016-12-27 17:04:07 +0800402 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
403 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800404 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800405 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800406
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800407 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
408 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400409 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800410 }
Geoff Lang3b573612016-10-31 14:08:10 -0400411 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000412
Geoff Langb0f917f2017-12-05 13:41:54 -0500413 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400414 {
415 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500416 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800417 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400418 }
419
Geoff Langb0f917f2017-12-05 13:41:54 -0500420 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400421 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500422 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800423 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400424 }
425
Jamie Madill4928b7c2017-06-20 12:57:39 -0400426 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500427
Jamie Madill57a89722013-07-02 11:57:03 -0400428 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000429
Geoff Langeb66a6e2016-10-31 13:06:12 -0400430 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400431 {
432 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
433 // In the initial state, a default transform feedback object is bound and treated as
434 // a transform feedback object with a name of zero. That object is bound any time
435 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400436 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400437 }
Geoff Langc8058452014-02-03 12:04:11 -0500438
Corentin Wallez336129f2017-10-17 15:55:40 -0400439 for (auto type : angle::AllEnums<BufferBinding>())
440 {
441 bindBuffer(type, 0);
442 }
443
444 bindRenderbuffer(GL_RENDERBUFFER, 0);
445
446 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
447 {
448 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
449 }
450
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700451 // Initialize GLES1 renderer if appropriate.
452 if (getClientVersion() < Version(2, 0))
453 {
454 mGLES1Renderer.reset(new GLES1Renderer());
455 }
456
Jamie Madillad9f24e2016-02-12 09:27:24 -0500457 // Initialize dirty bit masks
Geoff Lang9bf86f02018-07-26 11:46:34 -0400458 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
459 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
460 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
461
462 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
463 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
464 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
465
Jamie Madillc67323a2017-11-02 23:11:41 -0400466 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500467 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500468 // No dirty objects.
469
470 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400471 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500472 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400473 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500474 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
475
476 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
477 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
478 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
479 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
480 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
481 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
482 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
483 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
484 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
485 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
486 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400487 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500488 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
489
490 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
491 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700492 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400493 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
494 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500495 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
496 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400497
Xinghua Cao10a4d432017-11-28 14:46:26 +0800498 // TODO(xinghua.cao@intel.com): add other dirty bits and dirty objects.
499 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
500 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
501 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
502 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
503 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800504 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800505 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800506
Jamie Madillb4927eb2018-07-16 11:39:46 -0400507 mImplementation->setErrorSet(&mErrors);
508
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400509 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000510}
511
Jamie Madill4928b7c2017-06-20 12:57:39 -0400512egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000513{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700514 if (mGLES1Renderer)
515 {
516 mGLES1Renderer->onDestroy(this, &mGLState);
517 }
518
Jamie Madille7b3fe22018-04-05 09:42:46 -0400519 // Delete the Surface first to trigger a finish() in Vulkan.
Jamie Madille7b3fe22018-04-05 09:42:46 -0400520 ANGLE_TRY(releaseSurface(display));
521
Corentin Wallez80b24112015-08-25 16:41:57 -0400522 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000523 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400524 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000525 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400526 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000527
Corentin Wallez80b24112015-08-25 16:41:57 -0400528 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000529 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400530 if (query.second != nullptr)
531 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400532 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400533 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000534 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400535 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000536
Corentin Wallez80b24112015-08-25 16:41:57 -0400537 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400538 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400539 if (vertexArray.second)
540 {
541 vertexArray.second->onDestroy(this);
542 }
Jamie Madill57a89722013-07-02 11:57:03 -0400543 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400544 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400545
Corentin Wallez80b24112015-08-25 16:41:57 -0400546 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500547 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500548 if (transformFeedback.second != nullptr)
549 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500550 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500551 }
Geoff Langc8058452014-02-03 12:04:11 -0500552 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400553 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500554
Jamie Madill5b772312018-03-08 20:28:32 -0500555 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400556 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800557 if (zeroTexture.get() != nullptr)
558 {
559 ANGLE_TRY(zeroTexture->onDestroy(this));
560 zeroTexture.set(this, nullptr);
561 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400562 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000563
Jamie Madill2f348d22017-06-05 10:50:59 -0400564 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500565
Jamie Madill4928b7c2017-06-20 12:57:39 -0400566 mGLState.reset(this);
567
Jamie Madill6c1f6712017-02-14 19:08:04 -0500568 mState.mBuffers->release(this);
569 mState.mShaderPrograms->release(this);
570 mState.mTextures->release(this);
571 mState.mRenderbuffers->release(this);
572 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400573 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500574 mState.mPaths->release(this);
575 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800576 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400577
Jamie Madill76e471e2017-10-21 09:56:01 -0400578 mImplementation->onDestroy(this);
579
Jamie Madill4928b7c2017-06-20 12:57:39 -0400580 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000581}
582
Jamie Madill70ee0f62017-02-06 16:04:20 -0500583Context::~Context()
584{
585}
586
Geoff Lang75359662018-04-11 01:42:27 -0400587void Context::setLabel(EGLLabelKHR label)
588{
589 mLabel = label;
590}
591
592EGLLabelKHR Context::getLabel() const
593{
594 return mLabel;
595}
596
Jamie Madill4928b7c2017-06-20 12:57:39 -0400597egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000598{
Jamie Madill61e16b42017-06-19 11:13:23 -0400599 mCurrentDisplay = display;
600
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000601 if (!mHasBeenCurrent)
602 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400603 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000604 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500605 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400606 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000607
Corentin Wallezc295e512017-01-27 17:47:50 -0500608 int width = 0;
609 int height = 0;
610 if (surface != nullptr)
611 {
612 width = surface->getWidth();
613 height = surface->getHeight();
614 }
615
616 mGLState.setViewportParams(0, 0, width, height);
617 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000618
619 mHasBeenCurrent = true;
620 }
621
Jamie Madill1b94d432015-08-07 13:23:23 -0400622 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700623 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400624 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400625
Jamie Madill4928b7c2017-06-20 12:57:39 -0400626 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500627
628 Framebuffer *newDefault = nullptr;
629 if (surface != nullptr)
630 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400631 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500632 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400633 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500634 }
635 else
636 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400637 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500638 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000639
Corentin Wallez37c39792015-08-20 14:19:46 -0400640 // Update default framebuffer, the binding of the previous default
641 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400642 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400643 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700644 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400645 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400646 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400647 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700648 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400649 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400650 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400651 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400652 }
Ian Ewell292f0052016-02-04 10:37:32 -0500653
654 // Notify the renderer of a context switch
Luc Ferron5396f2a2018-07-12 08:24:23 -0400655 ANGLE_TRY(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400656 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000657}
658
Jamie Madill4928b7c2017-06-20 12:57:39 -0400659egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400660{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400661 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400662
Geoff Langbf7b95d2018-05-01 16:48:21 -0400663 // Remove the default framebuffer
664 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500665 {
666 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400667 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500668 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400669
670 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500671 {
672 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400673 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500674 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400675
676 if (defaultFramebuffer)
677 {
678 defaultFramebuffer->onDestroy(this);
679 delete defaultFramebuffer;
680 }
681
Corentin Wallezc295e512017-01-27 17:47:50 -0500682 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
683
684 if (mCurrentSurface)
685 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400686 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500687 mCurrentSurface = nullptr;
688 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400689
690 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400691}
692
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000693GLuint Context::createBuffer()
694{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500695 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000696}
697
698GLuint Context::createProgram()
699{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500700 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000701}
702
Jiawei Shao385b3e02018-03-21 09:43:28 +0800703GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000704{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500705 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000706}
707
708GLuint Context::createTexture()
709{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500710 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000711}
712
713GLuint Context::createRenderbuffer()
714{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500715 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000716}
717
Brandon Jones59770802018-04-02 13:18:42 -0700718GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300719{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500720 auto resultOrError = mState.mPaths->createPaths(mImplementation.get(), range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300721 if (resultOrError.isError())
722 {
723 handleError(resultOrError.getError());
724 return 0;
725 }
726 return resultOrError.getResult();
727}
728
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000729// Returns an unused framebuffer name
730GLuint Context::createFramebuffer()
731{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500732 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000733}
734
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500735void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000736{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500737 for (int i = 0; i < n; i++)
738 {
739 GLuint handle = mFenceNVHandleAllocator.allocate();
740 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
741 fences[i] = handle;
742 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000743}
744
Yunchao Hea336b902017-08-02 16:05:21 +0800745GLuint Context::createProgramPipeline()
746{
747 return mState.mPipelines->createProgramPipeline();
748}
749
Jiawei Shao385b3e02018-03-21 09:43:28 +0800750GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800751{
752 UNIMPLEMENTED();
753 return 0u;
754}
755
James Darpinian4d9d4832018-03-13 12:43:28 -0700756void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000757{
James Darpinian4d9d4832018-03-13 12:43:28 -0700758 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
759 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000760 {
761 detachBuffer(buffer);
762 }
Jamie Madill893ab082014-05-16 16:56:10 -0400763
James Darpinian4d9d4832018-03-13 12:43:28 -0700764 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000765}
766
767void Context::deleteShader(GLuint shader)
768{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500769 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000770}
771
772void Context::deleteProgram(GLuint program)
773{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500774 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000775}
776
777void Context::deleteTexture(GLuint texture)
778{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500779 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000780 {
781 detachTexture(texture);
782 }
783
Jamie Madill6c1f6712017-02-14 19:08:04 -0500784 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000785}
786
787void Context::deleteRenderbuffer(GLuint renderbuffer)
788{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500789 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000790 {
791 detachRenderbuffer(renderbuffer);
792 }
Jamie Madill893ab082014-05-16 16:56:10 -0400793
Jamie Madill6c1f6712017-02-14 19:08:04 -0500794 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000795}
796
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400797void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400798{
799 // The spec specifies the underlying Fence object is not deleted until all current
800 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
801 // and since our API is currently designed for being called from a single thread, we can delete
802 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400803 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400804}
805
Yunchao Hea336b902017-08-02 16:05:21 +0800806void Context::deleteProgramPipeline(GLuint pipeline)
807{
808 if (mState.mPipelines->getProgramPipeline(pipeline))
809 {
810 detachProgramPipeline(pipeline);
811 }
812
813 mState.mPipelines->deleteObject(this, pipeline);
814}
815
Sami Väisänene45e53b2016-05-25 10:36:04 +0300816void Context::deletePaths(GLuint first, GLsizei range)
817{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500818 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300819}
820
Brandon Jones59770802018-04-02 13:18:42 -0700821bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300822{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500823 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300824 if (pathObj == nullptr)
825 return false;
826
827 return pathObj->hasPathData();
828}
829
Brandon Jones59770802018-04-02 13:18:42 -0700830bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300831{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500832 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300833}
834
Brandon Jones59770802018-04-02 13:18:42 -0700835void Context::pathCommands(GLuint path,
836 GLsizei numCommands,
837 const GLubyte *commands,
838 GLsizei numCoords,
839 GLenum coordType,
840 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300841{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500842 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300843
844 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
845}
846
Jamie Madill007530e2017-12-28 14:27:04 -0500847void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300848{
Jamie Madill007530e2017-12-28 14:27:04 -0500849 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300850
851 switch (pname)
852 {
853 case GL_PATH_STROKE_WIDTH_CHROMIUM:
854 pathObj->setStrokeWidth(value);
855 break;
856 case GL_PATH_END_CAPS_CHROMIUM:
857 pathObj->setEndCaps(static_cast<GLenum>(value));
858 break;
859 case GL_PATH_JOIN_STYLE_CHROMIUM:
860 pathObj->setJoinStyle(static_cast<GLenum>(value));
861 break;
862 case GL_PATH_MITER_LIMIT_CHROMIUM:
863 pathObj->setMiterLimit(value);
864 break;
865 case GL_PATH_STROKE_BOUND_CHROMIUM:
866 pathObj->setStrokeBound(value);
867 break;
868 default:
869 UNREACHABLE();
870 break;
871 }
872}
873
Jamie Madill007530e2017-12-28 14:27:04 -0500874void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300875{
Jamie Madill007530e2017-12-28 14:27:04 -0500876 // TODO(jmadill): Should use proper clamping/casting.
877 pathParameterf(path, pname, static_cast<GLfloat>(value));
878}
879
880void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
881{
882 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300883
884 switch (pname)
885 {
886 case GL_PATH_STROKE_WIDTH_CHROMIUM:
887 *value = pathObj->getStrokeWidth();
888 break;
889 case GL_PATH_END_CAPS_CHROMIUM:
890 *value = static_cast<GLfloat>(pathObj->getEndCaps());
891 break;
892 case GL_PATH_JOIN_STYLE_CHROMIUM:
893 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
894 break;
895 case GL_PATH_MITER_LIMIT_CHROMIUM:
896 *value = pathObj->getMiterLimit();
897 break;
898 case GL_PATH_STROKE_BOUND_CHROMIUM:
899 *value = pathObj->getStrokeBound();
900 break;
901 default:
902 UNREACHABLE();
903 break;
904 }
905}
906
Jamie Madill007530e2017-12-28 14:27:04 -0500907void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
908{
909 GLfloat val = 0.0f;
910 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
911 if (value)
912 *value = static_cast<GLint>(val);
913}
914
Brandon Jones59770802018-04-02 13:18:42 -0700915void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300916{
917 mGLState.setPathStencilFunc(func, ref, mask);
918}
919
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000920void Context::deleteFramebuffer(GLuint framebuffer)
921{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500922 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000923 {
924 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000925 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500926
Jamie Madill6c1f6712017-02-14 19:08:04 -0500927 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000928}
929
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500930void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000931{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500932 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000933 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500934 GLuint fence = fences[i];
935
936 FenceNV *fenceObject = nullptr;
937 if (mFenceNVMap.erase(fence, &fenceObject))
938 {
939 mFenceNVHandleAllocator.release(fence);
940 delete fenceObject;
941 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000942 }
943}
944
Geoff Lang70d0f492015-12-10 17:45:46 -0500945Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000946{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500947 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000948}
949
Jamie Madill570f7c82014-07-03 10:38:54 -0400950Texture *Context::getTexture(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000951{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500952 return mState.mTextures->getTexture(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000953}
954
Geoff Lang70d0f492015-12-10 17:45:46 -0500955Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000956{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500957 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000958}
959
Jamie Madill70b5bb02017-08-28 13:32:37 -0400960Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400961{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400962 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400963}
964
Jamie Madill57a89722013-07-02 11:57:03 -0400965VertexArray *Context::getVertexArray(GLuint handle) const
966{
Jamie Madill96a483b2017-06-27 16:49:21 -0400967 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400968}
969
Jamie Madilldc356042013-07-19 16:36:57 -0400970Sampler *Context::getSampler(GLuint handle) const
971{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500972 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -0400973}
974
Geoff Langc8058452014-02-03 12:04:11 -0500975TransformFeedback *Context::getTransformFeedback(GLuint handle) const
976{
Jamie Madill96a483b2017-06-27 16:49:21 -0400977 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -0500978}
979
Yunchao Hea336b902017-08-02 16:05:21 +0800980ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
981{
982 return mState.mPipelines->getProgramPipeline(handle);
983}
984
Geoff Lang75359662018-04-11 01:42:27 -0400985gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -0500986{
987 switch (identifier)
988 {
989 case GL_BUFFER:
990 return getBuffer(name);
991 case GL_SHADER:
992 return getShader(name);
993 case GL_PROGRAM:
994 return getProgram(name);
995 case GL_VERTEX_ARRAY:
996 return getVertexArray(name);
997 case GL_QUERY:
998 return getQuery(name);
999 case GL_TRANSFORM_FEEDBACK:
1000 return getTransformFeedback(name);
1001 case GL_SAMPLER:
1002 return getSampler(name);
1003 case GL_TEXTURE:
1004 return getTexture(name);
1005 case GL_RENDERBUFFER:
1006 return getRenderbuffer(name);
1007 case GL_FRAMEBUFFER:
1008 return getFramebuffer(name);
1009 default:
1010 UNREACHABLE();
1011 return nullptr;
1012 }
1013}
1014
Geoff Lang75359662018-04-11 01:42:27 -04001015gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001016{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001017 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001018}
1019
Martin Radev9d901792016-07-15 15:58:58 +03001020void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1021{
Geoff Lang75359662018-04-11 01:42:27 -04001022 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001023 ASSERT(object != nullptr);
1024
1025 std::string labelName = GetObjectLabelFromPointer(length, label);
1026 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001027
1028 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1029 // specified object is active until we do this.
1030 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001031}
1032
1033void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1034{
Geoff Lang75359662018-04-11 01:42:27 -04001035 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001036 ASSERT(object != nullptr);
1037
1038 std::string labelName = GetObjectLabelFromPointer(length, label);
1039 object->setLabel(labelName);
1040}
1041
1042void Context::getObjectLabel(GLenum identifier,
1043 GLuint name,
1044 GLsizei bufSize,
1045 GLsizei *length,
1046 GLchar *label) const
1047{
Geoff Lang75359662018-04-11 01:42:27 -04001048 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001049 ASSERT(object != nullptr);
1050
1051 const std::string &objectLabel = object->getLabel();
1052 GetObjectLabelBase(objectLabel, bufSize, length, label);
1053}
1054
1055void Context::getObjectPtrLabel(const void *ptr,
1056 GLsizei bufSize,
1057 GLsizei *length,
1058 GLchar *label) const
1059{
Geoff Lang75359662018-04-11 01:42:27 -04001060 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001061 ASSERT(object != nullptr);
1062
1063 const std::string &objectLabel = object->getLabel();
1064 GetObjectLabelBase(objectLabel, bufSize, length, label);
1065}
1066
Jamie Madilldc356042013-07-19 16:36:57 -04001067bool Context::isSampler(GLuint samplerName) const
1068{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001069 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001070}
1071
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001072void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001073{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001074 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001075
Jamie Madilldedd7b92014-11-05 16:30:36 -05001076 if (handle == 0)
1077 {
1078 texture = mZeroTextures[target].get();
1079 }
1080 else
1081 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001082 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001083 }
1084
1085 ASSERT(texture);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001086 mGLState.setSamplerTexture(this, target, texture);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001087}
1088
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001089void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001090{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001091 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1092 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001093 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001094 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001095}
1096
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001097void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001098{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001099 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1100 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001101 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001102 mDrawFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001103}
1104
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001105void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001106{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001107 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001108 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001109 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001110 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001111}
1112
Shao80957d92017-02-20 21:25:59 +08001113void Context::bindVertexBuffer(GLuint bindingIndex,
1114 GLuint bufferHandle,
1115 GLintptr offset,
1116 GLsizei stride)
1117{
1118 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001119 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001120 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001121}
1122
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001123void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001124{
Geoff Lang76b10c92014-09-05 16:28:14 -04001125 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001126 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001127 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001128 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001129}
1130
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001131void Context::bindImageTexture(GLuint unit,
1132 GLuint texture,
1133 GLint level,
1134 GLboolean layered,
1135 GLint layer,
1136 GLenum access,
1137 GLenum format)
1138{
1139 Texture *tex = mState.mTextures->getTexture(texture);
1140 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1141}
1142
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001143void Context::useProgram(GLuint program)
1144{
Jamie Madill6c1f6712017-02-14 19:08:04 -05001145 mGLState.setProgram(this, getProgram(program));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001146 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001147}
1148
Jiajia Qin5451d532017-11-16 17:16:34 +08001149void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1150{
1151 UNIMPLEMENTED();
1152}
1153
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001154void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001155{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001156 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001157 TransformFeedback *transformFeedback =
1158 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001159 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -05001160}
1161
Yunchao Hea336b902017-08-02 16:05:21 +08001162void Context::bindProgramPipeline(GLuint pipelineHandle)
1163{
1164 ProgramPipeline *pipeline =
1165 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1166 mGLState.setProgramPipelineBinding(this, pipeline);
1167}
1168
Corentin Wallezad3ae902018-03-09 13:40:42 -05001169void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001170{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001171 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001172 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001173
Geoff Lang5aad9672014-09-08 11:10:42 -04001174 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001175 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001176
1177 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001178 mGLState.setActiveQuery(this, target, queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001179}
1180
Corentin Wallezad3ae902018-03-09 13:40:42 -05001181void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001182{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001183 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001184 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001185
Jamie Madill5188a272018-07-25 10:53:56 -04001186 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001187
Geoff Lang5aad9672014-09-08 11:10:42 -04001188 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001189 mGLState.setActiveQuery(this, target, nullptr);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001190}
1191
Corentin Wallezad3ae902018-03-09 13:40:42 -05001192void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001193{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001194 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001195
1196 Query *queryObject = getQuery(id, true, target);
1197 ASSERT(queryObject);
1198
Jamie Madill5188a272018-07-25 10:53:56 -04001199 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001200}
1201
Corentin Wallezad3ae902018-03-09 13:40:42 -05001202void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001203{
1204 switch (pname)
1205 {
1206 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001207 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001208 break;
1209 case GL_QUERY_COUNTER_BITS_EXT:
1210 switch (target)
1211 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001212 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001213 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1214 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001215 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001216 params[0] = getExtensions().queryCounterBitsTimestamp;
1217 break;
1218 default:
1219 UNREACHABLE();
1220 params[0] = 0;
1221 break;
1222 }
1223 break;
1224 default:
1225 UNREACHABLE();
1226 return;
1227 }
1228}
1229
Corentin Wallezad3ae902018-03-09 13:40:42 -05001230void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001231 GLenum pname,
1232 GLsizei bufSize,
1233 GLsizei *length,
1234 GLint *params)
1235{
1236 getQueryiv(target, pname, params);
1237}
1238
Geoff Lang2186c382016-10-14 10:54:54 -04001239void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001240{
Jamie Madill5188a272018-07-25 10:53:56 -04001241 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001242}
1243
Brandon Jones59770802018-04-02 13:18:42 -07001244void Context::getQueryObjectivRobust(GLuint id,
1245 GLenum pname,
1246 GLsizei bufSize,
1247 GLsizei *length,
1248 GLint *params)
1249{
1250 getQueryObjectiv(id, pname, params);
1251}
1252
Geoff Lang2186c382016-10-14 10:54:54 -04001253void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001254{
Jamie Madill5188a272018-07-25 10:53:56 -04001255 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001256}
1257
Brandon Jones59770802018-04-02 13:18:42 -07001258void Context::getQueryObjectuivRobust(GLuint id,
1259 GLenum pname,
1260 GLsizei bufSize,
1261 GLsizei *length,
1262 GLuint *params)
1263{
1264 getQueryObjectuiv(id, pname, params);
1265}
1266
Geoff Lang2186c382016-10-14 10:54:54 -04001267void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001268{
Jamie Madill5188a272018-07-25 10:53:56 -04001269 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001270}
1271
Brandon Jones59770802018-04-02 13:18:42 -07001272void Context::getQueryObjecti64vRobust(GLuint id,
1273 GLenum pname,
1274 GLsizei bufSize,
1275 GLsizei *length,
1276 GLint64 *params)
1277{
1278 getQueryObjecti64v(id, pname, params);
1279}
1280
Geoff Lang2186c382016-10-14 10:54:54 -04001281void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001282{
Jamie Madill5188a272018-07-25 10:53:56 -04001283 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001284}
1285
Brandon Jones59770802018-04-02 13:18:42 -07001286void Context::getQueryObjectui64vRobust(GLuint id,
1287 GLenum pname,
1288 GLsizei bufSize,
1289 GLsizei *length,
1290 GLuint64 *params)
1291{
1292 getQueryObjectui64v(id, pname, params);
1293}
1294
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001295Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001296{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001297 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001298}
1299
Jamie Madill2f348d22017-06-05 10:50:59 -04001300FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001301{
Jamie Madill96a483b2017-06-27 16:49:21 -04001302 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001303}
1304
Corentin Wallezad3ae902018-03-09 13:40:42 -05001305Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001306{
Jamie Madill96a483b2017-06-27 16:49:21 -04001307 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001308 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001309 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001310 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001311
1312 Query *query = mQueryMap.query(handle);
1313 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001314 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001315 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001316 query = new Query(mImplementation->createQuery(type), handle);
1317 query->addRef();
1318 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001319 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001320 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001321}
1322
Geoff Lang70d0f492015-12-10 17:45:46 -05001323Query *Context::getQuery(GLuint handle) const
1324{
Jamie Madill96a483b2017-06-27 16:49:21 -04001325 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001326}
1327
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001328Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001329{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001330 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1331 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001332}
1333
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001334Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001335{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001336 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001337}
1338
Geoff Lang492a7e42014-11-05 13:27:06 -05001339Compiler *Context::getCompiler() const
1340{
Jamie Madill2f348d22017-06-05 10:50:59 -04001341 if (mCompiler.get() == nullptr)
1342 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001343 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001344 }
1345 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001346}
1347
Jamie Madillc1d770e2017-04-13 17:31:24 -04001348void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001349{
1350 switch (pname)
1351 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001352 case GL_SHADER_COMPILER:
1353 *params = GL_TRUE;
1354 break;
1355 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1356 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1357 break;
1358 default:
1359 mGLState.getBooleanv(pname, params);
1360 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001361 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001362}
1363
Jamie Madillc1d770e2017-04-13 17:31:24 -04001364void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001365{
Shannon Woods53a94a82014-06-24 15:20:36 -04001366 // Queries about context capabilities and maximums are answered by Context.
1367 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001368 switch (pname)
1369 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001370 case GL_ALIASED_LINE_WIDTH_RANGE:
1371 params[0] = mCaps.minAliasedLineWidth;
1372 params[1] = mCaps.maxAliasedLineWidth;
1373 break;
1374 case GL_ALIASED_POINT_SIZE_RANGE:
1375 params[0] = mCaps.minAliasedPointSize;
1376 params[1] = mCaps.maxAliasedPointSize;
1377 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001378 case GL_SMOOTH_POINT_SIZE_RANGE:
1379 params[0] = mCaps.minSmoothPointSize;
1380 params[1] = mCaps.maxSmoothPointSize;
1381 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001382 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1383 ASSERT(mExtensions.textureFilterAnisotropic);
1384 *params = mExtensions.maxTextureAnisotropy;
1385 break;
1386 case GL_MAX_TEXTURE_LOD_BIAS:
1387 *params = mCaps.maxLODBias;
1388 break;
1389
1390 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1391 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1392 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001393 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1394 // GLES1 constants for modelview/projection matrix.
1395 if (getClientVersion() < Version(2, 0))
1396 {
1397 mGLState.getFloatv(pname, params);
1398 }
1399 else
1400 {
1401 ASSERT(mExtensions.pathRendering);
1402 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1403 memcpy(params, m, 16 * sizeof(GLfloat));
1404 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001405 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001406 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001407
Jamie Madill231c7f52017-04-26 13:45:37 -04001408 default:
1409 mGLState.getFloatv(pname, params);
1410 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001411 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001412}
1413
Jamie Madillc1d770e2017-04-13 17:31:24 -04001414void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001415{
Shannon Woods53a94a82014-06-24 15:20:36 -04001416 // Queries about context capabilities and maximums are answered by Context.
1417 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001418
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001419 switch (pname)
1420 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001421 case GL_MAX_VERTEX_ATTRIBS:
1422 *params = mCaps.maxVertexAttributes;
1423 break;
1424 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1425 *params = mCaps.maxVertexUniformVectors;
1426 break;
1427 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001428 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001429 break;
1430 case GL_MAX_VARYING_VECTORS:
1431 *params = mCaps.maxVaryingVectors;
1432 break;
1433 case GL_MAX_VARYING_COMPONENTS:
1434 *params = mCaps.maxVertexOutputComponents;
1435 break;
1436 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1437 *params = mCaps.maxCombinedTextureImageUnits;
1438 break;
1439 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001440 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001441 break;
1442 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001443 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001444 break;
1445 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1446 *params = mCaps.maxFragmentUniformVectors;
1447 break;
1448 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001449 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001450 break;
1451 case GL_MAX_RENDERBUFFER_SIZE:
1452 *params = mCaps.maxRenderbufferSize;
1453 break;
1454 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1455 *params = mCaps.maxColorAttachments;
1456 break;
1457 case GL_MAX_DRAW_BUFFERS_EXT:
1458 *params = mCaps.maxDrawBuffers;
1459 break;
1460 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1461 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1462 case GL_SUBPIXEL_BITS:
1463 *params = 4;
1464 break;
1465 case GL_MAX_TEXTURE_SIZE:
1466 *params = mCaps.max2DTextureSize;
1467 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001468 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1469 *params = mCaps.maxRectangleTextureSize;
1470 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001471 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1472 *params = mCaps.maxCubeMapTextureSize;
1473 break;
1474 case GL_MAX_3D_TEXTURE_SIZE:
1475 *params = mCaps.max3DTextureSize;
1476 break;
1477 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1478 *params = mCaps.maxArrayTextureLayers;
1479 break;
1480 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1481 *params = mCaps.uniformBufferOffsetAlignment;
1482 break;
1483 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1484 *params = mCaps.maxUniformBufferBindings;
1485 break;
1486 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001487 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001488 break;
1489 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001490 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001491 break;
1492 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1493 *params = mCaps.maxCombinedTextureImageUnits;
1494 break;
1495 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1496 *params = mCaps.maxVertexOutputComponents;
1497 break;
1498 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1499 *params = mCaps.maxFragmentInputComponents;
1500 break;
1501 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1502 *params = mCaps.minProgramTexelOffset;
1503 break;
1504 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1505 *params = mCaps.maxProgramTexelOffset;
1506 break;
1507 case GL_MAJOR_VERSION:
1508 *params = getClientVersion().major;
1509 break;
1510 case GL_MINOR_VERSION:
1511 *params = getClientVersion().minor;
1512 break;
1513 case GL_MAX_ELEMENTS_INDICES:
1514 *params = mCaps.maxElementsIndices;
1515 break;
1516 case GL_MAX_ELEMENTS_VERTICES:
1517 *params = mCaps.maxElementsVertices;
1518 break;
1519 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1520 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1521 break;
1522 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1523 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1524 break;
1525 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1526 *params = mCaps.maxTransformFeedbackSeparateComponents;
1527 break;
1528 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1529 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1530 break;
1531 case GL_MAX_SAMPLES_ANGLE:
1532 *params = mCaps.maxSamples;
1533 break;
1534 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001535 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001536 params[0] = mCaps.maxViewportWidth;
1537 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001538 }
1539 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001540 case GL_COMPRESSED_TEXTURE_FORMATS:
1541 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1542 params);
1543 break;
1544 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1545 *params = mResetStrategy;
1546 break;
1547 case GL_NUM_SHADER_BINARY_FORMATS:
1548 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1549 break;
1550 case GL_SHADER_BINARY_FORMATS:
1551 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1552 break;
1553 case GL_NUM_PROGRAM_BINARY_FORMATS:
1554 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1555 break;
1556 case GL_PROGRAM_BINARY_FORMATS:
1557 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1558 break;
1559 case GL_NUM_EXTENSIONS:
1560 *params = static_cast<GLint>(mExtensionStrings.size());
1561 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001562
Jamie Madill231c7f52017-04-26 13:45:37 -04001563 // GL_KHR_debug
1564 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1565 *params = mExtensions.maxDebugMessageLength;
1566 break;
1567 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1568 *params = mExtensions.maxDebugLoggedMessages;
1569 break;
1570 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1571 *params = mExtensions.maxDebugGroupStackDepth;
1572 break;
1573 case GL_MAX_LABEL_LENGTH:
1574 *params = mExtensions.maxLabelLength;
1575 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001576
Martin Radeve5285d22017-07-14 16:23:53 +03001577 // GL_ANGLE_multiview
1578 case GL_MAX_VIEWS_ANGLE:
1579 *params = mExtensions.maxViews;
1580 break;
1581
Jamie Madill231c7f52017-04-26 13:45:37 -04001582 // GL_EXT_disjoint_timer_query
1583 case GL_GPU_DISJOINT_EXT:
1584 *params = mImplementation->getGPUDisjoint();
1585 break;
1586 case GL_MAX_FRAMEBUFFER_WIDTH:
1587 *params = mCaps.maxFramebufferWidth;
1588 break;
1589 case GL_MAX_FRAMEBUFFER_HEIGHT:
1590 *params = mCaps.maxFramebufferHeight;
1591 break;
1592 case GL_MAX_FRAMEBUFFER_SAMPLES:
1593 *params = mCaps.maxFramebufferSamples;
1594 break;
1595 case GL_MAX_SAMPLE_MASK_WORDS:
1596 *params = mCaps.maxSampleMaskWords;
1597 break;
1598 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1599 *params = mCaps.maxColorTextureSamples;
1600 break;
1601 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1602 *params = mCaps.maxDepthTextureSamples;
1603 break;
1604 case GL_MAX_INTEGER_SAMPLES:
1605 *params = mCaps.maxIntegerSamples;
1606 break;
1607 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1608 *params = mCaps.maxVertexAttribRelativeOffset;
1609 break;
1610 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1611 *params = mCaps.maxVertexAttribBindings;
1612 break;
1613 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1614 *params = mCaps.maxVertexAttribStride;
1615 break;
1616 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001617 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001618 break;
1619 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001620 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001621 break;
1622 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001623 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001624 break;
1625 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001626 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001627 break;
1628 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001629 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001630 break;
1631 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001632 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001633 break;
1634 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001635 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001636 break;
1637 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001638 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001639 break;
1640 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1641 *params = mCaps.minProgramTextureGatherOffset;
1642 break;
1643 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1644 *params = mCaps.maxProgramTextureGatherOffset;
1645 break;
1646 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1647 *params = mCaps.maxComputeWorkGroupInvocations;
1648 break;
1649 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001650 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001651 break;
1652 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001653 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001654 break;
1655 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1656 *params = mCaps.maxComputeSharedMemorySize;
1657 break;
1658 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001659 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001660 break;
1661 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001662 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001663 break;
1664 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001665 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001666 break;
1667 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001668 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001669 break;
1670 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001671 *params =
1672 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001673 break;
1674 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001675 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001676 break;
1677 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1678 *params = mCaps.maxCombinedShaderOutputResources;
1679 break;
1680 case GL_MAX_UNIFORM_LOCATIONS:
1681 *params = mCaps.maxUniformLocations;
1682 break;
1683 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1684 *params = mCaps.maxAtomicCounterBufferBindings;
1685 break;
1686 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1687 *params = mCaps.maxAtomicCounterBufferSize;
1688 break;
1689 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1690 *params = mCaps.maxCombinedAtomicCounterBuffers;
1691 break;
1692 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1693 *params = mCaps.maxCombinedAtomicCounters;
1694 break;
1695 case GL_MAX_IMAGE_UNITS:
1696 *params = mCaps.maxImageUnits;
1697 break;
1698 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1699 *params = mCaps.maxCombinedImageUniforms;
1700 break;
1701 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1702 *params = mCaps.maxShaderStorageBufferBindings;
1703 break;
1704 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1705 *params = mCaps.maxCombinedShaderStorageBlocks;
1706 break;
1707 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1708 *params = mCaps.shaderStorageBufferOffsetAlignment;
1709 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001710
1711 // GL_EXT_geometry_shader
1712 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1713 *params = mCaps.maxFramebufferLayers;
1714 break;
1715 case GL_LAYER_PROVOKING_VERTEX_EXT:
1716 *params = mCaps.layerProvokingVertex;
1717 break;
1718 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001719 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001720 break;
1721 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001722 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001723 break;
1724 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001725 *params =
1726 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001727 break;
1728 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1729 *params = mCaps.maxGeometryInputComponents;
1730 break;
1731 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1732 *params = mCaps.maxGeometryOutputComponents;
1733 break;
1734 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1735 *params = mCaps.maxGeometryOutputVertices;
1736 break;
1737 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1738 *params = mCaps.maxGeometryTotalOutputComponents;
1739 break;
1740 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1741 *params = mCaps.maxGeometryShaderInvocations;
1742 break;
1743 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001744 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001745 break;
1746 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001747 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001748 break;
1749 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001750 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001751 break;
1752 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001753 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001754 break;
1755 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001756 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001757 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001758 // GLES1 emulation: Caps queries
1759 case GL_MAX_TEXTURE_UNITS:
1760 *params = mCaps.maxMultitextureUnits;
1761 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001762 case GL_MAX_MODELVIEW_STACK_DEPTH:
1763 *params = mCaps.maxModelviewMatrixStackDepth;
1764 break;
1765 case GL_MAX_PROJECTION_STACK_DEPTH:
1766 *params = mCaps.maxProjectionMatrixStackDepth;
1767 break;
1768 case GL_MAX_TEXTURE_STACK_DEPTH:
1769 *params = mCaps.maxTextureMatrixStackDepth;
1770 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001771 case GL_MAX_LIGHTS:
1772 *params = mCaps.maxLights;
1773 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001774 case GL_MAX_CLIP_PLANES:
1775 *params = mCaps.maxClipPlanes;
1776 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001777 // GLES1 emulation: Vertex attribute queries
1778 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1779 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1780 case GL_COLOR_ARRAY_BUFFER_BINDING:
1781 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1782 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1783 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1784 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1785 break;
1786 case GL_VERTEX_ARRAY_STRIDE:
1787 case GL_NORMAL_ARRAY_STRIDE:
1788 case GL_COLOR_ARRAY_STRIDE:
1789 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1790 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1791 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1792 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1793 break;
1794 case GL_VERTEX_ARRAY_SIZE:
1795 case GL_COLOR_ARRAY_SIZE:
1796 case GL_TEXTURE_COORD_ARRAY_SIZE:
1797 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1798 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1799 break;
1800 case GL_VERTEX_ARRAY_TYPE:
1801 case GL_COLOR_ARRAY_TYPE:
1802 case GL_NORMAL_ARRAY_TYPE:
1803 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1804 case GL_TEXTURE_COORD_ARRAY_TYPE:
1805 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1806 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1807 break;
1808
jchen1082af6202018-06-22 10:59:52 +08001809 // GL_KHR_parallel_shader_compile
1810 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1811 *params = mGLState.getMaxShaderCompilerThreads();
1812 break;
1813
Jamie Madill231c7f52017-04-26 13:45:37 -04001814 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001815 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001816 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001817 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001818}
1819
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001820void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001821{
Shannon Woods53a94a82014-06-24 15:20:36 -04001822 // Queries about context capabilities and maximums are answered by Context.
1823 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001824 switch (pname)
1825 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001826 case GL_MAX_ELEMENT_INDEX:
1827 *params = mCaps.maxElementIndex;
1828 break;
1829 case GL_MAX_UNIFORM_BLOCK_SIZE:
1830 *params = mCaps.maxUniformBlockSize;
1831 break;
1832 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001833 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001834 break;
1835 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001836 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001837 break;
1838 case GL_MAX_SERVER_WAIT_TIMEOUT:
1839 *params = mCaps.maxServerWaitTimeout;
1840 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001841
Jamie Madill231c7f52017-04-26 13:45:37 -04001842 // GL_EXT_disjoint_timer_query
1843 case GL_TIMESTAMP_EXT:
1844 *params = mImplementation->getTimestamp();
1845 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001846
Jamie Madill231c7f52017-04-26 13:45:37 -04001847 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1848 *params = mCaps.maxShaderStorageBlockSize;
1849 break;
1850 default:
1851 UNREACHABLE();
1852 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001853 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001854}
1855
Geoff Lang70d0f492015-12-10 17:45:46 -05001856void Context::getPointerv(GLenum pname, void **params) const
1857{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001858 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001859}
1860
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001861void Context::getPointervRobustANGLERobust(GLenum pname,
1862 GLsizei bufSize,
1863 GLsizei *length,
1864 void **params)
1865{
1866 UNIMPLEMENTED();
1867}
1868
Martin Radev66fb8202016-07-28 11:45:20 +03001869void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001870{
Shannon Woods53a94a82014-06-24 15:20:36 -04001871 // Queries about context capabilities and maximums are answered by Context.
1872 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001873
1874 GLenum nativeType;
1875 unsigned int numParams;
1876 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1877 ASSERT(queryStatus);
1878
1879 if (nativeType == GL_INT)
1880 {
1881 switch (target)
1882 {
1883 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1884 ASSERT(index < 3u);
1885 *data = mCaps.maxComputeWorkGroupCount[index];
1886 break;
1887 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1888 ASSERT(index < 3u);
1889 *data = mCaps.maxComputeWorkGroupSize[index];
1890 break;
1891 default:
1892 mGLState.getIntegeri_v(target, index, data);
1893 }
1894 }
1895 else
1896 {
1897 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1898 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001899}
1900
Brandon Jones59770802018-04-02 13:18:42 -07001901void Context::getIntegeri_vRobust(GLenum target,
1902 GLuint index,
1903 GLsizei bufSize,
1904 GLsizei *length,
1905 GLint *data)
1906{
1907 getIntegeri_v(target, index, data);
1908}
1909
Martin Radev66fb8202016-07-28 11:45:20 +03001910void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001911{
Shannon Woods53a94a82014-06-24 15:20:36 -04001912 // Queries about context capabilities and maximums are answered by Context.
1913 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001914
1915 GLenum nativeType;
1916 unsigned int numParams;
1917 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1918 ASSERT(queryStatus);
1919
1920 if (nativeType == GL_INT_64_ANGLEX)
1921 {
1922 mGLState.getInteger64i_v(target, index, data);
1923 }
1924 else
1925 {
1926 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1927 }
1928}
1929
Brandon Jones59770802018-04-02 13:18:42 -07001930void Context::getInteger64i_vRobust(GLenum target,
1931 GLuint index,
1932 GLsizei bufSize,
1933 GLsizei *length,
1934 GLint64 *data)
1935{
1936 getInteger64i_v(target, index, data);
1937}
1938
Martin Radev66fb8202016-07-28 11:45:20 +03001939void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1940{
1941 // Queries about context capabilities and maximums are answered by Context.
1942 // Queries about current GL state values are answered by State.
1943
1944 GLenum nativeType;
1945 unsigned int numParams;
1946 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1947 ASSERT(queryStatus);
1948
1949 if (nativeType == GL_BOOL)
1950 {
1951 mGLState.getBooleani_v(target, index, data);
1952 }
1953 else
1954 {
1955 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1956 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001957}
1958
Brandon Jones59770802018-04-02 13:18:42 -07001959void Context::getBooleani_vRobust(GLenum target,
1960 GLuint index,
1961 GLsizei bufSize,
1962 GLsizei *length,
1963 GLboolean *data)
1964{
1965 getBooleani_v(target, index, data);
1966}
1967
Corentin Wallez336129f2017-10-17 15:55:40 -04001968void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001969{
1970 Buffer *buffer = mGLState.getTargetBuffer(target);
1971 QueryBufferParameteriv(buffer, pname, params);
1972}
1973
Brandon Jones59770802018-04-02 13:18:42 -07001974void Context::getBufferParameterivRobust(BufferBinding target,
1975 GLenum pname,
1976 GLsizei bufSize,
1977 GLsizei *length,
1978 GLint *params)
1979{
1980 getBufferParameteriv(target, pname, params);
1981}
1982
He Yunchao010e4db2017-03-03 14:22:06 +08001983void Context::getFramebufferAttachmentParameteriv(GLenum target,
1984 GLenum attachment,
1985 GLenum pname,
1986 GLint *params)
1987{
1988 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08001989 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08001990}
1991
Brandon Jones59770802018-04-02 13:18:42 -07001992void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
1993 GLenum attachment,
1994 GLenum pname,
1995 GLsizei bufSize,
1996 GLsizei *length,
1997 GLint *params)
1998{
1999 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2000}
2001
He Yunchao010e4db2017-03-03 14:22:06 +08002002void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2003{
2004 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2005 QueryRenderbufferiv(this, renderbuffer, pname, params);
2006}
2007
Brandon Jones59770802018-04-02 13:18:42 -07002008void Context::getRenderbufferParameterivRobust(GLenum target,
2009 GLenum pname,
2010 GLsizei bufSize,
2011 GLsizei *length,
2012 GLint *params)
2013{
2014 getRenderbufferParameteriv(target, pname, params);
2015}
2016
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002017void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002018{
2019 Texture *texture = getTargetTexture(target);
2020 QueryTexParameterfv(texture, pname, params);
2021}
2022
Brandon Jones59770802018-04-02 13:18:42 -07002023void Context::getTexParameterfvRobust(TextureType target,
2024 GLenum pname,
2025 GLsizei bufSize,
2026 GLsizei *length,
2027 GLfloat *params)
2028{
2029 getTexParameterfv(target, pname, params);
2030}
2031
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002032void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002033{
2034 Texture *texture = getTargetTexture(target);
2035 QueryTexParameteriv(texture, pname, params);
2036}
Jiajia Qin5451d532017-11-16 17:16:34 +08002037
Brandon Jones59770802018-04-02 13:18:42 -07002038void Context::getTexParameterivRobust(TextureType target,
2039 GLenum pname,
2040 GLsizei bufSize,
2041 GLsizei *length,
2042 GLint *params)
2043{
2044 getTexParameteriv(target, pname, params);
2045}
2046
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002047void Context::getTexParameterIivRobust(TextureType target,
2048 GLenum pname,
2049 GLsizei bufSize,
2050 GLsizei *length,
2051 GLint *params)
2052{
2053 UNIMPLEMENTED();
2054}
2055
2056void Context::getTexParameterIuivRobust(TextureType target,
2057 GLenum pname,
2058 GLsizei bufSize,
2059 GLsizei *length,
2060 GLuint *params)
2061{
2062 UNIMPLEMENTED();
2063}
2064
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002065void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002066{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002067 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002068 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002069}
2070
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002071void Context::getTexLevelParameterivRobust(TextureTarget target,
2072 GLint level,
2073 GLenum pname,
2074 GLsizei bufSize,
2075 GLsizei *length,
2076 GLint *params)
2077{
2078 UNIMPLEMENTED();
2079}
2080
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002081void Context::getTexLevelParameterfv(TextureTarget target,
2082 GLint level,
2083 GLenum pname,
2084 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002085{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002086 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002087 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002088}
2089
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002090void Context::getTexLevelParameterfvRobust(TextureTarget target,
2091 GLint level,
2092 GLenum pname,
2093 GLsizei bufSize,
2094 GLsizei *length,
2095 GLfloat *params)
2096{
2097 UNIMPLEMENTED();
2098}
2099
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002100void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002101{
2102 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002103 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002104 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002105}
2106
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002107void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002108{
2109 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002110 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002111 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002112}
2113
Brandon Jones59770802018-04-02 13:18:42 -07002114void Context::texParameterfvRobust(TextureType target,
2115 GLenum pname,
2116 GLsizei bufSize,
2117 const GLfloat *params)
2118{
2119 texParameterfv(target, pname, params);
2120}
2121
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002122void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002123{
2124 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002125 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002126 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002127}
2128
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002129void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002130{
2131 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002132 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002133 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002134}
2135
Brandon Jones59770802018-04-02 13:18:42 -07002136void Context::texParameterivRobust(TextureType target,
2137 GLenum pname,
2138 GLsizei bufSize,
2139 const GLint *params)
2140{
2141 texParameteriv(target, pname, params);
2142}
2143
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002144void Context::texParameterIivRobust(TextureType target,
2145 GLenum pname,
2146 GLsizei bufSize,
2147 const GLint *params)
2148{
2149 UNIMPLEMENTED();
2150}
2151
2152void Context::texParameterIuivRobust(TextureType target,
2153 GLenum pname,
2154 GLsizei bufSize,
2155 const GLuint *params)
2156{
2157 UNIMPLEMENTED();
2158}
2159
Jamie Madill493f9572018-05-24 19:52:15 -04002160void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002161{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002162 // No-op if count draws no primitives for given mode
2163 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002164 {
2165 return;
2166 }
2167
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002168 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002169 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002170 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002171}
2172
Jamie Madill493f9572018-05-24 19:52:15 -04002173void Context::drawArraysInstanced(PrimitiveMode mode,
2174 GLint first,
2175 GLsizei count,
2176 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002177{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002178 // No-op if count draws no primitives for given mode
2179 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002180 {
2181 return;
2182 }
2183
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002184 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002185 ANGLE_CONTEXT_TRY(
2186 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002187 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2188 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002189}
2190
Jamie Madill493f9572018-05-24 19:52:15 -04002191void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002192{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002193 // No-op if count draws no primitives for given mode
2194 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002195 {
2196 return;
2197 }
2198
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002199 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002200 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002201}
2202
Jamie Madill493f9572018-05-24 19:52:15 -04002203void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002204 GLsizei count,
2205 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002206 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002207 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002208{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002209 // No-op if count draws no primitives for given mode
2210 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002211 {
2212 return;
2213 }
2214
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002215 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002216 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002217 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002218}
2219
Jamie Madill493f9572018-05-24 19:52:15 -04002220void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002221 GLuint start,
2222 GLuint end,
2223 GLsizei count,
2224 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002225 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002226{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002227 // No-op if count draws no primitives for given mode
2228 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002229 {
2230 return;
2231 }
2232
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002233 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002234 ANGLE_CONTEXT_TRY(
2235 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002236}
2237
Jamie Madill493f9572018-05-24 19:52:15 -04002238void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002239{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002240 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002241 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002242}
2243
Jamie Madill493f9572018-05-24 19:52:15 -04002244void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002245{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002246 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002247 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002248}
2249
Jamie Madill675fe712016-12-19 13:07:54 -05002250void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002251{
Jamie Madillafa02a22017-11-23 12:57:38 -05002252 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002253}
2254
Jamie Madill675fe712016-12-19 13:07:54 -05002255void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002256{
Jamie Madillafa02a22017-11-23 12:57:38 -05002257 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002258}
2259
Austin Kinross6ee1e782015-05-29 17:05:37 -07002260void Context::insertEventMarker(GLsizei length, const char *marker)
2261{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002262 ASSERT(mImplementation);
2263 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002264}
2265
2266void Context::pushGroupMarker(GLsizei length, const char *marker)
2267{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002268 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002269
2270 if (marker == nullptr)
2271 {
2272 // From the EXT_debug_marker spec,
2273 // "If <marker> is null then an empty string is pushed on the stack."
2274 mImplementation->pushGroupMarker(length, "");
2275 }
2276 else
2277 {
2278 mImplementation->pushGroupMarker(length, marker);
2279 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002280}
2281
2282void Context::popGroupMarker()
2283{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002284 ASSERT(mImplementation);
2285 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002286}
2287
Geoff Langd8605522016-04-13 10:19:12 -04002288void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2289{
2290 Program *programObject = getProgram(program);
2291 ASSERT(programObject);
2292
2293 programObject->bindUniformLocation(location, name);
2294}
2295
Brandon Jones59770802018-04-02 13:18:42 -07002296void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002297{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002298 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002299}
2300
Brandon Jones59770802018-04-02 13:18:42 -07002301void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002302{
2303 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2304}
2305
Brandon Jones59770802018-04-02 13:18:42 -07002306void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002307{
2308 GLfloat I[16];
2309 angle::Matrix<GLfloat>::setToIdentity(I);
2310
2311 mGLState.loadPathRenderingMatrix(matrixMode, I);
2312}
2313
2314void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2315{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002316 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002317 if (!pathObj)
2318 return;
2319
Geoff Lang9bf86f02018-07-26 11:46:34 -04002320 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002321
2322 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2323}
2324
2325void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2326{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002327 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002328 if (!pathObj)
2329 return;
2330
Geoff Lang9bf86f02018-07-26 11:46:34 -04002331 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002332
2333 mImplementation->stencilStrokePath(pathObj, reference, mask);
2334}
2335
2336void Context::coverFillPath(GLuint path, GLenum coverMode)
2337{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002338 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002339 if (!pathObj)
2340 return;
2341
Geoff Lang9bf86f02018-07-26 11:46:34 -04002342 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002343
2344 mImplementation->coverFillPath(pathObj, coverMode);
2345}
2346
2347void Context::coverStrokePath(GLuint path, GLenum coverMode)
2348{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002349 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002350 if (!pathObj)
2351 return;
2352
Geoff Lang9bf86f02018-07-26 11:46:34 -04002353 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002354
2355 mImplementation->coverStrokePath(pathObj, coverMode);
2356}
2357
2358void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2359{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002360 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002361 if (!pathObj)
2362 return;
2363
Geoff Lang9bf86f02018-07-26 11:46:34 -04002364 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002365
2366 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2367}
2368
2369void Context::stencilThenCoverStrokePath(GLuint path,
2370 GLint reference,
2371 GLuint mask,
2372 GLenum coverMode)
2373{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002374 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002375 if (!pathObj)
2376 return;
2377
Geoff Lang9bf86f02018-07-26 11:46:34 -04002378 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002379
2380 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2381}
2382
Sami Väisänend59ca052016-06-21 16:10:00 +03002383void Context::coverFillPathInstanced(GLsizei numPaths,
2384 GLenum pathNameType,
2385 const void *paths,
2386 GLuint pathBase,
2387 GLenum coverMode,
2388 GLenum transformType,
2389 const GLfloat *transformValues)
2390{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002391 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002392
Geoff Lang9bf86f02018-07-26 11:46:34 -04002393 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002394
2395 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2396}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002397
Sami Väisänend59ca052016-06-21 16:10:00 +03002398void Context::coverStrokePathInstanced(GLsizei numPaths,
2399 GLenum pathNameType,
2400 const void *paths,
2401 GLuint pathBase,
2402 GLenum coverMode,
2403 GLenum transformType,
2404 const GLfloat *transformValues)
2405{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002406 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002407
2408 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002409 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002410
2411 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2412 transformValues);
2413}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002414
Sami Väisänend59ca052016-06-21 16:10:00 +03002415void Context::stencilFillPathInstanced(GLsizei numPaths,
2416 GLenum pathNameType,
2417 const void *paths,
2418 GLuint pathBase,
2419 GLenum fillMode,
2420 GLuint mask,
2421 GLenum transformType,
2422 const GLfloat *transformValues)
2423{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002424 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002425
2426 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002427 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002428
2429 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2430 transformValues);
2431}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002432
Sami Väisänend59ca052016-06-21 16:10:00 +03002433void Context::stencilStrokePathInstanced(GLsizei numPaths,
2434 GLenum pathNameType,
2435 const void *paths,
2436 GLuint pathBase,
2437 GLint reference,
2438 GLuint mask,
2439 GLenum transformType,
2440 const GLfloat *transformValues)
2441{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002442 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002443
Geoff Lang9bf86f02018-07-26 11:46:34 -04002444 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002445
2446 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2447 transformValues);
2448}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002449
Sami Väisänend59ca052016-06-21 16:10:00 +03002450void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2451 GLenum pathNameType,
2452 const void *paths,
2453 GLuint pathBase,
2454 GLenum fillMode,
2455 GLuint mask,
2456 GLenum coverMode,
2457 GLenum transformType,
2458 const GLfloat *transformValues)
2459{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002460 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002461
Geoff Lang9bf86f02018-07-26 11:46:34 -04002462 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002463
2464 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2465 transformType, transformValues);
2466}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002467
Sami Väisänend59ca052016-06-21 16:10:00 +03002468void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2469 GLenum pathNameType,
2470 const void *paths,
2471 GLuint pathBase,
2472 GLint reference,
2473 GLuint mask,
2474 GLenum coverMode,
2475 GLenum transformType,
2476 const GLfloat *transformValues)
2477{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002478 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002479
Geoff Lang9bf86f02018-07-26 11:46:34 -04002480 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002481
2482 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2483 transformType, transformValues);
2484}
2485
Sami Väisänen46eaa942016-06-29 10:26:37 +03002486void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2487{
2488 auto *programObject = getProgram(program);
2489
2490 programObject->bindFragmentInputLocation(location, name);
2491}
2492
2493void Context::programPathFragmentInputGen(GLuint program,
2494 GLint location,
2495 GLenum genMode,
2496 GLint components,
2497 const GLfloat *coeffs)
2498{
2499 auto *programObject = getProgram(program);
2500
Jamie Madillbd044ed2017-06-05 12:59:21 -04002501 programObject->pathFragmentInputGen(this, location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002502}
2503
jchen1015015f72017-03-16 13:54:21 +08002504GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2505{
jchen10fd7c3b52017-03-21 15:36:03 +08002506 const auto *programObject = getProgram(program);
jchen1015015f72017-03-16 13:54:21 +08002507 return QueryProgramResourceIndex(programObject, programInterface, name);
2508}
2509
jchen10fd7c3b52017-03-21 15:36:03 +08002510void Context::getProgramResourceName(GLuint program,
2511 GLenum programInterface,
2512 GLuint index,
2513 GLsizei bufSize,
2514 GLsizei *length,
2515 GLchar *name)
2516{
2517 const auto *programObject = getProgram(program);
2518 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2519}
2520
jchen10191381f2017-04-11 13:59:04 +08002521GLint Context::getProgramResourceLocation(GLuint program,
2522 GLenum programInterface,
2523 const GLchar *name)
2524{
2525 const auto *programObject = getProgram(program);
2526 return QueryProgramResourceLocation(programObject, programInterface, name);
2527}
2528
jchen10880683b2017-04-12 16:21:55 +08002529void Context::getProgramResourceiv(GLuint program,
2530 GLenum programInterface,
2531 GLuint index,
2532 GLsizei propCount,
2533 const GLenum *props,
2534 GLsizei bufSize,
2535 GLsizei *length,
2536 GLint *params)
2537{
2538 const auto *programObject = getProgram(program);
2539 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2540 length, params);
2541}
2542
jchen10d9cd7b72017-08-30 15:04:25 +08002543void Context::getProgramInterfaceiv(GLuint program,
2544 GLenum programInterface,
2545 GLenum pname,
2546 GLint *params)
2547{
2548 const auto *programObject = getProgram(program);
2549 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2550}
2551
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002552void Context::getProgramInterfaceivRobust(GLuint program,
2553 GLenum programInterface,
2554 GLenum pname,
2555 GLsizei bufSize,
2556 GLsizei *length,
2557 GLint *params)
2558{
2559 UNIMPLEMENTED();
2560}
2561
Jamie Madill306b6c12018-07-27 08:12:49 -04002562void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002563{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002564 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002565}
2566
2567// Get one of the recorded errors and clear its flag, if any.
2568// [OpenGL ES 2.0.24] section 2.5 page 13.
2569GLenum Context::getError()
2570{
Geoff Langda5777c2014-07-11 09:52:58 -04002571 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002572 {
Geoff Langda5777c2014-07-11 09:52:58 -04002573 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002574 }
Geoff Langda5777c2014-07-11 09:52:58 -04002575 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002576 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002577 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002578 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002579}
2580
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002581// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002582void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002583{
2584 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002585 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002586 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002587 mContextLostForced = true;
2588 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002589 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002590}
2591
Jamie Madill427064d2018-04-13 16:20:34 -04002592bool Context::isContextLost() const
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002593{
2594 return mContextLost;
2595}
2596
Jamie Madillfa920eb2018-01-04 11:45:50 -05002597GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002598{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002599 // Even if the application doesn't want to know about resets, we want to know
2600 // as it will allow us to skip all the calls.
2601 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002602 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002603 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002604 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002605 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002606 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002607
2608 // EXT_robustness, section 2.6: If the reset notification behavior is
2609 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2610 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2611 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002612 }
2613
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002614 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2615 // status should be returned at least once, and GL_NO_ERROR should be returned
2616 // once the device has finished resetting.
2617 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002618 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002619 ASSERT(mResetStatus == GL_NO_ERROR);
2620 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002621
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002622 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002623 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002624 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002625 }
2626 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002627 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002628 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002629 // If markContextLost was used to mark the context lost then
2630 // assume that is not recoverable, and continue to report the
2631 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002632 mResetStatus = mImplementation->getResetStatus();
2633 }
Jamie Madill893ab082014-05-16 16:56:10 -04002634
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002635 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002636}
2637
2638bool Context::isResetNotificationEnabled()
2639{
2640 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2641}
2642
Corentin Walleze3b10e82015-05-20 11:06:25 -04002643const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002644{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002645 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002646}
2647
2648EGLenum Context::getClientType() const
2649{
2650 return mClientType;
2651}
2652
2653EGLenum Context::getRenderBuffer() const
2654{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002655 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2656 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002657 {
2658 return EGL_NONE;
2659 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002660
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002661 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002662 ASSERT(backAttachment != nullptr);
2663 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002664}
2665
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002666VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002667{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002668 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002669 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2670 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002671 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002672 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2673 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002674
Jamie Madill96a483b2017-06-27 16:49:21 -04002675 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002676 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002677
2678 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002679}
2680
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002681TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002682{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002683 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002684 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2685 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002686 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002687 transformFeedback =
2688 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002689 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002690 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002691 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002692
2693 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002694}
2695
2696bool Context::isVertexArrayGenerated(GLuint vertexArray)
2697{
Jamie Madill96a483b2017-06-27 16:49:21 -04002698 ASSERT(mVertexArrayMap.contains(0));
2699 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002700}
2701
2702bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2703{
Jamie Madill96a483b2017-06-27 16:49:21 -04002704 ASSERT(mTransformFeedbackMap.contains(0));
2705 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002706}
2707
Shannon Woods53a94a82014-06-24 15:20:36 -04002708void Context::detachTexture(GLuint texture)
2709{
2710 // Simple pass-through to State's detachTexture method, as textures do not require
2711 // allocation map management either here or in the resource manager at detach time.
2712 // Zero textures are held by the Context, and we don't attempt to request them from
2713 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002714 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002715}
2716
James Darpinian4d9d4832018-03-13 12:43:28 -07002717void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002718{
Yuly Novikov5807a532015-12-03 13:01:22 -05002719 // Simple pass-through to State's detachBuffer method, since
2720 // only buffer attachments to container objects that are bound to the current context
2721 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002722
Yuly Novikov5807a532015-12-03 13:01:22 -05002723 // [OpenGL ES 3.2] section 5.1.2 page 45:
2724 // Attachments to unbound container objects, such as
2725 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2726 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002727 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002728}
2729
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002730void Context::detachFramebuffer(GLuint framebuffer)
2731{
Shannon Woods53a94a82014-06-24 15:20:36 -04002732 // Framebuffer detachment is handled by Context, because 0 is a valid
2733 // Framebuffer object, and a pointer to it must be passed from Context
2734 // to State at binding time.
2735
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002736 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002737 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2738 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2739 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002740
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002741 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002742 {
2743 bindReadFramebuffer(0);
2744 }
2745
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002746 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002747 {
2748 bindDrawFramebuffer(0);
2749 }
2750}
2751
2752void Context::detachRenderbuffer(GLuint renderbuffer)
2753{
Jamie Madilla02315b2017-02-23 14:14:47 -05002754 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002755}
2756
Jamie Madill57a89722013-07-02 11:57:03 -04002757void Context::detachVertexArray(GLuint vertexArray)
2758{
Jamie Madill77a72f62015-04-14 11:18:32 -04002759 // Vertex array detachment is handled by Context, because 0 is a valid
2760 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002761 // binding time.
2762
Jamie Madill57a89722013-07-02 11:57:03 -04002763 // [OpenGL ES 3.0.2] section 2.10 page 43:
2764 // If a vertex array object that is currently bound is deleted, the binding
2765 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002766 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002767 {
2768 bindVertexArray(0);
2769 }
2770}
2771
Geoff Langc8058452014-02-03 12:04:11 -05002772void Context::detachTransformFeedback(GLuint transformFeedback)
2773{
Corentin Walleza2257da2016-04-19 16:43:12 -04002774 // Transform feedback detachment is handled by Context, because 0 is a valid
2775 // transform feedback, and a pointer to it must be passed from Context to State at
2776 // binding time.
2777
2778 // The OpenGL specification doesn't mention what should happen when the currently bound
2779 // transform feedback object is deleted. Since it is a container object, we treat it like
2780 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002781 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002782 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002783 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002784 }
Geoff Langc8058452014-02-03 12:04:11 -05002785}
2786
Jamie Madilldc356042013-07-19 16:36:57 -04002787void Context::detachSampler(GLuint sampler)
2788{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002789 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002790}
2791
Yunchao Hea336b902017-08-02 16:05:21 +08002792void Context::detachProgramPipeline(GLuint pipeline)
2793{
2794 mGLState.detachProgramPipeline(this, pipeline);
2795}
2796
Jamie Madill3ef140a2017-08-26 23:11:21 -04002797void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002798{
Shaodde78e82017-05-22 14:13:27 +08002799 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002800 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002801}
2802
Jamie Madille29d1672013-07-19 16:36:57 -04002803void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2804{
Geoff Langc1984ed2016-10-07 12:41:00 -04002805 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002806 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002807 SetSamplerParameteri(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002808 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002809}
Jamie Madille29d1672013-07-19 16:36:57 -04002810
Geoff Langc1984ed2016-10-07 12:41:00 -04002811void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2812{
2813 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002814 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002815 SetSamplerParameteriv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002816 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002817}
2818
Brandon Jones59770802018-04-02 13:18:42 -07002819void Context::samplerParameterivRobust(GLuint sampler,
2820 GLenum pname,
2821 GLsizei bufSize,
2822 const GLint *param)
2823{
2824 samplerParameteriv(sampler, pname, param);
2825}
2826
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002827void Context::samplerParameterIivRobust(GLuint sampler,
2828 GLenum pname,
2829 GLsizei bufSize,
2830 const GLint *param)
2831{
2832 UNIMPLEMENTED();
2833}
2834
2835void Context::samplerParameterIuivRobust(GLuint sampler,
2836 GLenum pname,
2837 GLsizei bufSize,
2838 const GLuint *param)
2839{
2840 UNIMPLEMENTED();
2841}
2842
Jamie Madille29d1672013-07-19 16:36:57 -04002843void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2844{
Geoff Langc1984ed2016-10-07 12:41:00 -04002845 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002846 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002847 SetSamplerParameterf(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002848 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002849}
2850
Geoff Langc1984ed2016-10-07 12:41:00 -04002851void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002852{
Geoff Langc1984ed2016-10-07 12:41:00 -04002853 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002854 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002855 SetSamplerParameterfv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002856 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002857}
2858
Brandon Jones59770802018-04-02 13:18:42 -07002859void Context::samplerParameterfvRobust(GLuint sampler,
2860 GLenum pname,
2861 GLsizei bufSize,
2862 const GLfloat *param)
2863{
2864 samplerParameterfv(sampler, pname, param);
2865}
2866
Geoff Langc1984ed2016-10-07 12:41:00 -04002867void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002868{
Geoff Langc1984ed2016-10-07 12:41:00 -04002869 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002870 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002871 QuerySamplerParameteriv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002872 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002873}
Jamie Madill9675b802013-07-19 16:36:59 -04002874
Brandon Jones59770802018-04-02 13:18:42 -07002875void Context::getSamplerParameterivRobust(GLuint sampler,
2876 GLenum pname,
2877 GLsizei bufSize,
2878 GLsizei *length,
2879 GLint *params)
2880{
2881 getSamplerParameteriv(sampler, pname, params);
2882}
2883
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002884void Context::getSamplerParameterIivRobust(GLuint sampler,
2885 GLenum pname,
2886 GLsizei bufSize,
2887 GLsizei *length,
2888 GLint *params)
2889{
2890 UNIMPLEMENTED();
2891}
2892
2893void Context::getSamplerParameterIuivRobust(GLuint sampler,
2894 GLenum pname,
2895 GLsizei bufSize,
2896 GLsizei *length,
2897 GLuint *params)
2898{
2899 UNIMPLEMENTED();
2900}
2901
Geoff Langc1984ed2016-10-07 12:41:00 -04002902void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2903{
2904 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002905 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002906 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002907 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002908}
2909
Brandon Jones59770802018-04-02 13:18:42 -07002910void Context::getSamplerParameterfvRobust(GLuint sampler,
2911 GLenum pname,
2912 GLsizei bufSize,
2913 GLsizei *length,
2914 GLfloat *params)
2915{
2916 getSamplerParameterfv(sampler, pname, params);
2917}
2918
Olli Etuahof0fee072016-03-30 15:11:58 +03002919void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2920{
2921 gl::Program *programObject = getProgram(program);
Yunchao He61afff12017-03-14 15:34:03 +08002922 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002923}
2924
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002925void Context::initRendererString()
2926{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002927 std::ostringstream rendererString;
2928 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002929 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002930 rendererString << ")";
2931
Geoff Langcec35902014-04-16 10:52:36 -04002932 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002933}
2934
Geoff Langc339c4e2016-11-29 10:37:36 -05002935void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002936{
Geoff Langc339c4e2016-11-29 10:37:36 -05002937 const Version &clientVersion = getClientVersion();
2938
2939 std::ostringstream versionString;
2940 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2941 << ANGLE_VERSION_STRING << ")";
2942 mVersionString = MakeStaticString(versionString.str());
2943
2944 std::ostringstream shadingLanguageVersionString;
2945 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2946 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2947 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
2948 << ")";
2949 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002950}
2951
Geoff Langcec35902014-04-16 10:52:36 -04002952void Context::initExtensionStrings()
2953{
Geoff Langc339c4e2016-11-29 10:37:36 -05002954 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
2955 std::ostringstream combinedStringStream;
2956 std::copy(strings.begin(), strings.end(),
2957 std::ostream_iterator<const char *>(combinedStringStream, " "));
2958 return MakeStaticString(combinedStringStream.str());
2959 };
2960
2961 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002962 for (const auto &extensionString : mExtensions.getStrings())
2963 {
2964 mExtensionStrings.push_back(MakeStaticString(extensionString));
2965 }
Geoff Langc339c4e2016-11-29 10:37:36 -05002966 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002967
Geoff Langc339c4e2016-11-29 10:37:36 -05002968 mRequestableExtensionStrings.clear();
2969 for (const auto &extensionInfo : GetExtensionInfoMap())
2970 {
2971 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08002972 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05002973 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05002974 {
2975 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
2976 }
2977 }
2978 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002979}
2980
Geoff Langc339c4e2016-11-29 10:37:36 -05002981const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04002982{
Geoff Langc339c4e2016-11-29 10:37:36 -05002983 switch (name)
2984 {
2985 case GL_VENDOR:
2986 return reinterpret_cast<const GLubyte *>("Google Inc.");
2987
2988 case GL_RENDERER:
2989 return reinterpret_cast<const GLubyte *>(mRendererString);
2990
2991 case GL_VERSION:
2992 return reinterpret_cast<const GLubyte *>(mVersionString);
2993
2994 case GL_SHADING_LANGUAGE_VERSION:
2995 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
2996
2997 case GL_EXTENSIONS:
2998 return reinterpret_cast<const GLubyte *>(mExtensionString);
2999
3000 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3001 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3002
3003 default:
3004 UNREACHABLE();
3005 return nullptr;
3006 }
Geoff Langcec35902014-04-16 10:52:36 -04003007}
3008
Geoff Langc339c4e2016-11-29 10:37:36 -05003009const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003010{
Geoff Langc339c4e2016-11-29 10:37:36 -05003011 switch (name)
3012 {
3013 case GL_EXTENSIONS:
3014 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3015
3016 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3017 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3018
3019 default:
3020 UNREACHABLE();
3021 return nullptr;
3022 }
Geoff Langcec35902014-04-16 10:52:36 -04003023}
3024
3025size_t Context::getExtensionStringCount() const
3026{
3027 return mExtensionStrings.size();
3028}
3029
Geoff Lang111a99e2017-10-17 10:58:41 -04003030bool Context::isExtensionRequestable(const char *name)
3031{
3032 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3033 auto extension = extensionInfos.find(name);
3034
Geoff Lang111a99e2017-10-17 10:58:41 -04003035 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003036 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003037}
3038
Geoff Langc339c4e2016-11-29 10:37:36 -05003039void Context::requestExtension(const char *name)
3040{
3041 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3042 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3043 const auto &extension = extensionInfos.at(name);
3044 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003045 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003046
3047 if (mExtensions.*(extension.ExtensionsMember))
3048 {
3049 // Extension already enabled
3050 return;
3051 }
3052
3053 mExtensions.*(extension.ExtensionsMember) = true;
3054 updateCaps();
3055 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003056
Jamie Madill2f348d22017-06-05 10:50:59 -04003057 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3058 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003059
Jamie Madill81c2e252017-09-09 23:32:46 -04003060 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3061 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003062 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003063 for (auto &zeroTexture : mZeroTextures)
3064 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003065 if (zeroTexture.get() != nullptr)
3066 {
3067 zeroTexture->signalDirty(this, InitState::Initialized);
3068 }
Geoff Lang9aded172017-04-05 11:07:56 -04003069 }
3070
Jamie Madillb983a4b2018-08-01 11:34:51 -04003071 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003072}
3073
3074size_t Context::getRequestableExtensionStringCount() const
3075{
3076 return mRequestableExtensionStrings.size();
3077}
3078
Jamie Madill493f9572018-05-24 19:52:15 -04003079void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003080{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003081 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003082 ASSERT(transformFeedback != nullptr);
3083 ASSERT(!transformFeedback->isPaused());
3084
Jamie Madill6c1f6712017-02-14 19:08:04 -05003085 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003086}
3087
3088bool Context::hasActiveTransformFeedback(GLuint program) const
3089{
3090 for (auto pair : mTransformFeedbackMap)
3091 {
3092 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3093 {
3094 return true;
3095 }
3096 }
3097 return false;
3098}
3099
Geoff Lang33f11fb2018-05-07 13:42:47 -04003100Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003101{
3102 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3103
jchen1082af6202018-06-22 10:59:52 +08003104 // Explicitly enable GL_KHR_parallel_shader_compile
3105 supportedExtensions.parallelShaderCompile = true;
3106
Geoff Langb0f917f2017-12-05 13:41:54 -05003107 if (getClientVersion() < ES_2_0)
3108 {
3109 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003110 supportedExtensions.pointSizeArray = true;
3111 supportedExtensions.textureCubeMap = true;
3112 supportedExtensions.pointSprite = true;
3113 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003114 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003115 }
3116
3117 if (getClientVersion() < ES_3_0)
3118 {
3119 // Disable ES3+ extensions
3120 supportedExtensions.colorBufferFloat = false;
3121 supportedExtensions.eglImageExternalEssl3 = false;
3122 supportedExtensions.textureNorm16 = false;
3123 supportedExtensions.multiview = false;
3124 supportedExtensions.maxViews = 1u;
3125 }
3126
3127 if (getClientVersion() < ES_3_1)
3128 {
3129 // Disable ES3.1+ extensions
3130 supportedExtensions.geometryShader = false;
3131 }
3132
3133 if (getClientVersion() > ES_2_0)
3134 {
3135 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3136 // supportedExtensions.sRGB = false;
3137 }
3138
3139 // Some extensions are always available because they are implemented in the GL layer.
3140 supportedExtensions.bindUniformLocation = true;
3141 supportedExtensions.vertexArrayObject = true;
3142 supportedExtensions.bindGeneratesResource = true;
3143 supportedExtensions.clientArrays = true;
3144 supportedExtensions.requestExtension = true;
3145
3146 // Enable the no error extension if the context was created with the flag.
3147 supportedExtensions.noError = mSkipValidation;
3148
3149 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003150 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003151
3152 // Explicitly enable GL_KHR_debug
3153 supportedExtensions.debug = true;
3154 supportedExtensions.maxDebugMessageLength = 1024;
3155 supportedExtensions.maxDebugLoggedMessages = 1024;
3156 supportedExtensions.maxDebugGroupStackDepth = 1024;
3157 supportedExtensions.maxLabelLength = 1024;
3158
3159 // Explicitly enable GL_ANGLE_robust_client_memory
3160 supportedExtensions.robustClientMemory = true;
3161
3162 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003163 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003164
3165 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3166 // supports it.
3167 supportedExtensions.robustBufferAccessBehavior =
3168 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3169
3170 // Enable the cache control query unconditionally.
3171 supportedExtensions.programCacheControl = true;
3172
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003173 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003174 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003175 {
3176 // GL_ANGLE_explicit_context_gles1
3177 supportedExtensions.explicitContextGles1 = true;
3178 // GL_ANGLE_explicit_context
3179 supportedExtensions.explicitContext = true;
3180 }
3181
Geoff Langb0f917f2017-12-05 13:41:54 -05003182 return supportedExtensions;
3183}
3184
Geoff Lang33f11fb2018-05-07 13:42:47 -04003185void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003186{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003187 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003188
Geoff Lang33f11fb2018-05-07 13:42:47 -04003189 mSupportedExtensions = generateSupportedExtensions();
3190 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003191
3192 mLimitations = mImplementation->getNativeLimitations();
3193
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003194 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3195 if (getClientVersion() < Version(2, 0))
3196 {
3197 mCaps.maxMultitextureUnits = 4;
3198 mCaps.maxClipPlanes = 6;
3199 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003200 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3201 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3202 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003203 mCaps.minSmoothPointSize = 1.0f;
3204 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003205 }
3206
Luc Ferronad2ae932018-06-11 15:31:17 -04003207 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003208 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003209
Luc Ferronad2ae932018-06-11 15:31:17 -04003210 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3211
Jamie Madill0f80ed82017-09-19 00:24:56 -04003212 if (getClientVersion() < ES_3_1)
3213 {
3214 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3215 }
3216 else
3217 {
3218 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3219 }
Geoff Lang301d1612014-07-09 10:34:37 -04003220
Jiawei Shao54aafe52018-04-27 14:54:57 +08003221 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3222 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill0f80ed82017-09-19 00:24:56 -04003223 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3224 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3225
3226 // Limit textures as well, so we can use fast bitsets with texture bindings.
3227 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003228 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3229 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3230 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3231 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003232
Jiawei Shaodb342272017-09-27 10:21:45 +08003233 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3234
Geoff Langc287ea62016-09-16 14:46:51 -04003235 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003236 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003237 for (const auto &extensionInfo : GetExtensionInfoMap())
3238 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003239 // If the user has requested that extensions start disabled and they are requestable,
3240 // disable them.
3241 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003242 {
3243 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3244 }
3245 }
3246
3247 // Generate texture caps
3248 updateCaps();
3249}
3250
3251void Context::updateCaps()
3252{
Geoff Lang900013c2014-07-07 11:32:19 -04003253 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003254 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003255
Jamie Madill7b62cf92017-11-02 15:20:49 -04003256 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003257 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003258 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003259 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003260
Geoff Lang0d8b7242015-09-09 14:56:53 -04003261 // Update the format caps based on the client version and extensions.
3262 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3263 // ES3.
3264 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003265 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003266 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003267 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003268 formatCaps.textureAttachment =
3269 formatCaps.textureAttachment &&
3270 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3271 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3272 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003273
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003274 // OpenGL ES does not support multisampling with non-rendererable formats
3275 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003276 if (!formatCaps.renderbuffer ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003277 (getClientVersion() < ES_3_1 &&
3278 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003279 {
Geoff Langd87878e2014-09-19 15:42:59 -04003280 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003281 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003282 else
3283 {
3284 // We may have limited the max samples for some required renderbuffer formats due to
3285 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3286 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3287
3288 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3289 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3290 // exception of signed and unsigned integer formats."
3291 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3292 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3293 {
3294 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3295 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3296 }
3297
3298 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3299 if (getClientVersion() >= ES_3_1)
3300 {
3301 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3302 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3303 // the exception that the signed and unsigned integer formats are required only to
3304 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3305 // multisamples, which must be at least one."
3306 if (formatInfo.componentType == GL_INT ||
3307 formatInfo.componentType == GL_UNSIGNED_INT)
3308 {
3309 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3310 }
3311
3312 // GLES 3.1 section 19.3.1.
3313 if (formatCaps.texturable)
3314 {
3315 if (formatInfo.depthBits > 0)
3316 {
3317 mCaps.maxDepthTextureSamples =
3318 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3319 }
3320 else if (formatInfo.redBits > 0)
3321 {
3322 mCaps.maxColorTextureSamples =
3323 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3324 }
3325 }
3326 }
3327 }
Geoff Langd87878e2014-09-19 15:42:59 -04003328
3329 if (formatCaps.texturable && formatInfo.compressed)
3330 {
Geoff Langca271392017-04-05 12:30:00 -04003331 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003332 }
3333
Geoff Langca271392017-04-05 12:30:00 -04003334 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003335 }
Jamie Madill32447362017-06-28 14:53:52 -04003336
3337 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003338 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003339 {
3340 mMemoryProgramCache = nullptr;
3341 }
Corentin Walleze4477002017-12-01 14:39:58 -05003342
3343 // Compute which buffer types are allowed
3344 mValidBufferBindings.reset();
3345 mValidBufferBindings.set(BufferBinding::ElementArray);
3346 mValidBufferBindings.set(BufferBinding::Array);
3347
3348 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3349 {
3350 mValidBufferBindings.set(BufferBinding::PixelPack);
3351 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3352 }
3353
3354 if (getClientVersion() >= ES_3_0)
3355 {
3356 mValidBufferBindings.set(BufferBinding::CopyRead);
3357 mValidBufferBindings.set(BufferBinding::CopyWrite);
3358 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3359 mValidBufferBindings.set(BufferBinding::Uniform);
3360 }
3361
3362 if (getClientVersion() >= ES_3_1)
3363 {
3364 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3365 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3366 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3367 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3368 }
Geoff Lang493daf52014-07-03 13:38:44 -04003369}
3370
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003371void Context::initWorkarounds()
3372{
Jamie Madill761b02c2017-06-23 16:27:06 -04003373 // Apply back-end workarounds.
3374 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3375
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003376 // Lose the context upon out of memory error if the application is
3377 // expecting to watch for those events.
3378 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
3379}
3380
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003381// Return true if the draw is a no-op, else return false.
3382// A no-op draw occurs if the count of vertices is less than the minimum required to
3383// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3384bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3385{
3386 return count < kMinimumPrimitiveCounts[mode];
3387}
3388
3389bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3390{
3391 return (instanceCount == 0) || noopDraw(mode, count);
3392}
3393
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003394Error Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003395{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003396 if (mGLES1Renderer)
3397 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003398 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003399 }
3400
Geoff Lang9bf86f02018-07-26 11:46:34 -04003401 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003402
3403 if (isRobustResourceInitEnabled())
3404 {
3405 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3406 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3407 }
3408
Geoff Langa8cb2872018-03-09 16:09:40 -05003409 ANGLE_TRY(syncDirtyBits());
Geoff Langd4fff502017-09-22 11:28:28 -04003410 return NoError();
3411}
3412
3413Error Context::prepareForClear(GLbitfield mask)
3414{
Geoff Langa8cb2872018-03-09 16:09:40 -05003415 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003416 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003417 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003418 return NoError();
3419}
3420
3421Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3422{
Geoff Langa8cb2872018-03-09 16:09:40 -05003423 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003424 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3425 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003426 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003427 return NoError();
3428}
3429
Geoff Langa8cb2872018-03-09 16:09:40 -05003430Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003431{
Geoff Langa8cb2872018-03-09 16:09:40 -05003432 ANGLE_TRY(syncDirtyObjects(objectMask));
3433 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003434 return NoError();
3435}
3436
Geoff Langa8cb2872018-03-09 16:09:40 -05003437Error Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003438{
3439 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill189ad872018-07-09 13:32:37 -04003440 ANGLE_TRY(mImplementation->syncState(this, dirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003441 mGLState.clearDirtyBits();
3442 return NoError();
3443}
3444
Geoff Langa8cb2872018-03-09 16:09:40 -05003445Error Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003446{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003447 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill189ad872018-07-09 13:32:37 -04003448 ANGLE_TRY(mImplementation->syncState(this, dirtyBits));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003449 mGLState.clearDirtyBits(dirtyBits);
Jamie Madillbc918e72018-03-08 09:47:21 -05003450 return NoError();
Jamie Madill1b94d432015-08-07 13:23:23 -04003451}
Jamie Madillc29968b2016-01-20 11:17:23 -05003452
Geoff Langa8cb2872018-03-09 16:09:40 -05003453Error Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003454{
3455 return mGLState.syncDirtyObjects(this, objectMask);
3456}
3457
Jamie Madillc29968b2016-01-20 11:17:23 -05003458void Context::blitFramebuffer(GLint srcX0,
3459 GLint srcY0,
3460 GLint srcX1,
3461 GLint srcY1,
3462 GLint dstX0,
3463 GLint dstY0,
3464 GLint dstX1,
3465 GLint dstY1,
3466 GLbitfield mask,
3467 GLenum filter)
3468{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003469 if (mask == 0)
3470 {
3471 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3472 // buffers are copied.
3473 return;
3474 }
3475
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003476 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003477 ASSERT(drawFramebuffer);
3478
3479 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3480 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3481
Jamie Madillbc918e72018-03-08 09:47:21 -05003482 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003483
Jamie Madillc564c072017-06-01 12:45:42 -04003484 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003485}
Jamie Madillc29968b2016-01-20 11:17:23 -05003486
3487void Context::clear(GLbitfield mask)
3488{
Geoff Langd4fff502017-09-22 11:28:28 -04003489 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3490 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003491}
3492
3493void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3494{
Geoff Langd4fff502017-09-22 11:28:28 -04003495 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3496 ANGLE_CONTEXT_TRY(
3497 mGLState.getDrawFramebuffer()->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003498}
3499
3500void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3501{
Geoff Langd4fff502017-09-22 11:28:28 -04003502 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3503 ANGLE_CONTEXT_TRY(
3504 mGLState.getDrawFramebuffer()->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003505}
3506
3507void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3508{
Geoff Langd4fff502017-09-22 11:28:28 -04003509 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3510 ANGLE_CONTEXT_TRY(
3511 mGLState.getDrawFramebuffer()->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003512}
3513
3514void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3515{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003516 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003517 ASSERT(framebufferObject);
3518
3519 // If a buffer is not present, the clear has no effect
3520 if (framebufferObject->getDepthbuffer() == nullptr &&
3521 framebufferObject->getStencilbuffer() == nullptr)
3522 {
3523 return;
3524 }
3525
Geoff Langd4fff502017-09-22 11:28:28 -04003526 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3527 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003528}
3529
3530void Context::readPixels(GLint x,
3531 GLint y,
3532 GLsizei width,
3533 GLsizei height,
3534 GLenum format,
3535 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003536 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003537{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003538 if (width == 0 || height == 0)
3539 {
3540 return;
3541 }
3542
Jamie Madillbc918e72018-03-08 09:47:21 -05003543 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003544
Jamie Madillb6664922017-07-25 12:55:04 -04003545 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3546 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003547
3548 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003549 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003550}
3551
Brandon Jones59770802018-04-02 13:18:42 -07003552void Context::readPixelsRobust(GLint x,
3553 GLint y,
3554 GLsizei width,
3555 GLsizei height,
3556 GLenum format,
3557 GLenum type,
3558 GLsizei bufSize,
3559 GLsizei *length,
3560 GLsizei *columns,
3561 GLsizei *rows,
3562 void *pixels)
3563{
3564 readPixels(x, y, width, height, format, type, pixels);
3565}
3566
3567void Context::readnPixelsRobust(GLint x,
3568 GLint y,
3569 GLsizei width,
3570 GLsizei height,
3571 GLenum format,
3572 GLenum type,
3573 GLsizei bufSize,
3574 GLsizei *length,
3575 GLsizei *columns,
3576 GLsizei *rows,
3577 void *data)
3578{
3579 readPixels(x, y, width, height, format, type, data);
3580}
3581
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003582void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003583 GLint level,
3584 GLenum internalformat,
3585 GLint x,
3586 GLint y,
3587 GLsizei width,
3588 GLsizei height,
3589 GLint border)
3590{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003591 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003592 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003593
Jamie Madillc29968b2016-01-20 11:17:23 -05003594 Rectangle sourceArea(x, y, width, height);
3595
Jamie Madill05b35b22017-10-03 09:01:44 -04003596 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003597 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003598 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003599}
3600
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003601void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003602 GLint level,
3603 GLint xoffset,
3604 GLint yoffset,
3605 GLint x,
3606 GLint y,
3607 GLsizei width,
3608 GLsizei height)
3609{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003610 if (width == 0 || height == 0)
3611 {
3612 return;
3613 }
3614
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003615 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003616 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003617
Jamie Madillc29968b2016-01-20 11:17:23 -05003618 Offset destOffset(xoffset, yoffset, 0);
3619 Rectangle sourceArea(x, y, width, height);
3620
Jamie Madill05b35b22017-10-03 09:01:44 -04003621 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003622 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003623 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003624}
3625
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003626void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003627 GLint level,
3628 GLint xoffset,
3629 GLint yoffset,
3630 GLint zoffset,
3631 GLint x,
3632 GLint y,
3633 GLsizei width,
3634 GLsizei height)
3635{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003636 if (width == 0 || height == 0)
3637 {
3638 return;
3639 }
3640
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003641 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003642 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003643
Jamie Madillc29968b2016-01-20 11:17:23 -05003644 Offset destOffset(xoffset, yoffset, zoffset);
3645 Rectangle sourceArea(x, y, width, height);
3646
Jamie Madill05b35b22017-10-03 09:01:44 -04003647 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3648 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003649 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3650 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003651}
3652
3653void Context::framebufferTexture2D(GLenum target,
3654 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003655 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003656 GLuint texture,
3657 GLint level)
3658{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003659 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003660 ASSERT(framebuffer);
3661
3662 if (texture != 0)
3663 {
3664 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003665 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003666 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003667 }
3668 else
3669 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003670 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003671 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003672
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003673 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003674}
3675
3676void Context::framebufferRenderbuffer(GLenum target,
3677 GLenum attachment,
3678 GLenum renderbuffertarget,
3679 GLuint renderbuffer)
3680{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003681 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003682 ASSERT(framebuffer);
3683
3684 if (renderbuffer != 0)
3685 {
3686 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003687
Jamie Madillcc129372018-04-12 09:13:18 -04003688 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003689 renderbufferObject);
3690 }
3691 else
3692 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003693 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003694 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003695
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003696 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003697}
3698
3699void Context::framebufferTextureLayer(GLenum target,
3700 GLenum attachment,
3701 GLuint texture,
3702 GLint level,
3703 GLint layer)
3704{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003705 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003706 ASSERT(framebuffer);
3707
3708 if (texture != 0)
3709 {
3710 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003711 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003712 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003713 }
3714 else
3715 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003716 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003717 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003718
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003719 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003720}
3721
Brandon Jones59770802018-04-02 13:18:42 -07003722void Context::framebufferTextureMultiviewLayered(GLenum target,
3723 GLenum attachment,
3724 GLuint texture,
3725 GLint level,
3726 GLint baseViewIndex,
3727 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003728{
Martin Radev82ef7742017-08-08 17:44:58 +03003729 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3730 ASSERT(framebuffer);
3731
3732 if (texture != 0)
3733 {
3734 Texture *textureObj = getTexture(texture);
3735
Martin Radev18b75ba2017-08-15 15:50:40 +03003736 ImageIndex index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
Martin Radev82ef7742017-08-08 17:44:58 +03003737 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3738 numViews, baseViewIndex);
3739 }
3740 else
3741 {
3742 framebuffer->resetAttachment(this, attachment);
3743 }
3744
3745 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003746}
3747
Brandon Jones59770802018-04-02 13:18:42 -07003748void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3749 GLenum attachment,
3750 GLuint texture,
3751 GLint level,
3752 GLsizei numViews,
3753 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003754{
Martin Radev5dae57b2017-07-14 16:15:55 +03003755 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3756 ASSERT(framebuffer);
3757
3758 if (texture != 0)
3759 {
3760 Texture *textureObj = getTexture(texture);
3761
3762 ImageIndex index = ImageIndex::Make2D(level);
3763 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3764 textureObj, numViews, viewportOffsets);
3765 }
3766 else
3767 {
3768 framebuffer->resetAttachment(this, attachment);
3769 }
3770
3771 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003772}
3773
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003774void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3775{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003776 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3777 ASSERT(framebuffer);
3778
3779 if (texture != 0)
3780 {
3781 Texture *textureObj = getTexture(texture);
3782
3783 ImageIndex index = ImageIndex::MakeFromType(
3784 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3785 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3786 }
3787 else
3788 {
3789 framebuffer->resetAttachment(this, attachment);
3790 }
3791
3792 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003793}
3794
Jamie Madillc29968b2016-01-20 11:17:23 -05003795void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3796{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003797 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003798 ASSERT(framebuffer);
3799 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003800 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003801}
3802
3803void Context::readBuffer(GLenum mode)
3804{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003805 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003806 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003807 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003808}
3809
3810void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3811{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003812 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003813 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003814
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003815 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003816 ASSERT(framebuffer);
3817
3818 // The specification isn't clear what should be done when the framebuffer isn't complete.
3819 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003820 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003821}
3822
3823void Context::invalidateFramebuffer(GLenum target,
3824 GLsizei numAttachments,
3825 const GLenum *attachments)
3826{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003827 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003828 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003829
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003830 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003831 ASSERT(framebuffer);
3832
Jamie Madill427064d2018-04-13 16:20:34 -04003833 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003834 {
Jamie Madill437fa652016-05-03 15:13:24 -04003835 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003836 }
Jamie Madill437fa652016-05-03 15:13:24 -04003837
Jamie Madill4928b7c2017-06-20 12:57:39 -04003838 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003839}
3840
3841void Context::invalidateSubFramebuffer(GLenum target,
3842 GLsizei numAttachments,
3843 const GLenum *attachments,
3844 GLint x,
3845 GLint y,
3846 GLsizei width,
3847 GLsizei height)
3848{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003849 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003850 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003851
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003852 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003853 ASSERT(framebuffer);
3854
Jamie Madill427064d2018-04-13 16:20:34 -04003855 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003856 {
Jamie Madill437fa652016-05-03 15:13:24 -04003857 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003858 }
Jamie Madill437fa652016-05-03 15:13:24 -04003859
3860 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003861 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003862}
3863
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003864void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003865 GLint level,
3866 GLint internalformat,
3867 GLsizei width,
3868 GLsizei height,
3869 GLint border,
3870 GLenum format,
3871 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003872 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003873{
Jamie Madillbc918e72018-03-08 09:47:21 -05003874 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003875
3876 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003877 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003878 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07003879 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003880}
3881
Brandon Jones59770802018-04-02 13:18:42 -07003882void Context::texImage2DRobust(TextureTarget target,
3883 GLint level,
3884 GLint internalformat,
3885 GLsizei width,
3886 GLsizei height,
3887 GLint border,
3888 GLenum format,
3889 GLenum type,
3890 GLsizei bufSize,
3891 const void *pixels)
3892{
3893 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
3894}
3895
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003896void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003897 GLint level,
3898 GLint internalformat,
3899 GLsizei width,
3900 GLsizei height,
3901 GLsizei depth,
3902 GLint border,
3903 GLenum format,
3904 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003905 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003906{
Jamie Madillbc918e72018-03-08 09:47:21 -05003907 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003908
3909 Extents size(width, height, depth);
3910 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003911 handleError(texture->setImage(this, mGLState.getUnpackState(),
3912 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07003913 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003914}
3915
Brandon Jones59770802018-04-02 13:18:42 -07003916void Context::texImage3DRobust(TextureType target,
3917 GLint level,
3918 GLint internalformat,
3919 GLsizei width,
3920 GLsizei height,
3921 GLsizei depth,
3922 GLint border,
3923 GLenum format,
3924 GLenum type,
3925 GLsizei bufSize,
3926 const void *pixels)
3927{
3928 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
3929}
3930
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003931void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003932 GLint level,
3933 GLint xoffset,
3934 GLint yoffset,
3935 GLsizei width,
3936 GLsizei height,
3937 GLenum format,
3938 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003939 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003940{
3941 // Zero sized uploads are valid but no-ops
3942 if (width == 0 || height == 0)
3943 {
3944 return;
3945 }
3946
Jamie Madillbc918e72018-03-08 09:47:21 -05003947 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003948
3949 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003950 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003951 handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07003952 type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003953}
3954
Brandon Jones59770802018-04-02 13:18:42 -07003955void Context::texSubImage2DRobust(TextureTarget target,
3956 GLint level,
3957 GLint xoffset,
3958 GLint yoffset,
3959 GLsizei width,
3960 GLsizei height,
3961 GLenum format,
3962 GLenum type,
3963 GLsizei bufSize,
3964 const void *pixels)
3965{
3966 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
3967}
3968
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003969void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003970 GLint level,
3971 GLint xoffset,
3972 GLint yoffset,
3973 GLint zoffset,
3974 GLsizei width,
3975 GLsizei height,
3976 GLsizei depth,
3977 GLenum format,
3978 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003979 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003980{
3981 // Zero sized uploads are valid but no-ops
3982 if (width == 0 || height == 0 || depth == 0)
3983 {
3984 return;
3985 }
3986
Jamie Madillbc918e72018-03-08 09:47:21 -05003987 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003988
3989 Box area(xoffset, yoffset, zoffset, width, height, depth);
3990 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003991 handleError(texture->setSubImage(this, mGLState.getUnpackState(),
3992 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07003993 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003994}
3995
Brandon Jones59770802018-04-02 13:18:42 -07003996void Context::texSubImage3DRobust(TextureType target,
3997 GLint level,
3998 GLint xoffset,
3999 GLint yoffset,
4000 GLint zoffset,
4001 GLsizei width,
4002 GLsizei height,
4003 GLsizei depth,
4004 GLenum format,
4005 GLenum type,
4006 GLsizei bufSize,
4007 const void *pixels)
4008{
4009 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4010 pixels);
4011}
4012
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004013void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004014 GLint level,
4015 GLenum internalformat,
4016 GLsizei width,
4017 GLsizei height,
4018 GLint border,
4019 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004020 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004021{
Jamie Madillbc918e72018-03-08 09:47:21 -05004022 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004023
4024 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004025 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004026 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4027 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004028 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004029}
4030
Brandon Jones59770802018-04-02 13:18:42 -07004031void Context::compressedTexImage2DRobust(TextureTarget target,
4032 GLint level,
4033 GLenum internalformat,
4034 GLsizei width,
4035 GLsizei height,
4036 GLint border,
4037 GLsizei imageSize,
4038 GLsizei dataSize,
4039 const GLvoid *data)
4040{
4041 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4042}
4043
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004044void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004045 GLint level,
4046 GLenum internalformat,
4047 GLsizei width,
4048 GLsizei height,
4049 GLsizei depth,
4050 GLint border,
4051 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004052 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004053{
Jamie Madillbc918e72018-03-08 09:47:21 -05004054 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004055
4056 Extents size(width, height, depth);
4057 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004058 handleError(texture->setCompressedImage(
4059 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004060 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004061}
4062
Brandon Jones59770802018-04-02 13:18:42 -07004063void Context::compressedTexImage3DRobust(TextureType target,
4064 GLint level,
4065 GLenum internalformat,
4066 GLsizei width,
4067 GLsizei height,
4068 GLsizei depth,
4069 GLint border,
4070 GLsizei imageSize,
4071 GLsizei dataSize,
4072 const GLvoid *data)
4073{
4074 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4075 data);
4076}
4077
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004078void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004079 GLint level,
4080 GLint xoffset,
4081 GLint yoffset,
4082 GLsizei width,
4083 GLsizei height,
4084 GLenum format,
4085 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004086 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004087{
Jamie Madillbc918e72018-03-08 09:47:21 -05004088 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004089
4090 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004091 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004092 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4093 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004094 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004095}
4096
Brandon Jones59770802018-04-02 13:18:42 -07004097void Context::compressedTexSubImage2DRobust(TextureTarget target,
4098 GLint level,
4099 GLint xoffset,
4100 GLint yoffset,
4101 GLsizei width,
4102 GLsizei height,
4103 GLenum format,
4104 GLsizei imageSize,
4105 GLsizei dataSize,
4106 const GLvoid *data)
4107{
4108 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4109 data);
4110}
4111
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004112void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004113 GLint level,
4114 GLint xoffset,
4115 GLint yoffset,
4116 GLint zoffset,
4117 GLsizei width,
4118 GLsizei height,
4119 GLsizei depth,
4120 GLenum format,
4121 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004122 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004123{
4124 // Zero sized uploads are valid but no-ops
4125 if (width == 0 || height == 0)
4126 {
4127 return;
4128 }
4129
Jamie Madillbc918e72018-03-08 09:47:21 -05004130 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004131
4132 Box area(xoffset, yoffset, zoffset, width, height, depth);
4133 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004134 handleError(texture->setCompressedSubImage(
4135 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004136 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004137}
4138
Brandon Jones59770802018-04-02 13:18:42 -07004139void Context::compressedTexSubImage3DRobust(TextureType target,
4140 GLint level,
4141 GLint xoffset,
4142 GLint yoffset,
4143 GLint zoffset,
4144 GLsizei width,
4145 GLsizei height,
4146 GLsizei depth,
4147 GLenum format,
4148 GLsizei imageSize,
4149 GLsizei dataSize,
4150 const GLvoid *data)
4151{
4152 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4153 imageSize, data);
4154}
4155
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004156void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004157{
4158 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004159 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004160}
4161
Jamie Madill007530e2017-12-28 14:27:04 -05004162void Context::copyTexture(GLuint sourceId,
4163 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004164 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004165 GLuint destId,
4166 GLint destLevel,
4167 GLint internalFormat,
4168 GLenum destType,
4169 GLboolean unpackFlipY,
4170 GLboolean unpackPremultiplyAlpha,
4171 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004172{
Jamie Madillbc918e72018-03-08 09:47:21 -05004173 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004174
4175 gl::Texture *sourceTexture = getTexture(sourceId);
4176 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004177 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4178 sourceLevel, ConvertToBool(unpackFlipY),
4179 ConvertToBool(unpackPremultiplyAlpha),
4180 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004181}
4182
Jamie Madill007530e2017-12-28 14:27:04 -05004183void Context::copySubTexture(GLuint sourceId,
4184 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004185 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004186 GLuint destId,
4187 GLint destLevel,
4188 GLint xoffset,
4189 GLint yoffset,
4190 GLint x,
4191 GLint y,
4192 GLsizei width,
4193 GLsizei height,
4194 GLboolean unpackFlipY,
4195 GLboolean unpackPremultiplyAlpha,
4196 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004197{
4198 // Zero sized copies are valid but no-ops
4199 if (width == 0 || height == 0)
4200 {
4201 return;
4202 }
4203
Jamie Madillbc918e72018-03-08 09:47:21 -05004204 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004205
4206 gl::Texture *sourceTexture = getTexture(sourceId);
4207 gl::Texture *destTexture = getTexture(destId);
4208 Offset offset(xoffset, yoffset, 0);
4209 Rectangle area(x, y, width, height);
Geoff Lang92019432017-11-20 13:09:34 -05004210 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, area,
4211 ConvertToBool(unpackFlipY),
4212 ConvertToBool(unpackPremultiplyAlpha),
4213 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004214}
4215
Jamie Madill007530e2017-12-28 14:27:04 -05004216void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004217{
Jamie Madillbc918e72018-03-08 09:47:21 -05004218 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004219
4220 gl::Texture *sourceTexture = getTexture(sourceId);
4221 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004222 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004223}
4224
Corentin Wallez336129f2017-10-17 15:55:40 -04004225void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004226{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004227 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004228 ASSERT(buffer);
4229
Geoff Lang496c02d2016-10-20 11:38:11 -07004230 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004231}
4232
Brandon Jones59770802018-04-02 13:18:42 -07004233void Context::getBufferPointervRobust(BufferBinding target,
4234 GLenum pname,
4235 GLsizei bufSize,
4236 GLsizei *length,
4237 void **params)
4238{
4239 getBufferPointerv(target, pname, params);
4240}
4241
Corentin Wallez336129f2017-10-17 15:55:40 -04004242void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004243{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004244 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004245 ASSERT(buffer);
4246
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004247 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004248 if (error.isError())
4249 {
Jamie Madill437fa652016-05-03 15:13:24 -04004250 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004251 return nullptr;
4252 }
4253
4254 return buffer->getMapPointer();
4255}
4256
Corentin Wallez336129f2017-10-17 15:55:40 -04004257GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004258{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004259 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004260 ASSERT(buffer);
4261
4262 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004263 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004264 if (error.isError())
4265 {
Jamie Madill437fa652016-05-03 15:13:24 -04004266 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004267 return GL_FALSE;
4268 }
4269
4270 return result;
4271}
4272
Corentin Wallez336129f2017-10-17 15:55:40 -04004273void *Context::mapBufferRange(BufferBinding target,
4274 GLintptr offset,
4275 GLsizeiptr length,
4276 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004277{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004278 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004279 ASSERT(buffer);
4280
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004281 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004282 if (error.isError())
4283 {
Jamie Madill437fa652016-05-03 15:13:24 -04004284 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004285 return nullptr;
4286 }
4287
4288 return buffer->getMapPointer();
4289}
4290
Corentin Wallez336129f2017-10-17 15:55:40 -04004291void Context::flushMappedBufferRange(BufferBinding /*target*/,
4292 GLintptr /*offset*/,
4293 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004294{
4295 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4296}
4297
Jamie Madillbc918e72018-03-08 09:47:21 -05004298Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004299{
Geoff Langa8cb2872018-03-09 16:09:40 -05004300 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004301}
4302
Jamie Madillbc918e72018-03-08 09:47:21 -05004303Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004304{
Geoff Langa8cb2872018-03-09 16:09:40 -05004305 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004306}
4307
Jamie Madillbc918e72018-03-08 09:47:21 -05004308Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004309{
Geoff Langa8cb2872018-03-09 16:09:40 -05004310 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004311}
4312
Geoff Lang9bf86f02018-07-26 11:46:34 -04004313Error Context::syncStateForPathOperation()
4314{
4315 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4316
4317 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4318 ANGLE_TRY(syncDirtyBits());
4319
4320 return NoError();
4321}
4322
Jiajia Qin5451d532017-11-16 17:16:34 +08004323void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4324{
4325 UNIMPLEMENTED();
4326}
4327
Jamie Madillc20ab272016-06-09 07:20:46 -07004328void Context::activeTexture(GLenum texture)
4329{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004330 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004331}
4332
Jamie Madill876429b2017-04-20 15:46:24 -04004333void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004334{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004335 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004336}
4337
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004338void Context::blendEquation(GLenum mode)
4339{
4340 mGLState.setBlendEquation(mode, mode);
4341}
4342
Jamie Madillc20ab272016-06-09 07:20:46 -07004343void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4344{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004345 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004346}
4347
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004348void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4349{
4350 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4351}
4352
Jamie Madillc20ab272016-06-09 07:20:46 -07004353void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4354{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004355 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004356}
4357
Jamie Madill876429b2017-04-20 15:46:24 -04004358void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004359{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004360 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004361}
4362
Jamie Madill876429b2017-04-20 15:46:24 -04004363void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004364{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004365 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07004366}
4367
4368void Context::clearStencil(GLint s)
4369{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004370 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004371}
4372
4373void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4374{
Geoff Lang92019432017-11-20 13:09:34 -05004375 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4376 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004377}
4378
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004379void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004380{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004381 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004382}
4383
4384void Context::depthFunc(GLenum func)
4385{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004386 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004387}
4388
4389void Context::depthMask(GLboolean flag)
4390{
Geoff Lang92019432017-11-20 13:09:34 -05004391 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004392}
4393
Jamie Madill876429b2017-04-20 15:46:24 -04004394void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004395{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004396 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07004397}
4398
4399void Context::disable(GLenum cap)
4400{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004401 mGLState.setEnableFeature(cap, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07004402}
4403
4404void Context::disableVertexAttribArray(GLuint index)
4405{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004406 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004407 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004408}
4409
4410void Context::enable(GLenum cap)
4411{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004412 mGLState.setEnableFeature(cap, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07004413}
4414
4415void Context::enableVertexAttribArray(GLuint index)
4416{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004417 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004418 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004419}
4420
4421void Context::frontFace(GLenum mode)
4422{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004423 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004424}
4425
4426void Context::hint(GLenum target, GLenum mode)
4427{
4428 switch (target)
4429 {
4430 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004431 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004432 break;
4433
4434 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004435 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004436 break;
4437
4438 default:
4439 UNREACHABLE();
4440 return;
4441 }
4442}
4443
4444void Context::lineWidth(GLfloat width)
4445{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004446 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004447}
4448
4449void Context::pixelStorei(GLenum pname, GLint param)
4450{
4451 switch (pname)
4452 {
4453 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004454 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004455 break;
4456
4457 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004458 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004459 break;
4460
4461 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004462 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004463 break;
4464
4465 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004466 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004467 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004468 break;
4469
4470 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004471 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004472 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004473 break;
4474
4475 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004476 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004477 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004478 break;
4479
4480 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004481 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004482 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004483 break;
4484
4485 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004486 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004487 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004488 break;
4489
4490 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004491 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004492 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004493 break;
4494
4495 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004496 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004497 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004498 break;
4499
4500 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004501 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004502 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004503 break;
4504
4505 default:
4506 UNREACHABLE();
4507 return;
4508 }
4509}
4510
4511void Context::polygonOffset(GLfloat factor, GLfloat units)
4512{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004513 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004514}
4515
Jamie Madill876429b2017-04-20 15:46:24 -04004516void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004517{
Geoff Lang92019432017-11-20 13:09:34 -05004518 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004519}
4520
Jiawei Shaodb342272017-09-27 10:21:45 +08004521void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4522{
4523 mGLState.setSampleMaskParams(maskNumber, mask);
4524}
4525
Jamie Madillc20ab272016-06-09 07:20:46 -07004526void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4527{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004528 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004529}
4530
4531void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4532{
4533 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4534 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004535 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004536 }
4537
4538 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4539 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004540 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004541 }
4542}
4543
4544void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4545{
4546 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4547 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004548 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004549 }
4550
4551 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4552 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004553 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004554 }
4555}
4556
4557void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4558{
4559 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4560 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004561 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004562 }
4563
4564 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4565 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004566 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004567 }
4568}
4569
4570void Context::vertexAttrib1f(GLuint index, GLfloat x)
4571{
4572 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004573 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004574}
4575
4576void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4577{
4578 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004579 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004580}
4581
4582void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4583{
4584 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004585 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004586}
4587
4588void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4589{
4590 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004591 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004592}
4593
4594void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4595{
4596 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004597 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004598}
4599
4600void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4601{
4602 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004603 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004604}
4605
4606void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4607{
4608 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004609 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004610}
4611
4612void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4613{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004614 mGLState.setVertexAttribf(index, values);
Jamie Madillc20ab272016-06-09 07:20:46 -07004615}
4616
4617void Context::vertexAttribPointer(GLuint index,
4618 GLint size,
4619 GLenum type,
4620 GLboolean normalized,
4621 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004622 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004623{
Corentin Wallez336129f2017-10-17 15:55:40 -04004624 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004625 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004626 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004627}
4628
Shao80957d92017-02-20 21:25:59 +08004629void Context::vertexAttribFormat(GLuint attribIndex,
4630 GLint size,
4631 GLenum type,
4632 GLboolean normalized,
4633 GLuint relativeOffset)
4634{
Geoff Lang92019432017-11-20 13:09:34 -05004635 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004636 relativeOffset);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004637 mStateCache.onVertexArraySizeChange(this);
Shao80957d92017-02-20 21:25:59 +08004638}
4639
4640void Context::vertexAttribIFormat(GLuint attribIndex,
4641 GLint size,
4642 GLenum type,
4643 GLuint relativeOffset)
4644{
4645 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004646 mStateCache.onVertexArraySizeChange(this);
Shao80957d92017-02-20 21:25:59 +08004647}
4648
4649void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4650{
Shaodde78e82017-05-22 14:13:27 +08004651 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004652 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004653}
4654
Jiajia Qin5451d532017-11-16 17:16:34 +08004655void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004656{
4657 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004658 mStateCache.onVertexArraySizeChange(this);
Shao80957d92017-02-20 21:25:59 +08004659}
4660
Jamie Madillc20ab272016-06-09 07:20:46 -07004661void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4662{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004663 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004664}
4665
4666void Context::vertexAttribIPointer(GLuint index,
4667 GLint size,
4668 GLenum type,
4669 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004670 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004671{
Corentin Wallez336129f2017-10-17 15:55:40 -04004672 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4673 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004674 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004675}
4676
4677void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4678{
4679 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004680 mGLState.setVertexAttribi(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004681}
4682
4683void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4684{
4685 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004686 mGLState.setVertexAttribu(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004687}
4688
4689void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4690{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004691 mGLState.setVertexAttribi(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07004692}
4693
4694void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4695{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004696 mGLState.setVertexAttribu(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07004697}
4698
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004699void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4700{
4701 const VertexAttribCurrentValueData &currentValues =
4702 getGLState().getVertexAttribCurrentValue(index);
4703 const VertexArray *vao = getGLState().getVertexArray();
4704 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4705 currentValues, pname, params);
4706}
4707
Brandon Jones59770802018-04-02 13:18:42 -07004708void Context::getVertexAttribivRobust(GLuint index,
4709 GLenum pname,
4710 GLsizei bufSize,
4711 GLsizei *length,
4712 GLint *params)
4713{
4714 getVertexAttribiv(index, pname, params);
4715}
4716
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004717void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4718{
4719 const VertexAttribCurrentValueData &currentValues =
4720 getGLState().getVertexAttribCurrentValue(index);
4721 const VertexArray *vao = getGLState().getVertexArray();
4722 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4723 currentValues, pname, params);
4724}
4725
Brandon Jones59770802018-04-02 13:18:42 -07004726void Context::getVertexAttribfvRobust(GLuint index,
4727 GLenum pname,
4728 GLsizei bufSize,
4729 GLsizei *length,
4730 GLfloat *params)
4731{
4732 getVertexAttribfv(index, pname, params);
4733}
4734
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004735void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4736{
4737 const VertexAttribCurrentValueData &currentValues =
4738 getGLState().getVertexAttribCurrentValue(index);
4739 const VertexArray *vao = getGLState().getVertexArray();
4740 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4741 currentValues, pname, params);
4742}
4743
Brandon Jones59770802018-04-02 13:18:42 -07004744void Context::getVertexAttribIivRobust(GLuint index,
4745 GLenum pname,
4746 GLsizei bufSize,
4747 GLsizei *length,
4748 GLint *params)
4749{
4750 getVertexAttribIiv(index, pname, params);
4751}
4752
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004753void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4754{
4755 const VertexAttribCurrentValueData &currentValues =
4756 getGLState().getVertexAttribCurrentValue(index);
4757 const VertexArray *vao = getGLState().getVertexArray();
4758 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4759 currentValues, pname, params);
4760}
4761
Brandon Jones59770802018-04-02 13:18:42 -07004762void Context::getVertexAttribIuivRobust(GLuint index,
4763 GLenum pname,
4764 GLsizei bufSize,
4765 GLsizei *length,
4766 GLuint *params)
4767{
4768 getVertexAttribIuiv(index, pname, params);
4769}
4770
Jamie Madill876429b2017-04-20 15:46:24 -04004771void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004772{
4773 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4774 QueryVertexAttribPointerv(attrib, pname, pointer);
4775}
4776
Brandon Jones59770802018-04-02 13:18:42 -07004777void Context::getVertexAttribPointervRobust(GLuint index,
4778 GLenum pname,
4779 GLsizei bufSize,
4780 GLsizei *length,
4781 void **pointer)
4782{
4783 getVertexAttribPointerv(index, pname, pointer);
4784}
4785
Jamie Madillc20ab272016-06-09 07:20:46 -07004786void Context::debugMessageControl(GLenum source,
4787 GLenum type,
4788 GLenum severity,
4789 GLsizei count,
4790 const GLuint *ids,
4791 GLboolean enabled)
4792{
4793 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004794 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05004795 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07004796}
4797
4798void Context::debugMessageInsert(GLenum source,
4799 GLenum type,
4800 GLuint id,
4801 GLenum severity,
4802 GLsizei length,
4803 const GLchar *buf)
4804{
4805 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004806 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07004807}
4808
4809void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
4810{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004811 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07004812}
4813
4814GLuint Context::getDebugMessageLog(GLuint count,
4815 GLsizei bufSize,
4816 GLenum *sources,
4817 GLenum *types,
4818 GLuint *ids,
4819 GLenum *severities,
4820 GLsizei *lengths,
4821 GLchar *messageLog)
4822{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004823 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
4824 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07004825}
4826
4827void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
4828{
4829 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004830 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05004831 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07004832}
4833
4834void Context::popDebugGroup()
4835{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004836 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05004837 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07004838}
4839
Corentin Wallez336129f2017-10-17 15:55:40 -04004840void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04004841{
4842 Buffer *buffer = mGLState.getTargetBuffer(target);
4843 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004844 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04004845}
4846
Corentin Wallez336129f2017-10-17 15:55:40 -04004847void Context::bufferSubData(BufferBinding target,
4848 GLintptr offset,
4849 GLsizeiptr size,
4850 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04004851{
4852 if (data == nullptr)
4853 {
4854 return;
4855 }
4856
4857 Buffer *buffer = mGLState.getTargetBuffer(target);
4858 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004859 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04004860}
4861
Jamie Madillef300b12016-10-07 15:12:09 -04004862void Context::attachShader(GLuint program, GLuint shader)
4863{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05004864 Program *programObject = mState.mShaderPrograms->getProgram(program);
4865 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04004866 ASSERT(programObject && shaderObject);
4867 programObject->attachShader(shaderObject);
4868}
4869
Kenneth Russellf2f6f652016-10-05 19:53:23 -07004870const Workarounds &Context::getWorkarounds() const
4871{
4872 return mWorkarounds;
4873}
4874
Corentin Wallez336129f2017-10-17 15:55:40 -04004875void Context::copyBufferSubData(BufferBinding readTarget,
4876 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04004877 GLintptr readOffset,
4878 GLintptr writeOffset,
4879 GLsizeiptr size)
4880{
4881 // if size is zero, the copy is a successful no-op
4882 if (size == 0)
4883 {
4884 return;
4885 }
4886
4887 // TODO(jmadill): cache these.
4888 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
4889 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
4890
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004891 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04004892}
4893
Jamie Madill01a80ee2016-11-07 12:06:18 -05004894void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
4895{
4896 Program *programObject = getProgram(program);
4897 // TODO(jmadill): Re-use this from the validation if possible.
4898 ASSERT(programObject);
4899 programObject->bindAttributeLocation(index, name);
4900}
4901
Corentin Wallez336129f2017-10-17 15:55:40 -04004902void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004903{
Corentin Wallez336129f2017-10-17 15:55:40 -04004904 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4905 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004906}
4907
Corentin Wallez336129f2017-10-17 15:55:40 -04004908void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08004909{
4910 bindBufferRange(target, index, buffer, 0, 0);
4911}
4912
Corentin Wallez336129f2017-10-17 15:55:40 -04004913void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08004914 GLuint index,
4915 GLuint buffer,
4916 GLintptr offset,
4917 GLsizeiptr size)
4918{
Corentin Wallez336129f2017-10-17 15:55:40 -04004919 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4920 mGLState.setIndexedBufferBinding(this, target, index, bufferObject, offset, size);
Jiajia Qin6eafb042016-12-27 17:04:07 +08004921}
4922
Jamie Madill01a80ee2016-11-07 12:06:18 -05004923void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
4924{
4925 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4926 {
4927 bindReadFramebuffer(framebuffer);
4928 }
4929
4930 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4931 {
4932 bindDrawFramebuffer(framebuffer);
4933 }
4934}
4935
4936void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
4937{
4938 ASSERT(target == GL_RENDERBUFFER);
4939 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05004940 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004941 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004942}
4943
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004944void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08004945 GLsizei samples,
4946 GLenum internalformat,
4947 GLsizei width,
4948 GLsizei height,
4949 GLboolean fixedsamplelocations)
4950{
4951 Extents size(width, height, 1);
4952 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004953 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
4954 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08004955}
4956
4957void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
4958{
JiangYizhou5b03f472017-01-09 10:22:53 +08004959 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
4960 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05004961 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08004962 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08004963
4964 switch (pname)
4965 {
4966 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04004967 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08004968 break;
4969 default:
4970 UNREACHABLE();
4971 }
4972}
4973
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07004974void Context::getMultisamplefvRobust(GLenum pname,
4975 GLuint index,
4976 GLsizei bufSize,
4977 GLsizei *length,
4978 GLfloat *val)
4979{
4980 UNIMPLEMENTED();
4981}
4982
Jamie Madille8fb6402017-02-14 17:56:40 -05004983void Context::renderbufferStorage(GLenum target,
4984 GLenum internalformat,
4985 GLsizei width,
4986 GLsizei height)
4987{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004988 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4989 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
4990
Jamie Madille8fb6402017-02-14 17:56:40 -05004991 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04004992 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004993}
4994
4995void Context::renderbufferStorageMultisample(GLenum target,
4996 GLsizei samples,
4997 GLenum internalformat,
4998 GLsizei width,
4999 GLsizei height)
5000{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005001 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5002 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005003
5004 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005005 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005006 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005007}
5008
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005009void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5010{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005011 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005012 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005013}
5014
JiangYizhoue18e6392017-02-20 10:32:23 +08005015void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5016{
5017 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5018 QueryFramebufferParameteriv(framebuffer, pname, params);
5019}
5020
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005021void Context::getFramebufferParameterivRobust(GLenum target,
5022 GLenum pname,
5023 GLsizei bufSize,
5024 GLsizei *length,
5025 GLint *params)
5026{
5027 UNIMPLEMENTED();
5028}
5029
Jiajia Qin5451d532017-11-16 17:16:34 +08005030void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005031{
5032 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005033 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005034}
5035
Jamie Madilldec86232018-07-11 09:01:18 -04005036bool Context::getScratchBuffer(size_t requstedSizeBytes,
5037 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005038{
Jamie Madilldec86232018-07-11 09:01:18 -04005039 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005040}
5041
Jamie Madilldec86232018-07-11 09:01:18 -04005042bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5043 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005044{
Jamie Madilldec86232018-07-11 09:01:18 -04005045 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005046}
5047
Xinghua Cao10a4d432017-11-28 14:46:26 +08005048Error Context::prepareForDispatch()
5049{
Geoff Langa8cb2872018-03-09 16:09:40 -05005050 ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005051
5052 if (isRobustResourceInitEnabled())
5053 {
5054 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5055 }
5056
5057 return NoError();
5058}
5059
Xinghua Cao2b396592017-03-29 15:36:04 +08005060void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5061{
5062 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5063 {
5064 return;
5065 }
5066
Xinghua Cao10a4d432017-11-28 14:46:26 +08005067 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005068 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005069}
5070
Jiajia Qin5451d532017-11-16 17:16:34 +08005071void Context::dispatchComputeIndirect(GLintptr indirect)
5072{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005073 ANGLE_CONTEXT_TRY(prepareForDispatch());
5074 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005075}
5076
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005077void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005078 GLsizei levels,
5079 GLenum internalFormat,
5080 GLsizei width,
5081 GLsizei height)
5082{
5083 Extents size(width, height, 1);
5084 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005085 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005086}
5087
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005088void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005089 GLsizei levels,
5090 GLenum internalFormat,
5091 GLsizei width,
5092 GLsizei height,
5093 GLsizei depth)
5094{
5095 Extents size(width, height, depth);
5096 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005097 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005098}
5099
Jiajia Qin5451d532017-11-16 17:16:34 +08005100void Context::memoryBarrier(GLbitfield barriers)
5101{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005102 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005103}
5104
5105void Context::memoryBarrierByRegion(GLbitfield barriers)
5106{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005107 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005108}
5109
Jamie Madillc1d770e2017-04-13 17:31:24 -04005110GLenum Context::checkFramebufferStatus(GLenum target)
5111{
5112 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5113 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005114 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005115}
5116
5117void Context::compileShader(GLuint shader)
5118{
5119 Shader *shaderObject = GetValidShader(this, shader);
5120 if (!shaderObject)
5121 {
5122 return;
5123 }
5124 shaderObject->compile(this);
5125}
5126
5127void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5128{
5129 for (int i = 0; i < n; i++)
5130 {
5131 deleteBuffer(buffers[i]);
5132 }
5133}
5134
5135void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5136{
5137 for (int i = 0; i < n; i++)
5138 {
5139 if (framebuffers[i] != 0)
5140 {
5141 deleteFramebuffer(framebuffers[i]);
5142 }
5143 }
5144}
5145
5146void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5147{
5148 for (int i = 0; i < n; i++)
5149 {
5150 deleteRenderbuffer(renderbuffers[i]);
5151 }
5152}
5153
5154void Context::deleteTextures(GLsizei n, const GLuint *textures)
5155{
5156 for (int i = 0; i < n; i++)
5157 {
5158 if (textures[i] != 0)
5159 {
5160 deleteTexture(textures[i]);
5161 }
5162 }
5163}
5164
5165void Context::detachShader(GLuint program, GLuint shader)
5166{
5167 Program *programObject = getProgram(program);
5168 ASSERT(programObject);
5169
5170 Shader *shaderObject = getShader(shader);
5171 ASSERT(shaderObject);
5172
5173 programObject->detachShader(this, shaderObject);
5174}
5175
5176void Context::genBuffers(GLsizei n, GLuint *buffers)
5177{
5178 for (int i = 0; i < n; i++)
5179 {
5180 buffers[i] = createBuffer();
5181 }
5182}
5183
5184void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5185{
5186 for (int i = 0; i < n; i++)
5187 {
5188 framebuffers[i] = createFramebuffer();
5189 }
5190}
5191
5192void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5193{
5194 for (int i = 0; i < n; i++)
5195 {
5196 renderbuffers[i] = createRenderbuffer();
5197 }
5198}
5199
5200void Context::genTextures(GLsizei n, GLuint *textures)
5201{
5202 for (int i = 0; i < n; i++)
5203 {
5204 textures[i] = createTexture();
5205 }
5206}
5207
5208void Context::getActiveAttrib(GLuint program,
5209 GLuint index,
5210 GLsizei bufsize,
5211 GLsizei *length,
5212 GLint *size,
5213 GLenum *type,
5214 GLchar *name)
5215{
5216 Program *programObject = getProgram(program);
5217 ASSERT(programObject);
5218 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5219}
5220
5221void Context::getActiveUniform(GLuint program,
5222 GLuint index,
5223 GLsizei bufsize,
5224 GLsizei *length,
5225 GLint *size,
5226 GLenum *type,
5227 GLchar *name)
5228{
5229 Program *programObject = getProgram(program);
5230 ASSERT(programObject);
5231 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5232}
5233
5234void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5235{
5236 Program *programObject = getProgram(program);
5237 ASSERT(programObject);
5238 programObject->getAttachedShaders(maxcount, count, shaders);
5239}
5240
5241GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5242{
5243 Program *programObject = getProgram(program);
5244 ASSERT(programObject);
5245 return programObject->getAttributeLocation(name);
5246}
5247
5248void Context::getBooleanv(GLenum pname, GLboolean *params)
5249{
5250 GLenum nativeType;
5251 unsigned int numParams = 0;
5252 getQueryParameterInfo(pname, &nativeType, &numParams);
5253
5254 if (nativeType == GL_BOOL)
5255 {
5256 getBooleanvImpl(pname, params);
5257 }
5258 else
5259 {
5260 CastStateValues(this, nativeType, pname, numParams, params);
5261 }
5262}
5263
Brandon Jones59770802018-04-02 13:18:42 -07005264void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5265{
5266 getBooleanv(pname, params);
5267}
5268
Jamie Madillc1d770e2017-04-13 17:31:24 -04005269void Context::getFloatv(GLenum pname, GLfloat *params)
5270{
5271 GLenum nativeType;
5272 unsigned int numParams = 0;
5273 getQueryParameterInfo(pname, &nativeType, &numParams);
5274
5275 if (nativeType == GL_FLOAT)
5276 {
5277 getFloatvImpl(pname, params);
5278 }
5279 else
5280 {
5281 CastStateValues(this, nativeType, pname, numParams, params);
5282 }
5283}
5284
Brandon Jones59770802018-04-02 13:18:42 -07005285void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5286{
5287 getFloatv(pname, params);
5288}
5289
Jamie Madillc1d770e2017-04-13 17:31:24 -04005290void Context::getIntegerv(GLenum pname, GLint *params)
5291{
5292 GLenum nativeType;
5293 unsigned int numParams = 0;
5294 getQueryParameterInfo(pname, &nativeType, &numParams);
5295
5296 if (nativeType == GL_INT)
5297 {
5298 getIntegervImpl(pname, params);
5299 }
5300 else
5301 {
5302 CastStateValues(this, nativeType, pname, numParams, params);
5303 }
5304}
5305
Brandon Jones59770802018-04-02 13:18:42 -07005306void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5307{
5308 getIntegerv(pname, data);
5309}
5310
Jamie Madillc1d770e2017-04-13 17:31:24 -04005311void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5312{
5313 Program *programObject = getProgram(program);
5314 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005315 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005316}
5317
Brandon Jones59770802018-04-02 13:18:42 -07005318void Context::getProgramivRobust(GLuint program,
5319 GLenum pname,
5320 GLsizei bufSize,
5321 GLsizei *length,
5322 GLint *params)
5323{
5324 getProgramiv(program, pname, params);
5325}
5326
Jiajia Qin5451d532017-11-16 17:16:34 +08005327void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5328{
5329 UNIMPLEMENTED();
5330}
5331
Jamie Madillbe849e42017-05-02 15:49:00 -04005332void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005333{
5334 Program *programObject = getProgram(program);
5335 ASSERT(programObject);
5336 programObject->getInfoLog(bufsize, length, infolog);
5337}
5338
Jiajia Qin5451d532017-11-16 17:16:34 +08005339void Context::getProgramPipelineInfoLog(GLuint pipeline,
5340 GLsizei bufSize,
5341 GLsizei *length,
5342 GLchar *infoLog)
5343{
5344 UNIMPLEMENTED();
5345}
5346
Jamie Madillc1d770e2017-04-13 17:31:24 -04005347void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5348{
5349 Shader *shaderObject = getShader(shader);
5350 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04005351 QueryShaderiv(this, shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005352}
5353
Brandon Jones59770802018-04-02 13:18:42 -07005354void Context::getShaderivRobust(GLuint shader,
5355 GLenum pname,
5356 GLsizei bufSize,
5357 GLsizei *length,
5358 GLint *params)
5359{
5360 getShaderiv(shader, pname, params);
5361}
5362
Jamie Madillc1d770e2017-04-13 17:31:24 -04005363void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5364{
5365 Shader *shaderObject = getShader(shader);
5366 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04005367 shaderObject->getInfoLog(this, bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005368}
5369
5370void Context::getShaderPrecisionFormat(GLenum shadertype,
5371 GLenum precisiontype,
5372 GLint *range,
5373 GLint *precision)
5374{
5375 // TODO(jmadill): Compute shaders.
5376
5377 switch (shadertype)
5378 {
5379 case GL_VERTEX_SHADER:
5380 switch (precisiontype)
5381 {
5382 case GL_LOW_FLOAT:
5383 mCaps.vertexLowpFloat.get(range, precision);
5384 break;
5385 case GL_MEDIUM_FLOAT:
5386 mCaps.vertexMediumpFloat.get(range, precision);
5387 break;
5388 case GL_HIGH_FLOAT:
5389 mCaps.vertexHighpFloat.get(range, precision);
5390 break;
5391
5392 case GL_LOW_INT:
5393 mCaps.vertexLowpInt.get(range, precision);
5394 break;
5395 case GL_MEDIUM_INT:
5396 mCaps.vertexMediumpInt.get(range, precision);
5397 break;
5398 case GL_HIGH_INT:
5399 mCaps.vertexHighpInt.get(range, precision);
5400 break;
5401
5402 default:
5403 UNREACHABLE();
5404 return;
5405 }
5406 break;
5407
5408 case GL_FRAGMENT_SHADER:
5409 switch (precisiontype)
5410 {
5411 case GL_LOW_FLOAT:
5412 mCaps.fragmentLowpFloat.get(range, precision);
5413 break;
5414 case GL_MEDIUM_FLOAT:
5415 mCaps.fragmentMediumpFloat.get(range, precision);
5416 break;
5417 case GL_HIGH_FLOAT:
5418 mCaps.fragmentHighpFloat.get(range, precision);
5419 break;
5420
5421 case GL_LOW_INT:
5422 mCaps.fragmentLowpInt.get(range, precision);
5423 break;
5424 case GL_MEDIUM_INT:
5425 mCaps.fragmentMediumpInt.get(range, precision);
5426 break;
5427 case GL_HIGH_INT:
5428 mCaps.fragmentHighpInt.get(range, precision);
5429 break;
5430
5431 default:
5432 UNREACHABLE();
5433 return;
5434 }
5435 break;
5436
5437 default:
5438 UNREACHABLE();
5439 return;
5440 }
5441}
5442
5443void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5444{
5445 Shader *shaderObject = getShader(shader);
5446 ASSERT(shaderObject);
5447 shaderObject->getSource(bufsize, length, source);
5448}
5449
5450void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5451{
5452 Program *programObject = getProgram(program);
5453 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005454 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005455}
5456
Brandon Jones59770802018-04-02 13:18:42 -07005457void Context::getUniformfvRobust(GLuint program,
5458 GLint location,
5459 GLsizei bufSize,
5460 GLsizei *length,
5461 GLfloat *params)
5462{
5463 getUniformfv(program, location, params);
5464}
5465
Jamie Madillc1d770e2017-04-13 17:31:24 -04005466void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5467{
5468 Program *programObject = getProgram(program);
5469 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005470 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005471}
5472
Brandon Jones59770802018-04-02 13:18:42 -07005473void Context::getUniformivRobust(GLuint program,
5474 GLint location,
5475 GLsizei bufSize,
5476 GLsizei *length,
5477 GLint *params)
5478{
5479 getUniformiv(program, location, params);
5480}
5481
Jamie Madillc1d770e2017-04-13 17:31:24 -04005482GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5483{
5484 Program *programObject = getProgram(program);
5485 ASSERT(programObject);
5486 return programObject->getUniformLocation(name);
5487}
5488
5489GLboolean Context::isBuffer(GLuint buffer)
5490{
5491 if (buffer == 0)
5492 {
5493 return GL_FALSE;
5494 }
5495
5496 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5497}
5498
5499GLboolean Context::isEnabled(GLenum cap)
5500{
5501 return mGLState.getEnableFeature(cap);
5502}
5503
5504GLboolean Context::isFramebuffer(GLuint framebuffer)
5505{
5506 if (framebuffer == 0)
5507 {
5508 return GL_FALSE;
5509 }
5510
5511 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5512}
5513
5514GLboolean Context::isProgram(GLuint program)
5515{
5516 if (program == 0)
5517 {
5518 return GL_FALSE;
5519 }
5520
5521 return (getProgram(program) ? GL_TRUE : GL_FALSE);
5522}
5523
5524GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5525{
5526 if (renderbuffer == 0)
5527 {
5528 return GL_FALSE;
5529 }
5530
5531 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5532}
5533
5534GLboolean Context::isShader(GLuint shader)
5535{
5536 if (shader == 0)
5537 {
5538 return GL_FALSE;
5539 }
5540
5541 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5542}
5543
5544GLboolean Context::isTexture(GLuint texture)
5545{
5546 if (texture == 0)
5547 {
5548 return GL_FALSE;
5549 }
5550
5551 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5552}
5553
5554void Context::linkProgram(GLuint program)
5555{
5556 Program *programObject = getProgram(program);
5557 ASSERT(programObject);
5558 handleError(programObject->link(this));
Martin Radev0abb7a22017-08-28 15:34:45 +03005559 mGLState.onProgramExecutableChange(programObject);
Jamie Madillc43cdad2018-08-08 15:49:25 -04005560 mStateCache.onProgramExecutableChange(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005561}
5562
5563void Context::releaseShaderCompiler()
5564{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005565 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005566}
5567
5568void Context::shaderBinary(GLsizei n,
5569 const GLuint *shaders,
5570 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005571 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005572 GLsizei length)
5573{
5574 // No binary shader formats are supported.
5575 UNIMPLEMENTED();
5576}
5577
5578void Context::shaderSource(GLuint shader,
5579 GLsizei count,
5580 const GLchar *const *string,
5581 const GLint *length)
5582{
5583 Shader *shaderObject = getShader(shader);
5584 ASSERT(shaderObject);
5585 shaderObject->setSource(count, string, length);
5586}
5587
5588void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5589{
5590 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5591}
5592
5593void Context::stencilMask(GLuint mask)
5594{
5595 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5596}
5597
5598void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5599{
5600 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5601}
5602
5603void Context::uniform1f(GLint location, GLfloat x)
5604{
5605 Program *program = mGLState.getProgram();
5606 program->setUniform1fv(location, 1, &x);
5607}
5608
5609void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5610{
5611 Program *program = mGLState.getProgram();
5612 program->setUniform1fv(location, count, v);
5613}
5614
Jamie Madill7e4eff12018-08-08 15:49:26 -04005615void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005616{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005617 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04005618 {
5619 mGLState.setObjectDirty(GL_PROGRAM);
5620 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005621}
5622
Jamie Madill7e4eff12018-08-08 15:49:26 -04005623void Context::uniform1i(GLint location, GLint x)
5624{
5625 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
5626}
5627
Jamie Madillc1d770e2017-04-13 17:31:24 -04005628void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5629{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005630 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005631}
5632
5633void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5634{
5635 GLfloat xy[2] = {x, y};
5636 Program *program = mGLState.getProgram();
5637 program->setUniform2fv(location, 1, xy);
5638}
5639
5640void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5641{
5642 Program *program = mGLState.getProgram();
5643 program->setUniform2fv(location, count, v);
5644}
5645
5646void Context::uniform2i(GLint location, GLint x, GLint y)
5647{
5648 GLint xy[2] = {x, y};
5649 Program *program = mGLState.getProgram();
5650 program->setUniform2iv(location, 1, xy);
5651}
5652
5653void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
5654{
5655 Program *program = mGLState.getProgram();
5656 program->setUniform2iv(location, count, v);
5657}
5658
5659void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5660{
5661 GLfloat xyz[3] = {x, y, z};
5662 Program *program = mGLState.getProgram();
5663 program->setUniform3fv(location, 1, xyz);
5664}
5665
5666void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
5667{
5668 Program *program = mGLState.getProgram();
5669 program->setUniform3fv(location, count, v);
5670}
5671
5672void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
5673{
5674 GLint xyz[3] = {x, y, z};
5675 Program *program = mGLState.getProgram();
5676 program->setUniform3iv(location, 1, xyz);
5677}
5678
5679void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
5680{
5681 Program *program = mGLState.getProgram();
5682 program->setUniform3iv(location, count, v);
5683}
5684
5685void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5686{
5687 GLfloat xyzw[4] = {x, y, z, w};
5688 Program *program = mGLState.getProgram();
5689 program->setUniform4fv(location, 1, xyzw);
5690}
5691
5692void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
5693{
5694 Program *program = mGLState.getProgram();
5695 program->setUniform4fv(location, count, v);
5696}
5697
5698void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5699{
5700 GLint xyzw[4] = {x, y, z, w};
5701 Program *program = mGLState.getProgram();
5702 program->setUniform4iv(location, 1, xyzw);
5703}
5704
5705void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
5706{
5707 Program *program = mGLState.getProgram();
5708 program->setUniform4iv(location, count, v);
5709}
5710
5711void Context::uniformMatrix2fv(GLint location,
5712 GLsizei count,
5713 GLboolean transpose,
5714 const GLfloat *value)
5715{
5716 Program *program = mGLState.getProgram();
5717 program->setUniformMatrix2fv(location, count, transpose, value);
5718}
5719
5720void Context::uniformMatrix3fv(GLint location,
5721 GLsizei count,
5722 GLboolean transpose,
5723 const GLfloat *value)
5724{
5725 Program *program = mGLState.getProgram();
5726 program->setUniformMatrix3fv(location, count, transpose, value);
5727}
5728
5729void Context::uniformMatrix4fv(GLint location,
5730 GLsizei count,
5731 GLboolean transpose,
5732 const GLfloat *value)
5733{
5734 Program *program = mGLState.getProgram();
5735 program->setUniformMatrix4fv(location, count, transpose, value);
5736}
5737
5738void Context::validateProgram(GLuint program)
5739{
5740 Program *programObject = getProgram(program);
5741 ASSERT(programObject);
5742 programObject->validate(mCaps);
5743}
5744
Jiajia Qin5451d532017-11-16 17:16:34 +08005745void Context::validateProgramPipeline(GLuint pipeline)
5746{
5747 UNIMPLEMENTED();
5748}
5749
Jamie Madilld04908b2017-06-09 14:15:35 -04005750void Context::getProgramBinary(GLuint program,
5751 GLsizei bufSize,
5752 GLsizei *length,
5753 GLenum *binaryFormat,
5754 void *binary)
5755{
5756 Program *programObject = getProgram(program);
5757 ASSERT(programObject != nullptr);
5758
5759 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
5760}
5761
5762void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
5763{
5764 Program *programObject = getProgram(program);
5765 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04005766
Jamie Madilld04908b2017-06-09 14:15:35 -04005767 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madillc43cdad2018-08-08 15:49:25 -04005768 mStateCache.onProgramExecutableChange(this);
Jamie Madilld04908b2017-06-09 14:15:35 -04005769}
5770
Jamie Madillff325f12017-08-26 15:06:05 -04005771void Context::uniform1ui(GLint location, GLuint v0)
5772{
5773 Program *program = mGLState.getProgram();
5774 program->setUniform1uiv(location, 1, &v0);
5775}
5776
5777void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
5778{
5779 Program *program = mGLState.getProgram();
5780 const GLuint xy[] = {v0, v1};
5781 program->setUniform2uiv(location, 1, xy);
5782}
5783
5784void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
5785{
5786 Program *program = mGLState.getProgram();
5787 const GLuint xyz[] = {v0, v1, v2};
5788 program->setUniform3uiv(location, 1, xyz);
5789}
5790
5791void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
5792{
5793 Program *program = mGLState.getProgram();
5794 const GLuint xyzw[] = {v0, v1, v2, v3};
5795 program->setUniform4uiv(location, 1, xyzw);
5796}
5797
5798void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
5799{
5800 Program *program = mGLState.getProgram();
5801 program->setUniform1uiv(location, count, value);
5802}
5803void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
5804{
5805 Program *program = mGLState.getProgram();
5806 program->setUniform2uiv(location, count, value);
5807}
5808
5809void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
5810{
5811 Program *program = mGLState.getProgram();
5812 program->setUniform3uiv(location, count, value);
5813}
5814
5815void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
5816{
5817 Program *program = mGLState.getProgram();
5818 program->setUniform4uiv(location, count, value);
5819}
5820
Jamie Madillf0e04492017-08-26 15:28:42 -04005821void Context::genQueries(GLsizei n, GLuint *ids)
5822{
5823 for (GLsizei i = 0; i < n; i++)
5824 {
5825 GLuint handle = mQueryHandleAllocator.allocate();
5826 mQueryMap.assign(handle, nullptr);
5827 ids[i] = handle;
5828 }
5829}
5830
5831void Context::deleteQueries(GLsizei n, const GLuint *ids)
5832{
5833 for (int i = 0; i < n; i++)
5834 {
5835 GLuint query = ids[i];
5836
5837 Query *queryObject = nullptr;
5838 if (mQueryMap.erase(query, &queryObject))
5839 {
5840 mQueryHandleAllocator.release(query);
5841 if (queryObject)
5842 {
5843 queryObject->release(this);
5844 }
5845 }
5846 }
5847}
5848
5849GLboolean Context::isQuery(GLuint id)
5850{
Corentin Wallezad3ae902018-03-09 13:40:42 -05005851 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04005852}
5853
Jamie Madillc8c95812017-08-26 18:40:09 -04005854void Context::uniformMatrix2x3fv(GLint location,
5855 GLsizei count,
5856 GLboolean transpose,
5857 const GLfloat *value)
5858{
5859 Program *program = mGLState.getProgram();
5860 program->setUniformMatrix2x3fv(location, count, transpose, value);
5861}
5862
5863void Context::uniformMatrix3x2fv(GLint location,
5864 GLsizei count,
5865 GLboolean transpose,
5866 const GLfloat *value)
5867{
5868 Program *program = mGLState.getProgram();
5869 program->setUniformMatrix3x2fv(location, count, transpose, value);
5870}
5871
5872void Context::uniformMatrix2x4fv(GLint location,
5873 GLsizei count,
5874 GLboolean transpose,
5875 const GLfloat *value)
5876{
5877 Program *program = mGLState.getProgram();
5878 program->setUniformMatrix2x4fv(location, count, transpose, value);
5879}
5880
5881void Context::uniformMatrix4x2fv(GLint location,
5882 GLsizei count,
5883 GLboolean transpose,
5884 const GLfloat *value)
5885{
5886 Program *program = mGLState.getProgram();
5887 program->setUniformMatrix4x2fv(location, count, transpose, value);
5888}
5889
5890void Context::uniformMatrix3x4fv(GLint location,
5891 GLsizei count,
5892 GLboolean transpose,
5893 const GLfloat *value)
5894{
5895 Program *program = mGLState.getProgram();
5896 program->setUniformMatrix3x4fv(location, count, transpose, value);
5897}
5898
5899void Context::uniformMatrix4x3fv(GLint location,
5900 GLsizei count,
5901 GLboolean transpose,
5902 const GLfloat *value)
5903{
5904 Program *program = mGLState.getProgram();
5905 program->setUniformMatrix4x3fv(location, count, transpose, value);
5906}
5907
Jamie Madilld7576732017-08-26 18:49:50 -04005908void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
5909{
5910 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5911 {
5912 GLuint vertexArray = arrays[arrayIndex];
5913
5914 if (arrays[arrayIndex] != 0)
5915 {
5916 VertexArray *vertexArrayObject = nullptr;
5917 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
5918 {
5919 if (vertexArrayObject != nullptr)
5920 {
5921 detachVertexArray(vertexArray);
5922 vertexArrayObject->onDestroy(this);
5923 }
5924
5925 mVertexArrayHandleAllocator.release(vertexArray);
5926 }
5927 }
5928 }
5929}
5930
5931void Context::genVertexArrays(GLsizei n, GLuint *arrays)
5932{
5933 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5934 {
5935 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
5936 mVertexArrayMap.assign(vertexArray, nullptr);
5937 arrays[arrayIndex] = vertexArray;
5938 }
5939}
5940
5941bool Context::isVertexArray(GLuint array)
5942{
5943 if (array == 0)
5944 {
5945 return GL_FALSE;
5946 }
5947
5948 VertexArray *vao = getVertexArray(array);
5949 return (vao != nullptr ? GL_TRUE : GL_FALSE);
5950}
5951
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04005952void Context::endTransformFeedback()
5953{
5954 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5955 transformFeedback->end(this);
5956}
5957
5958void Context::transformFeedbackVaryings(GLuint program,
5959 GLsizei count,
5960 const GLchar *const *varyings,
5961 GLenum bufferMode)
5962{
5963 Program *programObject = getProgram(program);
5964 ASSERT(programObject);
5965 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
5966}
5967
5968void Context::getTransformFeedbackVarying(GLuint program,
5969 GLuint index,
5970 GLsizei bufSize,
5971 GLsizei *length,
5972 GLsizei *size,
5973 GLenum *type,
5974 GLchar *name)
5975{
5976 Program *programObject = getProgram(program);
5977 ASSERT(programObject);
5978 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
5979}
5980
5981void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
5982{
5983 for (int i = 0; i < n; i++)
5984 {
5985 GLuint transformFeedback = ids[i];
5986 if (transformFeedback == 0)
5987 {
5988 continue;
5989 }
5990
5991 TransformFeedback *transformFeedbackObject = nullptr;
5992 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
5993 {
5994 if (transformFeedbackObject != nullptr)
5995 {
5996 detachTransformFeedback(transformFeedback);
5997 transformFeedbackObject->release(this);
5998 }
5999
6000 mTransformFeedbackHandleAllocator.release(transformFeedback);
6001 }
6002 }
6003}
6004
6005void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6006{
6007 for (int i = 0; i < n; i++)
6008 {
6009 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6010 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6011 ids[i] = transformFeedback;
6012 }
6013}
6014
6015bool Context::isTransformFeedback(GLuint id)
6016{
6017 if (id == 0)
6018 {
6019 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6020 // returns FALSE
6021 return GL_FALSE;
6022 }
6023
6024 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6025 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6026}
6027
6028void Context::pauseTransformFeedback()
6029{
6030 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6031 transformFeedback->pause();
6032}
6033
6034void Context::resumeTransformFeedback()
6035{
6036 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6037 transformFeedback->resume();
6038}
6039
Jamie Madill12e957f2017-08-26 21:42:26 -04006040void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6041{
6042 const Program *programObject = getProgram(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006043 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006044}
6045
Brandon Jones59770802018-04-02 13:18:42 -07006046void Context::getUniformuivRobust(GLuint program,
6047 GLint location,
6048 GLsizei bufSize,
6049 GLsizei *length,
6050 GLuint *params)
6051{
6052 getUniformuiv(program, location, params);
6053}
6054
Jamie Madill12e957f2017-08-26 21:42:26 -04006055GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6056{
6057 const Program *programObject = getProgram(program);
6058 return programObject->getFragDataLocation(name);
6059}
6060
6061void Context::getUniformIndices(GLuint program,
6062 GLsizei uniformCount,
6063 const GLchar *const *uniformNames,
6064 GLuint *uniformIndices)
6065{
6066 const Program *programObject = getProgram(program);
6067 if (!programObject->isLinked())
6068 {
6069 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6070 {
6071 uniformIndices[uniformId] = GL_INVALID_INDEX;
6072 }
6073 }
6074 else
6075 {
6076 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6077 {
6078 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6079 }
6080 }
6081}
6082
6083void Context::getActiveUniformsiv(GLuint program,
6084 GLsizei uniformCount,
6085 const GLuint *uniformIndices,
6086 GLenum pname,
6087 GLint *params)
6088{
6089 const Program *programObject = getProgram(program);
6090 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6091 {
6092 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006093 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006094 }
6095}
6096
6097GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6098{
6099 const Program *programObject = getProgram(program);
6100 return programObject->getUniformBlockIndex(uniformBlockName);
6101}
6102
6103void Context::getActiveUniformBlockiv(GLuint program,
6104 GLuint uniformBlockIndex,
6105 GLenum pname,
6106 GLint *params)
6107{
6108 const Program *programObject = getProgram(program);
6109 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6110}
6111
Brandon Jones59770802018-04-02 13:18:42 -07006112void Context::getActiveUniformBlockivRobust(GLuint program,
6113 GLuint uniformBlockIndex,
6114 GLenum pname,
6115 GLsizei bufSize,
6116 GLsizei *length,
6117 GLint *params)
6118{
6119 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6120}
6121
Jamie Madill12e957f2017-08-26 21:42:26 -04006122void Context::getActiveUniformBlockName(GLuint program,
6123 GLuint uniformBlockIndex,
6124 GLsizei bufSize,
6125 GLsizei *length,
6126 GLchar *uniformBlockName)
6127{
6128 const Program *programObject = getProgram(program);
6129 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6130}
6131
6132void Context::uniformBlockBinding(GLuint program,
6133 GLuint uniformBlockIndex,
6134 GLuint uniformBlockBinding)
6135{
6136 Program *programObject = getProgram(program);
6137 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
6138}
6139
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006140GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6141{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006142 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6143 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006144
Jamie Madill70b5bb02017-08-28 13:32:37 -04006145 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006146 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006147 if (error.isError())
6148 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006149 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006150 handleError(error);
6151 return nullptr;
6152 }
6153
Jamie Madill70b5bb02017-08-28 13:32:37 -04006154 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006155}
6156
6157GLboolean Context::isSync(GLsync sync)
6158{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006159 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006160}
6161
6162GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6163{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006164 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006165
6166 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006167 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006168 return result;
6169}
6170
6171void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6172{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006173 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006174 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006175}
6176
6177void Context::getInteger64v(GLenum pname, GLint64 *params)
6178{
6179 GLenum nativeType = GL_NONE;
6180 unsigned int numParams = 0;
6181 getQueryParameterInfo(pname, &nativeType, &numParams);
6182
6183 if (nativeType == GL_INT_64_ANGLEX)
6184 {
6185 getInteger64vImpl(pname, params);
6186 }
6187 else
6188 {
6189 CastStateValues(this, nativeType, pname, numParams, params);
6190 }
6191}
6192
Brandon Jones59770802018-04-02 13:18:42 -07006193void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6194{
6195 getInteger64v(pname, data);
6196}
6197
Corentin Wallez336129f2017-10-17 15:55:40 -04006198void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006199{
6200 Buffer *buffer = mGLState.getTargetBuffer(target);
6201 QueryBufferParameteri64v(buffer, pname, params);
6202}
6203
Brandon Jones59770802018-04-02 13:18:42 -07006204void Context::getBufferParameteri64vRobust(BufferBinding target,
6205 GLenum pname,
6206 GLsizei bufSize,
6207 GLsizei *length,
6208 GLint64 *params)
6209{
6210 getBufferParameteri64v(target, pname, params);
6211}
6212
Jamie Madill3ef140a2017-08-26 23:11:21 -04006213void Context::genSamplers(GLsizei count, GLuint *samplers)
6214{
6215 for (int i = 0; i < count; i++)
6216 {
6217 samplers[i] = mState.mSamplers->createSampler();
6218 }
6219}
6220
6221void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6222{
6223 for (int i = 0; i < count; i++)
6224 {
6225 GLuint sampler = samplers[i];
6226
6227 if (mState.mSamplers->getSampler(sampler))
6228 {
6229 detachSampler(sampler);
6230 }
6231
6232 mState.mSamplers->deleteObject(this, sampler);
6233 }
6234}
6235
6236void Context::getInternalformativ(GLenum target,
6237 GLenum internalformat,
6238 GLenum pname,
6239 GLsizei bufSize,
6240 GLint *params)
6241{
6242 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6243 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6244}
6245
Brandon Jones59770802018-04-02 13:18:42 -07006246void Context::getInternalformativRobust(GLenum target,
6247 GLenum internalformat,
6248 GLenum pname,
6249 GLsizei bufSize,
6250 GLsizei *length,
6251 GLint *params)
6252{
6253 getInternalformativ(target, internalformat, pname, bufSize, params);
6254}
6255
Jiajia Qin5451d532017-11-16 17:16:34 +08006256void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6257{
6258 programUniform1iv(program, location, 1, &v0);
6259}
6260
6261void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6262{
6263 GLint xy[2] = {v0, v1};
6264 programUniform2iv(program, location, 1, xy);
6265}
6266
6267void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6268{
6269 GLint xyz[3] = {v0, v1, v2};
6270 programUniform3iv(program, location, 1, xyz);
6271}
6272
6273void Context::programUniform4i(GLuint program,
6274 GLint location,
6275 GLint v0,
6276 GLint v1,
6277 GLint v2,
6278 GLint v3)
6279{
6280 GLint xyzw[4] = {v0, v1, v2, v3};
6281 programUniform4iv(program, location, 1, xyzw);
6282}
6283
6284void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6285{
6286 programUniform1uiv(program, location, 1, &v0);
6287}
6288
6289void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6290{
6291 GLuint xy[2] = {v0, v1};
6292 programUniform2uiv(program, location, 1, xy);
6293}
6294
6295void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6296{
6297 GLuint xyz[3] = {v0, v1, v2};
6298 programUniform3uiv(program, location, 1, xyz);
6299}
6300
6301void Context::programUniform4ui(GLuint program,
6302 GLint location,
6303 GLuint v0,
6304 GLuint v1,
6305 GLuint v2,
6306 GLuint v3)
6307{
6308 GLuint xyzw[4] = {v0, v1, v2, v3};
6309 programUniform4uiv(program, location, 1, xyzw);
6310}
6311
6312void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6313{
6314 programUniform1fv(program, location, 1, &v0);
6315}
6316
6317void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6318{
6319 GLfloat xy[2] = {v0, v1};
6320 programUniform2fv(program, location, 1, xy);
6321}
6322
6323void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6324{
6325 GLfloat xyz[3] = {v0, v1, v2};
6326 programUniform3fv(program, location, 1, xyz);
6327}
6328
6329void Context::programUniform4f(GLuint program,
6330 GLint location,
6331 GLfloat v0,
6332 GLfloat v1,
6333 GLfloat v2,
6334 GLfloat v3)
6335{
6336 GLfloat xyzw[4] = {v0, v1, v2, v3};
6337 programUniform4fv(program, location, 1, xyzw);
6338}
6339
Jamie Madill81c2e252017-09-09 23:32:46 -04006340void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6341{
6342 Program *programObject = getProgram(program);
6343 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006344 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006345}
6346
Jiajia Qin5451d532017-11-16 17:16:34 +08006347void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6348{
6349 Program *programObject = getProgram(program);
6350 ASSERT(programObject);
6351 programObject->setUniform2iv(location, count, value);
6352}
6353
6354void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6355{
6356 Program *programObject = getProgram(program);
6357 ASSERT(programObject);
6358 programObject->setUniform3iv(location, count, value);
6359}
6360
6361void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6362{
6363 Program *programObject = getProgram(program);
6364 ASSERT(programObject);
6365 programObject->setUniform4iv(location, count, value);
6366}
6367
6368void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6369{
6370 Program *programObject = getProgram(program);
6371 ASSERT(programObject);
6372 programObject->setUniform1uiv(location, count, value);
6373}
6374
6375void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6376{
6377 Program *programObject = getProgram(program);
6378 ASSERT(programObject);
6379 programObject->setUniform2uiv(location, count, value);
6380}
6381
6382void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6383{
6384 Program *programObject = getProgram(program);
6385 ASSERT(programObject);
6386 programObject->setUniform3uiv(location, count, value);
6387}
6388
6389void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6390{
6391 Program *programObject = getProgram(program);
6392 ASSERT(programObject);
6393 programObject->setUniform4uiv(location, count, value);
6394}
6395
6396void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6397{
6398 Program *programObject = getProgram(program);
6399 ASSERT(programObject);
6400 programObject->setUniform1fv(location, count, value);
6401}
6402
6403void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6404{
6405 Program *programObject = getProgram(program);
6406 ASSERT(programObject);
6407 programObject->setUniform2fv(location, count, value);
6408}
6409
6410void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6411{
6412 Program *programObject = getProgram(program);
6413 ASSERT(programObject);
6414 programObject->setUniform3fv(location, count, value);
6415}
6416
6417void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6418{
6419 Program *programObject = getProgram(program);
6420 ASSERT(programObject);
6421 programObject->setUniform4fv(location, count, value);
6422}
6423
6424void Context::programUniformMatrix2fv(GLuint program,
6425 GLint location,
6426 GLsizei count,
6427 GLboolean transpose,
6428 const GLfloat *value)
6429{
6430 Program *programObject = getProgram(program);
6431 ASSERT(programObject);
6432 programObject->setUniformMatrix2fv(location, count, transpose, value);
6433}
6434
6435void Context::programUniformMatrix3fv(GLuint program,
6436 GLint location,
6437 GLsizei count,
6438 GLboolean transpose,
6439 const GLfloat *value)
6440{
6441 Program *programObject = getProgram(program);
6442 ASSERT(programObject);
6443 programObject->setUniformMatrix3fv(location, count, transpose, value);
6444}
6445
6446void Context::programUniformMatrix4fv(GLuint program,
6447 GLint location,
6448 GLsizei count,
6449 GLboolean transpose,
6450 const GLfloat *value)
6451{
6452 Program *programObject = getProgram(program);
6453 ASSERT(programObject);
6454 programObject->setUniformMatrix4fv(location, count, transpose, value);
6455}
6456
6457void Context::programUniformMatrix2x3fv(GLuint program,
6458 GLint location,
6459 GLsizei count,
6460 GLboolean transpose,
6461 const GLfloat *value)
6462{
6463 Program *programObject = getProgram(program);
6464 ASSERT(programObject);
6465 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6466}
6467
6468void Context::programUniformMatrix3x2fv(GLuint program,
6469 GLint location,
6470 GLsizei count,
6471 GLboolean transpose,
6472 const GLfloat *value)
6473{
6474 Program *programObject = getProgram(program);
6475 ASSERT(programObject);
6476 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6477}
6478
6479void Context::programUniformMatrix2x4fv(GLuint program,
6480 GLint location,
6481 GLsizei count,
6482 GLboolean transpose,
6483 const GLfloat *value)
6484{
6485 Program *programObject = getProgram(program);
6486 ASSERT(programObject);
6487 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6488}
6489
6490void Context::programUniformMatrix4x2fv(GLuint program,
6491 GLint location,
6492 GLsizei count,
6493 GLboolean transpose,
6494 const GLfloat *value)
6495{
6496 Program *programObject = getProgram(program);
6497 ASSERT(programObject);
6498 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6499}
6500
6501void Context::programUniformMatrix3x4fv(GLuint program,
6502 GLint location,
6503 GLsizei count,
6504 GLboolean transpose,
6505 const GLfloat *value)
6506{
6507 Program *programObject = getProgram(program);
6508 ASSERT(programObject);
6509 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6510}
6511
6512void Context::programUniformMatrix4x3fv(GLuint program,
6513 GLint location,
6514 GLsizei count,
6515 GLboolean transpose,
6516 const GLfloat *value)
6517{
6518 Program *programObject = getProgram(program);
6519 ASSERT(programObject);
6520 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6521}
6522
Jamie Madill81c2e252017-09-09 23:32:46 -04006523void Context::onTextureChange(const Texture *texture)
6524{
6525 // Conservatively assume all textures are dirty.
6526 // TODO(jmadill): More fine-grained update.
6527 mGLState.setObjectDirty(GL_TEXTURE);
6528}
6529
James Darpiniane8a93c62018-01-04 18:02:24 -08006530bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6531{
6532 return mGLState.isCurrentTransformFeedback(tf);
6533}
6534bool Context::isCurrentVertexArray(const VertexArray *va) const
6535{
6536 return mGLState.isCurrentVertexArray(va);
6537}
6538
Yunchao Hea336b902017-08-02 16:05:21 +08006539void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6540{
6541 for (int i = 0; i < count; i++)
6542 {
6543 pipelines[i] = createProgramPipeline();
6544 }
6545}
6546
6547void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6548{
6549 for (int i = 0; i < count; i++)
6550 {
6551 if (pipelines[i] != 0)
6552 {
6553 deleteProgramPipeline(pipelines[i]);
6554 }
6555 }
6556}
6557
6558GLboolean Context::isProgramPipeline(GLuint pipeline)
6559{
6560 if (pipeline == 0)
6561 {
6562 return GL_FALSE;
6563 }
6564
6565 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6566}
6567
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006568void Context::finishFenceNV(GLuint fence)
6569{
6570 FenceNV *fenceObject = getFenceNV(fence);
6571
6572 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04006573 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006574}
6575
6576void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6577{
6578 FenceNV *fenceObject = getFenceNV(fence);
6579
6580 ASSERT(fenceObject && fenceObject->isSet());
6581
6582 switch (pname)
6583 {
6584 case GL_FENCE_STATUS_NV:
6585 {
6586 // GL_NV_fence spec:
6587 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6588 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6589 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6590 GLboolean status = GL_TRUE;
6591 if (fenceObject->getStatus() != GL_TRUE)
6592 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006593 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006594 }
6595 *params = status;
6596 break;
6597 }
6598
6599 case GL_FENCE_CONDITION_NV:
6600 {
6601 *params = static_cast<GLint>(fenceObject->getCondition());
6602 break;
6603 }
6604
6605 default:
6606 UNREACHABLE();
6607 }
6608}
6609
6610void Context::getTranslatedShaderSource(GLuint shader,
6611 GLsizei bufsize,
6612 GLsizei *length,
6613 GLchar *source)
6614{
6615 Shader *shaderObject = getShader(shader);
6616 ASSERT(shaderObject);
6617 shaderObject->getTranslatedSourceWithDebugInfo(this, bufsize, length, source);
6618}
6619
6620void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6621{
6622 Program *programObject = getProgram(program);
6623 ASSERT(programObject);
6624
6625 programObject->getUniformfv(this, location, params);
6626}
6627
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006628void Context::getnUniformfvRobust(GLuint program,
6629 GLint location,
6630 GLsizei bufSize,
6631 GLsizei *length,
6632 GLfloat *params)
6633{
6634 UNIMPLEMENTED();
6635}
6636
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006637void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
6638{
6639 Program *programObject = getProgram(program);
6640 ASSERT(programObject);
6641
6642 programObject->getUniformiv(this, location, params);
6643}
6644
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006645void Context::getnUniformivRobust(GLuint program,
6646 GLint location,
6647 GLsizei bufSize,
6648 GLsizei *length,
6649 GLint *params)
6650{
6651 UNIMPLEMENTED();
6652}
6653
6654void Context::getnUniformuivRobust(GLuint program,
6655 GLint location,
6656 GLsizei bufSize,
6657 GLsizei *length,
6658 GLuint *params)
6659{
6660 UNIMPLEMENTED();
6661}
6662
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006663GLboolean Context::isFenceNV(GLuint fence)
6664{
6665 FenceNV *fenceObject = getFenceNV(fence);
6666
6667 if (fenceObject == nullptr)
6668 {
6669 return GL_FALSE;
6670 }
6671
6672 // GL_NV_fence spec:
6673 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
6674 // existing fence.
6675 return fenceObject->isSet();
6676}
6677
6678void Context::readnPixels(GLint x,
6679 GLint y,
6680 GLsizei width,
6681 GLsizei height,
6682 GLenum format,
6683 GLenum type,
6684 GLsizei bufSize,
6685 void *data)
6686{
6687 return readPixels(x, y, width, height, format, type, data);
6688}
6689
Jamie Madill007530e2017-12-28 14:27:04 -05006690void Context::setFenceNV(GLuint fence, GLenum condition)
6691{
6692 ASSERT(condition == GL_ALL_COMPLETED_NV);
6693
6694 FenceNV *fenceObject = getFenceNV(fence);
6695 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04006696 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05006697}
6698
6699GLboolean Context::testFenceNV(GLuint fence)
6700{
6701 FenceNV *fenceObject = getFenceNV(fence);
6702
6703 ASSERT(fenceObject != nullptr);
6704 ASSERT(fenceObject->isSet() == GL_TRUE);
6705
6706 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04006707 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05006708 if (error.isError())
6709 {
6710 handleError(error);
6711 return GL_TRUE;
6712 }
6713
6714 return result;
6715}
6716
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006717void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006718{
6719 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07006720 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05006721 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05006722}
6723
Jamie Madillfa920eb2018-01-04 11:45:50 -05006724void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006725{
6726 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07006727 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05006728 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
6729}
6730
Jamie Madillfa920eb2018-01-04 11:45:50 -05006731void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
6732{
6733 UNIMPLEMENTED();
6734}
6735
Jamie Madill5b772312018-03-08 20:28:32 -05006736bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
6737{
6738 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
6739 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
6740 // to the fact that it is stored internally as a float, and so would require conversion
6741 // if returned from Context::getIntegerv. Since this conversion is already implemented
6742 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
6743 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
6744 // application.
6745 switch (pname)
6746 {
6747 case GL_COMPRESSED_TEXTURE_FORMATS:
6748 {
6749 *type = GL_INT;
6750 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
6751 return true;
6752 }
6753 case GL_SHADER_BINARY_FORMATS:
6754 {
6755 *type = GL_INT;
6756 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
6757 return true;
6758 }
6759
6760 case GL_MAX_VERTEX_ATTRIBS:
6761 case GL_MAX_VERTEX_UNIFORM_VECTORS:
6762 case GL_MAX_VARYING_VECTORS:
6763 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
6764 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
6765 case GL_MAX_TEXTURE_IMAGE_UNITS:
6766 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
6767 case GL_MAX_RENDERBUFFER_SIZE:
6768 case GL_NUM_SHADER_BINARY_FORMATS:
6769 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
6770 case GL_ARRAY_BUFFER_BINDING:
6771 case GL_FRAMEBUFFER_BINDING:
6772 case GL_RENDERBUFFER_BINDING:
6773 case GL_CURRENT_PROGRAM:
6774 case GL_PACK_ALIGNMENT:
6775 case GL_UNPACK_ALIGNMENT:
6776 case GL_GENERATE_MIPMAP_HINT:
6777 case GL_RED_BITS:
6778 case GL_GREEN_BITS:
6779 case GL_BLUE_BITS:
6780 case GL_ALPHA_BITS:
6781 case GL_DEPTH_BITS:
6782 case GL_STENCIL_BITS:
6783 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
6784 case GL_CULL_FACE_MODE:
6785 case GL_FRONT_FACE:
6786 case GL_ACTIVE_TEXTURE:
6787 case GL_STENCIL_FUNC:
6788 case GL_STENCIL_VALUE_MASK:
6789 case GL_STENCIL_REF:
6790 case GL_STENCIL_FAIL:
6791 case GL_STENCIL_PASS_DEPTH_FAIL:
6792 case GL_STENCIL_PASS_DEPTH_PASS:
6793 case GL_STENCIL_BACK_FUNC:
6794 case GL_STENCIL_BACK_VALUE_MASK:
6795 case GL_STENCIL_BACK_REF:
6796 case GL_STENCIL_BACK_FAIL:
6797 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
6798 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
6799 case GL_DEPTH_FUNC:
6800 case GL_BLEND_SRC_RGB:
6801 case GL_BLEND_SRC_ALPHA:
6802 case GL_BLEND_DST_RGB:
6803 case GL_BLEND_DST_ALPHA:
6804 case GL_BLEND_EQUATION_RGB:
6805 case GL_BLEND_EQUATION_ALPHA:
6806 case GL_STENCIL_WRITEMASK:
6807 case GL_STENCIL_BACK_WRITEMASK:
6808 case GL_STENCIL_CLEAR_VALUE:
6809 case GL_SUBPIXEL_BITS:
6810 case GL_MAX_TEXTURE_SIZE:
6811 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
6812 case GL_SAMPLE_BUFFERS:
6813 case GL_SAMPLES:
6814 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
6815 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
6816 case GL_TEXTURE_BINDING_2D:
6817 case GL_TEXTURE_BINDING_CUBE_MAP:
6818 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
6819 {
6820 *type = GL_INT;
6821 *numParams = 1;
6822 return true;
6823 }
6824 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
6825 {
6826 if (!getExtensions().packReverseRowOrder)
6827 {
6828 return false;
6829 }
6830 *type = GL_INT;
6831 *numParams = 1;
6832 return true;
6833 }
6834 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
6835 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
6836 {
6837 if (!getExtensions().textureRectangle)
6838 {
6839 return false;
6840 }
6841 *type = GL_INT;
6842 *numParams = 1;
6843 return true;
6844 }
6845 case GL_MAX_DRAW_BUFFERS_EXT:
6846 case GL_MAX_COLOR_ATTACHMENTS_EXT:
6847 {
6848 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
6849 {
6850 return false;
6851 }
6852 *type = GL_INT;
6853 *numParams = 1;
6854 return true;
6855 }
6856 case GL_MAX_VIEWPORT_DIMS:
6857 {
6858 *type = GL_INT;
6859 *numParams = 2;
6860 return true;
6861 }
6862 case GL_VIEWPORT:
6863 case GL_SCISSOR_BOX:
6864 {
6865 *type = GL_INT;
6866 *numParams = 4;
6867 return true;
6868 }
6869 case GL_SHADER_COMPILER:
6870 case GL_SAMPLE_COVERAGE_INVERT:
6871 case GL_DEPTH_WRITEMASK:
6872 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
6873 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
6874 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
6875 // bool-natural
6876 case GL_SAMPLE_COVERAGE:
6877 case GL_SCISSOR_TEST:
6878 case GL_STENCIL_TEST:
6879 case GL_DEPTH_TEST:
6880 case GL_BLEND:
6881 case GL_DITHER:
6882 case GL_CONTEXT_ROBUST_ACCESS_EXT:
6883 {
6884 *type = GL_BOOL;
6885 *numParams = 1;
6886 return true;
6887 }
6888 case GL_COLOR_WRITEMASK:
6889 {
6890 *type = GL_BOOL;
6891 *numParams = 4;
6892 return true;
6893 }
6894 case GL_POLYGON_OFFSET_FACTOR:
6895 case GL_POLYGON_OFFSET_UNITS:
6896 case GL_SAMPLE_COVERAGE_VALUE:
6897 case GL_DEPTH_CLEAR_VALUE:
6898 case GL_LINE_WIDTH:
6899 {
6900 *type = GL_FLOAT;
6901 *numParams = 1;
6902 return true;
6903 }
6904 case GL_ALIASED_LINE_WIDTH_RANGE:
6905 case GL_ALIASED_POINT_SIZE_RANGE:
6906 case GL_DEPTH_RANGE:
6907 {
6908 *type = GL_FLOAT;
6909 *numParams = 2;
6910 return true;
6911 }
6912 case GL_COLOR_CLEAR_VALUE:
6913 case GL_BLEND_COLOR:
6914 {
6915 *type = GL_FLOAT;
6916 *numParams = 4;
6917 return true;
6918 }
6919 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
6920 if (!getExtensions().textureFilterAnisotropic)
6921 {
6922 return false;
6923 }
6924 *type = GL_FLOAT;
6925 *numParams = 1;
6926 return true;
6927 case GL_TIMESTAMP_EXT:
6928 if (!getExtensions().disjointTimerQuery)
6929 {
6930 return false;
6931 }
6932 *type = GL_INT_64_ANGLEX;
6933 *numParams = 1;
6934 return true;
6935 case GL_GPU_DISJOINT_EXT:
6936 if (!getExtensions().disjointTimerQuery)
6937 {
6938 return false;
6939 }
6940 *type = GL_INT;
6941 *numParams = 1;
6942 return true;
6943 case GL_COVERAGE_MODULATION_CHROMIUM:
6944 if (!getExtensions().framebufferMixedSamples)
6945 {
6946 return false;
6947 }
6948 *type = GL_INT;
6949 *numParams = 1;
6950 return true;
6951 case GL_TEXTURE_BINDING_EXTERNAL_OES:
6952 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
6953 {
6954 return false;
6955 }
6956 *type = GL_INT;
6957 *numParams = 1;
6958 return true;
6959 }
6960
6961 if (getExtensions().debug)
6962 {
6963 switch (pname)
6964 {
6965 case GL_DEBUG_LOGGED_MESSAGES:
6966 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
6967 case GL_DEBUG_GROUP_STACK_DEPTH:
6968 case GL_MAX_DEBUG_MESSAGE_LENGTH:
6969 case GL_MAX_DEBUG_LOGGED_MESSAGES:
6970 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
6971 case GL_MAX_LABEL_LENGTH:
6972 *type = GL_INT;
6973 *numParams = 1;
6974 return true;
6975
6976 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
6977 case GL_DEBUG_OUTPUT:
6978 *type = GL_BOOL;
6979 *numParams = 1;
6980 return true;
6981 }
6982 }
6983
6984 if (getExtensions().multisampleCompatibility)
6985 {
6986 switch (pname)
6987 {
6988 case GL_MULTISAMPLE_EXT:
6989 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
6990 *type = GL_BOOL;
6991 *numParams = 1;
6992 return true;
6993 }
6994 }
6995
6996 if (getExtensions().pathRendering)
6997 {
6998 switch (pname)
6999 {
7000 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7001 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7002 *type = GL_FLOAT;
7003 *numParams = 16;
7004 return true;
7005 }
7006 }
7007
7008 if (getExtensions().bindGeneratesResource)
7009 {
7010 switch (pname)
7011 {
7012 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7013 *type = GL_BOOL;
7014 *numParams = 1;
7015 return true;
7016 }
7017 }
7018
7019 if (getExtensions().clientArrays)
7020 {
7021 switch (pname)
7022 {
7023 case GL_CLIENT_ARRAYS_ANGLE:
7024 *type = GL_BOOL;
7025 *numParams = 1;
7026 return true;
7027 }
7028 }
7029
7030 if (getExtensions().sRGBWriteControl)
7031 {
7032 switch (pname)
7033 {
7034 case GL_FRAMEBUFFER_SRGB_EXT:
7035 *type = GL_BOOL;
7036 *numParams = 1;
7037 return true;
7038 }
7039 }
7040
7041 if (getExtensions().robustResourceInitialization &&
7042 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7043 {
7044 *type = GL_BOOL;
7045 *numParams = 1;
7046 return true;
7047 }
7048
7049 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7050 {
7051 *type = GL_BOOL;
7052 *numParams = 1;
7053 return true;
7054 }
7055
jchen1082af6202018-06-22 10:59:52 +08007056 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7057 {
7058 *type = GL_INT;
7059 *numParams = 1;
7060 return true;
7061 }
7062
Jamie Madill5b772312018-03-08 20:28:32 -05007063 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7064 switch (pname)
7065 {
7066 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7067 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7068 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7069 {
7070 return false;
7071 }
7072 *type = GL_INT;
7073 *numParams = 1;
7074 return true;
7075
7076 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7077 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7078 {
7079 return false;
7080 }
7081 *type = GL_INT;
7082 *numParams = 1;
7083 return true;
7084
7085 case GL_PROGRAM_BINARY_FORMATS_OES:
7086 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7087 {
7088 return false;
7089 }
7090 *type = GL_INT;
7091 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7092 return true;
7093
7094 case GL_PACK_ROW_LENGTH:
7095 case GL_PACK_SKIP_ROWS:
7096 case GL_PACK_SKIP_PIXELS:
7097 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7098 {
7099 return false;
7100 }
7101 *type = GL_INT;
7102 *numParams = 1;
7103 return true;
7104 case GL_UNPACK_ROW_LENGTH:
7105 case GL_UNPACK_SKIP_ROWS:
7106 case GL_UNPACK_SKIP_PIXELS:
7107 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7108 {
7109 return false;
7110 }
7111 *type = GL_INT;
7112 *numParams = 1;
7113 return true;
7114 case GL_VERTEX_ARRAY_BINDING:
7115 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7116 {
7117 return false;
7118 }
7119 *type = GL_INT;
7120 *numParams = 1;
7121 return true;
7122 case GL_PIXEL_PACK_BUFFER_BINDING:
7123 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7124 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7125 {
7126 return false;
7127 }
7128 *type = GL_INT;
7129 *numParams = 1;
7130 return true;
7131 case GL_MAX_SAMPLES:
7132 {
7133 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7134 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7135 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7136 {
7137 return false;
7138 }
7139 *type = GL_INT;
7140 *numParams = 1;
7141 return true;
7142
7143 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7144 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7145 {
7146 return false;
7147 }
7148 *type = GL_INT;
7149 *numParams = 1;
7150 return true;
7151 }
7152 }
7153
7154 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7155 {
7156 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7157 {
7158 return false;
7159 }
7160 *type = GL_INT;
7161 *numParams = 1;
7162 return true;
7163 }
7164
7165 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7166 {
7167 *type = GL_INT;
7168 *numParams = 1;
7169 return true;
7170 }
7171
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007172 if (getClientVersion() < Version(2, 0))
7173 {
7174 switch (pname)
7175 {
7176 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007177 case GL_CLIENT_ACTIVE_TEXTURE:
7178 case GL_MATRIX_MODE:
7179 case GL_MAX_TEXTURE_UNITS:
7180 case GL_MAX_MODELVIEW_STACK_DEPTH:
7181 case GL_MAX_PROJECTION_STACK_DEPTH:
7182 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007183 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007184 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007185 case GL_VERTEX_ARRAY_STRIDE:
7186 case GL_NORMAL_ARRAY_STRIDE:
7187 case GL_COLOR_ARRAY_STRIDE:
7188 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7189 case GL_VERTEX_ARRAY_SIZE:
7190 case GL_COLOR_ARRAY_SIZE:
7191 case GL_TEXTURE_COORD_ARRAY_SIZE:
7192 case GL_VERTEX_ARRAY_TYPE:
7193 case GL_NORMAL_ARRAY_TYPE:
7194 case GL_COLOR_ARRAY_TYPE:
7195 case GL_TEXTURE_COORD_ARRAY_TYPE:
7196 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7197 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7198 case GL_COLOR_ARRAY_BUFFER_BINDING:
7199 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7200 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7201 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7202 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007203 case GL_SHADE_MODEL:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007204 *type = GL_INT;
7205 *numParams = 1;
7206 return true;
7207 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007208 case GL_FOG_DENSITY:
7209 case GL_FOG_START:
7210 case GL_FOG_END:
7211 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007212 case GL_POINT_SIZE:
7213 case GL_POINT_SIZE_MIN:
7214 case GL_POINT_SIZE_MAX:
7215 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007216 *type = GL_FLOAT;
7217 *numParams = 1;
7218 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007219 case GL_SMOOTH_POINT_SIZE_RANGE:
7220 *type = GL_FLOAT;
7221 *numParams = 2;
7222 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007223 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007224 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007225 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007226 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007227 *type = GL_FLOAT;
7228 *numParams = 4;
7229 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007230 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007231 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007232 *type = GL_FLOAT;
7233 *numParams = 3;
7234 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007235 case GL_MODELVIEW_MATRIX:
7236 case GL_PROJECTION_MATRIX:
7237 case GL_TEXTURE_MATRIX:
7238 *type = GL_FLOAT;
7239 *numParams = 16;
7240 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007241 case GL_LIGHT_MODEL_TWO_SIDE:
7242 *type = GL_BOOL;
7243 *numParams = 1;
7244 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007245 }
7246 }
7247
Jamie Madill5b772312018-03-08 20:28:32 -05007248 if (getClientVersion() < Version(3, 0))
7249 {
7250 return false;
7251 }
7252
7253 // Check for ES3.0+ parameter names
7254 switch (pname)
7255 {
7256 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7257 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7258 case GL_UNIFORM_BUFFER_BINDING:
7259 case GL_TRANSFORM_FEEDBACK_BINDING:
7260 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7261 case GL_COPY_READ_BUFFER_BINDING:
7262 case GL_COPY_WRITE_BUFFER_BINDING:
7263 case GL_SAMPLER_BINDING:
7264 case GL_READ_BUFFER:
7265 case GL_TEXTURE_BINDING_3D:
7266 case GL_TEXTURE_BINDING_2D_ARRAY:
7267 case GL_MAX_3D_TEXTURE_SIZE:
7268 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7269 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7270 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7271 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7272 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7273 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7274 case GL_MAX_VARYING_COMPONENTS:
7275 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7276 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7277 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7278 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7279 case GL_NUM_EXTENSIONS:
7280 case GL_MAJOR_VERSION:
7281 case GL_MINOR_VERSION:
7282 case GL_MAX_ELEMENTS_INDICES:
7283 case GL_MAX_ELEMENTS_VERTICES:
7284 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7285 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7286 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7287 case GL_UNPACK_IMAGE_HEIGHT:
7288 case GL_UNPACK_SKIP_IMAGES:
7289 {
7290 *type = GL_INT;
7291 *numParams = 1;
7292 return true;
7293 }
7294
7295 case GL_MAX_ELEMENT_INDEX:
7296 case GL_MAX_UNIFORM_BLOCK_SIZE:
7297 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7298 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7299 case GL_MAX_SERVER_WAIT_TIMEOUT:
7300 {
7301 *type = GL_INT_64_ANGLEX;
7302 *numParams = 1;
7303 return true;
7304 }
7305
7306 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7307 case GL_TRANSFORM_FEEDBACK_PAUSED:
7308 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7309 case GL_RASTERIZER_DISCARD:
7310 {
7311 *type = GL_BOOL;
7312 *numParams = 1;
7313 return true;
7314 }
7315
7316 case GL_MAX_TEXTURE_LOD_BIAS:
7317 {
7318 *type = GL_FLOAT;
7319 *numParams = 1;
7320 return true;
7321 }
7322 }
7323
7324 if (getExtensions().requestExtension)
7325 {
7326 switch (pname)
7327 {
7328 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7329 *type = GL_INT;
7330 *numParams = 1;
7331 return true;
7332 }
7333 }
7334
7335 if (getClientVersion() < Version(3, 1))
7336 {
7337 return false;
7338 }
7339
7340 switch (pname)
7341 {
7342 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7343 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7344 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7345 case GL_MAX_FRAMEBUFFER_WIDTH:
7346 case GL_MAX_FRAMEBUFFER_HEIGHT:
7347 case GL_MAX_FRAMEBUFFER_SAMPLES:
7348 case GL_MAX_SAMPLE_MASK_WORDS:
7349 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7350 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7351 case GL_MAX_INTEGER_SAMPLES:
7352 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7353 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7354 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7355 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7356 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7357 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7358 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7359 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7360 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7361 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7362 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7363 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7364 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7365 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7366 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7367 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7368 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7369 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7370 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7371 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7372 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7373 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7374 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7375 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7376 case GL_MAX_UNIFORM_LOCATIONS:
7377 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7378 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7379 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7380 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7381 case GL_MAX_IMAGE_UNITS:
7382 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7383 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7384 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7385 case GL_SHADER_STORAGE_BUFFER_BINDING:
7386 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7387 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
7388 *type = GL_INT;
7389 *numParams = 1;
7390 return true;
7391 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7392 *type = GL_INT_64_ANGLEX;
7393 *numParams = 1;
7394 return true;
7395 case GL_SAMPLE_MASK:
7396 *type = GL_BOOL;
7397 *numParams = 1;
7398 return true;
7399 }
7400
7401 if (getExtensions().geometryShader)
7402 {
7403 switch (pname)
7404 {
7405 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7406 case GL_LAYER_PROVOKING_VERTEX_EXT:
7407 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7408 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7409 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7410 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7411 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7412 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7413 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7414 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7415 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7416 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7417 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7418 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7419 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7420 *type = GL_INT;
7421 *numParams = 1;
7422 return true;
7423 }
7424 }
7425
7426 return false;
7427}
7428
7429bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7430{
7431 if (getClientVersion() < Version(3, 0))
7432 {
7433 return false;
7434 }
7435
7436 switch (target)
7437 {
7438 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7439 case GL_UNIFORM_BUFFER_BINDING:
7440 {
7441 *type = GL_INT;
7442 *numParams = 1;
7443 return true;
7444 }
7445 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7446 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7447 case GL_UNIFORM_BUFFER_START:
7448 case GL_UNIFORM_BUFFER_SIZE:
7449 {
7450 *type = GL_INT_64_ANGLEX;
7451 *numParams = 1;
7452 return true;
7453 }
7454 }
7455
7456 if (getClientVersion() < Version(3, 1))
7457 {
7458 return false;
7459 }
7460
7461 switch (target)
7462 {
7463 case GL_IMAGE_BINDING_LAYERED:
7464 {
7465 *type = GL_BOOL;
7466 *numParams = 1;
7467 return true;
7468 }
7469 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7470 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7471 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7472 case GL_SHADER_STORAGE_BUFFER_BINDING:
7473 case GL_VERTEX_BINDING_BUFFER:
7474 case GL_VERTEX_BINDING_DIVISOR:
7475 case GL_VERTEX_BINDING_OFFSET:
7476 case GL_VERTEX_BINDING_STRIDE:
7477 case GL_SAMPLE_MASK_VALUE:
7478 case GL_IMAGE_BINDING_NAME:
7479 case GL_IMAGE_BINDING_LEVEL:
7480 case GL_IMAGE_BINDING_LAYER:
7481 case GL_IMAGE_BINDING_ACCESS:
7482 case GL_IMAGE_BINDING_FORMAT:
7483 {
7484 *type = GL_INT;
7485 *numParams = 1;
7486 return true;
7487 }
7488 case GL_ATOMIC_COUNTER_BUFFER_START:
7489 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7490 case GL_SHADER_STORAGE_BUFFER_START:
7491 case GL_SHADER_STORAGE_BUFFER_SIZE:
7492 {
7493 *type = GL_INT_64_ANGLEX;
7494 *numParams = 1;
7495 return true;
7496 }
7497 }
7498
7499 return false;
7500}
7501
7502Program *Context::getProgram(GLuint handle) const
7503{
7504 return mState.mShaderPrograms->getProgram(handle);
7505}
7506
7507Shader *Context::getShader(GLuint handle) const
7508{
7509 return mState.mShaderPrograms->getShader(handle);
7510}
7511
7512bool Context::isTextureGenerated(GLuint texture) const
7513{
7514 return mState.mTextures->isHandleGenerated(texture);
7515}
7516
7517bool Context::isBufferGenerated(GLuint buffer) const
7518{
7519 return mState.mBuffers->isHandleGenerated(buffer);
7520}
7521
7522bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7523{
7524 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7525}
7526
7527bool Context::isFramebufferGenerated(GLuint framebuffer) const
7528{
7529 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7530}
7531
7532bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7533{
7534 return mState.mPipelines->isHandleGenerated(pipeline);
7535}
7536
7537bool Context::usingDisplayTextureShareGroup() const
7538{
7539 return mDisplayTextureShareGroup;
7540}
7541
7542GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7543{
7544 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7545 internalformat == GL_DEPTH_STENCIL
7546 ? GL_DEPTH24_STENCIL8
7547 : internalformat;
7548}
7549
jchen1082af6202018-06-22 10:59:52 +08007550void Context::maxShaderCompilerThreads(GLuint count)
7551{
7552 mGLState.setMaxShaderCompilerThreads(count);
7553}
7554
Jamie Madill2eb65032018-07-30 10:25:57 -04007555bool Context::isGLES1() const
7556{
7557 return mState.getClientVersion() < Version(2, 0);
7558}
7559
Jamie Madilla11819d2018-07-30 10:26:01 -04007560void Context::onSubjectStateChange(const Context *context,
7561 angle::SubjectIndex index,
7562 angle::SubjectMessage message)
7563{
7564 ASSERT(message == angle::SubjectMessage::CONTENTS_CHANGED);
7565 switch (index)
7566 {
7567 case kVertexArraySubjectIndex:
7568 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
Jamie Madillc43cdad2018-08-08 15:49:25 -04007569 mStateCache.onVertexArraySizeChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04007570 break;
7571
7572 case kReadFramebufferSubjectIndex:
7573 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
7574 break;
7575
7576 case kDrawFramebufferSubjectIndex:
7577 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
7578 break;
7579
7580 default:
7581 UNREACHABLE();
7582 break;
7583 }
7584}
7585
Jamie Madill6b873dd2018-07-12 23:56:30 -04007586// ErrorSet implementation.
7587ErrorSet::ErrorSet(Context *context) : mContext(context)
7588{
7589}
7590
7591ErrorSet::~ErrorSet() = default;
7592
Jamie Madill306b6c12018-07-27 08:12:49 -04007593void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04007594{
7595 // This internal enum is used to filter internal errors that are already handled.
7596 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
7597 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
7598 {
7599 return;
7600 }
7601
7602 if (ANGLE_UNLIKELY(error.isError()))
7603 {
7604 GLenum code = error.getCode();
7605 mErrors.insert(code);
7606 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
7607 {
7608 mContext->markContextLost();
7609 }
7610
7611 ASSERT(!error.getMessage().empty());
7612 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
7613 error.getID(), GL_DEBUG_SEVERITY_HIGH,
7614 error.getMessage());
7615 }
7616}
7617
7618bool ErrorSet::empty() const
7619{
7620 return mErrors.empty();
7621}
7622
7623GLenum ErrorSet::popError()
7624{
7625 ASSERT(!empty());
7626 GLenum error = *mErrors.begin();
7627 mErrors.erase(mErrors.begin());
7628 return error;
7629}
Jamie Madilldc358af2018-07-31 11:22:13 -04007630
7631// StateCache implementation.
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007632StateCache::StateCache()
7633 : mCachedHasAnyEnabledClientAttrib(false),
7634 mCachedNonInstancedVertexElementLimit(0),
7635 mCachedInstancedVertexElementLimit(0)
Jamie Madilldc358af2018-07-31 11:22:13 -04007636{
7637}
7638
7639StateCache::~StateCache() = default;
7640
7641void StateCache::updateActiveAttribsMask(Context *context)
7642{
7643 bool isGLES1 = context->isGLES1();
7644 const State &glState = context->getGLState();
7645
7646 if (!isGLES1 && !glState.getProgram())
7647 {
7648 mCachedActiveBufferedAttribsMask = AttributesMask();
7649 mCachedActiveClientAttribsMask = AttributesMask();
7650 return;
7651 }
7652
7653 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
7654 : glState.getProgram()->getActiveAttribLocationsMask();
7655
7656 const VertexArray *vao = glState.getVertexArray();
7657 ASSERT(vao);
7658
7659 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
7660 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
7661
7662 activeAttribs &= enabledAttribs;
7663
7664 mCachedActiveClientAttribsMask = activeAttribs & clientAttribs;
7665 mCachedActiveBufferedAttribsMask = activeAttribs & ~clientAttribs;
7666 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
7667}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007668
7669void StateCache::updateVertexElementLimits(Context *context)
7670{
7671 const VertexArray *vao = context->getGLState().getVertexArray();
7672
7673 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
7674 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
7675
7676 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
7677 // If there are no buffered attributes then we should not limit the draw call count.
7678 if (!vao || !mCachedActiveBufferedAttribsMask.any())
7679 {
7680 return;
7681 }
7682
7683 const auto &vertexAttribs = vao->getVertexAttributes();
7684 const auto &vertexBindings = vao->getVertexBindings();
7685
7686 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
7687 {
7688 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
7689 ASSERT(attrib.enabled);
7690
7691 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
7692 ASSERT(context->isGLES1() ||
7693 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
7694
7695 GLint64 limit = attrib.getCachedElementLimit();
7696 if (binding.getDivisor() > 0)
7697 {
7698 mCachedInstancedVertexElementLimit =
7699 std::min(mCachedInstancedVertexElementLimit, limit);
7700 }
7701 else
7702 {
7703 mCachedNonInstancedVertexElementLimit =
7704 std::min(mCachedNonInstancedVertexElementLimit, limit);
7705 }
7706 }
7707}
Jamie Madillc43cdad2018-08-08 15:49:25 -04007708
7709void StateCache::onVertexArrayBindingChange(Context *context)
7710{
7711 updateActiveAttribsMask(context);
7712 updateVertexElementLimits(context);
7713}
7714
7715void StateCache::onProgramExecutableChange(Context *context)
7716{
7717 updateActiveAttribsMask(context);
7718 updateVertexElementLimits(context);
7719}
7720
7721void StateCache::onVertexArraySizeChange(Context *context)
7722{
7723 updateVertexElementLimits(context);
7724}
7725
7726void StateCache::onVertexArrayStateChange(Context *context)
7727{
7728 updateActiveAttribsMask(context);
7729 updateVertexElementLimits(context);
7730}
7731
7732void StateCache::onGLES1ClientStateChange(Context *context)
7733{
7734 updateActiveAttribsMask(context);
7735}
Jamie Madillc29968b2016-01-20 11:17:23 -05007736} // namespace gl