blob: 48fd5fc9af5031d2b8eac7c01d8cdb7f44e4aead [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 Madill6c43a012018-08-08 15:49:27 -0400301constexpr angle::SubjectIndex kVertexArraySubjectIndex = gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES + 0;
302constexpr angle::SubjectIndex kReadFramebufferSubjectIndex =
303 gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES + 1;
304constexpr angle::SubjectIndex kDrawFramebufferSubjectIndex =
305 gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES + 2;
Geoff Langf6db0982015-08-25 13:04:00 -0400306} // anonymous namespace
307
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000308namespace gl
309{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000310
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400311Context::Context(rx::EGLImplFactory *implFactory,
312 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400313 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500314 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400315 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500316 const egl::AttributeMap &attribs,
Brandon Jones2b0cdcc2018-05-02 08:02:50 -0700317 const egl::DisplayExtensions &displayExtensions,
318 const egl::ClientExtensions &clientExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500319 : mState(reinterpret_cast<ContextID>(this),
320 shareContext ? &shareContext->mState : nullptr,
321 shareTextures,
322 GetClientVersion(attribs),
323 &mGLState,
324 mCaps,
325 mTextureCaps,
326 mExtensions,
327 mLimitations),
328 mSkipValidation(GetNoError(attribs)),
329 mDisplayTextureShareGroup(shareTextures != nullptr),
330 mSavedArgsType(nullptr),
Geoff Lang3cacf692018-06-20 16:49:57 -0400331 mImplementation(implFactory->createContext(mState, config, shareContext, attribs)),
Geoff Lang75359662018-04-11 01:42:27 -0400332 mLabel(nullptr),
Jamie Madill2f348d22017-06-05 10:50:59 -0400333 mCompiler(),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400334 mGLState(GetDebug(attribs),
335 GetBindGeneratesResource(attribs),
336 GetClientArraysEnabled(attribs),
337 GetRobustResourceInit(attribs),
338 memoryProgramCache != nullptr),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400339 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500340 mClientType(EGL_OPENGL_ES_API),
Jamie Madill6b873dd2018-07-12 23:56:30 -0400341 mErrors(this),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500342 mHasBeenCurrent(false),
343 mContextLost(false),
344 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700345 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500346 mResetStrategy(GetResetStrategy(attribs)),
347 mRobustAccess(GetRobustAccess(attribs)),
Geoff Lang33f11fb2018-05-07 13:42:47 -0400348 mSurfacelessSupported(displayExtensions.surfacelessContext),
349 mExplicitContextAvailable(clientExtensions.explicitContext),
Jamie Madill61e16b42017-06-19 11:13:23 -0400350 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
351 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madille14951e2017-03-09 18:55:16 -0500352 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400353 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400354 mMemoryProgramCache(memoryProgramCache),
Jamie Madilla11819d2018-07-30 10:26:01 -0400355 mVertexArrayObserverBinding(this, kVertexArraySubjectIndex),
356 mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex),
357 mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400358 mScratchBuffer(1000u),
359 mZeroFilledBuffer(1000u)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000360{
Jamie Madill5b772312018-03-08 20:28:32 -0500361 // Needed to solve a Clang warning of unused variables.
Jamie Madillc6dbc252018-04-30 19:07:56 -0400362 ANGLE_UNUSED_VARIABLE(mSavedArgsType);
363 ANGLE_UNUSED_VARIABLE(mParamsBuffer);
Geoff Lang33f11fb2018-05-07 13:42:47 -0400364}
Jamie Madill5b772312018-03-08 20:28:32 -0500365
Geoff Lang33f11fb2018-05-07 13:42:47 -0400366void Context::initialize()
367{
368 mImplementation->setMemoryProgramCache(mMemoryProgramCache);
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400369
Geoff Lang33f11fb2018-05-07 13:42:47 -0400370 initCaps();
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700371 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400372
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400373 mGLState.initialize(this);
Régis Fénéon83107972015-02-05 12:57:44 +0100374
Shannon Woods53a94a82014-06-24 15:20:36 -0400375 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400376
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000377 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400378 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000379 // and cube map texture state vectors respectively associated with them.
380 // In order that access to these initial textures not be lost, they are treated as texture
381 // objects all of whose names are 0.
382
Corentin Wallez99d492c2018-02-27 15:17:10 -0500383 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800384 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500385
Corentin Wallez99d492c2018-02-27 15:17:10 -0500386 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800387 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400388
Geoff Langeb66a6e2016-10-31 13:06:12 -0400389 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400390 {
391 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500392 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800393 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400394
Corentin Wallez99d492c2018-02-27 15:17:10 -0500395 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800396 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400397 }
Geoff Lang3b573612016-10-31 14:08:10 -0400398 if (getClientVersion() >= Version(3, 1))
399 {
400 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500401 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800402 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800403
Jiajia Qin6eafb042016-12-27 17:04:07 +0800404 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
405 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800406 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800407 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800408
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800409 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
410 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400411 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800412 }
Geoff Lang3b573612016-10-31 14:08:10 -0400413 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000414
Geoff Langb0f917f2017-12-05 13:41:54 -0500415 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400416 {
417 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500418 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800419 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400420 }
421
Geoff Langb0f917f2017-12-05 13:41:54 -0500422 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400423 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500424 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800425 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400426 }
427
Jamie Madill4928b7c2017-06-20 12:57:39 -0400428 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500429
Jamie Madill57a89722013-07-02 11:57:03 -0400430 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000431
Geoff Langeb66a6e2016-10-31 13:06:12 -0400432 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400433 {
434 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
435 // In the initial state, a default transform feedback object is bound and treated as
436 // a transform feedback object with a name of zero. That object is bound any time
437 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400438 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400439 }
Geoff Langc8058452014-02-03 12:04:11 -0500440
Corentin Wallez336129f2017-10-17 15:55:40 -0400441 for (auto type : angle::AllEnums<BufferBinding>())
442 {
443 bindBuffer(type, 0);
444 }
445
446 bindRenderbuffer(GL_RENDERBUFFER, 0);
447
448 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
449 {
450 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
451 }
452
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700453 // Initialize GLES1 renderer if appropriate.
454 if (getClientVersion() < Version(2, 0))
455 {
456 mGLES1Renderer.reset(new GLES1Renderer());
457 }
458
Jamie Madillad9f24e2016-02-12 09:27:24 -0500459 // Initialize dirty bit masks
Geoff Lang9bf86f02018-07-26 11:46:34 -0400460 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
461 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
462 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
463
464 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
465 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
466 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
467
Jamie Madillc67323a2017-11-02 23:11:41 -0400468 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500469 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500470 // No dirty objects.
471
472 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400473 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500474 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400475 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500476 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
477
478 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
479 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
480 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
481 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
482 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
483 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
484 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
485 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
486 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
487 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
488 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400489 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500490 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
491
492 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
493 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700494 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400495 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
496 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500497 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
498 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400499
Xinghua Cao10a4d432017-11-28 14:46:26 +0800500 // TODO(xinghua.cao@intel.com): add other dirty bits and dirty objects.
501 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
502 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
503 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
504 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
505 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800506 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800507 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800508
Jamie Madillb4927eb2018-07-16 11:39:46 -0400509 mImplementation->setErrorSet(&mErrors);
510
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400511 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000512}
513
Jamie Madill4928b7c2017-06-20 12:57:39 -0400514egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000515{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700516 if (mGLES1Renderer)
517 {
518 mGLES1Renderer->onDestroy(this, &mGLState);
519 }
520
Jamie Madille7b3fe22018-04-05 09:42:46 -0400521 // Delete the Surface first to trigger a finish() in Vulkan.
Jamie Madille7b3fe22018-04-05 09:42:46 -0400522 ANGLE_TRY(releaseSurface(display));
523
Corentin Wallez80b24112015-08-25 16:41:57 -0400524 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000525 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400526 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000527 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400528 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000529
Corentin Wallez80b24112015-08-25 16:41:57 -0400530 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000531 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400532 if (query.second != nullptr)
533 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400534 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400535 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000536 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400537 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000538
Corentin Wallez80b24112015-08-25 16:41:57 -0400539 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400540 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400541 if (vertexArray.second)
542 {
543 vertexArray.second->onDestroy(this);
544 }
Jamie Madill57a89722013-07-02 11:57:03 -0400545 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400546 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400547
Corentin Wallez80b24112015-08-25 16:41:57 -0400548 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500549 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500550 if (transformFeedback.second != nullptr)
551 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500552 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500553 }
Geoff Langc8058452014-02-03 12:04:11 -0500554 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400555 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500556
Jamie Madill5b772312018-03-08 20:28:32 -0500557 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400558 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800559 if (zeroTexture.get() != nullptr)
560 {
561 ANGLE_TRY(zeroTexture->onDestroy(this));
562 zeroTexture.set(this, nullptr);
563 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400564 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000565
Jamie Madill2f348d22017-06-05 10:50:59 -0400566 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500567
Jamie Madill4928b7c2017-06-20 12:57:39 -0400568 mGLState.reset(this);
569
Jamie Madill6c1f6712017-02-14 19:08:04 -0500570 mState.mBuffers->release(this);
571 mState.mShaderPrograms->release(this);
572 mState.mTextures->release(this);
573 mState.mRenderbuffers->release(this);
574 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400575 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500576 mState.mPaths->release(this);
577 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800578 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400579
Jamie Madill76e471e2017-10-21 09:56:01 -0400580 mImplementation->onDestroy(this);
581
Jamie Madill4928b7c2017-06-20 12:57:39 -0400582 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000583}
584
Jamie Madill70ee0f62017-02-06 16:04:20 -0500585Context::~Context()
586{
587}
588
Geoff Lang75359662018-04-11 01:42:27 -0400589void Context::setLabel(EGLLabelKHR label)
590{
591 mLabel = label;
592}
593
594EGLLabelKHR Context::getLabel() const
595{
596 return mLabel;
597}
598
Jamie Madill4928b7c2017-06-20 12:57:39 -0400599egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000600{
Jamie Madill61e16b42017-06-19 11:13:23 -0400601 mCurrentDisplay = display;
602
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000603 if (!mHasBeenCurrent)
604 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400605 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000606 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500607 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400608 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000609
Corentin Wallezc295e512017-01-27 17:47:50 -0500610 int width = 0;
611 int height = 0;
612 if (surface != nullptr)
613 {
614 width = surface->getWidth();
615 height = surface->getHeight();
616 }
617
618 mGLState.setViewportParams(0, 0, width, height);
619 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000620
621 mHasBeenCurrent = true;
622 }
623
Jamie Madill1b94d432015-08-07 13:23:23 -0400624 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700625 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400626 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400627
Jamie Madill4928b7c2017-06-20 12:57:39 -0400628 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500629
630 Framebuffer *newDefault = nullptr;
631 if (surface != nullptr)
632 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400633 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500634 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400635 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500636 }
637 else
638 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400639 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500640 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000641
Corentin Wallez37c39792015-08-20 14:19:46 -0400642 // Update default framebuffer, the binding of the previous default
643 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400644 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400645 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700646 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400647 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400648 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400649 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700650 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400651 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400652 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400653 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400654 }
Ian Ewell292f0052016-02-04 10:37:32 -0500655
656 // Notify the renderer of a context switch
Luc Ferron5396f2a2018-07-12 08:24:23 -0400657 ANGLE_TRY(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400658 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000659}
660
Jamie Madill4928b7c2017-06-20 12:57:39 -0400661egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400662{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400663 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400664
Geoff Langbf7b95d2018-05-01 16:48:21 -0400665 // Remove the default framebuffer
666 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500667 {
668 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400669 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500670 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400671
672 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500673 {
674 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400675 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500676 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400677
678 if (defaultFramebuffer)
679 {
680 defaultFramebuffer->onDestroy(this);
681 delete defaultFramebuffer;
682 }
683
Corentin Wallezc295e512017-01-27 17:47:50 -0500684 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
685
686 if (mCurrentSurface)
687 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400688 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500689 mCurrentSurface = nullptr;
690 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400691
692 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400693}
694
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000695GLuint Context::createBuffer()
696{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500697 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000698}
699
700GLuint Context::createProgram()
701{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500702 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000703}
704
Jiawei Shao385b3e02018-03-21 09:43:28 +0800705GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000706{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500707 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000708}
709
710GLuint Context::createTexture()
711{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500712 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000713}
714
715GLuint Context::createRenderbuffer()
716{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500717 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000718}
719
Brandon Jones59770802018-04-02 13:18:42 -0700720GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300721{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500722 auto resultOrError = mState.mPaths->createPaths(mImplementation.get(), range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300723 if (resultOrError.isError())
724 {
725 handleError(resultOrError.getError());
726 return 0;
727 }
728 return resultOrError.getResult();
729}
730
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000731// Returns an unused framebuffer name
732GLuint Context::createFramebuffer()
733{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500734 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000735}
736
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500737void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000738{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500739 for (int i = 0; i < n; i++)
740 {
741 GLuint handle = mFenceNVHandleAllocator.allocate();
742 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
743 fences[i] = handle;
744 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000745}
746
Yunchao Hea336b902017-08-02 16:05:21 +0800747GLuint Context::createProgramPipeline()
748{
749 return mState.mPipelines->createProgramPipeline();
750}
751
Jiawei Shao385b3e02018-03-21 09:43:28 +0800752GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800753{
754 UNIMPLEMENTED();
755 return 0u;
756}
757
James Darpinian4d9d4832018-03-13 12:43:28 -0700758void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000759{
James Darpinian4d9d4832018-03-13 12:43:28 -0700760 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
761 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000762 {
763 detachBuffer(buffer);
764 }
Jamie Madill893ab082014-05-16 16:56:10 -0400765
James Darpinian4d9d4832018-03-13 12:43:28 -0700766 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000767}
768
769void Context::deleteShader(GLuint shader)
770{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500771 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000772}
773
774void Context::deleteProgram(GLuint program)
775{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500776 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000777}
778
779void Context::deleteTexture(GLuint texture)
780{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500781 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000782 {
783 detachTexture(texture);
784 }
785
Jamie Madill6c1f6712017-02-14 19:08:04 -0500786 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000787}
788
789void Context::deleteRenderbuffer(GLuint renderbuffer)
790{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500791 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000792 {
793 detachRenderbuffer(renderbuffer);
794 }
Jamie Madill893ab082014-05-16 16:56:10 -0400795
Jamie Madill6c1f6712017-02-14 19:08:04 -0500796 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000797}
798
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400799void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400800{
801 // The spec specifies the underlying Fence object is not deleted until all current
802 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
803 // and since our API is currently designed for being called from a single thread, we can delete
804 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400805 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400806}
807
Yunchao Hea336b902017-08-02 16:05:21 +0800808void Context::deleteProgramPipeline(GLuint pipeline)
809{
810 if (mState.mPipelines->getProgramPipeline(pipeline))
811 {
812 detachProgramPipeline(pipeline);
813 }
814
815 mState.mPipelines->deleteObject(this, pipeline);
816}
817
Sami Väisänene45e53b2016-05-25 10:36:04 +0300818void Context::deletePaths(GLuint first, GLsizei range)
819{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500820 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300821}
822
Brandon Jones59770802018-04-02 13:18:42 -0700823bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300824{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500825 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300826 if (pathObj == nullptr)
827 return false;
828
829 return pathObj->hasPathData();
830}
831
Brandon Jones59770802018-04-02 13:18:42 -0700832bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300833{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500834 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300835}
836
Brandon Jones59770802018-04-02 13:18:42 -0700837void Context::pathCommands(GLuint path,
838 GLsizei numCommands,
839 const GLubyte *commands,
840 GLsizei numCoords,
841 GLenum coordType,
842 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300843{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500844 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300845
846 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
847}
848
Jamie Madill007530e2017-12-28 14:27:04 -0500849void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300850{
Jamie Madill007530e2017-12-28 14:27:04 -0500851 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300852
853 switch (pname)
854 {
855 case GL_PATH_STROKE_WIDTH_CHROMIUM:
856 pathObj->setStrokeWidth(value);
857 break;
858 case GL_PATH_END_CAPS_CHROMIUM:
859 pathObj->setEndCaps(static_cast<GLenum>(value));
860 break;
861 case GL_PATH_JOIN_STYLE_CHROMIUM:
862 pathObj->setJoinStyle(static_cast<GLenum>(value));
863 break;
864 case GL_PATH_MITER_LIMIT_CHROMIUM:
865 pathObj->setMiterLimit(value);
866 break;
867 case GL_PATH_STROKE_BOUND_CHROMIUM:
868 pathObj->setStrokeBound(value);
869 break;
870 default:
871 UNREACHABLE();
872 break;
873 }
874}
875
Jamie Madill007530e2017-12-28 14:27:04 -0500876void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300877{
Jamie Madill007530e2017-12-28 14:27:04 -0500878 // TODO(jmadill): Should use proper clamping/casting.
879 pathParameterf(path, pname, static_cast<GLfloat>(value));
880}
881
882void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
883{
884 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300885
886 switch (pname)
887 {
888 case GL_PATH_STROKE_WIDTH_CHROMIUM:
889 *value = pathObj->getStrokeWidth();
890 break;
891 case GL_PATH_END_CAPS_CHROMIUM:
892 *value = static_cast<GLfloat>(pathObj->getEndCaps());
893 break;
894 case GL_PATH_JOIN_STYLE_CHROMIUM:
895 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
896 break;
897 case GL_PATH_MITER_LIMIT_CHROMIUM:
898 *value = pathObj->getMiterLimit();
899 break;
900 case GL_PATH_STROKE_BOUND_CHROMIUM:
901 *value = pathObj->getStrokeBound();
902 break;
903 default:
904 UNREACHABLE();
905 break;
906 }
907}
908
Jamie Madill007530e2017-12-28 14:27:04 -0500909void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
910{
911 GLfloat val = 0.0f;
912 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
913 if (value)
914 *value = static_cast<GLint>(val);
915}
916
Brandon Jones59770802018-04-02 13:18:42 -0700917void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300918{
919 mGLState.setPathStencilFunc(func, ref, mask);
920}
921
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000922void Context::deleteFramebuffer(GLuint framebuffer)
923{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500924 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000925 {
926 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000927 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500928
Jamie Madill6c1f6712017-02-14 19:08:04 -0500929 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000930}
931
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500932void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000933{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500934 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000935 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500936 GLuint fence = fences[i];
937
938 FenceNV *fenceObject = nullptr;
939 if (mFenceNVMap.erase(fence, &fenceObject))
940 {
941 mFenceNVHandleAllocator.release(fence);
942 delete fenceObject;
943 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000944 }
945}
946
Geoff Lang70d0f492015-12-10 17:45:46 -0500947Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000948{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500949 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000950}
951
Jamie Madill570f7c82014-07-03 10:38:54 -0400952Texture *Context::getTexture(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000953{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500954 return mState.mTextures->getTexture(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000955}
956
Geoff Lang70d0f492015-12-10 17:45:46 -0500957Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000958{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500959 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000960}
961
Jamie Madill70b5bb02017-08-28 13:32:37 -0400962Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400963{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400964 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400965}
966
Jamie Madill57a89722013-07-02 11:57:03 -0400967VertexArray *Context::getVertexArray(GLuint handle) const
968{
Jamie Madill96a483b2017-06-27 16:49:21 -0400969 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400970}
971
Jamie Madilldc356042013-07-19 16:36:57 -0400972Sampler *Context::getSampler(GLuint handle) const
973{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500974 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -0400975}
976
Geoff Langc8058452014-02-03 12:04:11 -0500977TransformFeedback *Context::getTransformFeedback(GLuint handle) const
978{
Jamie Madill96a483b2017-06-27 16:49:21 -0400979 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -0500980}
981
Yunchao Hea336b902017-08-02 16:05:21 +0800982ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
983{
984 return mState.mPipelines->getProgramPipeline(handle);
985}
986
Geoff Lang75359662018-04-11 01:42:27 -0400987gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -0500988{
989 switch (identifier)
990 {
991 case GL_BUFFER:
992 return getBuffer(name);
993 case GL_SHADER:
994 return getShader(name);
995 case GL_PROGRAM:
996 return getProgram(name);
997 case GL_VERTEX_ARRAY:
998 return getVertexArray(name);
999 case GL_QUERY:
1000 return getQuery(name);
1001 case GL_TRANSFORM_FEEDBACK:
1002 return getTransformFeedback(name);
1003 case GL_SAMPLER:
1004 return getSampler(name);
1005 case GL_TEXTURE:
1006 return getTexture(name);
1007 case GL_RENDERBUFFER:
1008 return getRenderbuffer(name);
1009 case GL_FRAMEBUFFER:
1010 return getFramebuffer(name);
1011 default:
1012 UNREACHABLE();
1013 return nullptr;
1014 }
1015}
1016
Geoff Lang75359662018-04-11 01:42:27 -04001017gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001018{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001019 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001020}
1021
Martin Radev9d901792016-07-15 15:58:58 +03001022void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1023{
Geoff Lang75359662018-04-11 01:42:27 -04001024 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001025 ASSERT(object != nullptr);
1026
1027 std::string labelName = GetObjectLabelFromPointer(length, label);
1028 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001029
1030 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1031 // specified object is active until we do this.
1032 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001033}
1034
1035void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1036{
Geoff Lang75359662018-04-11 01:42:27 -04001037 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001038 ASSERT(object != nullptr);
1039
1040 std::string labelName = GetObjectLabelFromPointer(length, label);
1041 object->setLabel(labelName);
1042}
1043
1044void Context::getObjectLabel(GLenum identifier,
1045 GLuint name,
1046 GLsizei bufSize,
1047 GLsizei *length,
1048 GLchar *label) const
1049{
Geoff Lang75359662018-04-11 01:42:27 -04001050 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001051 ASSERT(object != nullptr);
1052
1053 const std::string &objectLabel = object->getLabel();
1054 GetObjectLabelBase(objectLabel, bufSize, length, label);
1055}
1056
1057void Context::getObjectPtrLabel(const void *ptr,
1058 GLsizei bufSize,
1059 GLsizei *length,
1060 GLchar *label) const
1061{
Geoff Lang75359662018-04-11 01:42:27 -04001062 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001063 ASSERT(object != nullptr);
1064
1065 const std::string &objectLabel = object->getLabel();
1066 GetObjectLabelBase(objectLabel, bufSize, length, label);
1067}
1068
Jamie Madilldc356042013-07-19 16:36:57 -04001069bool Context::isSampler(GLuint samplerName) const
1070{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001071 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001072}
1073
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001074void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001075{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001076 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001077
Jamie Madilldedd7b92014-11-05 16:30:36 -05001078 if (handle == 0)
1079 {
1080 texture = mZeroTextures[target].get();
1081 }
1082 else
1083 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001084 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001085 }
1086
1087 ASSERT(texture);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001088 mGLState.setSamplerTexture(this, target, texture);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001089}
1090
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001091void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001092{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001093 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1094 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001095 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001096 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001097}
1098
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001099void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001100{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001101 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1102 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001103 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001104 mDrawFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001105}
1106
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001107void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001108{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001109 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001110 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001111 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001112 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001113}
1114
Shao80957d92017-02-20 21:25:59 +08001115void Context::bindVertexBuffer(GLuint bindingIndex,
1116 GLuint bufferHandle,
1117 GLintptr offset,
1118 GLsizei stride)
1119{
1120 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001121 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001122 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001123}
1124
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001125void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001126{
Geoff Lang76b10c92014-09-05 16:28:14 -04001127 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001128 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001129 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001130 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001131}
1132
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001133void Context::bindImageTexture(GLuint unit,
1134 GLuint texture,
1135 GLint level,
1136 GLboolean layered,
1137 GLint layer,
1138 GLenum access,
1139 GLenum format)
1140{
1141 Texture *tex = mState.mTextures->getTexture(texture);
1142 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1143}
1144
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001145void Context::useProgram(GLuint program)
1146{
Jamie Madill6c1f6712017-02-14 19:08:04 -05001147 mGLState.setProgram(this, getProgram(program));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001148 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001149}
1150
Jiajia Qin5451d532017-11-16 17:16:34 +08001151void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1152{
1153 UNIMPLEMENTED();
1154}
1155
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001156void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001157{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001158 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001159 TransformFeedback *transformFeedback =
1160 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001161 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -05001162}
1163
Yunchao Hea336b902017-08-02 16:05:21 +08001164void Context::bindProgramPipeline(GLuint pipelineHandle)
1165{
1166 ProgramPipeline *pipeline =
1167 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1168 mGLState.setProgramPipelineBinding(this, pipeline);
1169}
1170
Corentin Wallezad3ae902018-03-09 13:40:42 -05001171void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001172{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001173 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001174 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001175
Geoff Lang5aad9672014-09-08 11:10:42 -04001176 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001177 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001178
1179 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001180 mGLState.setActiveQuery(this, target, queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001181}
1182
Corentin Wallezad3ae902018-03-09 13:40:42 -05001183void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001184{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001185 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001186 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001187
Jamie Madill5188a272018-07-25 10:53:56 -04001188 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001189
Geoff Lang5aad9672014-09-08 11:10:42 -04001190 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001191 mGLState.setActiveQuery(this, target, nullptr);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001192}
1193
Corentin Wallezad3ae902018-03-09 13:40:42 -05001194void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001195{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001196 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001197
1198 Query *queryObject = getQuery(id, true, target);
1199 ASSERT(queryObject);
1200
Jamie Madill5188a272018-07-25 10:53:56 -04001201 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001202}
1203
Corentin Wallezad3ae902018-03-09 13:40:42 -05001204void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001205{
1206 switch (pname)
1207 {
1208 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001209 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001210 break;
1211 case GL_QUERY_COUNTER_BITS_EXT:
1212 switch (target)
1213 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001214 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001215 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1216 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001217 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001218 params[0] = getExtensions().queryCounterBitsTimestamp;
1219 break;
1220 default:
1221 UNREACHABLE();
1222 params[0] = 0;
1223 break;
1224 }
1225 break;
1226 default:
1227 UNREACHABLE();
1228 return;
1229 }
1230}
1231
Corentin Wallezad3ae902018-03-09 13:40:42 -05001232void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001233 GLenum pname,
1234 GLsizei bufSize,
1235 GLsizei *length,
1236 GLint *params)
1237{
1238 getQueryiv(target, pname, params);
1239}
1240
Geoff Lang2186c382016-10-14 10:54:54 -04001241void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001242{
Jamie Madill5188a272018-07-25 10:53:56 -04001243 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001244}
1245
Brandon Jones59770802018-04-02 13:18:42 -07001246void Context::getQueryObjectivRobust(GLuint id,
1247 GLenum pname,
1248 GLsizei bufSize,
1249 GLsizei *length,
1250 GLint *params)
1251{
1252 getQueryObjectiv(id, pname, params);
1253}
1254
Geoff Lang2186c382016-10-14 10:54:54 -04001255void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001256{
Jamie Madill5188a272018-07-25 10:53:56 -04001257 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001258}
1259
Brandon Jones59770802018-04-02 13:18:42 -07001260void Context::getQueryObjectuivRobust(GLuint id,
1261 GLenum pname,
1262 GLsizei bufSize,
1263 GLsizei *length,
1264 GLuint *params)
1265{
1266 getQueryObjectuiv(id, pname, params);
1267}
1268
Geoff Lang2186c382016-10-14 10:54:54 -04001269void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001270{
Jamie Madill5188a272018-07-25 10:53:56 -04001271 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001272}
1273
Brandon Jones59770802018-04-02 13:18:42 -07001274void Context::getQueryObjecti64vRobust(GLuint id,
1275 GLenum pname,
1276 GLsizei bufSize,
1277 GLsizei *length,
1278 GLint64 *params)
1279{
1280 getQueryObjecti64v(id, pname, params);
1281}
1282
Geoff Lang2186c382016-10-14 10:54:54 -04001283void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001284{
Jamie Madill5188a272018-07-25 10:53:56 -04001285 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001286}
1287
Brandon Jones59770802018-04-02 13:18:42 -07001288void Context::getQueryObjectui64vRobust(GLuint id,
1289 GLenum pname,
1290 GLsizei bufSize,
1291 GLsizei *length,
1292 GLuint64 *params)
1293{
1294 getQueryObjectui64v(id, pname, params);
1295}
1296
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001297Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001298{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001299 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001300}
1301
Jamie Madill2f348d22017-06-05 10:50:59 -04001302FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001303{
Jamie Madill96a483b2017-06-27 16:49:21 -04001304 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001305}
1306
Corentin Wallezad3ae902018-03-09 13:40:42 -05001307Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001308{
Jamie Madill96a483b2017-06-27 16:49:21 -04001309 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001310 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001311 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001312 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001313
1314 Query *query = mQueryMap.query(handle);
1315 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001316 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001317 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001318 query = new Query(mImplementation->createQuery(type), handle);
1319 query->addRef();
1320 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001321 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001322 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001323}
1324
Geoff Lang70d0f492015-12-10 17:45:46 -05001325Query *Context::getQuery(GLuint handle) const
1326{
Jamie Madill96a483b2017-06-27 16:49:21 -04001327 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001328}
1329
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001330Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001331{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001332 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1333 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001334}
1335
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001336Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001337{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001338 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001339}
1340
Geoff Lang492a7e42014-11-05 13:27:06 -05001341Compiler *Context::getCompiler() const
1342{
Jamie Madill2f348d22017-06-05 10:50:59 -04001343 if (mCompiler.get() == nullptr)
1344 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001345 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001346 }
1347 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001348}
1349
Jamie Madillc1d770e2017-04-13 17:31:24 -04001350void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001351{
1352 switch (pname)
1353 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001354 case GL_SHADER_COMPILER:
1355 *params = GL_TRUE;
1356 break;
1357 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1358 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1359 break;
1360 default:
1361 mGLState.getBooleanv(pname, params);
1362 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001363 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001364}
1365
Jamie Madillc1d770e2017-04-13 17:31:24 -04001366void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001367{
Shannon Woods53a94a82014-06-24 15:20:36 -04001368 // Queries about context capabilities and maximums are answered by Context.
1369 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001370 switch (pname)
1371 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001372 case GL_ALIASED_LINE_WIDTH_RANGE:
1373 params[0] = mCaps.minAliasedLineWidth;
1374 params[1] = mCaps.maxAliasedLineWidth;
1375 break;
1376 case GL_ALIASED_POINT_SIZE_RANGE:
1377 params[0] = mCaps.minAliasedPointSize;
1378 params[1] = mCaps.maxAliasedPointSize;
1379 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001380 case GL_SMOOTH_POINT_SIZE_RANGE:
1381 params[0] = mCaps.minSmoothPointSize;
1382 params[1] = mCaps.maxSmoothPointSize;
1383 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001384 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1385 ASSERT(mExtensions.textureFilterAnisotropic);
1386 *params = mExtensions.maxTextureAnisotropy;
1387 break;
1388 case GL_MAX_TEXTURE_LOD_BIAS:
1389 *params = mCaps.maxLODBias;
1390 break;
1391
1392 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1393 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1394 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001395 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1396 // GLES1 constants for modelview/projection matrix.
1397 if (getClientVersion() < Version(2, 0))
1398 {
1399 mGLState.getFloatv(pname, params);
1400 }
1401 else
1402 {
1403 ASSERT(mExtensions.pathRendering);
1404 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1405 memcpy(params, m, 16 * sizeof(GLfloat));
1406 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001407 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001408 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001409
Jamie Madill231c7f52017-04-26 13:45:37 -04001410 default:
1411 mGLState.getFloatv(pname, params);
1412 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001413 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001414}
1415
Jamie Madillc1d770e2017-04-13 17:31:24 -04001416void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001417{
Shannon Woods53a94a82014-06-24 15:20:36 -04001418 // Queries about context capabilities and maximums are answered by Context.
1419 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001420
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001421 switch (pname)
1422 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001423 case GL_MAX_VERTEX_ATTRIBS:
1424 *params = mCaps.maxVertexAttributes;
1425 break;
1426 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1427 *params = mCaps.maxVertexUniformVectors;
1428 break;
1429 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001430 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001431 break;
1432 case GL_MAX_VARYING_VECTORS:
1433 *params = mCaps.maxVaryingVectors;
1434 break;
1435 case GL_MAX_VARYING_COMPONENTS:
1436 *params = mCaps.maxVertexOutputComponents;
1437 break;
1438 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1439 *params = mCaps.maxCombinedTextureImageUnits;
1440 break;
1441 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001442 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001443 break;
1444 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001445 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001446 break;
1447 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1448 *params = mCaps.maxFragmentUniformVectors;
1449 break;
1450 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001451 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001452 break;
1453 case GL_MAX_RENDERBUFFER_SIZE:
1454 *params = mCaps.maxRenderbufferSize;
1455 break;
1456 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1457 *params = mCaps.maxColorAttachments;
1458 break;
1459 case GL_MAX_DRAW_BUFFERS_EXT:
1460 *params = mCaps.maxDrawBuffers;
1461 break;
1462 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1463 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1464 case GL_SUBPIXEL_BITS:
1465 *params = 4;
1466 break;
1467 case GL_MAX_TEXTURE_SIZE:
1468 *params = mCaps.max2DTextureSize;
1469 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001470 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1471 *params = mCaps.maxRectangleTextureSize;
1472 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001473 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1474 *params = mCaps.maxCubeMapTextureSize;
1475 break;
1476 case GL_MAX_3D_TEXTURE_SIZE:
1477 *params = mCaps.max3DTextureSize;
1478 break;
1479 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1480 *params = mCaps.maxArrayTextureLayers;
1481 break;
1482 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1483 *params = mCaps.uniformBufferOffsetAlignment;
1484 break;
1485 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1486 *params = mCaps.maxUniformBufferBindings;
1487 break;
1488 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001489 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001490 break;
1491 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001492 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001493 break;
1494 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1495 *params = mCaps.maxCombinedTextureImageUnits;
1496 break;
1497 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1498 *params = mCaps.maxVertexOutputComponents;
1499 break;
1500 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1501 *params = mCaps.maxFragmentInputComponents;
1502 break;
1503 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1504 *params = mCaps.minProgramTexelOffset;
1505 break;
1506 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1507 *params = mCaps.maxProgramTexelOffset;
1508 break;
1509 case GL_MAJOR_VERSION:
1510 *params = getClientVersion().major;
1511 break;
1512 case GL_MINOR_VERSION:
1513 *params = getClientVersion().minor;
1514 break;
1515 case GL_MAX_ELEMENTS_INDICES:
1516 *params = mCaps.maxElementsIndices;
1517 break;
1518 case GL_MAX_ELEMENTS_VERTICES:
1519 *params = mCaps.maxElementsVertices;
1520 break;
1521 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1522 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1523 break;
1524 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1525 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1526 break;
1527 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1528 *params = mCaps.maxTransformFeedbackSeparateComponents;
1529 break;
1530 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1531 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1532 break;
1533 case GL_MAX_SAMPLES_ANGLE:
1534 *params = mCaps.maxSamples;
1535 break;
1536 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001537 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001538 params[0] = mCaps.maxViewportWidth;
1539 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001540 }
1541 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001542 case GL_COMPRESSED_TEXTURE_FORMATS:
1543 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1544 params);
1545 break;
1546 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1547 *params = mResetStrategy;
1548 break;
1549 case GL_NUM_SHADER_BINARY_FORMATS:
1550 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1551 break;
1552 case GL_SHADER_BINARY_FORMATS:
1553 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1554 break;
1555 case GL_NUM_PROGRAM_BINARY_FORMATS:
1556 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1557 break;
1558 case GL_PROGRAM_BINARY_FORMATS:
1559 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1560 break;
1561 case GL_NUM_EXTENSIONS:
1562 *params = static_cast<GLint>(mExtensionStrings.size());
1563 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001564
Jamie Madill231c7f52017-04-26 13:45:37 -04001565 // GL_KHR_debug
1566 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1567 *params = mExtensions.maxDebugMessageLength;
1568 break;
1569 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1570 *params = mExtensions.maxDebugLoggedMessages;
1571 break;
1572 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1573 *params = mExtensions.maxDebugGroupStackDepth;
1574 break;
1575 case GL_MAX_LABEL_LENGTH:
1576 *params = mExtensions.maxLabelLength;
1577 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001578
Martin Radeve5285d22017-07-14 16:23:53 +03001579 // GL_ANGLE_multiview
1580 case GL_MAX_VIEWS_ANGLE:
1581 *params = mExtensions.maxViews;
1582 break;
1583
Jamie Madill231c7f52017-04-26 13:45:37 -04001584 // GL_EXT_disjoint_timer_query
1585 case GL_GPU_DISJOINT_EXT:
1586 *params = mImplementation->getGPUDisjoint();
1587 break;
1588 case GL_MAX_FRAMEBUFFER_WIDTH:
1589 *params = mCaps.maxFramebufferWidth;
1590 break;
1591 case GL_MAX_FRAMEBUFFER_HEIGHT:
1592 *params = mCaps.maxFramebufferHeight;
1593 break;
1594 case GL_MAX_FRAMEBUFFER_SAMPLES:
1595 *params = mCaps.maxFramebufferSamples;
1596 break;
1597 case GL_MAX_SAMPLE_MASK_WORDS:
1598 *params = mCaps.maxSampleMaskWords;
1599 break;
1600 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1601 *params = mCaps.maxColorTextureSamples;
1602 break;
1603 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1604 *params = mCaps.maxDepthTextureSamples;
1605 break;
1606 case GL_MAX_INTEGER_SAMPLES:
1607 *params = mCaps.maxIntegerSamples;
1608 break;
1609 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1610 *params = mCaps.maxVertexAttribRelativeOffset;
1611 break;
1612 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1613 *params = mCaps.maxVertexAttribBindings;
1614 break;
1615 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1616 *params = mCaps.maxVertexAttribStride;
1617 break;
1618 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001619 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001620 break;
1621 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001622 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001623 break;
1624 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001625 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001626 break;
1627 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001628 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001629 break;
1630 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001631 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001632 break;
1633 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001634 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001635 break;
1636 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001637 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001638 break;
1639 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001640 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001641 break;
1642 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1643 *params = mCaps.minProgramTextureGatherOffset;
1644 break;
1645 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1646 *params = mCaps.maxProgramTextureGatherOffset;
1647 break;
1648 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1649 *params = mCaps.maxComputeWorkGroupInvocations;
1650 break;
1651 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001652 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001653 break;
1654 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001655 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001656 break;
1657 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1658 *params = mCaps.maxComputeSharedMemorySize;
1659 break;
1660 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001661 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001662 break;
1663 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001664 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001665 break;
1666 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001667 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001668 break;
1669 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001670 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001671 break;
1672 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001673 *params =
1674 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001675 break;
1676 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001677 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001678 break;
1679 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1680 *params = mCaps.maxCombinedShaderOutputResources;
1681 break;
1682 case GL_MAX_UNIFORM_LOCATIONS:
1683 *params = mCaps.maxUniformLocations;
1684 break;
1685 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1686 *params = mCaps.maxAtomicCounterBufferBindings;
1687 break;
1688 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1689 *params = mCaps.maxAtomicCounterBufferSize;
1690 break;
1691 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1692 *params = mCaps.maxCombinedAtomicCounterBuffers;
1693 break;
1694 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1695 *params = mCaps.maxCombinedAtomicCounters;
1696 break;
1697 case GL_MAX_IMAGE_UNITS:
1698 *params = mCaps.maxImageUnits;
1699 break;
1700 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1701 *params = mCaps.maxCombinedImageUniforms;
1702 break;
1703 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1704 *params = mCaps.maxShaderStorageBufferBindings;
1705 break;
1706 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1707 *params = mCaps.maxCombinedShaderStorageBlocks;
1708 break;
1709 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1710 *params = mCaps.shaderStorageBufferOffsetAlignment;
1711 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001712
1713 // GL_EXT_geometry_shader
1714 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1715 *params = mCaps.maxFramebufferLayers;
1716 break;
1717 case GL_LAYER_PROVOKING_VERTEX_EXT:
1718 *params = mCaps.layerProvokingVertex;
1719 break;
1720 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001721 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001722 break;
1723 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001724 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001725 break;
1726 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001727 *params =
1728 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001729 break;
1730 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1731 *params = mCaps.maxGeometryInputComponents;
1732 break;
1733 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1734 *params = mCaps.maxGeometryOutputComponents;
1735 break;
1736 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1737 *params = mCaps.maxGeometryOutputVertices;
1738 break;
1739 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1740 *params = mCaps.maxGeometryTotalOutputComponents;
1741 break;
1742 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1743 *params = mCaps.maxGeometryShaderInvocations;
1744 break;
1745 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001746 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001747 break;
1748 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001749 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001750 break;
1751 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001752 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001753 break;
1754 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001755 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001756 break;
1757 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001758 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001759 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001760 // GLES1 emulation: Caps queries
1761 case GL_MAX_TEXTURE_UNITS:
1762 *params = mCaps.maxMultitextureUnits;
1763 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001764 case GL_MAX_MODELVIEW_STACK_DEPTH:
1765 *params = mCaps.maxModelviewMatrixStackDepth;
1766 break;
1767 case GL_MAX_PROJECTION_STACK_DEPTH:
1768 *params = mCaps.maxProjectionMatrixStackDepth;
1769 break;
1770 case GL_MAX_TEXTURE_STACK_DEPTH:
1771 *params = mCaps.maxTextureMatrixStackDepth;
1772 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001773 case GL_MAX_LIGHTS:
1774 *params = mCaps.maxLights;
1775 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001776 case GL_MAX_CLIP_PLANES:
1777 *params = mCaps.maxClipPlanes;
1778 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001779 // GLES1 emulation: Vertex attribute queries
1780 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1781 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1782 case GL_COLOR_ARRAY_BUFFER_BINDING:
1783 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1784 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1785 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1786 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1787 break;
1788 case GL_VERTEX_ARRAY_STRIDE:
1789 case GL_NORMAL_ARRAY_STRIDE:
1790 case GL_COLOR_ARRAY_STRIDE:
1791 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1792 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1793 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1794 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1795 break;
1796 case GL_VERTEX_ARRAY_SIZE:
1797 case GL_COLOR_ARRAY_SIZE:
1798 case GL_TEXTURE_COORD_ARRAY_SIZE:
1799 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1800 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1801 break;
1802 case GL_VERTEX_ARRAY_TYPE:
1803 case GL_COLOR_ARRAY_TYPE:
1804 case GL_NORMAL_ARRAY_TYPE:
1805 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1806 case GL_TEXTURE_COORD_ARRAY_TYPE:
1807 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1808 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1809 break;
1810
jchen1082af6202018-06-22 10:59:52 +08001811 // GL_KHR_parallel_shader_compile
1812 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1813 *params = mGLState.getMaxShaderCompilerThreads();
1814 break;
1815
Jamie Madill231c7f52017-04-26 13:45:37 -04001816 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001817 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001818 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001819 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001820}
1821
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001822void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001823{
Shannon Woods53a94a82014-06-24 15:20:36 -04001824 // Queries about context capabilities and maximums are answered by Context.
1825 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001826 switch (pname)
1827 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001828 case GL_MAX_ELEMENT_INDEX:
1829 *params = mCaps.maxElementIndex;
1830 break;
1831 case GL_MAX_UNIFORM_BLOCK_SIZE:
1832 *params = mCaps.maxUniformBlockSize;
1833 break;
1834 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001835 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001836 break;
1837 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001838 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001839 break;
1840 case GL_MAX_SERVER_WAIT_TIMEOUT:
1841 *params = mCaps.maxServerWaitTimeout;
1842 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001843
Jamie Madill231c7f52017-04-26 13:45:37 -04001844 // GL_EXT_disjoint_timer_query
1845 case GL_TIMESTAMP_EXT:
1846 *params = mImplementation->getTimestamp();
1847 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001848
Jamie Madill231c7f52017-04-26 13:45:37 -04001849 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1850 *params = mCaps.maxShaderStorageBlockSize;
1851 break;
1852 default:
1853 UNREACHABLE();
1854 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001855 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001856}
1857
Geoff Lang70d0f492015-12-10 17:45:46 -05001858void Context::getPointerv(GLenum pname, void **params) const
1859{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001860 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001861}
1862
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001863void Context::getPointervRobustANGLERobust(GLenum pname,
1864 GLsizei bufSize,
1865 GLsizei *length,
1866 void **params)
1867{
1868 UNIMPLEMENTED();
1869}
1870
Martin Radev66fb8202016-07-28 11:45:20 +03001871void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001872{
Shannon Woods53a94a82014-06-24 15:20:36 -04001873 // Queries about context capabilities and maximums are answered by Context.
1874 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001875
1876 GLenum nativeType;
1877 unsigned int numParams;
1878 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1879 ASSERT(queryStatus);
1880
1881 if (nativeType == GL_INT)
1882 {
1883 switch (target)
1884 {
1885 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1886 ASSERT(index < 3u);
1887 *data = mCaps.maxComputeWorkGroupCount[index];
1888 break;
1889 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1890 ASSERT(index < 3u);
1891 *data = mCaps.maxComputeWorkGroupSize[index];
1892 break;
1893 default:
1894 mGLState.getIntegeri_v(target, index, data);
1895 }
1896 }
1897 else
1898 {
1899 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1900 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001901}
1902
Brandon Jones59770802018-04-02 13:18:42 -07001903void Context::getIntegeri_vRobust(GLenum target,
1904 GLuint index,
1905 GLsizei bufSize,
1906 GLsizei *length,
1907 GLint *data)
1908{
1909 getIntegeri_v(target, index, data);
1910}
1911
Martin Radev66fb8202016-07-28 11:45:20 +03001912void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001913{
Shannon Woods53a94a82014-06-24 15:20:36 -04001914 // Queries about context capabilities and maximums are answered by Context.
1915 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001916
1917 GLenum nativeType;
1918 unsigned int numParams;
1919 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1920 ASSERT(queryStatus);
1921
1922 if (nativeType == GL_INT_64_ANGLEX)
1923 {
1924 mGLState.getInteger64i_v(target, index, data);
1925 }
1926 else
1927 {
1928 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1929 }
1930}
1931
Brandon Jones59770802018-04-02 13:18:42 -07001932void Context::getInteger64i_vRobust(GLenum target,
1933 GLuint index,
1934 GLsizei bufSize,
1935 GLsizei *length,
1936 GLint64 *data)
1937{
1938 getInteger64i_v(target, index, data);
1939}
1940
Martin Radev66fb8202016-07-28 11:45:20 +03001941void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1942{
1943 // Queries about context capabilities and maximums are answered by Context.
1944 // Queries about current GL state values are answered by State.
1945
1946 GLenum nativeType;
1947 unsigned int numParams;
1948 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1949 ASSERT(queryStatus);
1950
1951 if (nativeType == GL_BOOL)
1952 {
1953 mGLState.getBooleani_v(target, index, data);
1954 }
1955 else
1956 {
1957 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1958 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001959}
1960
Brandon Jones59770802018-04-02 13:18:42 -07001961void Context::getBooleani_vRobust(GLenum target,
1962 GLuint index,
1963 GLsizei bufSize,
1964 GLsizei *length,
1965 GLboolean *data)
1966{
1967 getBooleani_v(target, index, data);
1968}
1969
Corentin Wallez336129f2017-10-17 15:55:40 -04001970void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001971{
1972 Buffer *buffer = mGLState.getTargetBuffer(target);
1973 QueryBufferParameteriv(buffer, pname, params);
1974}
1975
Brandon Jones59770802018-04-02 13:18:42 -07001976void Context::getBufferParameterivRobust(BufferBinding target,
1977 GLenum pname,
1978 GLsizei bufSize,
1979 GLsizei *length,
1980 GLint *params)
1981{
1982 getBufferParameteriv(target, pname, params);
1983}
1984
He Yunchao010e4db2017-03-03 14:22:06 +08001985void Context::getFramebufferAttachmentParameteriv(GLenum target,
1986 GLenum attachment,
1987 GLenum pname,
1988 GLint *params)
1989{
1990 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08001991 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08001992}
1993
Brandon Jones59770802018-04-02 13:18:42 -07001994void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
1995 GLenum attachment,
1996 GLenum pname,
1997 GLsizei bufSize,
1998 GLsizei *length,
1999 GLint *params)
2000{
2001 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2002}
2003
He Yunchao010e4db2017-03-03 14:22:06 +08002004void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2005{
2006 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2007 QueryRenderbufferiv(this, renderbuffer, pname, params);
2008}
2009
Brandon Jones59770802018-04-02 13:18:42 -07002010void Context::getRenderbufferParameterivRobust(GLenum target,
2011 GLenum pname,
2012 GLsizei bufSize,
2013 GLsizei *length,
2014 GLint *params)
2015{
2016 getRenderbufferParameteriv(target, pname, params);
2017}
2018
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002019void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002020{
2021 Texture *texture = getTargetTexture(target);
2022 QueryTexParameterfv(texture, pname, params);
2023}
2024
Brandon Jones59770802018-04-02 13:18:42 -07002025void Context::getTexParameterfvRobust(TextureType target,
2026 GLenum pname,
2027 GLsizei bufSize,
2028 GLsizei *length,
2029 GLfloat *params)
2030{
2031 getTexParameterfv(target, pname, params);
2032}
2033
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002034void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002035{
2036 Texture *texture = getTargetTexture(target);
2037 QueryTexParameteriv(texture, pname, params);
2038}
Jiajia Qin5451d532017-11-16 17:16:34 +08002039
Brandon Jones59770802018-04-02 13:18:42 -07002040void Context::getTexParameterivRobust(TextureType target,
2041 GLenum pname,
2042 GLsizei bufSize,
2043 GLsizei *length,
2044 GLint *params)
2045{
2046 getTexParameteriv(target, pname, params);
2047}
2048
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002049void Context::getTexParameterIivRobust(TextureType target,
2050 GLenum pname,
2051 GLsizei bufSize,
2052 GLsizei *length,
2053 GLint *params)
2054{
2055 UNIMPLEMENTED();
2056}
2057
2058void Context::getTexParameterIuivRobust(TextureType target,
2059 GLenum pname,
2060 GLsizei bufSize,
2061 GLsizei *length,
2062 GLuint *params)
2063{
2064 UNIMPLEMENTED();
2065}
2066
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002067void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002068{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002069 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002070 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002071}
2072
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002073void Context::getTexLevelParameterivRobust(TextureTarget target,
2074 GLint level,
2075 GLenum pname,
2076 GLsizei bufSize,
2077 GLsizei *length,
2078 GLint *params)
2079{
2080 UNIMPLEMENTED();
2081}
2082
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002083void Context::getTexLevelParameterfv(TextureTarget target,
2084 GLint level,
2085 GLenum pname,
2086 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002087{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002088 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002089 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002090}
2091
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002092void Context::getTexLevelParameterfvRobust(TextureTarget target,
2093 GLint level,
2094 GLenum pname,
2095 GLsizei bufSize,
2096 GLsizei *length,
2097 GLfloat *params)
2098{
2099 UNIMPLEMENTED();
2100}
2101
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002102void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002103{
2104 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002105 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002106 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002107}
2108
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002109void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002110{
2111 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002112 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002113 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002114}
2115
Brandon Jones59770802018-04-02 13:18:42 -07002116void Context::texParameterfvRobust(TextureType target,
2117 GLenum pname,
2118 GLsizei bufSize,
2119 const GLfloat *params)
2120{
2121 texParameterfv(target, pname, params);
2122}
2123
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002124void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002125{
2126 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002127 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002128 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002129}
2130
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002131void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002132{
2133 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002134 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002135 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002136}
2137
Brandon Jones59770802018-04-02 13:18:42 -07002138void Context::texParameterivRobust(TextureType target,
2139 GLenum pname,
2140 GLsizei bufSize,
2141 const GLint *params)
2142{
2143 texParameteriv(target, pname, params);
2144}
2145
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002146void Context::texParameterIivRobust(TextureType target,
2147 GLenum pname,
2148 GLsizei bufSize,
2149 const GLint *params)
2150{
2151 UNIMPLEMENTED();
2152}
2153
2154void Context::texParameterIuivRobust(TextureType target,
2155 GLenum pname,
2156 GLsizei bufSize,
2157 const GLuint *params)
2158{
2159 UNIMPLEMENTED();
2160}
2161
Jamie Madill493f9572018-05-24 19:52:15 -04002162void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002163{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002164 // No-op if count draws no primitives for given mode
2165 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002166 {
2167 return;
2168 }
2169
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002170 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002171 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002172 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002173}
2174
Jamie Madill493f9572018-05-24 19:52:15 -04002175void Context::drawArraysInstanced(PrimitiveMode mode,
2176 GLint first,
2177 GLsizei count,
2178 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002179{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002180 // No-op if count draws no primitives for given mode
2181 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002182 {
2183 return;
2184 }
2185
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002186 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002187 ANGLE_CONTEXT_TRY(
2188 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002189 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2190 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002191}
2192
Jamie Madill493f9572018-05-24 19:52:15 -04002193void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002194{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002195 // No-op if count draws no primitives for given mode
2196 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002197 {
2198 return;
2199 }
2200
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002201 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002202 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002203}
2204
Jamie Madill493f9572018-05-24 19:52:15 -04002205void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002206 GLsizei count,
2207 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002208 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002209 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002210{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002211 // No-op if count draws no primitives for given mode
2212 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002213 {
2214 return;
2215 }
2216
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002217 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002218 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002219 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002220}
2221
Jamie Madill493f9572018-05-24 19:52:15 -04002222void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002223 GLuint start,
2224 GLuint end,
2225 GLsizei count,
2226 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002227 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002228{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002229 // No-op if count draws no primitives for given mode
2230 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002231 {
2232 return;
2233 }
2234
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002235 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002236 ANGLE_CONTEXT_TRY(
2237 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002238}
2239
Jamie Madill493f9572018-05-24 19:52:15 -04002240void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002241{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002242 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002243 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002244}
2245
Jamie Madill493f9572018-05-24 19:52:15 -04002246void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002247{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002248 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002249 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002250}
2251
Jamie Madill675fe712016-12-19 13:07:54 -05002252void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002253{
Jamie Madillafa02a22017-11-23 12:57:38 -05002254 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002255}
2256
Jamie Madill675fe712016-12-19 13:07:54 -05002257void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002258{
Jamie Madillafa02a22017-11-23 12:57:38 -05002259 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002260}
2261
Austin Kinross6ee1e782015-05-29 17:05:37 -07002262void Context::insertEventMarker(GLsizei length, const char *marker)
2263{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002264 ASSERT(mImplementation);
2265 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002266}
2267
2268void Context::pushGroupMarker(GLsizei length, const char *marker)
2269{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002270 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002271
2272 if (marker == nullptr)
2273 {
2274 // From the EXT_debug_marker spec,
2275 // "If <marker> is null then an empty string is pushed on the stack."
2276 mImplementation->pushGroupMarker(length, "");
2277 }
2278 else
2279 {
2280 mImplementation->pushGroupMarker(length, marker);
2281 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002282}
2283
2284void Context::popGroupMarker()
2285{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002286 ASSERT(mImplementation);
2287 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002288}
2289
Geoff Langd8605522016-04-13 10:19:12 -04002290void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2291{
2292 Program *programObject = getProgram(program);
2293 ASSERT(programObject);
2294
2295 programObject->bindUniformLocation(location, name);
2296}
2297
Brandon Jones59770802018-04-02 13:18:42 -07002298void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002299{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002300 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002301}
2302
Brandon Jones59770802018-04-02 13:18:42 -07002303void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002304{
2305 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2306}
2307
Brandon Jones59770802018-04-02 13:18:42 -07002308void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002309{
2310 GLfloat I[16];
2311 angle::Matrix<GLfloat>::setToIdentity(I);
2312
2313 mGLState.loadPathRenderingMatrix(matrixMode, I);
2314}
2315
2316void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2317{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002318 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002319 if (!pathObj)
2320 return;
2321
Geoff Lang9bf86f02018-07-26 11:46:34 -04002322 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002323
2324 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2325}
2326
2327void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2328{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002329 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002330 if (!pathObj)
2331 return;
2332
Geoff Lang9bf86f02018-07-26 11:46:34 -04002333 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002334
2335 mImplementation->stencilStrokePath(pathObj, reference, mask);
2336}
2337
2338void Context::coverFillPath(GLuint path, GLenum coverMode)
2339{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002340 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002341 if (!pathObj)
2342 return;
2343
Geoff Lang9bf86f02018-07-26 11:46:34 -04002344 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002345
2346 mImplementation->coverFillPath(pathObj, coverMode);
2347}
2348
2349void Context::coverStrokePath(GLuint path, GLenum coverMode)
2350{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002351 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002352 if (!pathObj)
2353 return;
2354
Geoff Lang9bf86f02018-07-26 11:46:34 -04002355 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002356
2357 mImplementation->coverStrokePath(pathObj, coverMode);
2358}
2359
2360void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2361{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002362 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002363 if (!pathObj)
2364 return;
2365
Geoff Lang9bf86f02018-07-26 11:46:34 -04002366 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002367
2368 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2369}
2370
2371void Context::stencilThenCoverStrokePath(GLuint path,
2372 GLint reference,
2373 GLuint mask,
2374 GLenum coverMode)
2375{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002376 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002377 if (!pathObj)
2378 return;
2379
Geoff Lang9bf86f02018-07-26 11:46:34 -04002380 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002381
2382 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2383}
2384
Sami Väisänend59ca052016-06-21 16:10:00 +03002385void Context::coverFillPathInstanced(GLsizei numPaths,
2386 GLenum pathNameType,
2387 const void *paths,
2388 GLuint pathBase,
2389 GLenum coverMode,
2390 GLenum transformType,
2391 const GLfloat *transformValues)
2392{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002393 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002394
Geoff Lang9bf86f02018-07-26 11:46:34 -04002395 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002396
2397 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2398}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002399
Sami Väisänend59ca052016-06-21 16:10:00 +03002400void Context::coverStrokePathInstanced(GLsizei numPaths,
2401 GLenum pathNameType,
2402 const void *paths,
2403 GLuint pathBase,
2404 GLenum coverMode,
2405 GLenum transformType,
2406 const GLfloat *transformValues)
2407{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002408 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002409
2410 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002411 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002412
2413 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2414 transformValues);
2415}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002416
Sami Väisänend59ca052016-06-21 16:10:00 +03002417void Context::stencilFillPathInstanced(GLsizei numPaths,
2418 GLenum pathNameType,
2419 const void *paths,
2420 GLuint pathBase,
2421 GLenum fillMode,
2422 GLuint mask,
2423 GLenum transformType,
2424 const GLfloat *transformValues)
2425{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002426 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002427
2428 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002429 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002430
2431 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2432 transformValues);
2433}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002434
Sami Väisänend59ca052016-06-21 16:10:00 +03002435void Context::stencilStrokePathInstanced(GLsizei numPaths,
2436 GLenum pathNameType,
2437 const void *paths,
2438 GLuint pathBase,
2439 GLint reference,
2440 GLuint mask,
2441 GLenum transformType,
2442 const GLfloat *transformValues)
2443{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002444 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002445
Geoff Lang9bf86f02018-07-26 11:46:34 -04002446 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002447
2448 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2449 transformValues);
2450}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002451
Sami Väisänend59ca052016-06-21 16:10:00 +03002452void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2453 GLenum pathNameType,
2454 const void *paths,
2455 GLuint pathBase,
2456 GLenum fillMode,
2457 GLuint mask,
2458 GLenum coverMode,
2459 GLenum transformType,
2460 const GLfloat *transformValues)
2461{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002462 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002463
Geoff Lang9bf86f02018-07-26 11:46:34 -04002464 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002465
2466 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2467 transformType, transformValues);
2468}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002469
Sami Väisänend59ca052016-06-21 16:10:00 +03002470void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2471 GLenum pathNameType,
2472 const void *paths,
2473 GLuint pathBase,
2474 GLint reference,
2475 GLuint mask,
2476 GLenum coverMode,
2477 GLenum transformType,
2478 const GLfloat *transformValues)
2479{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002480 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002481
Geoff Lang9bf86f02018-07-26 11:46:34 -04002482 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002483
2484 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2485 transformType, transformValues);
2486}
2487
Sami Väisänen46eaa942016-06-29 10:26:37 +03002488void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2489{
2490 auto *programObject = getProgram(program);
2491
2492 programObject->bindFragmentInputLocation(location, name);
2493}
2494
2495void Context::programPathFragmentInputGen(GLuint program,
2496 GLint location,
2497 GLenum genMode,
2498 GLint components,
2499 const GLfloat *coeffs)
2500{
2501 auto *programObject = getProgram(program);
2502
Jamie Madillbd044ed2017-06-05 12:59:21 -04002503 programObject->pathFragmentInputGen(this, location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002504}
2505
jchen1015015f72017-03-16 13:54:21 +08002506GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2507{
jchen10fd7c3b52017-03-21 15:36:03 +08002508 const auto *programObject = getProgram(program);
jchen1015015f72017-03-16 13:54:21 +08002509 return QueryProgramResourceIndex(programObject, programInterface, name);
2510}
2511
jchen10fd7c3b52017-03-21 15:36:03 +08002512void Context::getProgramResourceName(GLuint program,
2513 GLenum programInterface,
2514 GLuint index,
2515 GLsizei bufSize,
2516 GLsizei *length,
2517 GLchar *name)
2518{
2519 const auto *programObject = getProgram(program);
2520 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2521}
2522
jchen10191381f2017-04-11 13:59:04 +08002523GLint Context::getProgramResourceLocation(GLuint program,
2524 GLenum programInterface,
2525 const GLchar *name)
2526{
2527 const auto *programObject = getProgram(program);
2528 return QueryProgramResourceLocation(programObject, programInterface, name);
2529}
2530
jchen10880683b2017-04-12 16:21:55 +08002531void Context::getProgramResourceiv(GLuint program,
2532 GLenum programInterface,
2533 GLuint index,
2534 GLsizei propCount,
2535 const GLenum *props,
2536 GLsizei bufSize,
2537 GLsizei *length,
2538 GLint *params)
2539{
2540 const auto *programObject = getProgram(program);
2541 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2542 length, params);
2543}
2544
jchen10d9cd7b72017-08-30 15:04:25 +08002545void Context::getProgramInterfaceiv(GLuint program,
2546 GLenum programInterface,
2547 GLenum pname,
2548 GLint *params)
2549{
2550 const auto *programObject = getProgram(program);
2551 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2552}
2553
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002554void Context::getProgramInterfaceivRobust(GLuint program,
2555 GLenum programInterface,
2556 GLenum pname,
2557 GLsizei bufSize,
2558 GLsizei *length,
2559 GLint *params)
2560{
2561 UNIMPLEMENTED();
2562}
2563
Jamie Madill306b6c12018-07-27 08:12:49 -04002564void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002565{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002566 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002567}
2568
2569// Get one of the recorded errors and clear its flag, if any.
2570// [OpenGL ES 2.0.24] section 2.5 page 13.
2571GLenum Context::getError()
2572{
Geoff Langda5777c2014-07-11 09:52:58 -04002573 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002574 {
Geoff Langda5777c2014-07-11 09:52:58 -04002575 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002576 }
Geoff Langda5777c2014-07-11 09:52:58 -04002577 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002578 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002579 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002580 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002581}
2582
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002583// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002584void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002585{
2586 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002587 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002588 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002589 mContextLostForced = true;
2590 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002591 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002592}
2593
Jamie Madill427064d2018-04-13 16:20:34 -04002594bool Context::isContextLost() const
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002595{
2596 return mContextLost;
2597}
2598
Jamie Madillfa920eb2018-01-04 11:45:50 -05002599GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002600{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002601 // Even if the application doesn't want to know about resets, we want to know
2602 // as it will allow us to skip all the calls.
2603 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002604 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002605 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002606 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002607 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002608 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002609
2610 // EXT_robustness, section 2.6: If the reset notification behavior is
2611 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2612 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2613 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002614 }
2615
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002616 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2617 // status should be returned at least once, and GL_NO_ERROR should be returned
2618 // once the device has finished resetting.
2619 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002620 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002621 ASSERT(mResetStatus == GL_NO_ERROR);
2622 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002623
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002624 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002625 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002626 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002627 }
2628 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002629 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002630 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002631 // If markContextLost was used to mark the context lost then
2632 // assume that is not recoverable, and continue to report the
2633 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002634 mResetStatus = mImplementation->getResetStatus();
2635 }
Jamie Madill893ab082014-05-16 16:56:10 -04002636
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002637 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002638}
2639
2640bool Context::isResetNotificationEnabled()
2641{
2642 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2643}
2644
Corentin Walleze3b10e82015-05-20 11:06:25 -04002645const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002646{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002647 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002648}
2649
2650EGLenum Context::getClientType() const
2651{
2652 return mClientType;
2653}
2654
2655EGLenum Context::getRenderBuffer() const
2656{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002657 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2658 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002659 {
2660 return EGL_NONE;
2661 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002662
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002663 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002664 ASSERT(backAttachment != nullptr);
2665 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002666}
2667
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002668VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002669{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002670 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002671 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2672 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002673 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002674 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2675 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002676
Jamie Madill96a483b2017-06-27 16:49:21 -04002677 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002678 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002679
2680 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002681}
2682
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002683TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002684{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002685 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002686 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2687 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002688 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002689 transformFeedback =
2690 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002691 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002692 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002693 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002694
2695 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002696}
2697
2698bool Context::isVertexArrayGenerated(GLuint vertexArray)
2699{
Jamie Madill96a483b2017-06-27 16:49:21 -04002700 ASSERT(mVertexArrayMap.contains(0));
2701 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002702}
2703
2704bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2705{
Jamie Madill96a483b2017-06-27 16:49:21 -04002706 ASSERT(mTransformFeedbackMap.contains(0));
2707 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002708}
2709
Shannon Woods53a94a82014-06-24 15:20:36 -04002710void Context::detachTexture(GLuint texture)
2711{
2712 // Simple pass-through to State's detachTexture method, as textures do not require
2713 // allocation map management either here or in the resource manager at detach time.
2714 // Zero textures are held by the Context, and we don't attempt to request them from
2715 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002716 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002717}
2718
James Darpinian4d9d4832018-03-13 12:43:28 -07002719void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002720{
Yuly Novikov5807a532015-12-03 13:01:22 -05002721 // Simple pass-through to State's detachBuffer method, since
2722 // only buffer attachments to container objects that are bound to the current context
2723 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002724
Yuly Novikov5807a532015-12-03 13:01:22 -05002725 // [OpenGL ES 3.2] section 5.1.2 page 45:
2726 // Attachments to unbound container objects, such as
2727 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2728 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002729 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002730}
2731
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002732void Context::detachFramebuffer(GLuint framebuffer)
2733{
Shannon Woods53a94a82014-06-24 15:20:36 -04002734 // Framebuffer detachment is handled by Context, because 0 is a valid
2735 // Framebuffer object, and a pointer to it must be passed from Context
2736 // to State at binding time.
2737
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002738 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002739 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2740 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2741 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002742
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002743 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002744 {
2745 bindReadFramebuffer(0);
2746 }
2747
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002748 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002749 {
2750 bindDrawFramebuffer(0);
2751 }
2752}
2753
2754void Context::detachRenderbuffer(GLuint renderbuffer)
2755{
Jamie Madilla02315b2017-02-23 14:14:47 -05002756 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002757}
2758
Jamie Madill57a89722013-07-02 11:57:03 -04002759void Context::detachVertexArray(GLuint vertexArray)
2760{
Jamie Madill77a72f62015-04-14 11:18:32 -04002761 // Vertex array detachment is handled by Context, because 0 is a valid
2762 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002763 // binding time.
2764
Jamie Madill57a89722013-07-02 11:57:03 -04002765 // [OpenGL ES 3.0.2] section 2.10 page 43:
2766 // If a vertex array object that is currently bound is deleted, the binding
2767 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002768 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002769 {
2770 bindVertexArray(0);
2771 }
2772}
2773
Geoff Langc8058452014-02-03 12:04:11 -05002774void Context::detachTransformFeedback(GLuint transformFeedback)
2775{
Corentin Walleza2257da2016-04-19 16:43:12 -04002776 // Transform feedback detachment is handled by Context, because 0 is a valid
2777 // transform feedback, and a pointer to it must be passed from Context to State at
2778 // binding time.
2779
2780 // The OpenGL specification doesn't mention what should happen when the currently bound
2781 // transform feedback object is deleted. Since it is a container object, we treat it like
2782 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002783 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002784 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002785 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002786 }
Geoff Langc8058452014-02-03 12:04:11 -05002787}
2788
Jamie Madilldc356042013-07-19 16:36:57 -04002789void Context::detachSampler(GLuint sampler)
2790{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002791 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002792}
2793
Yunchao Hea336b902017-08-02 16:05:21 +08002794void Context::detachProgramPipeline(GLuint pipeline)
2795{
2796 mGLState.detachProgramPipeline(this, pipeline);
2797}
2798
Jamie Madill3ef140a2017-08-26 23:11:21 -04002799void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002800{
Shaodde78e82017-05-22 14:13:27 +08002801 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002802 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002803}
2804
Jamie Madille29d1672013-07-19 16:36:57 -04002805void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2806{
Geoff Langc1984ed2016-10-07 12:41:00 -04002807 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002808 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002809 SetSamplerParameteri(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002810 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002811}
Jamie Madille29d1672013-07-19 16:36:57 -04002812
Geoff Langc1984ed2016-10-07 12:41:00 -04002813void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2814{
2815 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002816 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002817 SetSamplerParameteriv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002818 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002819}
2820
Brandon Jones59770802018-04-02 13:18:42 -07002821void Context::samplerParameterivRobust(GLuint sampler,
2822 GLenum pname,
2823 GLsizei bufSize,
2824 const GLint *param)
2825{
2826 samplerParameteriv(sampler, pname, param);
2827}
2828
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002829void Context::samplerParameterIivRobust(GLuint sampler,
2830 GLenum pname,
2831 GLsizei bufSize,
2832 const GLint *param)
2833{
2834 UNIMPLEMENTED();
2835}
2836
2837void Context::samplerParameterIuivRobust(GLuint sampler,
2838 GLenum pname,
2839 GLsizei bufSize,
2840 const GLuint *param)
2841{
2842 UNIMPLEMENTED();
2843}
2844
Jamie Madille29d1672013-07-19 16:36:57 -04002845void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2846{
Geoff Langc1984ed2016-10-07 12:41:00 -04002847 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002848 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002849 SetSamplerParameterf(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002850 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002851}
2852
Geoff Langc1984ed2016-10-07 12:41:00 -04002853void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002854{
Geoff Langc1984ed2016-10-07 12:41:00 -04002855 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002856 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002857 SetSamplerParameterfv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002858 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002859}
2860
Brandon Jones59770802018-04-02 13:18:42 -07002861void Context::samplerParameterfvRobust(GLuint sampler,
2862 GLenum pname,
2863 GLsizei bufSize,
2864 const GLfloat *param)
2865{
2866 samplerParameterfv(sampler, pname, param);
2867}
2868
Geoff Langc1984ed2016-10-07 12:41:00 -04002869void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002870{
Geoff Langc1984ed2016-10-07 12:41:00 -04002871 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002872 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002873 QuerySamplerParameteriv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002874 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002875}
Jamie Madill9675b802013-07-19 16:36:59 -04002876
Brandon Jones59770802018-04-02 13:18:42 -07002877void Context::getSamplerParameterivRobust(GLuint sampler,
2878 GLenum pname,
2879 GLsizei bufSize,
2880 GLsizei *length,
2881 GLint *params)
2882{
2883 getSamplerParameteriv(sampler, pname, params);
2884}
2885
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002886void Context::getSamplerParameterIivRobust(GLuint sampler,
2887 GLenum pname,
2888 GLsizei bufSize,
2889 GLsizei *length,
2890 GLint *params)
2891{
2892 UNIMPLEMENTED();
2893}
2894
2895void Context::getSamplerParameterIuivRobust(GLuint sampler,
2896 GLenum pname,
2897 GLsizei bufSize,
2898 GLsizei *length,
2899 GLuint *params)
2900{
2901 UNIMPLEMENTED();
2902}
2903
Geoff Langc1984ed2016-10-07 12:41:00 -04002904void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2905{
2906 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002907 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002908 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002909 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002910}
2911
Brandon Jones59770802018-04-02 13:18:42 -07002912void Context::getSamplerParameterfvRobust(GLuint sampler,
2913 GLenum pname,
2914 GLsizei bufSize,
2915 GLsizei *length,
2916 GLfloat *params)
2917{
2918 getSamplerParameterfv(sampler, pname, params);
2919}
2920
Olli Etuahof0fee072016-03-30 15:11:58 +03002921void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2922{
2923 gl::Program *programObject = getProgram(program);
Yunchao He61afff12017-03-14 15:34:03 +08002924 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002925}
2926
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002927void Context::initRendererString()
2928{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002929 std::ostringstream rendererString;
2930 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002931 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002932 rendererString << ")";
2933
Geoff Langcec35902014-04-16 10:52:36 -04002934 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002935}
2936
Geoff Langc339c4e2016-11-29 10:37:36 -05002937void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002938{
Geoff Langc339c4e2016-11-29 10:37:36 -05002939 const Version &clientVersion = getClientVersion();
2940
2941 std::ostringstream versionString;
2942 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2943 << ANGLE_VERSION_STRING << ")";
2944 mVersionString = MakeStaticString(versionString.str());
2945
2946 std::ostringstream shadingLanguageVersionString;
2947 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2948 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2949 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
2950 << ")";
2951 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002952}
2953
Geoff Langcec35902014-04-16 10:52:36 -04002954void Context::initExtensionStrings()
2955{
Geoff Langc339c4e2016-11-29 10:37:36 -05002956 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
2957 std::ostringstream combinedStringStream;
2958 std::copy(strings.begin(), strings.end(),
2959 std::ostream_iterator<const char *>(combinedStringStream, " "));
2960 return MakeStaticString(combinedStringStream.str());
2961 };
2962
2963 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002964 for (const auto &extensionString : mExtensions.getStrings())
2965 {
2966 mExtensionStrings.push_back(MakeStaticString(extensionString));
2967 }
Geoff Langc339c4e2016-11-29 10:37:36 -05002968 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002969
Geoff Langc339c4e2016-11-29 10:37:36 -05002970 mRequestableExtensionStrings.clear();
2971 for (const auto &extensionInfo : GetExtensionInfoMap())
2972 {
2973 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08002974 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05002975 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05002976 {
2977 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
2978 }
2979 }
2980 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002981}
2982
Geoff Langc339c4e2016-11-29 10:37:36 -05002983const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04002984{
Geoff Langc339c4e2016-11-29 10:37:36 -05002985 switch (name)
2986 {
2987 case GL_VENDOR:
2988 return reinterpret_cast<const GLubyte *>("Google Inc.");
2989
2990 case GL_RENDERER:
2991 return reinterpret_cast<const GLubyte *>(mRendererString);
2992
2993 case GL_VERSION:
2994 return reinterpret_cast<const GLubyte *>(mVersionString);
2995
2996 case GL_SHADING_LANGUAGE_VERSION:
2997 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
2998
2999 case GL_EXTENSIONS:
3000 return reinterpret_cast<const GLubyte *>(mExtensionString);
3001
3002 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3003 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3004
3005 default:
3006 UNREACHABLE();
3007 return nullptr;
3008 }
Geoff Langcec35902014-04-16 10:52:36 -04003009}
3010
Geoff Langc339c4e2016-11-29 10:37:36 -05003011const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003012{
Geoff Langc339c4e2016-11-29 10:37:36 -05003013 switch (name)
3014 {
3015 case GL_EXTENSIONS:
3016 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3017
3018 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3019 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3020
3021 default:
3022 UNREACHABLE();
3023 return nullptr;
3024 }
Geoff Langcec35902014-04-16 10:52:36 -04003025}
3026
3027size_t Context::getExtensionStringCount() const
3028{
3029 return mExtensionStrings.size();
3030}
3031
Geoff Lang111a99e2017-10-17 10:58:41 -04003032bool Context::isExtensionRequestable(const char *name)
3033{
3034 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3035 auto extension = extensionInfos.find(name);
3036
Geoff Lang111a99e2017-10-17 10:58:41 -04003037 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003038 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003039}
3040
Geoff Langc339c4e2016-11-29 10:37:36 -05003041void Context::requestExtension(const char *name)
3042{
3043 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3044 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3045 const auto &extension = extensionInfos.at(name);
3046 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003047 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003048
3049 if (mExtensions.*(extension.ExtensionsMember))
3050 {
3051 // Extension already enabled
3052 return;
3053 }
3054
3055 mExtensions.*(extension.ExtensionsMember) = true;
3056 updateCaps();
3057 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003058
Jamie Madill2f348d22017-06-05 10:50:59 -04003059 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3060 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003061
Jamie Madill81c2e252017-09-09 23:32:46 -04003062 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3063 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003064 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003065 for (auto &zeroTexture : mZeroTextures)
3066 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003067 if (zeroTexture.get() != nullptr)
3068 {
3069 zeroTexture->signalDirty(this, InitState::Initialized);
3070 }
Geoff Lang9aded172017-04-05 11:07:56 -04003071 }
3072
Jamie Madillb983a4b2018-08-01 11:34:51 -04003073 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003074}
3075
3076size_t Context::getRequestableExtensionStringCount() const
3077{
3078 return mRequestableExtensionStrings.size();
3079}
3080
Jamie Madill493f9572018-05-24 19:52:15 -04003081void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003082{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003083 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003084 ASSERT(transformFeedback != nullptr);
3085 ASSERT(!transformFeedback->isPaused());
3086
Jamie Madill6c1f6712017-02-14 19:08:04 -05003087 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003088}
3089
3090bool Context::hasActiveTransformFeedback(GLuint program) const
3091{
3092 for (auto pair : mTransformFeedbackMap)
3093 {
3094 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3095 {
3096 return true;
3097 }
3098 }
3099 return false;
3100}
3101
Geoff Lang33f11fb2018-05-07 13:42:47 -04003102Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003103{
3104 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3105
jchen1082af6202018-06-22 10:59:52 +08003106 // Explicitly enable GL_KHR_parallel_shader_compile
3107 supportedExtensions.parallelShaderCompile = true;
3108
Geoff Langb0f917f2017-12-05 13:41:54 -05003109 if (getClientVersion() < ES_2_0)
3110 {
3111 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003112 supportedExtensions.pointSizeArray = true;
3113 supportedExtensions.textureCubeMap = true;
3114 supportedExtensions.pointSprite = true;
3115 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003116 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003117 }
3118
3119 if (getClientVersion() < ES_3_0)
3120 {
3121 // Disable ES3+ extensions
3122 supportedExtensions.colorBufferFloat = false;
3123 supportedExtensions.eglImageExternalEssl3 = false;
3124 supportedExtensions.textureNorm16 = false;
3125 supportedExtensions.multiview = false;
3126 supportedExtensions.maxViews = 1u;
3127 }
3128
3129 if (getClientVersion() < ES_3_1)
3130 {
3131 // Disable ES3.1+ extensions
3132 supportedExtensions.geometryShader = false;
3133 }
3134
3135 if (getClientVersion() > ES_2_0)
3136 {
3137 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3138 // supportedExtensions.sRGB = false;
3139 }
3140
3141 // Some extensions are always available because they are implemented in the GL layer.
3142 supportedExtensions.bindUniformLocation = true;
3143 supportedExtensions.vertexArrayObject = true;
3144 supportedExtensions.bindGeneratesResource = true;
3145 supportedExtensions.clientArrays = true;
3146 supportedExtensions.requestExtension = true;
3147
3148 // Enable the no error extension if the context was created with the flag.
3149 supportedExtensions.noError = mSkipValidation;
3150
3151 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003152 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003153
3154 // Explicitly enable GL_KHR_debug
3155 supportedExtensions.debug = true;
3156 supportedExtensions.maxDebugMessageLength = 1024;
3157 supportedExtensions.maxDebugLoggedMessages = 1024;
3158 supportedExtensions.maxDebugGroupStackDepth = 1024;
3159 supportedExtensions.maxLabelLength = 1024;
3160
3161 // Explicitly enable GL_ANGLE_robust_client_memory
3162 supportedExtensions.robustClientMemory = true;
3163
3164 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003165 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003166
3167 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3168 // supports it.
3169 supportedExtensions.robustBufferAccessBehavior =
3170 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3171
3172 // Enable the cache control query unconditionally.
3173 supportedExtensions.programCacheControl = true;
3174
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003175 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003176 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003177 {
3178 // GL_ANGLE_explicit_context_gles1
3179 supportedExtensions.explicitContextGles1 = true;
3180 // GL_ANGLE_explicit_context
3181 supportedExtensions.explicitContext = true;
3182 }
3183
Geoff Langb0f917f2017-12-05 13:41:54 -05003184 return supportedExtensions;
3185}
3186
Geoff Lang33f11fb2018-05-07 13:42:47 -04003187void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003188{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003189 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003190
Geoff Lang33f11fb2018-05-07 13:42:47 -04003191 mSupportedExtensions = generateSupportedExtensions();
3192 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003193
3194 mLimitations = mImplementation->getNativeLimitations();
3195
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003196 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3197 if (getClientVersion() < Version(2, 0))
3198 {
3199 mCaps.maxMultitextureUnits = 4;
3200 mCaps.maxClipPlanes = 6;
3201 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003202 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3203 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3204 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003205 mCaps.minSmoothPointSize = 1.0f;
3206 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003207 }
3208
Luc Ferronad2ae932018-06-11 15:31:17 -04003209 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003210 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003211
Luc Ferronad2ae932018-06-11 15:31:17 -04003212 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3213
Jamie Madill0f80ed82017-09-19 00:24:56 -04003214 if (getClientVersion() < ES_3_1)
3215 {
3216 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3217 }
3218 else
3219 {
3220 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3221 }
Geoff Lang301d1612014-07-09 10:34:37 -04003222
Jiawei Shao54aafe52018-04-27 14:54:57 +08003223 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3224 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill0f80ed82017-09-19 00:24:56 -04003225 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3226 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3227
3228 // Limit textures as well, so we can use fast bitsets with texture bindings.
3229 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003230 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3231 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3232 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3233 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003234
Jiawei Shaodb342272017-09-27 10:21:45 +08003235 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3236
Geoff Langc287ea62016-09-16 14:46:51 -04003237 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003238 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003239 for (const auto &extensionInfo : GetExtensionInfoMap())
3240 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003241 // If the user has requested that extensions start disabled and they are requestable,
3242 // disable them.
3243 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003244 {
3245 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3246 }
3247 }
3248
3249 // Generate texture caps
3250 updateCaps();
3251}
3252
3253void Context::updateCaps()
3254{
Geoff Lang900013c2014-07-07 11:32:19 -04003255 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003256 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003257
Jamie Madill7b62cf92017-11-02 15:20:49 -04003258 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003259 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003260 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003261 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003262
Geoff Lang0d8b7242015-09-09 14:56:53 -04003263 // Update the format caps based on the client version and extensions.
3264 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3265 // ES3.
3266 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003267 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003268 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003269 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003270 formatCaps.textureAttachment =
3271 formatCaps.textureAttachment &&
3272 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3273 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3274 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003275
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003276 // OpenGL ES does not support multisampling with non-rendererable formats
3277 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003278 if (!formatCaps.renderbuffer ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003279 (getClientVersion() < ES_3_1 &&
3280 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003281 {
Geoff Langd87878e2014-09-19 15:42:59 -04003282 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003283 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003284 else
3285 {
3286 // We may have limited the max samples for some required renderbuffer formats due to
3287 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3288 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3289
3290 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3291 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3292 // exception of signed and unsigned integer formats."
3293 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3294 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3295 {
3296 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3297 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3298 }
3299
3300 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3301 if (getClientVersion() >= ES_3_1)
3302 {
3303 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3304 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3305 // the exception that the signed and unsigned integer formats are required only to
3306 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3307 // multisamples, which must be at least one."
3308 if (formatInfo.componentType == GL_INT ||
3309 formatInfo.componentType == GL_UNSIGNED_INT)
3310 {
3311 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3312 }
3313
3314 // GLES 3.1 section 19.3.1.
3315 if (formatCaps.texturable)
3316 {
3317 if (formatInfo.depthBits > 0)
3318 {
3319 mCaps.maxDepthTextureSamples =
3320 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3321 }
3322 else if (formatInfo.redBits > 0)
3323 {
3324 mCaps.maxColorTextureSamples =
3325 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3326 }
3327 }
3328 }
3329 }
Geoff Langd87878e2014-09-19 15:42:59 -04003330
3331 if (formatCaps.texturable && formatInfo.compressed)
3332 {
Geoff Langca271392017-04-05 12:30:00 -04003333 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003334 }
3335
Geoff Langca271392017-04-05 12:30:00 -04003336 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003337 }
Jamie Madill32447362017-06-28 14:53:52 -04003338
3339 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003340 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003341 {
3342 mMemoryProgramCache = nullptr;
3343 }
Corentin Walleze4477002017-12-01 14:39:58 -05003344
3345 // Compute which buffer types are allowed
3346 mValidBufferBindings.reset();
3347 mValidBufferBindings.set(BufferBinding::ElementArray);
3348 mValidBufferBindings.set(BufferBinding::Array);
3349
3350 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3351 {
3352 mValidBufferBindings.set(BufferBinding::PixelPack);
3353 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3354 }
3355
3356 if (getClientVersion() >= ES_3_0)
3357 {
3358 mValidBufferBindings.set(BufferBinding::CopyRead);
3359 mValidBufferBindings.set(BufferBinding::CopyWrite);
3360 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3361 mValidBufferBindings.set(BufferBinding::Uniform);
3362 }
3363
3364 if (getClientVersion() >= ES_3_1)
3365 {
3366 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3367 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3368 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3369 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3370 }
Geoff Lang493daf52014-07-03 13:38:44 -04003371}
3372
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003373void Context::initWorkarounds()
3374{
Jamie Madill761b02c2017-06-23 16:27:06 -04003375 // Apply back-end workarounds.
3376 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3377
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003378 // Lose the context upon out of memory error if the application is
3379 // expecting to watch for those events.
3380 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
3381}
3382
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003383// Return true if the draw is a no-op, else return false.
3384// A no-op draw occurs if the count of vertices is less than the minimum required to
3385// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3386bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3387{
3388 return count < kMinimumPrimitiveCounts[mode];
3389}
3390
3391bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3392{
3393 return (instanceCount == 0) || noopDraw(mode, count);
3394}
3395
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003396Error Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003397{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003398 if (mGLES1Renderer)
3399 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003400 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003401 }
3402
Geoff Lang9bf86f02018-07-26 11:46:34 -04003403 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003404
3405 if (isRobustResourceInitEnabled())
3406 {
3407 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3408 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3409 }
3410
Geoff Langa8cb2872018-03-09 16:09:40 -05003411 ANGLE_TRY(syncDirtyBits());
Geoff Langd4fff502017-09-22 11:28:28 -04003412 return NoError();
3413}
3414
3415Error Context::prepareForClear(GLbitfield mask)
3416{
Geoff Langa8cb2872018-03-09 16:09:40 -05003417 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003418 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003419 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003420 return NoError();
3421}
3422
3423Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3424{
Geoff Langa8cb2872018-03-09 16:09:40 -05003425 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003426 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3427 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003428 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003429 return NoError();
3430}
3431
Geoff Langa8cb2872018-03-09 16:09:40 -05003432Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003433{
Geoff Langa8cb2872018-03-09 16:09:40 -05003434 ANGLE_TRY(syncDirtyObjects(objectMask));
3435 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003436 return NoError();
3437}
3438
Geoff Langa8cb2872018-03-09 16:09:40 -05003439Error Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003440{
3441 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill189ad872018-07-09 13:32:37 -04003442 ANGLE_TRY(mImplementation->syncState(this, dirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003443 mGLState.clearDirtyBits();
3444 return NoError();
3445}
3446
Geoff Langa8cb2872018-03-09 16:09:40 -05003447Error Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003448{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003449 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill189ad872018-07-09 13:32:37 -04003450 ANGLE_TRY(mImplementation->syncState(this, dirtyBits));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003451 mGLState.clearDirtyBits(dirtyBits);
Jamie Madillbc918e72018-03-08 09:47:21 -05003452 return NoError();
Jamie Madill1b94d432015-08-07 13:23:23 -04003453}
Jamie Madillc29968b2016-01-20 11:17:23 -05003454
Geoff Langa8cb2872018-03-09 16:09:40 -05003455Error Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003456{
3457 return mGLState.syncDirtyObjects(this, objectMask);
3458}
3459
Jamie Madillc29968b2016-01-20 11:17:23 -05003460void Context::blitFramebuffer(GLint srcX0,
3461 GLint srcY0,
3462 GLint srcX1,
3463 GLint srcY1,
3464 GLint dstX0,
3465 GLint dstY0,
3466 GLint dstX1,
3467 GLint dstY1,
3468 GLbitfield mask,
3469 GLenum filter)
3470{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003471 if (mask == 0)
3472 {
3473 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3474 // buffers are copied.
3475 return;
3476 }
3477
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003478 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003479 ASSERT(drawFramebuffer);
3480
3481 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3482 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3483
Jamie Madillbc918e72018-03-08 09:47:21 -05003484 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003485
Jamie Madillc564c072017-06-01 12:45:42 -04003486 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003487}
Jamie Madillc29968b2016-01-20 11:17:23 -05003488
3489void Context::clear(GLbitfield mask)
3490{
Geoff Langd4fff502017-09-22 11:28:28 -04003491 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3492 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003493}
3494
3495void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3496{
Geoff Langd4fff502017-09-22 11:28:28 -04003497 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3498 ANGLE_CONTEXT_TRY(
3499 mGLState.getDrawFramebuffer()->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003500}
3501
3502void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3503{
Geoff Langd4fff502017-09-22 11:28:28 -04003504 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3505 ANGLE_CONTEXT_TRY(
3506 mGLState.getDrawFramebuffer()->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003507}
3508
3509void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3510{
Geoff Langd4fff502017-09-22 11:28:28 -04003511 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3512 ANGLE_CONTEXT_TRY(
3513 mGLState.getDrawFramebuffer()->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003514}
3515
3516void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3517{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003518 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003519 ASSERT(framebufferObject);
3520
3521 // If a buffer is not present, the clear has no effect
3522 if (framebufferObject->getDepthbuffer() == nullptr &&
3523 framebufferObject->getStencilbuffer() == nullptr)
3524 {
3525 return;
3526 }
3527
Geoff Langd4fff502017-09-22 11:28:28 -04003528 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3529 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003530}
3531
3532void Context::readPixels(GLint x,
3533 GLint y,
3534 GLsizei width,
3535 GLsizei height,
3536 GLenum format,
3537 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003538 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003539{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003540 if (width == 0 || height == 0)
3541 {
3542 return;
3543 }
3544
Jamie Madillbc918e72018-03-08 09:47:21 -05003545 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003546
Jamie Madillb6664922017-07-25 12:55:04 -04003547 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3548 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003549
3550 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003551 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003552}
3553
Brandon Jones59770802018-04-02 13:18:42 -07003554void Context::readPixelsRobust(GLint x,
3555 GLint y,
3556 GLsizei width,
3557 GLsizei height,
3558 GLenum format,
3559 GLenum type,
3560 GLsizei bufSize,
3561 GLsizei *length,
3562 GLsizei *columns,
3563 GLsizei *rows,
3564 void *pixels)
3565{
3566 readPixels(x, y, width, height, format, type, pixels);
3567}
3568
3569void Context::readnPixelsRobust(GLint x,
3570 GLint y,
3571 GLsizei width,
3572 GLsizei height,
3573 GLenum format,
3574 GLenum type,
3575 GLsizei bufSize,
3576 GLsizei *length,
3577 GLsizei *columns,
3578 GLsizei *rows,
3579 void *data)
3580{
3581 readPixels(x, y, width, height, format, type, data);
3582}
3583
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003584void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003585 GLint level,
3586 GLenum internalformat,
3587 GLint x,
3588 GLint y,
3589 GLsizei width,
3590 GLsizei height,
3591 GLint border)
3592{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003593 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003594 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003595
Jamie Madillc29968b2016-01-20 11:17:23 -05003596 Rectangle sourceArea(x, y, width, height);
3597
Jamie Madill05b35b22017-10-03 09:01:44 -04003598 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003599 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003600 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003601}
3602
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003603void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003604 GLint level,
3605 GLint xoffset,
3606 GLint yoffset,
3607 GLint x,
3608 GLint y,
3609 GLsizei width,
3610 GLsizei height)
3611{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003612 if (width == 0 || height == 0)
3613 {
3614 return;
3615 }
3616
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003617 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003618 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003619
Jamie Madillc29968b2016-01-20 11:17:23 -05003620 Offset destOffset(xoffset, yoffset, 0);
3621 Rectangle sourceArea(x, y, width, height);
3622
Jamie Madill05b35b22017-10-03 09:01:44 -04003623 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003624 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003625 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003626}
3627
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003628void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003629 GLint level,
3630 GLint xoffset,
3631 GLint yoffset,
3632 GLint zoffset,
3633 GLint x,
3634 GLint y,
3635 GLsizei width,
3636 GLsizei height)
3637{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003638 if (width == 0 || height == 0)
3639 {
3640 return;
3641 }
3642
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003643 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003644 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003645
Jamie Madillc29968b2016-01-20 11:17:23 -05003646 Offset destOffset(xoffset, yoffset, zoffset);
3647 Rectangle sourceArea(x, y, width, height);
3648
Jamie Madill05b35b22017-10-03 09:01:44 -04003649 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3650 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003651 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3652 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003653}
3654
3655void Context::framebufferTexture2D(GLenum target,
3656 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003657 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003658 GLuint texture,
3659 GLint level)
3660{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003661 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003662 ASSERT(framebuffer);
3663
3664 if (texture != 0)
3665 {
3666 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003667 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003668 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003669 }
3670 else
3671 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003672 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003673 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003674
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003675 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003676}
3677
3678void Context::framebufferRenderbuffer(GLenum target,
3679 GLenum attachment,
3680 GLenum renderbuffertarget,
3681 GLuint renderbuffer)
3682{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003683 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003684 ASSERT(framebuffer);
3685
3686 if (renderbuffer != 0)
3687 {
3688 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003689
Jamie Madillcc129372018-04-12 09:13:18 -04003690 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003691 renderbufferObject);
3692 }
3693 else
3694 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003695 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003696 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003697
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003698 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003699}
3700
3701void Context::framebufferTextureLayer(GLenum target,
3702 GLenum attachment,
3703 GLuint texture,
3704 GLint level,
3705 GLint layer)
3706{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003707 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003708 ASSERT(framebuffer);
3709
3710 if (texture != 0)
3711 {
3712 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003713 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003714 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003715 }
3716 else
3717 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003718 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003719 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003720
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003721 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003722}
3723
Brandon Jones59770802018-04-02 13:18:42 -07003724void Context::framebufferTextureMultiviewLayered(GLenum target,
3725 GLenum attachment,
3726 GLuint texture,
3727 GLint level,
3728 GLint baseViewIndex,
3729 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003730{
Martin Radev82ef7742017-08-08 17:44:58 +03003731 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3732 ASSERT(framebuffer);
3733
3734 if (texture != 0)
3735 {
3736 Texture *textureObj = getTexture(texture);
3737
Martin Radev18b75ba2017-08-15 15:50:40 +03003738 ImageIndex index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
Martin Radev82ef7742017-08-08 17:44:58 +03003739 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3740 numViews, baseViewIndex);
3741 }
3742 else
3743 {
3744 framebuffer->resetAttachment(this, attachment);
3745 }
3746
3747 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003748}
3749
Brandon Jones59770802018-04-02 13:18:42 -07003750void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3751 GLenum attachment,
3752 GLuint texture,
3753 GLint level,
3754 GLsizei numViews,
3755 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003756{
Martin Radev5dae57b2017-07-14 16:15:55 +03003757 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3758 ASSERT(framebuffer);
3759
3760 if (texture != 0)
3761 {
3762 Texture *textureObj = getTexture(texture);
3763
3764 ImageIndex index = ImageIndex::Make2D(level);
3765 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3766 textureObj, numViews, viewportOffsets);
3767 }
3768 else
3769 {
3770 framebuffer->resetAttachment(this, attachment);
3771 }
3772
3773 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003774}
3775
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003776void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3777{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003778 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3779 ASSERT(framebuffer);
3780
3781 if (texture != 0)
3782 {
3783 Texture *textureObj = getTexture(texture);
3784
3785 ImageIndex index = ImageIndex::MakeFromType(
3786 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3787 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3788 }
3789 else
3790 {
3791 framebuffer->resetAttachment(this, attachment);
3792 }
3793
3794 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003795}
3796
Jamie Madillc29968b2016-01-20 11:17:23 -05003797void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3798{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003799 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003800 ASSERT(framebuffer);
3801 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003802 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003803}
3804
3805void Context::readBuffer(GLenum mode)
3806{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003807 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003808 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003809 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003810}
3811
3812void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3813{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003814 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003815 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003816
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003817 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003818 ASSERT(framebuffer);
3819
3820 // The specification isn't clear what should be done when the framebuffer isn't complete.
3821 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003822 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003823}
3824
3825void Context::invalidateFramebuffer(GLenum target,
3826 GLsizei numAttachments,
3827 const GLenum *attachments)
3828{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003829 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003830 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003831
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003832 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003833 ASSERT(framebuffer);
3834
Jamie Madill427064d2018-04-13 16:20:34 -04003835 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003836 {
Jamie Madill437fa652016-05-03 15:13:24 -04003837 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003838 }
Jamie Madill437fa652016-05-03 15:13:24 -04003839
Jamie Madill4928b7c2017-06-20 12:57:39 -04003840 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003841}
3842
3843void Context::invalidateSubFramebuffer(GLenum target,
3844 GLsizei numAttachments,
3845 const GLenum *attachments,
3846 GLint x,
3847 GLint y,
3848 GLsizei width,
3849 GLsizei height)
3850{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003851 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003852 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003853
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003854 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003855 ASSERT(framebuffer);
3856
Jamie Madill427064d2018-04-13 16:20:34 -04003857 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003858 {
Jamie Madill437fa652016-05-03 15:13:24 -04003859 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003860 }
Jamie Madill437fa652016-05-03 15:13:24 -04003861
3862 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003863 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003864}
3865
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003866void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003867 GLint level,
3868 GLint internalformat,
3869 GLsizei width,
3870 GLsizei height,
3871 GLint border,
3872 GLenum format,
3873 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003874 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003875{
Jamie Madillbc918e72018-03-08 09:47:21 -05003876 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003877
3878 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003879 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003880 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07003881 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003882}
3883
Brandon Jones59770802018-04-02 13:18:42 -07003884void Context::texImage2DRobust(TextureTarget target,
3885 GLint level,
3886 GLint internalformat,
3887 GLsizei width,
3888 GLsizei height,
3889 GLint border,
3890 GLenum format,
3891 GLenum type,
3892 GLsizei bufSize,
3893 const void *pixels)
3894{
3895 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
3896}
3897
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003898void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003899 GLint level,
3900 GLint internalformat,
3901 GLsizei width,
3902 GLsizei height,
3903 GLsizei depth,
3904 GLint border,
3905 GLenum format,
3906 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003907 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003908{
Jamie Madillbc918e72018-03-08 09:47:21 -05003909 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003910
3911 Extents size(width, height, depth);
3912 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003913 handleError(texture->setImage(this, mGLState.getUnpackState(),
3914 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07003915 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003916}
3917
Brandon Jones59770802018-04-02 13:18:42 -07003918void Context::texImage3DRobust(TextureType target,
3919 GLint level,
3920 GLint internalformat,
3921 GLsizei width,
3922 GLsizei height,
3923 GLsizei depth,
3924 GLint border,
3925 GLenum format,
3926 GLenum type,
3927 GLsizei bufSize,
3928 const void *pixels)
3929{
3930 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
3931}
3932
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003933void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003934 GLint level,
3935 GLint xoffset,
3936 GLint yoffset,
3937 GLsizei width,
3938 GLsizei height,
3939 GLenum format,
3940 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003941 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003942{
3943 // Zero sized uploads are valid but no-ops
3944 if (width == 0 || height == 0)
3945 {
3946 return;
3947 }
3948
Jamie Madillbc918e72018-03-08 09:47:21 -05003949 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003950
3951 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003952 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003953 handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07003954 type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003955}
3956
Brandon Jones59770802018-04-02 13:18:42 -07003957void Context::texSubImage2DRobust(TextureTarget target,
3958 GLint level,
3959 GLint xoffset,
3960 GLint yoffset,
3961 GLsizei width,
3962 GLsizei height,
3963 GLenum format,
3964 GLenum type,
3965 GLsizei bufSize,
3966 const void *pixels)
3967{
3968 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
3969}
3970
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003971void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003972 GLint level,
3973 GLint xoffset,
3974 GLint yoffset,
3975 GLint zoffset,
3976 GLsizei width,
3977 GLsizei height,
3978 GLsizei depth,
3979 GLenum format,
3980 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003981 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003982{
3983 // Zero sized uploads are valid but no-ops
3984 if (width == 0 || height == 0 || depth == 0)
3985 {
3986 return;
3987 }
3988
Jamie Madillbc918e72018-03-08 09:47:21 -05003989 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003990
3991 Box area(xoffset, yoffset, zoffset, width, height, depth);
3992 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003993 handleError(texture->setSubImage(this, mGLState.getUnpackState(),
3994 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07003995 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003996}
3997
Brandon Jones59770802018-04-02 13:18:42 -07003998void Context::texSubImage3DRobust(TextureType target,
3999 GLint level,
4000 GLint xoffset,
4001 GLint yoffset,
4002 GLint zoffset,
4003 GLsizei width,
4004 GLsizei height,
4005 GLsizei depth,
4006 GLenum format,
4007 GLenum type,
4008 GLsizei bufSize,
4009 const void *pixels)
4010{
4011 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4012 pixels);
4013}
4014
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004015void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004016 GLint level,
4017 GLenum internalformat,
4018 GLsizei width,
4019 GLsizei height,
4020 GLint border,
4021 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004022 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004023{
Jamie Madillbc918e72018-03-08 09:47:21 -05004024 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004025
4026 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004027 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004028 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4029 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004030 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004031}
4032
Brandon Jones59770802018-04-02 13:18:42 -07004033void Context::compressedTexImage2DRobust(TextureTarget target,
4034 GLint level,
4035 GLenum internalformat,
4036 GLsizei width,
4037 GLsizei height,
4038 GLint border,
4039 GLsizei imageSize,
4040 GLsizei dataSize,
4041 const GLvoid *data)
4042{
4043 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4044}
4045
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004046void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004047 GLint level,
4048 GLenum internalformat,
4049 GLsizei width,
4050 GLsizei height,
4051 GLsizei depth,
4052 GLint border,
4053 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004054 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004055{
Jamie Madillbc918e72018-03-08 09:47:21 -05004056 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004057
4058 Extents size(width, height, depth);
4059 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004060 handleError(texture->setCompressedImage(
4061 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004062 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004063}
4064
Brandon Jones59770802018-04-02 13:18:42 -07004065void Context::compressedTexImage3DRobust(TextureType target,
4066 GLint level,
4067 GLenum internalformat,
4068 GLsizei width,
4069 GLsizei height,
4070 GLsizei depth,
4071 GLint border,
4072 GLsizei imageSize,
4073 GLsizei dataSize,
4074 const GLvoid *data)
4075{
4076 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4077 data);
4078}
4079
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004080void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004081 GLint level,
4082 GLint xoffset,
4083 GLint yoffset,
4084 GLsizei width,
4085 GLsizei height,
4086 GLenum format,
4087 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004088 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004089{
Jamie Madillbc918e72018-03-08 09:47:21 -05004090 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004091
4092 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004093 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004094 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4095 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004096 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004097}
4098
Brandon Jones59770802018-04-02 13:18:42 -07004099void Context::compressedTexSubImage2DRobust(TextureTarget target,
4100 GLint level,
4101 GLint xoffset,
4102 GLint yoffset,
4103 GLsizei width,
4104 GLsizei height,
4105 GLenum format,
4106 GLsizei imageSize,
4107 GLsizei dataSize,
4108 const GLvoid *data)
4109{
4110 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4111 data);
4112}
4113
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004114void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004115 GLint level,
4116 GLint xoffset,
4117 GLint yoffset,
4118 GLint zoffset,
4119 GLsizei width,
4120 GLsizei height,
4121 GLsizei depth,
4122 GLenum format,
4123 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004124 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004125{
4126 // Zero sized uploads are valid but no-ops
4127 if (width == 0 || height == 0)
4128 {
4129 return;
4130 }
4131
Jamie Madillbc918e72018-03-08 09:47:21 -05004132 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004133
4134 Box area(xoffset, yoffset, zoffset, width, height, depth);
4135 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004136 handleError(texture->setCompressedSubImage(
4137 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004138 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004139}
4140
Brandon Jones59770802018-04-02 13:18:42 -07004141void Context::compressedTexSubImage3DRobust(TextureType target,
4142 GLint level,
4143 GLint xoffset,
4144 GLint yoffset,
4145 GLint zoffset,
4146 GLsizei width,
4147 GLsizei height,
4148 GLsizei depth,
4149 GLenum format,
4150 GLsizei imageSize,
4151 GLsizei dataSize,
4152 const GLvoid *data)
4153{
4154 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4155 imageSize, data);
4156}
4157
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004158void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004159{
4160 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004161 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004162}
4163
Jamie Madill007530e2017-12-28 14:27:04 -05004164void Context::copyTexture(GLuint sourceId,
4165 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004166 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004167 GLuint destId,
4168 GLint destLevel,
4169 GLint internalFormat,
4170 GLenum destType,
4171 GLboolean unpackFlipY,
4172 GLboolean unpackPremultiplyAlpha,
4173 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004174{
Jamie Madillbc918e72018-03-08 09:47:21 -05004175 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004176
4177 gl::Texture *sourceTexture = getTexture(sourceId);
4178 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004179 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4180 sourceLevel, ConvertToBool(unpackFlipY),
4181 ConvertToBool(unpackPremultiplyAlpha),
4182 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004183}
4184
Jamie Madill007530e2017-12-28 14:27:04 -05004185void Context::copySubTexture(GLuint sourceId,
4186 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004187 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004188 GLuint destId,
4189 GLint destLevel,
4190 GLint xoffset,
4191 GLint yoffset,
4192 GLint x,
4193 GLint y,
4194 GLsizei width,
4195 GLsizei height,
4196 GLboolean unpackFlipY,
4197 GLboolean unpackPremultiplyAlpha,
4198 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004199{
4200 // Zero sized copies are valid but no-ops
4201 if (width == 0 || height == 0)
4202 {
4203 return;
4204 }
4205
Jamie Madillbc918e72018-03-08 09:47:21 -05004206 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004207
4208 gl::Texture *sourceTexture = getTexture(sourceId);
4209 gl::Texture *destTexture = getTexture(destId);
4210 Offset offset(xoffset, yoffset, 0);
4211 Rectangle area(x, y, width, height);
Geoff Lang92019432017-11-20 13:09:34 -05004212 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, area,
4213 ConvertToBool(unpackFlipY),
4214 ConvertToBool(unpackPremultiplyAlpha),
4215 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004216}
4217
Jamie Madill007530e2017-12-28 14:27:04 -05004218void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004219{
Jamie Madillbc918e72018-03-08 09:47:21 -05004220 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004221
4222 gl::Texture *sourceTexture = getTexture(sourceId);
4223 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004224 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004225}
4226
Corentin Wallez336129f2017-10-17 15:55:40 -04004227void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004228{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004229 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004230 ASSERT(buffer);
4231
Geoff Lang496c02d2016-10-20 11:38:11 -07004232 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004233}
4234
Brandon Jones59770802018-04-02 13:18:42 -07004235void Context::getBufferPointervRobust(BufferBinding target,
4236 GLenum pname,
4237 GLsizei bufSize,
4238 GLsizei *length,
4239 void **params)
4240{
4241 getBufferPointerv(target, pname, params);
4242}
4243
Corentin Wallez336129f2017-10-17 15:55:40 -04004244void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004245{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004246 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004247 ASSERT(buffer);
4248
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004249 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004250 if (error.isError())
4251 {
Jamie Madill437fa652016-05-03 15:13:24 -04004252 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004253 return nullptr;
4254 }
4255
4256 return buffer->getMapPointer();
4257}
4258
Corentin Wallez336129f2017-10-17 15:55:40 -04004259GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004260{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004261 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004262 ASSERT(buffer);
4263
4264 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004265 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004266 if (error.isError())
4267 {
Jamie Madill437fa652016-05-03 15:13:24 -04004268 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004269 return GL_FALSE;
4270 }
4271
4272 return result;
4273}
4274
Corentin Wallez336129f2017-10-17 15:55:40 -04004275void *Context::mapBufferRange(BufferBinding target,
4276 GLintptr offset,
4277 GLsizeiptr length,
4278 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004279{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004280 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004281 ASSERT(buffer);
4282
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004283 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004284 if (error.isError())
4285 {
Jamie Madill437fa652016-05-03 15:13:24 -04004286 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004287 return nullptr;
4288 }
4289
4290 return buffer->getMapPointer();
4291}
4292
Corentin Wallez336129f2017-10-17 15:55:40 -04004293void Context::flushMappedBufferRange(BufferBinding /*target*/,
4294 GLintptr /*offset*/,
4295 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004296{
4297 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4298}
4299
Jamie Madillbc918e72018-03-08 09:47:21 -05004300Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004301{
Geoff Langa8cb2872018-03-09 16:09:40 -05004302 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004303}
4304
Jamie Madillbc918e72018-03-08 09:47:21 -05004305Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004306{
Geoff Langa8cb2872018-03-09 16:09:40 -05004307 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004308}
4309
Jamie Madillbc918e72018-03-08 09:47:21 -05004310Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004311{
Geoff Langa8cb2872018-03-09 16:09:40 -05004312 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004313}
4314
Geoff Lang9bf86f02018-07-26 11:46:34 -04004315Error Context::syncStateForPathOperation()
4316{
4317 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4318
4319 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4320 ANGLE_TRY(syncDirtyBits());
4321
4322 return NoError();
4323}
4324
Jiajia Qin5451d532017-11-16 17:16:34 +08004325void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4326{
4327 UNIMPLEMENTED();
4328}
4329
Jamie Madillc20ab272016-06-09 07:20:46 -07004330void Context::activeTexture(GLenum texture)
4331{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004332 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004333}
4334
Jamie Madill876429b2017-04-20 15:46:24 -04004335void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004336{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004337 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004338}
4339
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004340void Context::blendEquation(GLenum mode)
4341{
4342 mGLState.setBlendEquation(mode, mode);
4343}
4344
Jamie Madillc20ab272016-06-09 07:20:46 -07004345void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4346{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004347 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004348}
4349
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004350void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4351{
4352 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4353}
4354
Jamie Madillc20ab272016-06-09 07:20:46 -07004355void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4356{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004357 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004358}
4359
Jamie Madill876429b2017-04-20 15:46:24 -04004360void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004361{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004362 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004363}
4364
Jamie Madill876429b2017-04-20 15:46:24 -04004365void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004366{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004367 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07004368}
4369
4370void Context::clearStencil(GLint s)
4371{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004372 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004373}
4374
4375void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4376{
Geoff Lang92019432017-11-20 13:09:34 -05004377 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4378 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004379}
4380
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004381void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004382{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004383 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004384}
4385
4386void Context::depthFunc(GLenum func)
4387{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004388 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004389}
4390
4391void Context::depthMask(GLboolean flag)
4392{
Geoff Lang92019432017-11-20 13:09:34 -05004393 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004394}
4395
Jamie Madill876429b2017-04-20 15:46:24 -04004396void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004397{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004398 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07004399}
4400
4401void Context::disable(GLenum cap)
4402{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004403 mGLState.setEnableFeature(cap, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07004404}
4405
4406void Context::disableVertexAttribArray(GLuint index)
4407{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004408 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004409 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004410}
4411
4412void Context::enable(GLenum cap)
4413{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004414 mGLState.setEnableFeature(cap, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07004415}
4416
4417void Context::enableVertexAttribArray(GLuint index)
4418{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004419 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004420 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004421}
4422
4423void Context::frontFace(GLenum mode)
4424{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004425 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004426}
4427
4428void Context::hint(GLenum target, GLenum mode)
4429{
4430 switch (target)
4431 {
4432 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004433 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004434 break;
4435
4436 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004437 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004438 break;
4439
4440 default:
4441 UNREACHABLE();
4442 return;
4443 }
4444}
4445
4446void Context::lineWidth(GLfloat width)
4447{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004448 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004449}
4450
4451void Context::pixelStorei(GLenum pname, GLint param)
4452{
4453 switch (pname)
4454 {
4455 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004456 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004457 break;
4458
4459 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004460 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004461 break;
4462
4463 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004464 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004465 break;
4466
4467 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004468 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004469 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004470 break;
4471
4472 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004473 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004474 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004475 break;
4476
4477 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004478 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004479 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004480 break;
4481
4482 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004483 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004484 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004485 break;
4486
4487 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004488 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004489 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004490 break;
4491
4492 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004493 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004494 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004495 break;
4496
4497 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004498 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004499 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004500 break;
4501
4502 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004503 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004504 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004505 break;
4506
4507 default:
4508 UNREACHABLE();
4509 return;
4510 }
4511}
4512
4513void Context::polygonOffset(GLfloat factor, GLfloat units)
4514{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004515 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004516}
4517
Jamie Madill876429b2017-04-20 15:46:24 -04004518void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004519{
Geoff Lang92019432017-11-20 13:09:34 -05004520 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004521}
4522
Jiawei Shaodb342272017-09-27 10:21:45 +08004523void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4524{
4525 mGLState.setSampleMaskParams(maskNumber, mask);
4526}
4527
Jamie Madillc20ab272016-06-09 07:20:46 -07004528void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4529{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004530 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004531}
4532
4533void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4534{
4535 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4536 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004537 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004538 }
4539
4540 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4541 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004542 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004543 }
4544}
4545
4546void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4547{
4548 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4549 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004550 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004551 }
4552
4553 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4554 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004555 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004556 }
4557}
4558
4559void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4560{
4561 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4562 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004563 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004564 }
4565
4566 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4567 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004568 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004569 }
4570}
4571
4572void Context::vertexAttrib1f(GLuint index, GLfloat x)
4573{
4574 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004575 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004576}
4577
4578void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4579{
4580 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004581 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004582}
4583
4584void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4585{
4586 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004587 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004588}
4589
4590void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4591{
4592 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004593 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004594}
4595
4596void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4597{
4598 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004599 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004600}
4601
4602void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4603{
4604 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004605 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004606}
4607
4608void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4609{
4610 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004611 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004612}
4613
4614void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4615{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004616 mGLState.setVertexAttribf(index, values);
Jamie Madillc20ab272016-06-09 07:20:46 -07004617}
4618
4619void Context::vertexAttribPointer(GLuint index,
4620 GLint size,
4621 GLenum type,
4622 GLboolean normalized,
4623 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004624 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004625{
Corentin Wallez336129f2017-10-17 15:55:40 -04004626 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004627 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004628 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004629}
4630
Shao80957d92017-02-20 21:25:59 +08004631void Context::vertexAttribFormat(GLuint attribIndex,
4632 GLint size,
4633 GLenum type,
4634 GLboolean normalized,
4635 GLuint relativeOffset)
4636{
Geoff Lang92019432017-11-20 13:09:34 -05004637 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004638 relativeOffset);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004639 mStateCache.onVertexArraySizeChange(this);
Shao80957d92017-02-20 21:25:59 +08004640}
4641
4642void Context::vertexAttribIFormat(GLuint attribIndex,
4643 GLint size,
4644 GLenum type,
4645 GLuint relativeOffset)
4646{
4647 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004648 mStateCache.onVertexArraySizeChange(this);
Shao80957d92017-02-20 21:25:59 +08004649}
4650
4651void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4652{
Shaodde78e82017-05-22 14:13:27 +08004653 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004654 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004655}
4656
Jiajia Qin5451d532017-11-16 17:16:34 +08004657void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004658{
4659 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004660 mStateCache.onVertexArraySizeChange(this);
Shao80957d92017-02-20 21:25:59 +08004661}
4662
Jamie Madillc20ab272016-06-09 07:20:46 -07004663void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4664{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004665 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004666}
4667
4668void Context::vertexAttribIPointer(GLuint index,
4669 GLint size,
4670 GLenum type,
4671 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004672 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004673{
Corentin Wallez336129f2017-10-17 15:55:40 -04004674 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4675 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004676 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004677}
4678
4679void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4680{
4681 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004682 mGLState.setVertexAttribi(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004683}
4684
4685void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4686{
4687 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004688 mGLState.setVertexAttribu(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004689}
4690
4691void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4692{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004693 mGLState.setVertexAttribi(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07004694}
4695
4696void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4697{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004698 mGLState.setVertexAttribu(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07004699}
4700
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004701void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4702{
4703 const VertexAttribCurrentValueData &currentValues =
4704 getGLState().getVertexAttribCurrentValue(index);
4705 const VertexArray *vao = getGLState().getVertexArray();
4706 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4707 currentValues, pname, params);
4708}
4709
Brandon Jones59770802018-04-02 13:18:42 -07004710void Context::getVertexAttribivRobust(GLuint index,
4711 GLenum pname,
4712 GLsizei bufSize,
4713 GLsizei *length,
4714 GLint *params)
4715{
4716 getVertexAttribiv(index, pname, params);
4717}
4718
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004719void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4720{
4721 const VertexAttribCurrentValueData &currentValues =
4722 getGLState().getVertexAttribCurrentValue(index);
4723 const VertexArray *vao = getGLState().getVertexArray();
4724 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4725 currentValues, pname, params);
4726}
4727
Brandon Jones59770802018-04-02 13:18:42 -07004728void Context::getVertexAttribfvRobust(GLuint index,
4729 GLenum pname,
4730 GLsizei bufSize,
4731 GLsizei *length,
4732 GLfloat *params)
4733{
4734 getVertexAttribfv(index, pname, params);
4735}
4736
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004737void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4738{
4739 const VertexAttribCurrentValueData &currentValues =
4740 getGLState().getVertexAttribCurrentValue(index);
4741 const VertexArray *vao = getGLState().getVertexArray();
4742 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4743 currentValues, pname, params);
4744}
4745
Brandon Jones59770802018-04-02 13:18:42 -07004746void Context::getVertexAttribIivRobust(GLuint index,
4747 GLenum pname,
4748 GLsizei bufSize,
4749 GLsizei *length,
4750 GLint *params)
4751{
4752 getVertexAttribIiv(index, pname, params);
4753}
4754
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004755void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4756{
4757 const VertexAttribCurrentValueData &currentValues =
4758 getGLState().getVertexAttribCurrentValue(index);
4759 const VertexArray *vao = getGLState().getVertexArray();
4760 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4761 currentValues, pname, params);
4762}
4763
Brandon Jones59770802018-04-02 13:18:42 -07004764void Context::getVertexAttribIuivRobust(GLuint index,
4765 GLenum pname,
4766 GLsizei bufSize,
4767 GLsizei *length,
4768 GLuint *params)
4769{
4770 getVertexAttribIuiv(index, pname, params);
4771}
4772
Jamie Madill876429b2017-04-20 15:46:24 -04004773void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004774{
4775 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4776 QueryVertexAttribPointerv(attrib, pname, pointer);
4777}
4778
Brandon Jones59770802018-04-02 13:18:42 -07004779void Context::getVertexAttribPointervRobust(GLuint index,
4780 GLenum pname,
4781 GLsizei bufSize,
4782 GLsizei *length,
4783 void **pointer)
4784{
4785 getVertexAttribPointerv(index, pname, pointer);
4786}
4787
Jamie Madillc20ab272016-06-09 07:20:46 -07004788void Context::debugMessageControl(GLenum source,
4789 GLenum type,
4790 GLenum severity,
4791 GLsizei count,
4792 const GLuint *ids,
4793 GLboolean enabled)
4794{
4795 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004796 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05004797 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07004798}
4799
4800void Context::debugMessageInsert(GLenum source,
4801 GLenum type,
4802 GLuint id,
4803 GLenum severity,
4804 GLsizei length,
4805 const GLchar *buf)
4806{
4807 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004808 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07004809}
4810
4811void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
4812{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004813 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07004814}
4815
4816GLuint Context::getDebugMessageLog(GLuint count,
4817 GLsizei bufSize,
4818 GLenum *sources,
4819 GLenum *types,
4820 GLuint *ids,
4821 GLenum *severities,
4822 GLsizei *lengths,
4823 GLchar *messageLog)
4824{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004825 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
4826 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07004827}
4828
4829void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
4830{
4831 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004832 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05004833 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07004834}
4835
4836void Context::popDebugGroup()
4837{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004838 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05004839 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07004840}
4841
Corentin Wallez336129f2017-10-17 15:55:40 -04004842void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04004843{
4844 Buffer *buffer = mGLState.getTargetBuffer(target);
4845 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004846 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04004847}
4848
Corentin Wallez336129f2017-10-17 15:55:40 -04004849void Context::bufferSubData(BufferBinding target,
4850 GLintptr offset,
4851 GLsizeiptr size,
4852 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04004853{
4854 if (data == nullptr)
4855 {
4856 return;
4857 }
4858
4859 Buffer *buffer = mGLState.getTargetBuffer(target);
4860 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004861 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04004862}
4863
Jamie Madillef300b12016-10-07 15:12:09 -04004864void Context::attachShader(GLuint program, GLuint shader)
4865{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05004866 Program *programObject = mState.mShaderPrograms->getProgram(program);
4867 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04004868 ASSERT(programObject && shaderObject);
4869 programObject->attachShader(shaderObject);
4870}
4871
Kenneth Russellf2f6f652016-10-05 19:53:23 -07004872const Workarounds &Context::getWorkarounds() const
4873{
4874 return mWorkarounds;
4875}
4876
Corentin Wallez336129f2017-10-17 15:55:40 -04004877void Context::copyBufferSubData(BufferBinding readTarget,
4878 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04004879 GLintptr readOffset,
4880 GLintptr writeOffset,
4881 GLsizeiptr size)
4882{
4883 // if size is zero, the copy is a successful no-op
4884 if (size == 0)
4885 {
4886 return;
4887 }
4888
4889 // TODO(jmadill): cache these.
4890 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
4891 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
4892
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004893 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04004894}
4895
Jamie Madill01a80ee2016-11-07 12:06:18 -05004896void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
4897{
4898 Program *programObject = getProgram(program);
4899 // TODO(jmadill): Re-use this from the validation if possible.
4900 ASSERT(programObject);
4901 programObject->bindAttributeLocation(index, name);
4902}
4903
Corentin Wallez336129f2017-10-17 15:55:40 -04004904void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004905{
Corentin Wallez336129f2017-10-17 15:55:40 -04004906 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4907 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004908}
4909
Corentin Wallez336129f2017-10-17 15:55:40 -04004910void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08004911{
4912 bindBufferRange(target, index, buffer, 0, 0);
4913}
4914
Corentin Wallez336129f2017-10-17 15:55:40 -04004915void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08004916 GLuint index,
4917 GLuint buffer,
4918 GLintptr offset,
4919 GLsizeiptr size)
4920{
Corentin Wallez336129f2017-10-17 15:55:40 -04004921 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4922 mGLState.setIndexedBufferBinding(this, target, index, bufferObject, offset, size);
Jiajia Qin6eafb042016-12-27 17:04:07 +08004923}
4924
Jamie Madill01a80ee2016-11-07 12:06:18 -05004925void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
4926{
4927 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4928 {
4929 bindReadFramebuffer(framebuffer);
4930 }
4931
4932 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4933 {
4934 bindDrawFramebuffer(framebuffer);
4935 }
4936}
4937
4938void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
4939{
4940 ASSERT(target == GL_RENDERBUFFER);
4941 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05004942 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004943 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004944}
4945
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004946void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08004947 GLsizei samples,
4948 GLenum internalformat,
4949 GLsizei width,
4950 GLsizei height,
4951 GLboolean fixedsamplelocations)
4952{
4953 Extents size(width, height, 1);
4954 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004955 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
4956 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08004957}
4958
4959void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
4960{
JiangYizhou5b03f472017-01-09 10:22:53 +08004961 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
4962 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05004963 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08004964 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08004965
4966 switch (pname)
4967 {
4968 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04004969 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08004970 break;
4971 default:
4972 UNREACHABLE();
4973 }
4974}
4975
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07004976void Context::getMultisamplefvRobust(GLenum pname,
4977 GLuint index,
4978 GLsizei bufSize,
4979 GLsizei *length,
4980 GLfloat *val)
4981{
4982 UNIMPLEMENTED();
4983}
4984
Jamie Madille8fb6402017-02-14 17:56:40 -05004985void Context::renderbufferStorage(GLenum target,
4986 GLenum internalformat,
4987 GLsizei width,
4988 GLsizei height)
4989{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004990 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4991 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
4992
Jamie Madille8fb6402017-02-14 17:56:40 -05004993 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04004994 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004995}
4996
4997void Context::renderbufferStorageMultisample(GLenum target,
4998 GLsizei samples,
4999 GLenum internalformat,
5000 GLsizei width,
5001 GLsizei height)
5002{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005003 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5004 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005005
5006 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005007 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005008 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005009}
5010
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005011void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5012{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005013 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005014 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005015}
5016
JiangYizhoue18e6392017-02-20 10:32:23 +08005017void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5018{
5019 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5020 QueryFramebufferParameteriv(framebuffer, pname, params);
5021}
5022
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005023void Context::getFramebufferParameterivRobust(GLenum target,
5024 GLenum pname,
5025 GLsizei bufSize,
5026 GLsizei *length,
5027 GLint *params)
5028{
5029 UNIMPLEMENTED();
5030}
5031
Jiajia Qin5451d532017-11-16 17:16:34 +08005032void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005033{
5034 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005035 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005036}
5037
Jamie Madilldec86232018-07-11 09:01:18 -04005038bool Context::getScratchBuffer(size_t requstedSizeBytes,
5039 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005040{
Jamie Madilldec86232018-07-11 09:01:18 -04005041 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005042}
5043
Jamie Madilldec86232018-07-11 09:01:18 -04005044bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5045 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005046{
Jamie Madilldec86232018-07-11 09:01:18 -04005047 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005048}
5049
Xinghua Cao10a4d432017-11-28 14:46:26 +08005050Error Context::prepareForDispatch()
5051{
Geoff Langa8cb2872018-03-09 16:09:40 -05005052 ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005053
5054 if (isRobustResourceInitEnabled())
5055 {
5056 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5057 }
5058
5059 return NoError();
5060}
5061
Xinghua Cao2b396592017-03-29 15:36:04 +08005062void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5063{
5064 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5065 {
5066 return;
5067 }
5068
Xinghua Cao10a4d432017-11-28 14:46:26 +08005069 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005070 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005071}
5072
Jiajia Qin5451d532017-11-16 17:16:34 +08005073void Context::dispatchComputeIndirect(GLintptr indirect)
5074{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005075 ANGLE_CONTEXT_TRY(prepareForDispatch());
5076 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005077}
5078
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005079void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005080 GLsizei levels,
5081 GLenum internalFormat,
5082 GLsizei width,
5083 GLsizei height)
5084{
5085 Extents size(width, height, 1);
5086 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005087 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005088}
5089
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005090void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005091 GLsizei levels,
5092 GLenum internalFormat,
5093 GLsizei width,
5094 GLsizei height,
5095 GLsizei depth)
5096{
5097 Extents size(width, height, depth);
5098 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005099 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005100}
5101
Jiajia Qin5451d532017-11-16 17:16:34 +08005102void Context::memoryBarrier(GLbitfield barriers)
5103{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005104 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005105}
5106
5107void Context::memoryBarrierByRegion(GLbitfield barriers)
5108{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005109 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005110}
5111
Jamie Madillc1d770e2017-04-13 17:31:24 -04005112GLenum Context::checkFramebufferStatus(GLenum target)
5113{
5114 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5115 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005116 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005117}
5118
5119void Context::compileShader(GLuint shader)
5120{
5121 Shader *shaderObject = GetValidShader(this, shader);
5122 if (!shaderObject)
5123 {
5124 return;
5125 }
5126 shaderObject->compile(this);
5127}
5128
5129void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5130{
5131 for (int i = 0; i < n; i++)
5132 {
5133 deleteBuffer(buffers[i]);
5134 }
5135}
5136
5137void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5138{
5139 for (int i = 0; i < n; i++)
5140 {
5141 if (framebuffers[i] != 0)
5142 {
5143 deleteFramebuffer(framebuffers[i]);
5144 }
5145 }
5146}
5147
5148void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5149{
5150 for (int i = 0; i < n; i++)
5151 {
5152 deleteRenderbuffer(renderbuffers[i]);
5153 }
5154}
5155
5156void Context::deleteTextures(GLsizei n, const GLuint *textures)
5157{
5158 for (int i = 0; i < n; i++)
5159 {
5160 if (textures[i] != 0)
5161 {
5162 deleteTexture(textures[i]);
5163 }
5164 }
5165}
5166
5167void Context::detachShader(GLuint program, GLuint shader)
5168{
5169 Program *programObject = getProgram(program);
5170 ASSERT(programObject);
5171
5172 Shader *shaderObject = getShader(shader);
5173 ASSERT(shaderObject);
5174
5175 programObject->detachShader(this, shaderObject);
5176}
5177
5178void Context::genBuffers(GLsizei n, GLuint *buffers)
5179{
5180 for (int i = 0; i < n; i++)
5181 {
5182 buffers[i] = createBuffer();
5183 }
5184}
5185
5186void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5187{
5188 for (int i = 0; i < n; i++)
5189 {
5190 framebuffers[i] = createFramebuffer();
5191 }
5192}
5193
5194void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5195{
5196 for (int i = 0; i < n; i++)
5197 {
5198 renderbuffers[i] = createRenderbuffer();
5199 }
5200}
5201
5202void Context::genTextures(GLsizei n, GLuint *textures)
5203{
5204 for (int i = 0; i < n; i++)
5205 {
5206 textures[i] = createTexture();
5207 }
5208}
5209
5210void Context::getActiveAttrib(GLuint program,
5211 GLuint index,
5212 GLsizei bufsize,
5213 GLsizei *length,
5214 GLint *size,
5215 GLenum *type,
5216 GLchar *name)
5217{
5218 Program *programObject = getProgram(program);
5219 ASSERT(programObject);
5220 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5221}
5222
5223void Context::getActiveUniform(GLuint program,
5224 GLuint index,
5225 GLsizei bufsize,
5226 GLsizei *length,
5227 GLint *size,
5228 GLenum *type,
5229 GLchar *name)
5230{
5231 Program *programObject = getProgram(program);
5232 ASSERT(programObject);
5233 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5234}
5235
5236void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5237{
5238 Program *programObject = getProgram(program);
5239 ASSERT(programObject);
5240 programObject->getAttachedShaders(maxcount, count, shaders);
5241}
5242
5243GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5244{
5245 Program *programObject = getProgram(program);
5246 ASSERT(programObject);
5247 return programObject->getAttributeLocation(name);
5248}
5249
5250void Context::getBooleanv(GLenum pname, GLboolean *params)
5251{
5252 GLenum nativeType;
5253 unsigned int numParams = 0;
5254 getQueryParameterInfo(pname, &nativeType, &numParams);
5255
5256 if (nativeType == GL_BOOL)
5257 {
5258 getBooleanvImpl(pname, params);
5259 }
5260 else
5261 {
5262 CastStateValues(this, nativeType, pname, numParams, params);
5263 }
5264}
5265
Brandon Jones59770802018-04-02 13:18:42 -07005266void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5267{
5268 getBooleanv(pname, params);
5269}
5270
Jamie Madillc1d770e2017-04-13 17:31:24 -04005271void Context::getFloatv(GLenum pname, GLfloat *params)
5272{
5273 GLenum nativeType;
5274 unsigned int numParams = 0;
5275 getQueryParameterInfo(pname, &nativeType, &numParams);
5276
5277 if (nativeType == GL_FLOAT)
5278 {
5279 getFloatvImpl(pname, params);
5280 }
5281 else
5282 {
5283 CastStateValues(this, nativeType, pname, numParams, params);
5284 }
5285}
5286
Brandon Jones59770802018-04-02 13:18:42 -07005287void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5288{
5289 getFloatv(pname, params);
5290}
5291
Jamie Madillc1d770e2017-04-13 17:31:24 -04005292void Context::getIntegerv(GLenum pname, GLint *params)
5293{
5294 GLenum nativeType;
5295 unsigned int numParams = 0;
5296 getQueryParameterInfo(pname, &nativeType, &numParams);
5297
5298 if (nativeType == GL_INT)
5299 {
5300 getIntegervImpl(pname, params);
5301 }
5302 else
5303 {
5304 CastStateValues(this, nativeType, pname, numParams, params);
5305 }
5306}
5307
Brandon Jones59770802018-04-02 13:18:42 -07005308void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5309{
5310 getIntegerv(pname, data);
5311}
5312
Jamie Madillc1d770e2017-04-13 17:31:24 -04005313void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5314{
5315 Program *programObject = getProgram(program);
5316 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005317 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005318}
5319
Brandon Jones59770802018-04-02 13:18:42 -07005320void Context::getProgramivRobust(GLuint program,
5321 GLenum pname,
5322 GLsizei bufSize,
5323 GLsizei *length,
5324 GLint *params)
5325{
5326 getProgramiv(program, pname, params);
5327}
5328
Jiajia Qin5451d532017-11-16 17:16:34 +08005329void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5330{
5331 UNIMPLEMENTED();
5332}
5333
Jamie Madillbe849e42017-05-02 15:49:00 -04005334void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005335{
5336 Program *programObject = getProgram(program);
5337 ASSERT(programObject);
5338 programObject->getInfoLog(bufsize, length, infolog);
5339}
5340
Jiajia Qin5451d532017-11-16 17:16:34 +08005341void Context::getProgramPipelineInfoLog(GLuint pipeline,
5342 GLsizei bufSize,
5343 GLsizei *length,
5344 GLchar *infoLog)
5345{
5346 UNIMPLEMENTED();
5347}
5348
Jamie Madillc1d770e2017-04-13 17:31:24 -04005349void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5350{
5351 Shader *shaderObject = getShader(shader);
5352 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04005353 QueryShaderiv(this, shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005354}
5355
Brandon Jones59770802018-04-02 13:18:42 -07005356void Context::getShaderivRobust(GLuint shader,
5357 GLenum pname,
5358 GLsizei bufSize,
5359 GLsizei *length,
5360 GLint *params)
5361{
5362 getShaderiv(shader, pname, params);
5363}
5364
Jamie Madillc1d770e2017-04-13 17:31:24 -04005365void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5366{
5367 Shader *shaderObject = getShader(shader);
5368 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04005369 shaderObject->getInfoLog(this, bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005370}
5371
5372void Context::getShaderPrecisionFormat(GLenum shadertype,
5373 GLenum precisiontype,
5374 GLint *range,
5375 GLint *precision)
5376{
5377 // TODO(jmadill): Compute shaders.
5378
5379 switch (shadertype)
5380 {
5381 case GL_VERTEX_SHADER:
5382 switch (precisiontype)
5383 {
5384 case GL_LOW_FLOAT:
5385 mCaps.vertexLowpFloat.get(range, precision);
5386 break;
5387 case GL_MEDIUM_FLOAT:
5388 mCaps.vertexMediumpFloat.get(range, precision);
5389 break;
5390 case GL_HIGH_FLOAT:
5391 mCaps.vertexHighpFloat.get(range, precision);
5392 break;
5393
5394 case GL_LOW_INT:
5395 mCaps.vertexLowpInt.get(range, precision);
5396 break;
5397 case GL_MEDIUM_INT:
5398 mCaps.vertexMediumpInt.get(range, precision);
5399 break;
5400 case GL_HIGH_INT:
5401 mCaps.vertexHighpInt.get(range, precision);
5402 break;
5403
5404 default:
5405 UNREACHABLE();
5406 return;
5407 }
5408 break;
5409
5410 case GL_FRAGMENT_SHADER:
5411 switch (precisiontype)
5412 {
5413 case GL_LOW_FLOAT:
5414 mCaps.fragmentLowpFloat.get(range, precision);
5415 break;
5416 case GL_MEDIUM_FLOAT:
5417 mCaps.fragmentMediumpFloat.get(range, precision);
5418 break;
5419 case GL_HIGH_FLOAT:
5420 mCaps.fragmentHighpFloat.get(range, precision);
5421 break;
5422
5423 case GL_LOW_INT:
5424 mCaps.fragmentLowpInt.get(range, precision);
5425 break;
5426 case GL_MEDIUM_INT:
5427 mCaps.fragmentMediumpInt.get(range, precision);
5428 break;
5429 case GL_HIGH_INT:
5430 mCaps.fragmentHighpInt.get(range, precision);
5431 break;
5432
5433 default:
5434 UNREACHABLE();
5435 return;
5436 }
5437 break;
5438
5439 default:
5440 UNREACHABLE();
5441 return;
5442 }
5443}
5444
5445void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5446{
5447 Shader *shaderObject = getShader(shader);
5448 ASSERT(shaderObject);
5449 shaderObject->getSource(bufsize, length, source);
5450}
5451
5452void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5453{
5454 Program *programObject = getProgram(program);
5455 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005456 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005457}
5458
Brandon Jones59770802018-04-02 13:18:42 -07005459void Context::getUniformfvRobust(GLuint program,
5460 GLint location,
5461 GLsizei bufSize,
5462 GLsizei *length,
5463 GLfloat *params)
5464{
5465 getUniformfv(program, location, params);
5466}
5467
Jamie Madillc1d770e2017-04-13 17:31:24 -04005468void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5469{
5470 Program *programObject = getProgram(program);
5471 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005472 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005473}
5474
Brandon Jones59770802018-04-02 13:18:42 -07005475void Context::getUniformivRobust(GLuint program,
5476 GLint location,
5477 GLsizei bufSize,
5478 GLsizei *length,
5479 GLint *params)
5480{
5481 getUniformiv(program, location, params);
5482}
5483
Jamie Madillc1d770e2017-04-13 17:31:24 -04005484GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5485{
5486 Program *programObject = getProgram(program);
5487 ASSERT(programObject);
5488 return programObject->getUniformLocation(name);
5489}
5490
5491GLboolean Context::isBuffer(GLuint buffer)
5492{
5493 if (buffer == 0)
5494 {
5495 return GL_FALSE;
5496 }
5497
5498 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5499}
5500
5501GLboolean Context::isEnabled(GLenum cap)
5502{
5503 return mGLState.getEnableFeature(cap);
5504}
5505
5506GLboolean Context::isFramebuffer(GLuint framebuffer)
5507{
5508 if (framebuffer == 0)
5509 {
5510 return GL_FALSE;
5511 }
5512
5513 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5514}
5515
5516GLboolean Context::isProgram(GLuint program)
5517{
5518 if (program == 0)
5519 {
5520 return GL_FALSE;
5521 }
5522
5523 return (getProgram(program) ? GL_TRUE : GL_FALSE);
5524}
5525
5526GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5527{
5528 if (renderbuffer == 0)
5529 {
5530 return GL_FALSE;
5531 }
5532
5533 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5534}
5535
5536GLboolean Context::isShader(GLuint shader)
5537{
5538 if (shader == 0)
5539 {
5540 return GL_FALSE;
5541 }
5542
5543 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5544}
5545
5546GLboolean Context::isTexture(GLuint texture)
5547{
5548 if (texture == 0)
5549 {
5550 return GL_FALSE;
5551 }
5552
5553 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5554}
5555
5556void Context::linkProgram(GLuint program)
5557{
5558 Program *programObject = getProgram(program);
5559 ASSERT(programObject);
5560 handleError(programObject->link(this));
Martin Radev0abb7a22017-08-28 15:34:45 +03005561 mGLState.onProgramExecutableChange(programObject);
Jamie Madillc43cdad2018-08-08 15:49:25 -04005562 mStateCache.onProgramExecutableChange(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005563}
5564
5565void Context::releaseShaderCompiler()
5566{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005567 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005568}
5569
5570void Context::shaderBinary(GLsizei n,
5571 const GLuint *shaders,
5572 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005573 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005574 GLsizei length)
5575{
5576 // No binary shader formats are supported.
5577 UNIMPLEMENTED();
5578}
5579
5580void Context::shaderSource(GLuint shader,
5581 GLsizei count,
5582 const GLchar *const *string,
5583 const GLint *length)
5584{
5585 Shader *shaderObject = getShader(shader);
5586 ASSERT(shaderObject);
5587 shaderObject->setSource(count, string, length);
5588}
5589
5590void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5591{
5592 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5593}
5594
5595void Context::stencilMask(GLuint mask)
5596{
5597 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5598}
5599
5600void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5601{
5602 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5603}
5604
5605void Context::uniform1f(GLint location, GLfloat x)
5606{
5607 Program *program = mGLState.getProgram();
5608 program->setUniform1fv(location, 1, &x);
5609}
5610
5611void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5612{
5613 Program *program = mGLState.getProgram();
5614 program->setUniform1fv(location, count, v);
5615}
5616
Jamie Madill7e4eff12018-08-08 15:49:26 -04005617void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005618{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005619 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04005620 {
5621 mGLState.setObjectDirty(GL_PROGRAM);
5622 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005623}
5624
Jamie Madill7e4eff12018-08-08 15:49:26 -04005625void Context::uniform1i(GLint location, GLint x)
5626{
5627 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
5628}
5629
Jamie Madillc1d770e2017-04-13 17:31:24 -04005630void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5631{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005632 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005633}
5634
5635void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5636{
5637 GLfloat xy[2] = {x, y};
5638 Program *program = mGLState.getProgram();
5639 program->setUniform2fv(location, 1, xy);
5640}
5641
5642void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5643{
5644 Program *program = mGLState.getProgram();
5645 program->setUniform2fv(location, count, v);
5646}
5647
5648void Context::uniform2i(GLint location, GLint x, GLint y)
5649{
5650 GLint xy[2] = {x, y};
5651 Program *program = mGLState.getProgram();
5652 program->setUniform2iv(location, 1, xy);
5653}
5654
5655void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
5656{
5657 Program *program = mGLState.getProgram();
5658 program->setUniform2iv(location, count, v);
5659}
5660
5661void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5662{
5663 GLfloat xyz[3] = {x, y, z};
5664 Program *program = mGLState.getProgram();
5665 program->setUniform3fv(location, 1, xyz);
5666}
5667
5668void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
5669{
5670 Program *program = mGLState.getProgram();
5671 program->setUniform3fv(location, count, v);
5672}
5673
5674void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
5675{
5676 GLint xyz[3] = {x, y, z};
5677 Program *program = mGLState.getProgram();
5678 program->setUniform3iv(location, 1, xyz);
5679}
5680
5681void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
5682{
5683 Program *program = mGLState.getProgram();
5684 program->setUniform3iv(location, count, v);
5685}
5686
5687void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5688{
5689 GLfloat xyzw[4] = {x, y, z, w};
5690 Program *program = mGLState.getProgram();
5691 program->setUniform4fv(location, 1, xyzw);
5692}
5693
5694void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
5695{
5696 Program *program = mGLState.getProgram();
5697 program->setUniform4fv(location, count, v);
5698}
5699
5700void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5701{
5702 GLint xyzw[4] = {x, y, z, w};
5703 Program *program = mGLState.getProgram();
5704 program->setUniform4iv(location, 1, xyzw);
5705}
5706
5707void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
5708{
5709 Program *program = mGLState.getProgram();
5710 program->setUniform4iv(location, count, v);
5711}
5712
5713void Context::uniformMatrix2fv(GLint location,
5714 GLsizei count,
5715 GLboolean transpose,
5716 const GLfloat *value)
5717{
5718 Program *program = mGLState.getProgram();
5719 program->setUniformMatrix2fv(location, count, transpose, value);
5720}
5721
5722void Context::uniformMatrix3fv(GLint location,
5723 GLsizei count,
5724 GLboolean transpose,
5725 const GLfloat *value)
5726{
5727 Program *program = mGLState.getProgram();
5728 program->setUniformMatrix3fv(location, count, transpose, value);
5729}
5730
5731void Context::uniformMatrix4fv(GLint location,
5732 GLsizei count,
5733 GLboolean transpose,
5734 const GLfloat *value)
5735{
5736 Program *program = mGLState.getProgram();
5737 program->setUniformMatrix4fv(location, count, transpose, value);
5738}
5739
5740void Context::validateProgram(GLuint program)
5741{
5742 Program *programObject = getProgram(program);
5743 ASSERT(programObject);
5744 programObject->validate(mCaps);
5745}
5746
Jiajia Qin5451d532017-11-16 17:16:34 +08005747void Context::validateProgramPipeline(GLuint pipeline)
5748{
5749 UNIMPLEMENTED();
5750}
5751
Jamie Madilld04908b2017-06-09 14:15:35 -04005752void Context::getProgramBinary(GLuint program,
5753 GLsizei bufSize,
5754 GLsizei *length,
5755 GLenum *binaryFormat,
5756 void *binary)
5757{
5758 Program *programObject = getProgram(program);
5759 ASSERT(programObject != nullptr);
5760
5761 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
5762}
5763
5764void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
5765{
5766 Program *programObject = getProgram(program);
5767 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04005768
Jamie Madilld04908b2017-06-09 14:15:35 -04005769 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madillc43cdad2018-08-08 15:49:25 -04005770 mStateCache.onProgramExecutableChange(this);
Jamie Madilld04908b2017-06-09 14:15:35 -04005771}
5772
Jamie Madillff325f12017-08-26 15:06:05 -04005773void Context::uniform1ui(GLint location, GLuint v0)
5774{
5775 Program *program = mGLState.getProgram();
5776 program->setUniform1uiv(location, 1, &v0);
5777}
5778
5779void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
5780{
5781 Program *program = mGLState.getProgram();
5782 const GLuint xy[] = {v0, v1};
5783 program->setUniform2uiv(location, 1, xy);
5784}
5785
5786void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
5787{
5788 Program *program = mGLState.getProgram();
5789 const GLuint xyz[] = {v0, v1, v2};
5790 program->setUniform3uiv(location, 1, xyz);
5791}
5792
5793void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
5794{
5795 Program *program = mGLState.getProgram();
5796 const GLuint xyzw[] = {v0, v1, v2, v3};
5797 program->setUniform4uiv(location, 1, xyzw);
5798}
5799
5800void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
5801{
5802 Program *program = mGLState.getProgram();
5803 program->setUniform1uiv(location, count, value);
5804}
5805void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
5806{
5807 Program *program = mGLState.getProgram();
5808 program->setUniform2uiv(location, count, value);
5809}
5810
5811void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
5812{
5813 Program *program = mGLState.getProgram();
5814 program->setUniform3uiv(location, count, value);
5815}
5816
5817void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
5818{
5819 Program *program = mGLState.getProgram();
5820 program->setUniform4uiv(location, count, value);
5821}
5822
Jamie Madillf0e04492017-08-26 15:28:42 -04005823void Context::genQueries(GLsizei n, GLuint *ids)
5824{
5825 for (GLsizei i = 0; i < n; i++)
5826 {
5827 GLuint handle = mQueryHandleAllocator.allocate();
5828 mQueryMap.assign(handle, nullptr);
5829 ids[i] = handle;
5830 }
5831}
5832
5833void Context::deleteQueries(GLsizei n, const GLuint *ids)
5834{
5835 for (int i = 0; i < n; i++)
5836 {
5837 GLuint query = ids[i];
5838
5839 Query *queryObject = nullptr;
5840 if (mQueryMap.erase(query, &queryObject))
5841 {
5842 mQueryHandleAllocator.release(query);
5843 if (queryObject)
5844 {
5845 queryObject->release(this);
5846 }
5847 }
5848 }
5849}
5850
5851GLboolean Context::isQuery(GLuint id)
5852{
Corentin Wallezad3ae902018-03-09 13:40:42 -05005853 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04005854}
5855
Jamie Madillc8c95812017-08-26 18:40:09 -04005856void Context::uniformMatrix2x3fv(GLint location,
5857 GLsizei count,
5858 GLboolean transpose,
5859 const GLfloat *value)
5860{
5861 Program *program = mGLState.getProgram();
5862 program->setUniformMatrix2x3fv(location, count, transpose, value);
5863}
5864
5865void Context::uniformMatrix3x2fv(GLint location,
5866 GLsizei count,
5867 GLboolean transpose,
5868 const GLfloat *value)
5869{
5870 Program *program = mGLState.getProgram();
5871 program->setUniformMatrix3x2fv(location, count, transpose, value);
5872}
5873
5874void Context::uniformMatrix2x4fv(GLint location,
5875 GLsizei count,
5876 GLboolean transpose,
5877 const GLfloat *value)
5878{
5879 Program *program = mGLState.getProgram();
5880 program->setUniformMatrix2x4fv(location, count, transpose, value);
5881}
5882
5883void Context::uniformMatrix4x2fv(GLint location,
5884 GLsizei count,
5885 GLboolean transpose,
5886 const GLfloat *value)
5887{
5888 Program *program = mGLState.getProgram();
5889 program->setUniformMatrix4x2fv(location, count, transpose, value);
5890}
5891
5892void Context::uniformMatrix3x4fv(GLint location,
5893 GLsizei count,
5894 GLboolean transpose,
5895 const GLfloat *value)
5896{
5897 Program *program = mGLState.getProgram();
5898 program->setUniformMatrix3x4fv(location, count, transpose, value);
5899}
5900
5901void Context::uniformMatrix4x3fv(GLint location,
5902 GLsizei count,
5903 GLboolean transpose,
5904 const GLfloat *value)
5905{
5906 Program *program = mGLState.getProgram();
5907 program->setUniformMatrix4x3fv(location, count, transpose, value);
5908}
5909
Jamie Madilld7576732017-08-26 18:49:50 -04005910void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
5911{
5912 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5913 {
5914 GLuint vertexArray = arrays[arrayIndex];
5915
5916 if (arrays[arrayIndex] != 0)
5917 {
5918 VertexArray *vertexArrayObject = nullptr;
5919 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
5920 {
5921 if (vertexArrayObject != nullptr)
5922 {
5923 detachVertexArray(vertexArray);
5924 vertexArrayObject->onDestroy(this);
5925 }
5926
5927 mVertexArrayHandleAllocator.release(vertexArray);
5928 }
5929 }
5930 }
5931}
5932
5933void Context::genVertexArrays(GLsizei n, GLuint *arrays)
5934{
5935 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5936 {
5937 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
5938 mVertexArrayMap.assign(vertexArray, nullptr);
5939 arrays[arrayIndex] = vertexArray;
5940 }
5941}
5942
5943bool Context::isVertexArray(GLuint array)
5944{
5945 if (array == 0)
5946 {
5947 return GL_FALSE;
5948 }
5949
5950 VertexArray *vao = getVertexArray(array);
5951 return (vao != nullptr ? GL_TRUE : GL_FALSE);
5952}
5953
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04005954void Context::endTransformFeedback()
5955{
5956 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5957 transformFeedback->end(this);
5958}
5959
5960void Context::transformFeedbackVaryings(GLuint program,
5961 GLsizei count,
5962 const GLchar *const *varyings,
5963 GLenum bufferMode)
5964{
5965 Program *programObject = getProgram(program);
5966 ASSERT(programObject);
5967 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
5968}
5969
5970void Context::getTransformFeedbackVarying(GLuint program,
5971 GLuint index,
5972 GLsizei bufSize,
5973 GLsizei *length,
5974 GLsizei *size,
5975 GLenum *type,
5976 GLchar *name)
5977{
5978 Program *programObject = getProgram(program);
5979 ASSERT(programObject);
5980 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
5981}
5982
5983void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
5984{
5985 for (int i = 0; i < n; i++)
5986 {
5987 GLuint transformFeedback = ids[i];
5988 if (transformFeedback == 0)
5989 {
5990 continue;
5991 }
5992
5993 TransformFeedback *transformFeedbackObject = nullptr;
5994 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
5995 {
5996 if (transformFeedbackObject != nullptr)
5997 {
5998 detachTransformFeedback(transformFeedback);
5999 transformFeedbackObject->release(this);
6000 }
6001
6002 mTransformFeedbackHandleAllocator.release(transformFeedback);
6003 }
6004 }
6005}
6006
6007void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6008{
6009 for (int i = 0; i < n; i++)
6010 {
6011 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6012 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6013 ids[i] = transformFeedback;
6014 }
6015}
6016
6017bool Context::isTransformFeedback(GLuint id)
6018{
6019 if (id == 0)
6020 {
6021 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6022 // returns FALSE
6023 return GL_FALSE;
6024 }
6025
6026 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6027 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6028}
6029
6030void Context::pauseTransformFeedback()
6031{
6032 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6033 transformFeedback->pause();
6034}
6035
6036void Context::resumeTransformFeedback()
6037{
6038 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6039 transformFeedback->resume();
6040}
6041
Jamie Madill12e957f2017-08-26 21:42:26 -04006042void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6043{
6044 const Program *programObject = getProgram(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006045 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006046}
6047
Brandon Jones59770802018-04-02 13:18:42 -07006048void Context::getUniformuivRobust(GLuint program,
6049 GLint location,
6050 GLsizei bufSize,
6051 GLsizei *length,
6052 GLuint *params)
6053{
6054 getUniformuiv(program, location, params);
6055}
6056
Jamie Madill12e957f2017-08-26 21:42:26 -04006057GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6058{
6059 const Program *programObject = getProgram(program);
6060 return programObject->getFragDataLocation(name);
6061}
6062
6063void Context::getUniformIndices(GLuint program,
6064 GLsizei uniformCount,
6065 const GLchar *const *uniformNames,
6066 GLuint *uniformIndices)
6067{
6068 const Program *programObject = getProgram(program);
6069 if (!programObject->isLinked())
6070 {
6071 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6072 {
6073 uniformIndices[uniformId] = GL_INVALID_INDEX;
6074 }
6075 }
6076 else
6077 {
6078 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6079 {
6080 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6081 }
6082 }
6083}
6084
6085void Context::getActiveUniformsiv(GLuint program,
6086 GLsizei uniformCount,
6087 const GLuint *uniformIndices,
6088 GLenum pname,
6089 GLint *params)
6090{
6091 const Program *programObject = getProgram(program);
6092 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6093 {
6094 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006095 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006096 }
6097}
6098
6099GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6100{
6101 const Program *programObject = getProgram(program);
6102 return programObject->getUniformBlockIndex(uniformBlockName);
6103}
6104
6105void Context::getActiveUniformBlockiv(GLuint program,
6106 GLuint uniformBlockIndex,
6107 GLenum pname,
6108 GLint *params)
6109{
6110 const Program *programObject = getProgram(program);
6111 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6112}
6113
Brandon Jones59770802018-04-02 13:18:42 -07006114void Context::getActiveUniformBlockivRobust(GLuint program,
6115 GLuint uniformBlockIndex,
6116 GLenum pname,
6117 GLsizei bufSize,
6118 GLsizei *length,
6119 GLint *params)
6120{
6121 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6122}
6123
Jamie Madill12e957f2017-08-26 21:42:26 -04006124void Context::getActiveUniformBlockName(GLuint program,
6125 GLuint uniformBlockIndex,
6126 GLsizei bufSize,
6127 GLsizei *length,
6128 GLchar *uniformBlockName)
6129{
6130 const Program *programObject = getProgram(program);
6131 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6132}
6133
6134void Context::uniformBlockBinding(GLuint program,
6135 GLuint uniformBlockIndex,
6136 GLuint uniformBlockBinding)
6137{
6138 Program *programObject = getProgram(program);
6139 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
6140}
6141
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006142GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6143{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006144 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6145 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006146
Jamie Madill70b5bb02017-08-28 13:32:37 -04006147 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006148 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006149 if (error.isError())
6150 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006151 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006152 handleError(error);
6153 return nullptr;
6154 }
6155
Jamie Madill70b5bb02017-08-28 13:32:37 -04006156 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006157}
6158
6159GLboolean Context::isSync(GLsync sync)
6160{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006161 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006162}
6163
6164GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6165{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006166 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006167
6168 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006169 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006170 return result;
6171}
6172
6173void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6174{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006175 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006176 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006177}
6178
6179void Context::getInteger64v(GLenum pname, GLint64 *params)
6180{
6181 GLenum nativeType = GL_NONE;
6182 unsigned int numParams = 0;
6183 getQueryParameterInfo(pname, &nativeType, &numParams);
6184
6185 if (nativeType == GL_INT_64_ANGLEX)
6186 {
6187 getInteger64vImpl(pname, params);
6188 }
6189 else
6190 {
6191 CastStateValues(this, nativeType, pname, numParams, params);
6192 }
6193}
6194
Brandon Jones59770802018-04-02 13:18:42 -07006195void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6196{
6197 getInteger64v(pname, data);
6198}
6199
Corentin Wallez336129f2017-10-17 15:55:40 -04006200void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006201{
6202 Buffer *buffer = mGLState.getTargetBuffer(target);
6203 QueryBufferParameteri64v(buffer, pname, params);
6204}
6205
Brandon Jones59770802018-04-02 13:18:42 -07006206void Context::getBufferParameteri64vRobust(BufferBinding target,
6207 GLenum pname,
6208 GLsizei bufSize,
6209 GLsizei *length,
6210 GLint64 *params)
6211{
6212 getBufferParameteri64v(target, pname, params);
6213}
6214
Jamie Madill3ef140a2017-08-26 23:11:21 -04006215void Context::genSamplers(GLsizei count, GLuint *samplers)
6216{
6217 for (int i = 0; i < count; i++)
6218 {
6219 samplers[i] = mState.mSamplers->createSampler();
6220 }
6221}
6222
6223void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6224{
6225 for (int i = 0; i < count; i++)
6226 {
6227 GLuint sampler = samplers[i];
6228
6229 if (mState.mSamplers->getSampler(sampler))
6230 {
6231 detachSampler(sampler);
6232 }
6233
6234 mState.mSamplers->deleteObject(this, sampler);
6235 }
6236}
6237
6238void Context::getInternalformativ(GLenum target,
6239 GLenum internalformat,
6240 GLenum pname,
6241 GLsizei bufSize,
6242 GLint *params)
6243{
6244 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6245 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6246}
6247
Brandon Jones59770802018-04-02 13:18:42 -07006248void Context::getInternalformativRobust(GLenum target,
6249 GLenum internalformat,
6250 GLenum pname,
6251 GLsizei bufSize,
6252 GLsizei *length,
6253 GLint *params)
6254{
6255 getInternalformativ(target, internalformat, pname, bufSize, params);
6256}
6257
Jiajia Qin5451d532017-11-16 17:16:34 +08006258void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6259{
6260 programUniform1iv(program, location, 1, &v0);
6261}
6262
6263void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6264{
6265 GLint xy[2] = {v0, v1};
6266 programUniform2iv(program, location, 1, xy);
6267}
6268
6269void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6270{
6271 GLint xyz[3] = {v0, v1, v2};
6272 programUniform3iv(program, location, 1, xyz);
6273}
6274
6275void Context::programUniform4i(GLuint program,
6276 GLint location,
6277 GLint v0,
6278 GLint v1,
6279 GLint v2,
6280 GLint v3)
6281{
6282 GLint xyzw[4] = {v0, v1, v2, v3};
6283 programUniform4iv(program, location, 1, xyzw);
6284}
6285
6286void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6287{
6288 programUniform1uiv(program, location, 1, &v0);
6289}
6290
6291void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6292{
6293 GLuint xy[2] = {v0, v1};
6294 programUniform2uiv(program, location, 1, xy);
6295}
6296
6297void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6298{
6299 GLuint xyz[3] = {v0, v1, v2};
6300 programUniform3uiv(program, location, 1, xyz);
6301}
6302
6303void Context::programUniform4ui(GLuint program,
6304 GLint location,
6305 GLuint v0,
6306 GLuint v1,
6307 GLuint v2,
6308 GLuint v3)
6309{
6310 GLuint xyzw[4] = {v0, v1, v2, v3};
6311 programUniform4uiv(program, location, 1, xyzw);
6312}
6313
6314void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6315{
6316 programUniform1fv(program, location, 1, &v0);
6317}
6318
6319void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6320{
6321 GLfloat xy[2] = {v0, v1};
6322 programUniform2fv(program, location, 1, xy);
6323}
6324
6325void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6326{
6327 GLfloat xyz[3] = {v0, v1, v2};
6328 programUniform3fv(program, location, 1, xyz);
6329}
6330
6331void Context::programUniform4f(GLuint program,
6332 GLint location,
6333 GLfloat v0,
6334 GLfloat v1,
6335 GLfloat v2,
6336 GLfloat v3)
6337{
6338 GLfloat xyzw[4] = {v0, v1, v2, v3};
6339 programUniform4fv(program, location, 1, xyzw);
6340}
6341
Jamie Madill81c2e252017-09-09 23:32:46 -04006342void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6343{
6344 Program *programObject = getProgram(program);
6345 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006346 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006347}
6348
Jiajia Qin5451d532017-11-16 17:16:34 +08006349void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6350{
6351 Program *programObject = getProgram(program);
6352 ASSERT(programObject);
6353 programObject->setUniform2iv(location, count, value);
6354}
6355
6356void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6357{
6358 Program *programObject = getProgram(program);
6359 ASSERT(programObject);
6360 programObject->setUniform3iv(location, count, value);
6361}
6362
6363void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6364{
6365 Program *programObject = getProgram(program);
6366 ASSERT(programObject);
6367 programObject->setUniform4iv(location, count, value);
6368}
6369
6370void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6371{
6372 Program *programObject = getProgram(program);
6373 ASSERT(programObject);
6374 programObject->setUniform1uiv(location, count, value);
6375}
6376
6377void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6378{
6379 Program *programObject = getProgram(program);
6380 ASSERT(programObject);
6381 programObject->setUniform2uiv(location, count, value);
6382}
6383
6384void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6385{
6386 Program *programObject = getProgram(program);
6387 ASSERT(programObject);
6388 programObject->setUniform3uiv(location, count, value);
6389}
6390
6391void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6392{
6393 Program *programObject = getProgram(program);
6394 ASSERT(programObject);
6395 programObject->setUniform4uiv(location, count, value);
6396}
6397
6398void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6399{
6400 Program *programObject = getProgram(program);
6401 ASSERT(programObject);
6402 programObject->setUniform1fv(location, count, value);
6403}
6404
6405void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6406{
6407 Program *programObject = getProgram(program);
6408 ASSERT(programObject);
6409 programObject->setUniform2fv(location, count, value);
6410}
6411
6412void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6413{
6414 Program *programObject = getProgram(program);
6415 ASSERT(programObject);
6416 programObject->setUniform3fv(location, count, value);
6417}
6418
6419void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6420{
6421 Program *programObject = getProgram(program);
6422 ASSERT(programObject);
6423 programObject->setUniform4fv(location, count, value);
6424}
6425
6426void Context::programUniformMatrix2fv(GLuint program,
6427 GLint location,
6428 GLsizei count,
6429 GLboolean transpose,
6430 const GLfloat *value)
6431{
6432 Program *programObject = getProgram(program);
6433 ASSERT(programObject);
6434 programObject->setUniformMatrix2fv(location, count, transpose, value);
6435}
6436
6437void Context::programUniformMatrix3fv(GLuint program,
6438 GLint location,
6439 GLsizei count,
6440 GLboolean transpose,
6441 const GLfloat *value)
6442{
6443 Program *programObject = getProgram(program);
6444 ASSERT(programObject);
6445 programObject->setUniformMatrix3fv(location, count, transpose, value);
6446}
6447
6448void Context::programUniformMatrix4fv(GLuint program,
6449 GLint location,
6450 GLsizei count,
6451 GLboolean transpose,
6452 const GLfloat *value)
6453{
6454 Program *programObject = getProgram(program);
6455 ASSERT(programObject);
6456 programObject->setUniformMatrix4fv(location, count, transpose, value);
6457}
6458
6459void Context::programUniformMatrix2x3fv(GLuint program,
6460 GLint location,
6461 GLsizei count,
6462 GLboolean transpose,
6463 const GLfloat *value)
6464{
6465 Program *programObject = getProgram(program);
6466 ASSERT(programObject);
6467 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6468}
6469
6470void Context::programUniformMatrix3x2fv(GLuint program,
6471 GLint location,
6472 GLsizei count,
6473 GLboolean transpose,
6474 const GLfloat *value)
6475{
6476 Program *programObject = getProgram(program);
6477 ASSERT(programObject);
6478 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6479}
6480
6481void Context::programUniformMatrix2x4fv(GLuint program,
6482 GLint location,
6483 GLsizei count,
6484 GLboolean transpose,
6485 const GLfloat *value)
6486{
6487 Program *programObject = getProgram(program);
6488 ASSERT(programObject);
6489 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6490}
6491
6492void Context::programUniformMatrix4x2fv(GLuint program,
6493 GLint location,
6494 GLsizei count,
6495 GLboolean transpose,
6496 const GLfloat *value)
6497{
6498 Program *programObject = getProgram(program);
6499 ASSERT(programObject);
6500 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6501}
6502
6503void Context::programUniformMatrix3x4fv(GLuint program,
6504 GLint location,
6505 GLsizei count,
6506 GLboolean transpose,
6507 const GLfloat *value)
6508{
6509 Program *programObject = getProgram(program);
6510 ASSERT(programObject);
6511 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6512}
6513
6514void Context::programUniformMatrix4x3fv(GLuint program,
6515 GLint location,
6516 GLsizei count,
6517 GLboolean transpose,
6518 const GLfloat *value)
6519{
6520 Program *programObject = getProgram(program);
6521 ASSERT(programObject);
6522 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6523}
6524
Jamie Madill81c2e252017-09-09 23:32:46 -04006525void Context::onTextureChange(const Texture *texture)
6526{
6527 // Conservatively assume all textures are dirty.
6528 // TODO(jmadill): More fine-grained update.
6529 mGLState.setObjectDirty(GL_TEXTURE);
6530}
6531
James Darpiniane8a93c62018-01-04 18:02:24 -08006532bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6533{
6534 return mGLState.isCurrentTransformFeedback(tf);
6535}
6536bool Context::isCurrentVertexArray(const VertexArray *va) const
6537{
6538 return mGLState.isCurrentVertexArray(va);
6539}
6540
Yunchao Hea336b902017-08-02 16:05:21 +08006541void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6542{
6543 for (int i = 0; i < count; i++)
6544 {
6545 pipelines[i] = createProgramPipeline();
6546 }
6547}
6548
6549void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6550{
6551 for (int i = 0; i < count; i++)
6552 {
6553 if (pipelines[i] != 0)
6554 {
6555 deleteProgramPipeline(pipelines[i]);
6556 }
6557 }
6558}
6559
6560GLboolean Context::isProgramPipeline(GLuint pipeline)
6561{
6562 if (pipeline == 0)
6563 {
6564 return GL_FALSE;
6565 }
6566
6567 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6568}
6569
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006570void Context::finishFenceNV(GLuint fence)
6571{
6572 FenceNV *fenceObject = getFenceNV(fence);
6573
6574 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04006575 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006576}
6577
6578void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6579{
6580 FenceNV *fenceObject = getFenceNV(fence);
6581
6582 ASSERT(fenceObject && fenceObject->isSet());
6583
6584 switch (pname)
6585 {
6586 case GL_FENCE_STATUS_NV:
6587 {
6588 // GL_NV_fence spec:
6589 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6590 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6591 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6592 GLboolean status = GL_TRUE;
6593 if (fenceObject->getStatus() != GL_TRUE)
6594 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006595 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006596 }
6597 *params = status;
6598 break;
6599 }
6600
6601 case GL_FENCE_CONDITION_NV:
6602 {
6603 *params = static_cast<GLint>(fenceObject->getCondition());
6604 break;
6605 }
6606
6607 default:
6608 UNREACHABLE();
6609 }
6610}
6611
6612void Context::getTranslatedShaderSource(GLuint shader,
6613 GLsizei bufsize,
6614 GLsizei *length,
6615 GLchar *source)
6616{
6617 Shader *shaderObject = getShader(shader);
6618 ASSERT(shaderObject);
6619 shaderObject->getTranslatedSourceWithDebugInfo(this, bufsize, length, source);
6620}
6621
6622void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6623{
6624 Program *programObject = getProgram(program);
6625 ASSERT(programObject);
6626
6627 programObject->getUniformfv(this, location, params);
6628}
6629
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006630void Context::getnUniformfvRobust(GLuint program,
6631 GLint location,
6632 GLsizei bufSize,
6633 GLsizei *length,
6634 GLfloat *params)
6635{
6636 UNIMPLEMENTED();
6637}
6638
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006639void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
6640{
6641 Program *programObject = getProgram(program);
6642 ASSERT(programObject);
6643
6644 programObject->getUniformiv(this, location, params);
6645}
6646
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006647void Context::getnUniformivRobust(GLuint program,
6648 GLint location,
6649 GLsizei bufSize,
6650 GLsizei *length,
6651 GLint *params)
6652{
6653 UNIMPLEMENTED();
6654}
6655
6656void Context::getnUniformuivRobust(GLuint program,
6657 GLint location,
6658 GLsizei bufSize,
6659 GLsizei *length,
6660 GLuint *params)
6661{
6662 UNIMPLEMENTED();
6663}
6664
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006665GLboolean Context::isFenceNV(GLuint fence)
6666{
6667 FenceNV *fenceObject = getFenceNV(fence);
6668
6669 if (fenceObject == nullptr)
6670 {
6671 return GL_FALSE;
6672 }
6673
6674 // GL_NV_fence spec:
6675 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
6676 // existing fence.
6677 return fenceObject->isSet();
6678}
6679
6680void Context::readnPixels(GLint x,
6681 GLint y,
6682 GLsizei width,
6683 GLsizei height,
6684 GLenum format,
6685 GLenum type,
6686 GLsizei bufSize,
6687 void *data)
6688{
6689 return readPixels(x, y, width, height, format, type, data);
6690}
6691
Jamie Madill007530e2017-12-28 14:27:04 -05006692void Context::setFenceNV(GLuint fence, GLenum condition)
6693{
6694 ASSERT(condition == GL_ALL_COMPLETED_NV);
6695
6696 FenceNV *fenceObject = getFenceNV(fence);
6697 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04006698 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05006699}
6700
6701GLboolean Context::testFenceNV(GLuint fence)
6702{
6703 FenceNV *fenceObject = getFenceNV(fence);
6704
6705 ASSERT(fenceObject != nullptr);
6706 ASSERT(fenceObject->isSet() == GL_TRUE);
6707
6708 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04006709 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05006710 if (error.isError())
6711 {
6712 handleError(error);
6713 return GL_TRUE;
6714 }
6715
6716 return result;
6717}
6718
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006719void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006720{
6721 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07006722 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05006723 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05006724}
6725
Jamie Madillfa920eb2018-01-04 11:45:50 -05006726void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006727{
6728 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07006729 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05006730 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
6731}
6732
Jamie Madillfa920eb2018-01-04 11:45:50 -05006733void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
6734{
6735 UNIMPLEMENTED();
6736}
6737
Jamie Madill5b772312018-03-08 20:28:32 -05006738bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
6739{
6740 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
6741 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
6742 // to the fact that it is stored internally as a float, and so would require conversion
6743 // if returned from Context::getIntegerv. Since this conversion is already implemented
6744 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
6745 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
6746 // application.
6747 switch (pname)
6748 {
6749 case GL_COMPRESSED_TEXTURE_FORMATS:
6750 {
6751 *type = GL_INT;
6752 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
6753 return true;
6754 }
6755 case GL_SHADER_BINARY_FORMATS:
6756 {
6757 *type = GL_INT;
6758 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
6759 return true;
6760 }
6761
6762 case GL_MAX_VERTEX_ATTRIBS:
6763 case GL_MAX_VERTEX_UNIFORM_VECTORS:
6764 case GL_MAX_VARYING_VECTORS:
6765 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
6766 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
6767 case GL_MAX_TEXTURE_IMAGE_UNITS:
6768 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
6769 case GL_MAX_RENDERBUFFER_SIZE:
6770 case GL_NUM_SHADER_BINARY_FORMATS:
6771 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
6772 case GL_ARRAY_BUFFER_BINDING:
6773 case GL_FRAMEBUFFER_BINDING:
6774 case GL_RENDERBUFFER_BINDING:
6775 case GL_CURRENT_PROGRAM:
6776 case GL_PACK_ALIGNMENT:
6777 case GL_UNPACK_ALIGNMENT:
6778 case GL_GENERATE_MIPMAP_HINT:
6779 case GL_RED_BITS:
6780 case GL_GREEN_BITS:
6781 case GL_BLUE_BITS:
6782 case GL_ALPHA_BITS:
6783 case GL_DEPTH_BITS:
6784 case GL_STENCIL_BITS:
6785 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
6786 case GL_CULL_FACE_MODE:
6787 case GL_FRONT_FACE:
6788 case GL_ACTIVE_TEXTURE:
6789 case GL_STENCIL_FUNC:
6790 case GL_STENCIL_VALUE_MASK:
6791 case GL_STENCIL_REF:
6792 case GL_STENCIL_FAIL:
6793 case GL_STENCIL_PASS_DEPTH_FAIL:
6794 case GL_STENCIL_PASS_DEPTH_PASS:
6795 case GL_STENCIL_BACK_FUNC:
6796 case GL_STENCIL_BACK_VALUE_MASK:
6797 case GL_STENCIL_BACK_REF:
6798 case GL_STENCIL_BACK_FAIL:
6799 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
6800 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
6801 case GL_DEPTH_FUNC:
6802 case GL_BLEND_SRC_RGB:
6803 case GL_BLEND_SRC_ALPHA:
6804 case GL_BLEND_DST_RGB:
6805 case GL_BLEND_DST_ALPHA:
6806 case GL_BLEND_EQUATION_RGB:
6807 case GL_BLEND_EQUATION_ALPHA:
6808 case GL_STENCIL_WRITEMASK:
6809 case GL_STENCIL_BACK_WRITEMASK:
6810 case GL_STENCIL_CLEAR_VALUE:
6811 case GL_SUBPIXEL_BITS:
6812 case GL_MAX_TEXTURE_SIZE:
6813 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
6814 case GL_SAMPLE_BUFFERS:
6815 case GL_SAMPLES:
6816 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
6817 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
6818 case GL_TEXTURE_BINDING_2D:
6819 case GL_TEXTURE_BINDING_CUBE_MAP:
6820 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
6821 {
6822 *type = GL_INT;
6823 *numParams = 1;
6824 return true;
6825 }
6826 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
6827 {
6828 if (!getExtensions().packReverseRowOrder)
6829 {
6830 return false;
6831 }
6832 *type = GL_INT;
6833 *numParams = 1;
6834 return true;
6835 }
6836 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
6837 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
6838 {
6839 if (!getExtensions().textureRectangle)
6840 {
6841 return false;
6842 }
6843 *type = GL_INT;
6844 *numParams = 1;
6845 return true;
6846 }
6847 case GL_MAX_DRAW_BUFFERS_EXT:
6848 case GL_MAX_COLOR_ATTACHMENTS_EXT:
6849 {
6850 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
6851 {
6852 return false;
6853 }
6854 *type = GL_INT;
6855 *numParams = 1;
6856 return true;
6857 }
6858 case GL_MAX_VIEWPORT_DIMS:
6859 {
6860 *type = GL_INT;
6861 *numParams = 2;
6862 return true;
6863 }
6864 case GL_VIEWPORT:
6865 case GL_SCISSOR_BOX:
6866 {
6867 *type = GL_INT;
6868 *numParams = 4;
6869 return true;
6870 }
6871 case GL_SHADER_COMPILER:
6872 case GL_SAMPLE_COVERAGE_INVERT:
6873 case GL_DEPTH_WRITEMASK:
6874 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
6875 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
6876 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
6877 // bool-natural
6878 case GL_SAMPLE_COVERAGE:
6879 case GL_SCISSOR_TEST:
6880 case GL_STENCIL_TEST:
6881 case GL_DEPTH_TEST:
6882 case GL_BLEND:
6883 case GL_DITHER:
6884 case GL_CONTEXT_ROBUST_ACCESS_EXT:
6885 {
6886 *type = GL_BOOL;
6887 *numParams = 1;
6888 return true;
6889 }
6890 case GL_COLOR_WRITEMASK:
6891 {
6892 *type = GL_BOOL;
6893 *numParams = 4;
6894 return true;
6895 }
6896 case GL_POLYGON_OFFSET_FACTOR:
6897 case GL_POLYGON_OFFSET_UNITS:
6898 case GL_SAMPLE_COVERAGE_VALUE:
6899 case GL_DEPTH_CLEAR_VALUE:
6900 case GL_LINE_WIDTH:
6901 {
6902 *type = GL_FLOAT;
6903 *numParams = 1;
6904 return true;
6905 }
6906 case GL_ALIASED_LINE_WIDTH_RANGE:
6907 case GL_ALIASED_POINT_SIZE_RANGE:
6908 case GL_DEPTH_RANGE:
6909 {
6910 *type = GL_FLOAT;
6911 *numParams = 2;
6912 return true;
6913 }
6914 case GL_COLOR_CLEAR_VALUE:
6915 case GL_BLEND_COLOR:
6916 {
6917 *type = GL_FLOAT;
6918 *numParams = 4;
6919 return true;
6920 }
6921 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
6922 if (!getExtensions().textureFilterAnisotropic)
6923 {
6924 return false;
6925 }
6926 *type = GL_FLOAT;
6927 *numParams = 1;
6928 return true;
6929 case GL_TIMESTAMP_EXT:
6930 if (!getExtensions().disjointTimerQuery)
6931 {
6932 return false;
6933 }
6934 *type = GL_INT_64_ANGLEX;
6935 *numParams = 1;
6936 return true;
6937 case GL_GPU_DISJOINT_EXT:
6938 if (!getExtensions().disjointTimerQuery)
6939 {
6940 return false;
6941 }
6942 *type = GL_INT;
6943 *numParams = 1;
6944 return true;
6945 case GL_COVERAGE_MODULATION_CHROMIUM:
6946 if (!getExtensions().framebufferMixedSamples)
6947 {
6948 return false;
6949 }
6950 *type = GL_INT;
6951 *numParams = 1;
6952 return true;
6953 case GL_TEXTURE_BINDING_EXTERNAL_OES:
6954 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
6955 {
6956 return false;
6957 }
6958 *type = GL_INT;
6959 *numParams = 1;
6960 return true;
6961 }
6962
6963 if (getExtensions().debug)
6964 {
6965 switch (pname)
6966 {
6967 case GL_DEBUG_LOGGED_MESSAGES:
6968 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
6969 case GL_DEBUG_GROUP_STACK_DEPTH:
6970 case GL_MAX_DEBUG_MESSAGE_LENGTH:
6971 case GL_MAX_DEBUG_LOGGED_MESSAGES:
6972 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
6973 case GL_MAX_LABEL_LENGTH:
6974 *type = GL_INT;
6975 *numParams = 1;
6976 return true;
6977
6978 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
6979 case GL_DEBUG_OUTPUT:
6980 *type = GL_BOOL;
6981 *numParams = 1;
6982 return true;
6983 }
6984 }
6985
6986 if (getExtensions().multisampleCompatibility)
6987 {
6988 switch (pname)
6989 {
6990 case GL_MULTISAMPLE_EXT:
6991 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
6992 *type = GL_BOOL;
6993 *numParams = 1;
6994 return true;
6995 }
6996 }
6997
6998 if (getExtensions().pathRendering)
6999 {
7000 switch (pname)
7001 {
7002 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7003 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7004 *type = GL_FLOAT;
7005 *numParams = 16;
7006 return true;
7007 }
7008 }
7009
7010 if (getExtensions().bindGeneratesResource)
7011 {
7012 switch (pname)
7013 {
7014 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7015 *type = GL_BOOL;
7016 *numParams = 1;
7017 return true;
7018 }
7019 }
7020
7021 if (getExtensions().clientArrays)
7022 {
7023 switch (pname)
7024 {
7025 case GL_CLIENT_ARRAYS_ANGLE:
7026 *type = GL_BOOL;
7027 *numParams = 1;
7028 return true;
7029 }
7030 }
7031
7032 if (getExtensions().sRGBWriteControl)
7033 {
7034 switch (pname)
7035 {
7036 case GL_FRAMEBUFFER_SRGB_EXT:
7037 *type = GL_BOOL;
7038 *numParams = 1;
7039 return true;
7040 }
7041 }
7042
7043 if (getExtensions().robustResourceInitialization &&
7044 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7045 {
7046 *type = GL_BOOL;
7047 *numParams = 1;
7048 return true;
7049 }
7050
7051 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7052 {
7053 *type = GL_BOOL;
7054 *numParams = 1;
7055 return true;
7056 }
7057
jchen1082af6202018-06-22 10:59:52 +08007058 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7059 {
7060 *type = GL_INT;
7061 *numParams = 1;
7062 return true;
7063 }
7064
Jamie Madill5b772312018-03-08 20:28:32 -05007065 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7066 switch (pname)
7067 {
7068 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7069 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7070 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7071 {
7072 return false;
7073 }
7074 *type = GL_INT;
7075 *numParams = 1;
7076 return true;
7077
7078 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7079 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7080 {
7081 return false;
7082 }
7083 *type = GL_INT;
7084 *numParams = 1;
7085 return true;
7086
7087 case GL_PROGRAM_BINARY_FORMATS_OES:
7088 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7089 {
7090 return false;
7091 }
7092 *type = GL_INT;
7093 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7094 return true;
7095
7096 case GL_PACK_ROW_LENGTH:
7097 case GL_PACK_SKIP_ROWS:
7098 case GL_PACK_SKIP_PIXELS:
7099 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7100 {
7101 return false;
7102 }
7103 *type = GL_INT;
7104 *numParams = 1;
7105 return true;
7106 case GL_UNPACK_ROW_LENGTH:
7107 case GL_UNPACK_SKIP_ROWS:
7108 case GL_UNPACK_SKIP_PIXELS:
7109 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7110 {
7111 return false;
7112 }
7113 *type = GL_INT;
7114 *numParams = 1;
7115 return true;
7116 case GL_VERTEX_ARRAY_BINDING:
7117 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7118 {
7119 return false;
7120 }
7121 *type = GL_INT;
7122 *numParams = 1;
7123 return true;
7124 case GL_PIXEL_PACK_BUFFER_BINDING:
7125 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7126 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7127 {
7128 return false;
7129 }
7130 *type = GL_INT;
7131 *numParams = 1;
7132 return true;
7133 case GL_MAX_SAMPLES:
7134 {
7135 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7136 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7137 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7138 {
7139 return false;
7140 }
7141 *type = GL_INT;
7142 *numParams = 1;
7143 return true;
7144
7145 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7146 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7147 {
7148 return false;
7149 }
7150 *type = GL_INT;
7151 *numParams = 1;
7152 return true;
7153 }
7154 }
7155
7156 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7157 {
7158 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7159 {
7160 return false;
7161 }
7162 *type = GL_INT;
7163 *numParams = 1;
7164 return true;
7165 }
7166
7167 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7168 {
7169 *type = GL_INT;
7170 *numParams = 1;
7171 return true;
7172 }
7173
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007174 if (getClientVersion() < Version(2, 0))
7175 {
7176 switch (pname)
7177 {
7178 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007179 case GL_CLIENT_ACTIVE_TEXTURE:
7180 case GL_MATRIX_MODE:
7181 case GL_MAX_TEXTURE_UNITS:
7182 case GL_MAX_MODELVIEW_STACK_DEPTH:
7183 case GL_MAX_PROJECTION_STACK_DEPTH:
7184 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007185 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007186 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007187 case GL_VERTEX_ARRAY_STRIDE:
7188 case GL_NORMAL_ARRAY_STRIDE:
7189 case GL_COLOR_ARRAY_STRIDE:
7190 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7191 case GL_VERTEX_ARRAY_SIZE:
7192 case GL_COLOR_ARRAY_SIZE:
7193 case GL_TEXTURE_COORD_ARRAY_SIZE:
7194 case GL_VERTEX_ARRAY_TYPE:
7195 case GL_NORMAL_ARRAY_TYPE:
7196 case GL_COLOR_ARRAY_TYPE:
7197 case GL_TEXTURE_COORD_ARRAY_TYPE:
7198 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7199 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7200 case GL_COLOR_ARRAY_BUFFER_BINDING:
7201 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7202 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7203 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7204 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007205 case GL_SHADE_MODEL:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007206 *type = GL_INT;
7207 *numParams = 1;
7208 return true;
7209 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007210 case GL_FOG_DENSITY:
7211 case GL_FOG_START:
7212 case GL_FOG_END:
7213 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007214 case GL_POINT_SIZE:
7215 case GL_POINT_SIZE_MIN:
7216 case GL_POINT_SIZE_MAX:
7217 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007218 *type = GL_FLOAT;
7219 *numParams = 1;
7220 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007221 case GL_SMOOTH_POINT_SIZE_RANGE:
7222 *type = GL_FLOAT;
7223 *numParams = 2;
7224 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007225 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007226 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007227 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007228 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007229 *type = GL_FLOAT;
7230 *numParams = 4;
7231 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007232 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007233 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007234 *type = GL_FLOAT;
7235 *numParams = 3;
7236 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007237 case GL_MODELVIEW_MATRIX:
7238 case GL_PROJECTION_MATRIX:
7239 case GL_TEXTURE_MATRIX:
7240 *type = GL_FLOAT;
7241 *numParams = 16;
7242 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007243 case GL_LIGHT_MODEL_TWO_SIDE:
7244 *type = GL_BOOL;
7245 *numParams = 1;
7246 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007247 }
7248 }
7249
Jamie Madill5b772312018-03-08 20:28:32 -05007250 if (getClientVersion() < Version(3, 0))
7251 {
7252 return false;
7253 }
7254
7255 // Check for ES3.0+ parameter names
7256 switch (pname)
7257 {
7258 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7259 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7260 case GL_UNIFORM_BUFFER_BINDING:
7261 case GL_TRANSFORM_FEEDBACK_BINDING:
7262 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7263 case GL_COPY_READ_BUFFER_BINDING:
7264 case GL_COPY_WRITE_BUFFER_BINDING:
7265 case GL_SAMPLER_BINDING:
7266 case GL_READ_BUFFER:
7267 case GL_TEXTURE_BINDING_3D:
7268 case GL_TEXTURE_BINDING_2D_ARRAY:
7269 case GL_MAX_3D_TEXTURE_SIZE:
7270 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7271 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7272 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7273 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7274 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7275 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7276 case GL_MAX_VARYING_COMPONENTS:
7277 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7278 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7279 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7280 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7281 case GL_NUM_EXTENSIONS:
7282 case GL_MAJOR_VERSION:
7283 case GL_MINOR_VERSION:
7284 case GL_MAX_ELEMENTS_INDICES:
7285 case GL_MAX_ELEMENTS_VERTICES:
7286 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7287 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7288 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7289 case GL_UNPACK_IMAGE_HEIGHT:
7290 case GL_UNPACK_SKIP_IMAGES:
7291 {
7292 *type = GL_INT;
7293 *numParams = 1;
7294 return true;
7295 }
7296
7297 case GL_MAX_ELEMENT_INDEX:
7298 case GL_MAX_UNIFORM_BLOCK_SIZE:
7299 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7300 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7301 case GL_MAX_SERVER_WAIT_TIMEOUT:
7302 {
7303 *type = GL_INT_64_ANGLEX;
7304 *numParams = 1;
7305 return true;
7306 }
7307
7308 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7309 case GL_TRANSFORM_FEEDBACK_PAUSED:
7310 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7311 case GL_RASTERIZER_DISCARD:
7312 {
7313 *type = GL_BOOL;
7314 *numParams = 1;
7315 return true;
7316 }
7317
7318 case GL_MAX_TEXTURE_LOD_BIAS:
7319 {
7320 *type = GL_FLOAT;
7321 *numParams = 1;
7322 return true;
7323 }
7324 }
7325
7326 if (getExtensions().requestExtension)
7327 {
7328 switch (pname)
7329 {
7330 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7331 *type = GL_INT;
7332 *numParams = 1;
7333 return true;
7334 }
7335 }
7336
7337 if (getClientVersion() < Version(3, 1))
7338 {
7339 return false;
7340 }
7341
7342 switch (pname)
7343 {
7344 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7345 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7346 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7347 case GL_MAX_FRAMEBUFFER_WIDTH:
7348 case GL_MAX_FRAMEBUFFER_HEIGHT:
7349 case GL_MAX_FRAMEBUFFER_SAMPLES:
7350 case GL_MAX_SAMPLE_MASK_WORDS:
7351 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7352 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7353 case GL_MAX_INTEGER_SAMPLES:
7354 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7355 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7356 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7357 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7358 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7359 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7360 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7361 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7362 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7363 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7364 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7365 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7366 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7367 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7368 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7369 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7370 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7371 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7372 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7373 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7374 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7375 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7376 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7377 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7378 case GL_MAX_UNIFORM_LOCATIONS:
7379 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7380 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7381 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7382 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7383 case GL_MAX_IMAGE_UNITS:
7384 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7385 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7386 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7387 case GL_SHADER_STORAGE_BUFFER_BINDING:
7388 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7389 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
7390 *type = GL_INT;
7391 *numParams = 1;
7392 return true;
7393 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7394 *type = GL_INT_64_ANGLEX;
7395 *numParams = 1;
7396 return true;
7397 case GL_SAMPLE_MASK:
7398 *type = GL_BOOL;
7399 *numParams = 1;
7400 return true;
7401 }
7402
7403 if (getExtensions().geometryShader)
7404 {
7405 switch (pname)
7406 {
7407 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7408 case GL_LAYER_PROVOKING_VERTEX_EXT:
7409 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7410 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7411 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7412 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7413 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7414 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7415 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7416 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7417 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7418 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7419 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7420 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7421 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7422 *type = GL_INT;
7423 *numParams = 1;
7424 return true;
7425 }
7426 }
7427
7428 return false;
7429}
7430
7431bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7432{
7433 if (getClientVersion() < Version(3, 0))
7434 {
7435 return false;
7436 }
7437
7438 switch (target)
7439 {
7440 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7441 case GL_UNIFORM_BUFFER_BINDING:
7442 {
7443 *type = GL_INT;
7444 *numParams = 1;
7445 return true;
7446 }
7447 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7448 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7449 case GL_UNIFORM_BUFFER_START:
7450 case GL_UNIFORM_BUFFER_SIZE:
7451 {
7452 *type = GL_INT_64_ANGLEX;
7453 *numParams = 1;
7454 return true;
7455 }
7456 }
7457
7458 if (getClientVersion() < Version(3, 1))
7459 {
7460 return false;
7461 }
7462
7463 switch (target)
7464 {
7465 case GL_IMAGE_BINDING_LAYERED:
7466 {
7467 *type = GL_BOOL;
7468 *numParams = 1;
7469 return true;
7470 }
7471 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7472 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7473 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7474 case GL_SHADER_STORAGE_BUFFER_BINDING:
7475 case GL_VERTEX_BINDING_BUFFER:
7476 case GL_VERTEX_BINDING_DIVISOR:
7477 case GL_VERTEX_BINDING_OFFSET:
7478 case GL_VERTEX_BINDING_STRIDE:
7479 case GL_SAMPLE_MASK_VALUE:
7480 case GL_IMAGE_BINDING_NAME:
7481 case GL_IMAGE_BINDING_LEVEL:
7482 case GL_IMAGE_BINDING_LAYER:
7483 case GL_IMAGE_BINDING_ACCESS:
7484 case GL_IMAGE_BINDING_FORMAT:
7485 {
7486 *type = GL_INT;
7487 *numParams = 1;
7488 return true;
7489 }
7490 case GL_ATOMIC_COUNTER_BUFFER_START:
7491 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7492 case GL_SHADER_STORAGE_BUFFER_START:
7493 case GL_SHADER_STORAGE_BUFFER_SIZE:
7494 {
7495 *type = GL_INT_64_ANGLEX;
7496 *numParams = 1;
7497 return true;
7498 }
7499 }
7500
7501 return false;
7502}
7503
7504Program *Context::getProgram(GLuint handle) const
7505{
7506 return mState.mShaderPrograms->getProgram(handle);
7507}
7508
7509Shader *Context::getShader(GLuint handle) const
7510{
7511 return mState.mShaderPrograms->getShader(handle);
7512}
7513
7514bool Context::isTextureGenerated(GLuint texture) const
7515{
7516 return mState.mTextures->isHandleGenerated(texture);
7517}
7518
7519bool Context::isBufferGenerated(GLuint buffer) const
7520{
7521 return mState.mBuffers->isHandleGenerated(buffer);
7522}
7523
7524bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7525{
7526 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7527}
7528
7529bool Context::isFramebufferGenerated(GLuint framebuffer) const
7530{
7531 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7532}
7533
7534bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7535{
7536 return mState.mPipelines->isHandleGenerated(pipeline);
7537}
7538
7539bool Context::usingDisplayTextureShareGroup() const
7540{
7541 return mDisplayTextureShareGroup;
7542}
7543
7544GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7545{
7546 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7547 internalformat == GL_DEPTH_STENCIL
7548 ? GL_DEPTH24_STENCIL8
7549 : internalformat;
7550}
7551
jchen1082af6202018-06-22 10:59:52 +08007552void Context::maxShaderCompilerThreads(GLuint count)
7553{
7554 mGLState.setMaxShaderCompilerThreads(count);
7555}
7556
Jamie Madill2eb65032018-07-30 10:25:57 -04007557bool Context::isGLES1() const
7558{
7559 return mState.getClientVersion() < Version(2, 0);
7560}
7561
Jamie Madilla11819d2018-07-30 10:26:01 -04007562void Context::onSubjectStateChange(const Context *context,
7563 angle::SubjectIndex index,
7564 angle::SubjectMessage message)
7565{
Jamie Madilla11819d2018-07-30 10:26:01 -04007566 switch (index)
7567 {
7568 case kVertexArraySubjectIndex:
7569 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
Jamie Madillc43cdad2018-08-08 15:49:25 -04007570 mStateCache.onVertexArraySizeChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04007571 break;
7572
7573 case kReadFramebufferSubjectIndex:
7574 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
7575 break;
7576
7577 case kDrawFramebufferSubjectIndex:
7578 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
7579 break;
7580
7581 default:
Jamie Madill6c43a012018-08-08 15:49:27 -04007582 ASSERT(index < mGLState.getActiveTexturesCache().size());
7583 mGLState.onActiveTextureStateChange(index);
Jamie Madilla11819d2018-07-30 10:26:01 -04007584 break;
7585 }
7586}
7587
Jamie Madill6b873dd2018-07-12 23:56:30 -04007588// ErrorSet implementation.
7589ErrorSet::ErrorSet(Context *context) : mContext(context)
7590{
7591}
7592
7593ErrorSet::~ErrorSet() = default;
7594
Jamie Madill306b6c12018-07-27 08:12:49 -04007595void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04007596{
7597 // This internal enum is used to filter internal errors that are already handled.
7598 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
7599 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
7600 {
7601 return;
7602 }
7603
7604 if (ANGLE_UNLIKELY(error.isError()))
7605 {
7606 GLenum code = error.getCode();
7607 mErrors.insert(code);
7608 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
7609 {
7610 mContext->markContextLost();
7611 }
7612
7613 ASSERT(!error.getMessage().empty());
7614 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
7615 error.getID(), GL_DEBUG_SEVERITY_HIGH,
7616 error.getMessage());
7617 }
7618}
7619
7620bool ErrorSet::empty() const
7621{
7622 return mErrors.empty();
7623}
7624
7625GLenum ErrorSet::popError()
7626{
7627 ASSERT(!empty());
7628 GLenum error = *mErrors.begin();
7629 mErrors.erase(mErrors.begin());
7630 return error;
7631}
Jamie Madilldc358af2018-07-31 11:22:13 -04007632
7633// StateCache implementation.
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007634StateCache::StateCache()
7635 : mCachedHasAnyEnabledClientAttrib(false),
7636 mCachedNonInstancedVertexElementLimit(0),
7637 mCachedInstancedVertexElementLimit(0)
Jamie Madilldc358af2018-07-31 11:22:13 -04007638{
7639}
7640
7641StateCache::~StateCache() = default;
7642
7643void StateCache::updateActiveAttribsMask(Context *context)
7644{
7645 bool isGLES1 = context->isGLES1();
7646 const State &glState = context->getGLState();
7647
7648 if (!isGLES1 && !glState.getProgram())
7649 {
7650 mCachedActiveBufferedAttribsMask = AttributesMask();
7651 mCachedActiveClientAttribsMask = AttributesMask();
7652 return;
7653 }
7654
7655 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
7656 : glState.getProgram()->getActiveAttribLocationsMask();
7657
7658 const VertexArray *vao = glState.getVertexArray();
7659 ASSERT(vao);
7660
7661 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
7662 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
7663
7664 activeAttribs &= enabledAttribs;
7665
7666 mCachedActiveClientAttribsMask = activeAttribs & clientAttribs;
7667 mCachedActiveBufferedAttribsMask = activeAttribs & ~clientAttribs;
7668 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
7669}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007670
7671void StateCache::updateVertexElementLimits(Context *context)
7672{
7673 const VertexArray *vao = context->getGLState().getVertexArray();
7674
7675 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
7676 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
7677
7678 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
7679 // If there are no buffered attributes then we should not limit the draw call count.
7680 if (!vao || !mCachedActiveBufferedAttribsMask.any())
7681 {
7682 return;
7683 }
7684
7685 const auto &vertexAttribs = vao->getVertexAttributes();
7686 const auto &vertexBindings = vao->getVertexBindings();
7687
7688 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
7689 {
7690 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
7691 ASSERT(attrib.enabled);
7692
7693 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
7694 ASSERT(context->isGLES1() ||
7695 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
7696
7697 GLint64 limit = attrib.getCachedElementLimit();
7698 if (binding.getDivisor() > 0)
7699 {
7700 mCachedInstancedVertexElementLimit =
7701 std::min(mCachedInstancedVertexElementLimit, limit);
7702 }
7703 else
7704 {
7705 mCachedNonInstancedVertexElementLimit =
7706 std::min(mCachedNonInstancedVertexElementLimit, limit);
7707 }
7708 }
7709}
Jamie Madillc43cdad2018-08-08 15:49:25 -04007710
7711void StateCache::onVertexArrayBindingChange(Context *context)
7712{
7713 updateActiveAttribsMask(context);
7714 updateVertexElementLimits(context);
7715}
7716
7717void StateCache::onProgramExecutableChange(Context *context)
7718{
7719 updateActiveAttribsMask(context);
7720 updateVertexElementLimits(context);
7721}
7722
7723void StateCache::onVertexArraySizeChange(Context *context)
7724{
7725 updateVertexElementLimits(context);
7726}
7727
7728void StateCache::onVertexArrayStateChange(Context *context)
7729{
7730 updateActiveAttribsMask(context);
7731 updateVertexElementLimits(context);
7732}
7733
7734void StateCache::onGLES1ClientStateChange(Context *context)
7735{
7736 updateActiveAttribsMask(context);
7737}
Jamie Madillc29968b2016-01-20 11:17:23 -05007738} // namespace gl