blob: 268384f2e34e438d731440c5ac5d3492249c0661 [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
Sami Väisänene45e53b2016-05-25 10:36:04 +030017#include "common/matrix_utils.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040018#include "common/platform.h"
Jamie Madillb9293972015-02-19 11:07:54 -050019#include "common/utilities.h"
Geoff Langc339c4e2016-11-29 10:37:36 -050020#include "common/version.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050021#include "libANGLE/Buffer.h"
Jamie Madillb9293972015-02-19 11:07:54 -050022#include "libANGLE/Compiler.h"
Jamie Madill948bbe52017-06-01 13:10:42 -040023#include "libANGLE/Display.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050024#include "libANGLE/Fence.h"
25#include "libANGLE/Framebuffer.h"
26#include "libANGLE/FramebufferAttachment.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030027#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050028#include "libANGLE/Program.h"
Yunchao Hea336b902017-08-02 16:05:21 +080029#include "libANGLE/ProgramPipeline.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050030#include "libANGLE/Query.h"
Jamie Madillb9293972015-02-19 11:07:54 -050031#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050032#include "libANGLE/ResourceManager.h"
33#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050034#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050035#include "libANGLE/Texture.h"
36#include "libANGLE/TransformFeedback.h"
37#include "libANGLE/VertexArray.h"
Kenneth Russellf2f6f652016-10-05 19:53:23 -070038#include "libANGLE/Workarounds.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040039#include "libANGLE/formatutils.h"
Martin Radev66fb8202016-07-28 11:45:20 +030040#include "libANGLE/queryconversions.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040041#include "libANGLE/queryutils.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040042#include "libANGLE/renderer/ContextImpl.h"
43#include "libANGLE/renderer/EGLImplFactory.h"
Jamie Madill7b62cf92017-11-02 15:20:49 -040044#include "libANGLE/renderer/Format.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040045#include "libANGLE/validationES.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000046
Geoff Langf6db0982015-08-25 13:04:00 -040047namespace
48{
49
Jamie Madillb6664922017-07-25 12:55:04 -040050#define ANGLE_HANDLE_ERR(X) \
51 handleError(X); \
52 return;
53#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
54
Ian Ewell3ffd78b2016-01-22 16:09:42 -050055template <typename T>
Geoff Lang4ddf5af2016-12-01 14:30:44 -050056std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030057 GLsizei numPaths,
58 const void *paths,
59 GLuint pathBase)
60{
61 std::vector<gl::Path *> ret;
62 ret.reserve(numPaths);
63
64 const auto *nameArray = static_cast<const T *>(paths);
65
66 for (GLsizei i = 0; i < numPaths; ++i)
67 {
68 const GLuint pathName = nameArray[i] + pathBase;
69
70 ret.push_back(resourceManager.getPath(pathName));
71 }
72
73 return ret;
74}
75
Geoff Lang4ddf5af2016-12-01 14:30:44 -050076std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030077 GLsizei numPaths,
78 GLenum pathNameType,
79 const void *paths,
80 GLuint pathBase)
81{
82 switch (pathNameType)
83 {
84 case GL_UNSIGNED_BYTE:
85 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
86
87 case GL_BYTE:
88 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
89
90 case GL_UNSIGNED_SHORT:
91 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
92
93 case GL_SHORT:
94 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
95
96 case GL_UNSIGNED_INT:
97 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
98
99 case GL_INT:
100 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
101 }
102
103 UNREACHABLE();
104 return std::vector<gl::Path *>();
105}
106
107template <typename T>
Geoff Lang2186c382016-10-14 10:54:54 -0400108gl::Error GetQueryObjectParameter(gl::Query *query, GLenum pname, T *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500109{
Geoff Lang2186c382016-10-14 10:54:54 -0400110 ASSERT(query != nullptr);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500111
112 switch (pname)
113 {
114 case GL_QUERY_RESULT_EXT:
Geoff Lang2186c382016-10-14 10:54:54 -0400115 return query->getResult(params);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500116 case GL_QUERY_RESULT_AVAILABLE_EXT:
117 {
118 bool available;
Geoff Lang2186c382016-10-14 10:54:54 -0400119 gl::Error error = query->isResultAvailable(&available);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500120 if (!error.isError())
121 {
jchen10a99ed552017-09-22 08:10:32 +0800122 *params = gl::CastFromStateValue<T>(pname, static_cast<GLuint>(available));
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500123 }
124 return error;
125 }
126 default:
127 UNREACHABLE();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500128 return gl::InternalError() << "Unreachable Error";
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500129 }
130}
131
Jamie Madill09463932018-04-04 05:26:59 -0400132void MarkTransformFeedbackBufferUsage(const gl::Context *context,
133 gl::TransformFeedback *transformFeedback,
James Darpinian30b604d2018-03-12 17:26:57 -0700134 GLsizei count,
135 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -0400136{
Geoff Lang1a683462015-09-29 15:09:59 -0400137 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400138 {
Jamie Madill09463932018-04-04 05:26:59 -0400139 transformFeedback->onVerticesDrawn(context, count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -0400140 }
141}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500142
143// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300144EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500145{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400146 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500147}
148
Martin Radev1be913c2016-07-11 17:59:16 +0300149EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
150{
151 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
152}
153
Geoff Langeb66a6e2016-10-31 13:06:12 -0400154gl::Version GetClientVersion(const egl::AttributeMap &attribs)
155{
156 return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
157}
158
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500159GLenum GetResetStrategy(const egl::AttributeMap &attribs)
160{
Lingfeng Yangb27b03a2018-02-19 13:38:48 -0800161 EGLAttrib attrib =
162 attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500163 switch (attrib)
164 {
165 case EGL_NO_RESET_NOTIFICATION:
166 return GL_NO_RESET_NOTIFICATION_EXT;
167 case EGL_LOSE_CONTEXT_ON_RESET:
168 return GL_LOSE_CONTEXT_ON_RESET_EXT;
169 default:
170 UNREACHABLE();
171 return GL_NONE;
172 }
173}
174
175bool GetRobustAccess(const egl::AttributeMap &attribs)
176{
Geoff Lang077f20a2016-11-01 10:08:02 -0400177 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
178 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
179 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500180}
181
182bool GetDebug(const egl::AttributeMap &attribs)
183{
Geoff Lang077f20a2016-11-01 10:08:02 -0400184 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
185 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500186}
187
188bool GetNoError(const egl::AttributeMap &attribs)
189{
190 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
191}
192
Geoff Langc287ea62016-09-16 14:46:51 -0400193bool GetWebGLContext(const egl::AttributeMap &attribs)
194{
195 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
196}
197
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400198bool GetExtensionsEnabled(const egl::AttributeMap &attribs, bool webGLContext)
199{
200 // If the context is WebGL, extensions are disabled by default
201 EGLAttrib defaultValue = webGLContext ? EGL_FALSE : EGL_TRUE;
202 return (attribs.get(EGL_EXTENSIONS_ENABLED_ANGLE, defaultValue) == EGL_TRUE);
203}
204
Geoff Langf41a7152016-09-19 15:11:17 -0400205bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
206{
207 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
208}
209
Geoff Langfeb8c682017-02-13 16:07:35 -0500210bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
211{
212 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
213}
214
Geoff Langb433e872017-10-05 14:01:47 -0400215bool GetRobustResourceInit(const egl::AttributeMap &attribs)
216{
217 return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
218}
219
Martin Radev9d901792016-07-15 15:58:58 +0300220std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
221{
222 std::string labelName;
223 if (label != nullptr)
224 {
225 size_t labelLength = length < 0 ? strlen(label) : length;
226 labelName = std::string(label, labelLength);
227 }
228 return labelName;
229}
230
231void GetObjectLabelBase(const std::string &objectLabel,
232 GLsizei bufSize,
233 GLsizei *length,
234 GLchar *label)
235{
236 size_t writeLength = objectLabel.length();
237 if (label != nullptr && bufSize > 0)
238 {
239 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
240 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
241 label[writeLength] = '\0';
242 }
243
244 if (length != nullptr)
245 {
246 *length = static_cast<GLsizei>(writeLength);
247 }
248}
249
Jamie Madill0f80ed82017-09-19 00:24:56 -0400250template <typename CapT, typename MaxT>
251void LimitCap(CapT *cap, MaxT maximum)
252{
253 *cap = std::min(*cap, static_cast<CapT>(maximum));
254}
255
Geoff Langf6db0982015-08-25 13:04:00 -0400256} // anonymous namespace
257
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000258namespace gl
259{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000260
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400261Context::Context(rx::EGLImplFactory *implFactory,
262 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400263 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500264 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400265 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500266 const egl::AttributeMap &attribs,
Geoff Langb433e872017-10-05 14:01:47 -0400267 const egl::DisplayExtensions &displayExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500268 : mState(reinterpret_cast<ContextID>(this),
269 shareContext ? &shareContext->mState : nullptr,
270 shareTextures,
271 GetClientVersion(attribs),
272 &mGLState,
273 mCaps,
274 mTextureCaps,
275 mExtensions,
276 mLimitations),
277 mSkipValidation(GetNoError(attribs)),
278 mDisplayTextureShareGroup(shareTextures != nullptr),
279 mSavedArgsType(nullptr),
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700280 mImplementation(implFactory->createContext(mState)),
Jamie Madill2f348d22017-06-05 10:50:59 -0400281 mCompiler(),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400282 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500283 mClientType(EGL_OPENGL_ES_API),
284 mHasBeenCurrent(false),
285 mContextLost(false),
286 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700287 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500288 mResetStrategy(GetResetStrategy(attribs)),
289 mRobustAccess(GetRobustAccess(attribs)),
Jamie Madill61e16b42017-06-19 11:13:23 -0400290 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
291 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500292 mSurfacelessFramebuffer(nullptr),
Jamie Madille14951e2017-03-09 18:55:16 -0500293 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400294 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400295 mMemoryProgramCache(memoryProgramCache),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400296 mScratchBuffer(1000u),
297 mZeroFilledBuffer(1000u)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000298{
Jamie Madill5b772312018-03-08 20:28:32 -0500299 // Needed to solve a Clang warning of unused variables.
300 UNUSED_VARIABLE(mSavedArgsType);
301 UNUSED_VARIABLE(mParamsBuffer);
302
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400303 mImplementation->setMemoryProgramCache(memoryProgramCache);
304
Geoff Langb433e872017-10-05 14:01:47 -0400305 bool robustResourceInit = GetRobustResourceInit(attribs);
306 initCaps(displayExtensions, robustResourceInit);
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700307 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400308
Jamie Madill4928b7c2017-06-20 12:57:39 -0400309 mGLState.initialize(this, GetDebug(attribs), GetBindGeneratesResource(attribs),
Jamie Madillc43be722017-07-13 16:22:14 -0400310 GetClientArraysEnabled(attribs), robustResourceInit,
311 mMemoryProgramCache != nullptr);
Régis Fénéon83107972015-02-05 12:57:44 +0100312
Shannon Woods53a94a82014-06-24 15:20:36 -0400313 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400314
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000315 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400316 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000317 // and cube map texture state vectors respectively associated with them.
318 // In order that access to these initial textures not be lost, they are treated as texture
319 // objects all of whose names are 0.
320
Corentin Wallez99d492c2018-02-27 15:17:10 -0500321 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800322 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500323
Corentin Wallez99d492c2018-02-27 15:17:10 -0500324 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800325 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400326
Geoff Langeb66a6e2016-10-31 13:06:12 -0400327 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400328 {
329 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500330 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800331 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400332
Corentin Wallez99d492c2018-02-27 15:17:10 -0500333 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800334 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400335 }
Geoff Lang3b573612016-10-31 14:08:10 -0400336 if (getClientVersion() >= Version(3, 1))
337 {
338 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500339 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800340 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800341
Jiajia Qin6eafb042016-12-27 17:04:07 +0800342 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
343 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800344 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800345 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800346
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800347 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
348 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400349 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800350 }
Geoff Lang3b573612016-10-31 14:08:10 -0400351 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000352
Geoff Lang4751aab2017-10-30 15:14:52 -0400353 const Extensions &nativeExtensions = mImplementation->getNativeExtensions();
354 if (nativeExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400355 {
356 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500357 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800358 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400359 }
360
Geoff Lang4751aab2017-10-30 15:14:52 -0400361 if (nativeExtensions.eglImageExternal || nativeExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400362 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500363 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800364 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400365 }
366
Jamie Madill4928b7c2017-06-20 12:57:39 -0400367 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500368
Jamie Madill57a89722013-07-02 11:57:03 -0400369 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000370
Geoff Langeb66a6e2016-10-31 13:06:12 -0400371 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400372 {
373 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
374 // In the initial state, a default transform feedback object is bound and treated as
375 // a transform feedback object with a name of zero. That object is bound any time
376 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400377 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400378 }
Geoff Langc8058452014-02-03 12:04:11 -0500379
Corentin Wallez336129f2017-10-17 15:55:40 -0400380 for (auto type : angle::AllEnums<BufferBinding>())
381 {
382 bindBuffer(type, 0);
383 }
384
385 bindRenderbuffer(GL_RENDERBUFFER, 0);
386
387 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
388 {
389 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
390 }
391
Jamie Madillad9f24e2016-02-12 09:27:24 -0500392 // Initialize dirty bit masks
Jamie Madillc67323a2017-11-02 23:11:41 -0400393 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500394 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500395 // No dirty objects.
396
397 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400398 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500399 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500400 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
401
402 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
403 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
404 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
405 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
406 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
407 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
408 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
409 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
410 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
411 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
412 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
413 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
414
415 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
416 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700417 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500418 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
419 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400420
Xinghua Cao10a4d432017-11-28 14:46:26 +0800421 // TODO(xinghua.cao@intel.com): add other dirty bits and dirty objects.
422 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
423 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
424 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
425 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
426 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800427 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800428 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800429
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400430 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000431}
432
Jamie Madill4928b7c2017-06-20 12:57:39 -0400433egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000434{
Jamie Madille7b3fe22018-04-05 09:42:46 -0400435 // Delete the Surface first to trigger a finish() in Vulkan.
436 SafeDelete(mSurfacelessFramebuffer);
437
438 ANGLE_TRY(releaseSurface(display));
439
Corentin Wallez80b24112015-08-25 16:41:57 -0400440 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000441 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400442 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000443 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400444 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000445
Corentin Wallez80b24112015-08-25 16:41:57 -0400446 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000447 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400448 if (query.second != nullptr)
449 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400450 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400451 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000452 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400453 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000454
Corentin Wallez80b24112015-08-25 16:41:57 -0400455 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400456 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400457 if (vertexArray.second)
458 {
459 vertexArray.second->onDestroy(this);
460 }
Jamie Madill57a89722013-07-02 11:57:03 -0400461 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400462 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400463
Corentin Wallez80b24112015-08-25 16:41:57 -0400464 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500465 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500466 if (transformFeedback.second != nullptr)
467 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500468 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500469 }
Geoff Langc8058452014-02-03 12:04:11 -0500470 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400471 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500472
Jamie Madill5b772312018-03-08 20:28:32 -0500473 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400474 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800475 if (zeroTexture.get() != nullptr)
476 {
477 ANGLE_TRY(zeroTexture->onDestroy(this));
478 zeroTexture.set(this, nullptr);
479 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400480 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000481
Jamie Madill2f348d22017-06-05 10:50:59 -0400482 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500483
Jamie Madill4928b7c2017-06-20 12:57:39 -0400484 mGLState.reset(this);
485
Jamie Madill6c1f6712017-02-14 19:08:04 -0500486 mState.mBuffers->release(this);
487 mState.mShaderPrograms->release(this);
488 mState.mTextures->release(this);
489 mState.mRenderbuffers->release(this);
490 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400491 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500492 mState.mPaths->release(this);
493 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800494 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400495
Jamie Madill76e471e2017-10-21 09:56:01 -0400496 mImplementation->onDestroy(this);
497
Jamie Madill4928b7c2017-06-20 12:57:39 -0400498 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000499}
500
Jamie Madill70ee0f62017-02-06 16:04:20 -0500501Context::~Context()
502{
503}
504
Jamie Madill4928b7c2017-06-20 12:57:39 -0400505egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000506{
Jamie Madill61e16b42017-06-19 11:13:23 -0400507 mCurrentDisplay = display;
508
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000509 if (!mHasBeenCurrent)
510 {
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000511 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500512 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400513 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000514
Corentin Wallezc295e512017-01-27 17:47:50 -0500515 int width = 0;
516 int height = 0;
517 if (surface != nullptr)
518 {
519 width = surface->getWidth();
520 height = surface->getHeight();
521 }
522
523 mGLState.setViewportParams(0, 0, width, height);
524 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000525
526 mHasBeenCurrent = true;
527 }
528
Jamie Madill1b94d432015-08-07 13:23:23 -0400529 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700530 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400531 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400532
Jamie Madill4928b7c2017-06-20 12:57:39 -0400533 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500534
535 Framebuffer *newDefault = nullptr;
536 if (surface != nullptr)
537 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400538 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500539 mCurrentSurface = surface;
540 newDefault = surface->getDefaultFramebuffer();
541 }
542 else
543 {
544 if (mSurfacelessFramebuffer == nullptr)
545 {
546 mSurfacelessFramebuffer = new Framebuffer(mImplementation.get());
547 }
548
549 newDefault = mSurfacelessFramebuffer;
550 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000551
Corentin Wallez37c39792015-08-20 14:19:46 -0400552 // Update default framebuffer, the binding of the previous default
553 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400554 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700555 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400556 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700557 mGLState.setReadFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400558 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700559 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400560 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700561 mGLState.setDrawFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400562 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500563 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400564 }
Ian Ewell292f0052016-02-04 10:37:32 -0500565
566 // Notify the renderer of a context switch
Jamie Madill4928b7c2017-06-20 12:57:39 -0400567 mImplementation->onMakeCurrent(this);
568 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000569}
570
Jamie Madill4928b7c2017-06-20 12:57:39 -0400571egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400572{
Corentin Wallez37c39792015-08-20 14:19:46 -0400573 // Remove the default framebuffer
Corentin Wallezc295e512017-01-27 17:47:50 -0500574 Framebuffer *currentDefault = nullptr;
575 if (mCurrentSurface != nullptr)
Corentin Wallez51706ea2015-08-07 14:39:22 -0400576 {
Corentin Wallezc295e512017-01-27 17:47:50 -0500577 currentDefault = mCurrentSurface->getDefaultFramebuffer();
578 }
579 else if (mSurfacelessFramebuffer != nullptr)
580 {
581 currentDefault = mSurfacelessFramebuffer;
Corentin Wallez51706ea2015-08-07 14:39:22 -0400582 }
583
Corentin Wallezc295e512017-01-27 17:47:50 -0500584 if (mGLState.getReadFramebuffer() == currentDefault)
585 {
586 mGLState.setReadFramebufferBinding(nullptr);
587 }
588 if (mGLState.getDrawFramebuffer() == currentDefault)
589 {
590 mGLState.setDrawFramebufferBinding(nullptr);
591 }
592 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
593
594 if (mCurrentSurface)
595 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400596 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500597 mCurrentSurface = nullptr;
598 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400599
600 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400601}
602
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000603GLuint Context::createBuffer()
604{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500605 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000606}
607
608GLuint Context::createProgram()
609{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500610 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000611}
612
Jiawei Shao385b3e02018-03-21 09:43:28 +0800613GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000614{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500615 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000616}
617
618GLuint Context::createTexture()
619{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500620 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000621}
622
623GLuint Context::createRenderbuffer()
624{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500625 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000626}
627
Sami Väisänene45e53b2016-05-25 10:36:04 +0300628GLuint Context::createPaths(GLsizei range)
629{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500630 auto resultOrError = mState.mPaths->createPaths(mImplementation.get(), range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300631 if (resultOrError.isError())
632 {
633 handleError(resultOrError.getError());
634 return 0;
635 }
636 return resultOrError.getResult();
637}
638
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000639// Returns an unused framebuffer name
640GLuint Context::createFramebuffer()
641{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500642 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000643}
644
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500645void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000646{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500647 for (int i = 0; i < n; i++)
648 {
649 GLuint handle = mFenceNVHandleAllocator.allocate();
650 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
651 fences[i] = handle;
652 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000653}
654
Yunchao Hea336b902017-08-02 16:05:21 +0800655GLuint Context::createProgramPipeline()
656{
657 return mState.mPipelines->createProgramPipeline();
658}
659
Jiawei Shao385b3e02018-03-21 09:43:28 +0800660GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800661{
662 UNIMPLEMENTED();
663 return 0u;
664}
665
James Darpinian4d9d4832018-03-13 12:43:28 -0700666void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000667{
James Darpinian4d9d4832018-03-13 12:43:28 -0700668 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
669 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000670 {
671 detachBuffer(buffer);
672 }
Jamie Madill893ab082014-05-16 16:56:10 -0400673
James Darpinian4d9d4832018-03-13 12:43:28 -0700674 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000675}
676
677void Context::deleteShader(GLuint shader)
678{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500679 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000680}
681
682void Context::deleteProgram(GLuint program)
683{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500684 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000685}
686
687void Context::deleteTexture(GLuint texture)
688{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500689 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000690 {
691 detachTexture(texture);
692 }
693
Jamie Madill6c1f6712017-02-14 19:08:04 -0500694 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000695}
696
697void Context::deleteRenderbuffer(GLuint renderbuffer)
698{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500699 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000700 {
701 detachRenderbuffer(renderbuffer);
702 }
Jamie Madill893ab082014-05-16 16:56:10 -0400703
Jamie Madill6c1f6712017-02-14 19:08:04 -0500704 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000705}
706
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400707void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400708{
709 // The spec specifies the underlying Fence object is not deleted until all current
710 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
711 // and since our API is currently designed for being called from a single thread, we can delete
712 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400713 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400714}
715
Yunchao Hea336b902017-08-02 16:05:21 +0800716void Context::deleteProgramPipeline(GLuint pipeline)
717{
718 if (mState.mPipelines->getProgramPipeline(pipeline))
719 {
720 detachProgramPipeline(pipeline);
721 }
722
723 mState.mPipelines->deleteObject(this, pipeline);
724}
725
Sami Väisänene45e53b2016-05-25 10:36:04 +0300726void Context::deletePaths(GLuint first, GLsizei range)
727{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500728 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300729}
730
731bool Context::hasPathData(GLuint path) const
732{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500733 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300734 if (pathObj == nullptr)
735 return false;
736
737 return pathObj->hasPathData();
738}
739
740bool Context::hasPath(GLuint path) const
741{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500742 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300743}
744
745void Context::setPathCommands(GLuint path,
746 GLsizei numCommands,
747 const GLubyte *commands,
748 GLsizei numCoords,
749 GLenum coordType,
750 const void *coords)
751{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500752 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300753
754 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
755}
756
Jamie Madill007530e2017-12-28 14:27:04 -0500757void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300758{
Jamie Madill007530e2017-12-28 14:27:04 -0500759 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300760
761 switch (pname)
762 {
763 case GL_PATH_STROKE_WIDTH_CHROMIUM:
764 pathObj->setStrokeWidth(value);
765 break;
766 case GL_PATH_END_CAPS_CHROMIUM:
767 pathObj->setEndCaps(static_cast<GLenum>(value));
768 break;
769 case GL_PATH_JOIN_STYLE_CHROMIUM:
770 pathObj->setJoinStyle(static_cast<GLenum>(value));
771 break;
772 case GL_PATH_MITER_LIMIT_CHROMIUM:
773 pathObj->setMiterLimit(value);
774 break;
775 case GL_PATH_STROKE_BOUND_CHROMIUM:
776 pathObj->setStrokeBound(value);
777 break;
778 default:
779 UNREACHABLE();
780 break;
781 }
782}
783
Jamie Madill007530e2017-12-28 14:27:04 -0500784void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300785{
Jamie Madill007530e2017-12-28 14:27:04 -0500786 // TODO(jmadill): Should use proper clamping/casting.
787 pathParameterf(path, pname, static_cast<GLfloat>(value));
788}
789
790void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
791{
792 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300793
794 switch (pname)
795 {
796 case GL_PATH_STROKE_WIDTH_CHROMIUM:
797 *value = pathObj->getStrokeWidth();
798 break;
799 case GL_PATH_END_CAPS_CHROMIUM:
800 *value = static_cast<GLfloat>(pathObj->getEndCaps());
801 break;
802 case GL_PATH_JOIN_STYLE_CHROMIUM:
803 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
804 break;
805 case GL_PATH_MITER_LIMIT_CHROMIUM:
806 *value = pathObj->getMiterLimit();
807 break;
808 case GL_PATH_STROKE_BOUND_CHROMIUM:
809 *value = pathObj->getStrokeBound();
810 break;
811 default:
812 UNREACHABLE();
813 break;
814 }
815}
816
Jamie Madill007530e2017-12-28 14:27:04 -0500817void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
818{
819 GLfloat val = 0.0f;
820 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
821 if (value)
822 *value = static_cast<GLint>(val);
823}
824
Sami Väisänene45e53b2016-05-25 10:36:04 +0300825void Context::setPathStencilFunc(GLenum func, GLint ref, GLuint mask)
826{
827 mGLState.setPathStencilFunc(func, ref, mask);
828}
829
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000830void Context::deleteFramebuffer(GLuint framebuffer)
831{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500832 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000833 {
834 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000835 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500836
Jamie Madill6c1f6712017-02-14 19:08:04 -0500837 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000838}
839
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500840void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000841{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500842 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000843 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500844 GLuint fence = fences[i];
845
846 FenceNV *fenceObject = nullptr;
847 if (mFenceNVMap.erase(fence, &fenceObject))
848 {
849 mFenceNVHandleAllocator.release(fence);
850 delete fenceObject;
851 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000852 }
853}
854
Geoff Lang70d0f492015-12-10 17:45:46 -0500855Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000856{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500857 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000858}
859
Jamie Madill570f7c82014-07-03 10:38:54 -0400860Texture *Context::getTexture(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000861{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500862 return mState.mTextures->getTexture(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000863}
864
Geoff Lang70d0f492015-12-10 17:45:46 -0500865Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000866{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500867 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000868}
869
Jamie Madill70b5bb02017-08-28 13:32:37 -0400870Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400871{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400872 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400873}
874
Jamie Madill57a89722013-07-02 11:57:03 -0400875VertexArray *Context::getVertexArray(GLuint handle) const
876{
Jamie Madill96a483b2017-06-27 16:49:21 -0400877 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400878}
879
Jamie Madilldc356042013-07-19 16:36:57 -0400880Sampler *Context::getSampler(GLuint handle) const
881{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500882 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -0400883}
884
Geoff Langc8058452014-02-03 12:04:11 -0500885TransformFeedback *Context::getTransformFeedback(GLuint handle) const
886{
Jamie Madill96a483b2017-06-27 16:49:21 -0400887 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -0500888}
889
Yunchao Hea336b902017-08-02 16:05:21 +0800890ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
891{
892 return mState.mPipelines->getProgramPipeline(handle);
893}
894
Geoff Lang70d0f492015-12-10 17:45:46 -0500895LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
896{
897 switch (identifier)
898 {
899 case GL_BUFFER:
900 return getBuffer(name);
901 case GL_SHADER:
902 return getShader(name);
903 case GL_PROGRAM:
904 return getProgram(name);
905 case GL_VERTEX_ARRAY:
906 return getVertexArray(name);
907 case GL_QUERY:
908 return getQuery(name);
909 case GL_TRANSFORM_FEEDBACK:
910 return getTransformFeedback(name);
911 case GL_SAMPLER:
912 return getSampler(name);
913 case GL_TEXTURE:
914 return getTexture(name);
915 case GL_RENDERBUFFER:
916 return getRenderbuffer(name);
917 case GL_FRAMEBUFFER:
918 return getFramebuffer(name);
919 default:
920 UNREACHABLE();
921 return nullptr;
922 }
923}
924
925LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
926{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400927 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -0500928}
929
Martin Radev9d901792016-07-15 15:58:58 +0300930void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
931{
932 LabeledObject *object = getLabeledObject(identifier, name);
933 ASSERT(object != nullptr);
934
935 std::string labelName = GetObjectLabelFromPointer(length, label);
936 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -0400937
938 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
939 // specified object is active until we do this.
940 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +0300941}
942
943void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
944{
945 LabeledObject *object = getLabeledObjectFromPtr(ptr);
946 ASSERT(object != nullptr);
947
948 std::string labelName = GetObjectLabelFromPointer(length, label);
949 object->setLabel(labelName);
950}
951
952void Context::getObjectLabel(GLenum identifier,
953 GLuint name,
954 GLsizei bufSize,
955 GLsizei *length,
956 GLchar *label) const
957{
958 LabeledObject *object = getLabeledObject(identifier, name);
959 ASSERT(object != nullptr);
960
961 const std::string &objectLabel = object->getLabel();
962 GetObjectLabelBase(objectLabel, bufSize, length, label);
963}
964
965void Context::getObjectPtrLabel(const void *ptr,
966 GLsizei bufSize,
967 GLsizei *length,
968 GLchar *label) const
969{
970 LabeledObject *object = getLabeledObjectFromPtr(ptr);
971 ASSERT(object != nullptr);
972
973 const std::string &objectLabel = object->getLabel();
974 GetObjectLabelBase(objectLabel, bufSize, length, label);
975}
976
Jamie Madilldc356042013-07-19 16:36:57 -0400977bool Context::isSampler(GLuint samplerName) const
978{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500979 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -0400980}
981
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800982void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000983{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500984 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000985
Jamie Madilldedd7b92014-11-05 16:30:36 -0500986 if (handle == 0)
987 {
988 texture = mZeroTextures[target].get();
989 }
990 else
991 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500992 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500993 }
994
995 ASSERT(texture);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400996 mGLState.setSamplerTexture(this, target, texture);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000997}
998
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500999void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001000{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001001 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1002 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001003 mGLState.setReadFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001004}
1005
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001006void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001007{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001008 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1009 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001010 mGLState.setDrawFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001011}
1012
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001013void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001014{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001015 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001016 mGLState.setVertexArrayBinding(vertexArray);
Jamie Madill57a89722013-07-02 11:57:03 -04001017}
1018
Shao80957d92017-02-20 21:25:59 +08001019void Context::bindVertexBuffer(GLuint bindingIndex,
1020 GLuint bufferHandle,
1021 GLintptr offset,
1022 GLsizei stride)
1023{
1024 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001025 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Shao80957d92017-02-20 21:25:59 +08001026}
1027
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001028void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001029{
Geoff Lang76b10c92014-09-05 16:28:14 -04001030 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001031 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001032 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001033 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001034}
1035
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001036void Context::bindImageTexture(GLuint unit,
1037 GLuint texture,
1038 GLint level,
1039 GLboolean layered,
1040 GLint layer,
1041 GLenum access,
1042 GLenum format)
1043{
1044 Texture *tex = mState.mTextures->getTexture(texture);
1045 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1046}
1047
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001048void Context::useProgram(GLuint program)
1049{
Jamie Madill6c1f6712017-02-14 19:08:04 -05001050 mGLState.setProgram(this, getProgram(program));
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001051}
1052
Jiajia Qin5451d532017-11-16 17:16:34 +08001053void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1054{
1055 UNIMPLEMENTED();
1056}
1057
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001058void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001059{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001060 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001061 TransformFeedback *transformFeedback =
1062 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001063 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -05001064}
1065
Yunchao Hea336b902017-08-02 16:05:21 +08001066void Context::bindProgramPipeline(GLuint pipelineHandle)
1067{
1068 ProgramPipeline *pipeline =
1069 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1070 mGLState.setProgramPipelineBinding(this, pipeline);
1071}
1072
Jamie Madillf0e04492017-08-26 15:28:42 -04001073void Context::beginQuery(GLenum target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001074{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001075 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001076 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001077
Geoff Lang5aad9672014-09-08 11:10:42 -04001078 // begin query
Jamie Madillf0e04492017-08-26 15:28:42 -04001079 ANGLE_CONTEXT_TRY(queryObject->begin());
Geoff Lang5aad9672014-09-08 11:10:42 -04001080
1081 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001082 mGLState.setActiveQuery(this, target, queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001083}
1084
Jamie Madillf0e04492017-08-26 15:28:42 -04001085void Context::endQuery(GLenum target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001086{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001087 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001088 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001089
Jamie Madillf0e04492017-08-26 15:28:42 -04001090 handleError(queryObject->end());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001091
Geoff Lang5aad9672014-09-08 11:10:42 -04001092 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001093 mGLState.setActiveQuery(this, target, nullptr);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001094}
1095
Jamie Madillf0e04492017-08-26 15:28:42 -04001096void Context::queryCounter(GLuint id, GLenum target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001097{
1098 ASSERT(target == GL_TIMESTAMP_EXT);
1099
1100 Query *queryObject = getQuery(id, true, target);
1101 ASSERT(queryObject);
1102
Jamie Madillf0e04492017-08-26 15:28:42 -04001103 handleError(queryObject->queryCounter());
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001104}
1105
1106void Context::getQueryiv(GLenum target, GLenum pname, GLint *params)
1107{
1108 switch (pname)
1109 {
1110 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001111 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001112 break;
1113 case GL_QUERY_COUNTER_BITS_EXT:
1114 switch (target)
1115 {
1116 case GL_TIME_ELAPSED_EXT:
1117 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1118 break;
1119 case GL_TIMESTAMP_EXT:
1120 params[0] = getExtensions().queryCounterBitsTimestamp;
1121 break;
1122 default:
1123 UNREACHABLE();
1124 params[0] = 0;
1125 break;
1126 }
1127 break;
1128 default:
1129 UNREACHABLE();
1130 return;
1131 }
1132}
1133
Geoff Lang2186c382016-10-14 10:54:54 -04001134void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001135{
Geoff Lang2186c382016-10-14 10:54:54 -04001136 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001137}
1138
Geoff Lang2186c382016-10-14 10:54:54 -04001139void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001140{
Geoff Lang2186c382016-10-14 10:54:54 -04001141 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001142}
1143
Geoff Lang2186c382016-10-14 10:54:54 -04001144void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001145{
Geoff Lang2186c382016-10-14 10:54:54 -04001146 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001147}
1148
Geoff Lang2186c382016-10-14 10:54:54 -04001149void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001150{
Geoff Lang2186c382016-10-14 10:54:54 -04001151 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001152}
1153
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001154Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001155{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001156 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001157}
1158
Jamie Madill2f348d22017-06-05 10:50:59 -04001159FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001160{
Jamie Madill96a483b2017-06-27 16:49:21 -04001161 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001162}
1163
Jamie Madill2f348d22017-06-05 10:50:59 -04001164Query *Context::getQuery(GLuint handle, bool create, GLenum type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001165{
Jamie Madill96a483b2017-06-27 16:49:21 -04001166 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001167 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001168 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001169 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001170
1171 Query *query = mQueryMap.query(handle);
1172 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001173 {
Jamie Madill96a483b2017-06-27 16:49:21 -04001174 query = new Query(mImplementation->createQuery(type), handle);
1175 query->addRef();
1176 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001177 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001178 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001179}
1180
Geoff Lang70d0f492015-12-10 17:45:46 -05001181Query *Context::getQuery(GLuint handle) const
1182{
Jamie Madill96a483b2017-06-27 16:49:21 -04001183 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001184}
1185
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001186Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001187{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001188 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1189 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001190}
1191
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001192Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001193{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001194 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001195}
1196
Geoff Lang492a7e42014-11-05 13:27:06 -05001197Compiler *Context::getCompiler() const
1198{
Jamie Madill2f348d22017-06-05 10:50:59 -04001199 if (mCompiler.get() == nullptr)
1200 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001201 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001202 }
1203 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001204}
1205
Jamie Madillc1d770e2017-04-13 17:31:24 -04001206void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001207{
1208 switch (pname)
1209 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001210 case GL_SHADER_COMPILER:
1211 *params = GL_TRUE;
1212 break;
1213 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1214 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1215 break;
1216 default:
1217 mGLState.getBooleanv(pname, params);
1218 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001219 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001220}
1221
Jamie Madillc1d770e2017-04-13 17:31:24 -04001222void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001223{
Shannon Woods53a94a82014-06-24 15:20:36 -04001224 // Queries about context capabilities and maximums are answered by Context.
1225 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001226 switch (pname)
1227 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001228 case GL_ALIASED_LINE_WIDTH_RANGE:
1229 params[0] = mCaps.minAliasedLineWidth;
1230 params[1] = mCaps.maxAliasedLineWidth;
1231 break;
1232 case GL_ALIASED_POINT_SIZE_RANGE:
1233 params[0] = mCaps.minAliasedPointSize;
1234 params[1] = mCaps.maxAliasedPointSize;
1235 break;
1236 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1237 ASSERT(mExtensions.textureFilterAnisotropic);
1238 *params = mExtensions.maxTextureAnisotropy;
1239 break;
1240 case GL_MAX_TEXTURE_LOD_BIAS:
1241 *params = mCaps.maxLODBias;
1242 break;
1243
1244 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1245 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1246 {
1247 ASSERT(mExtensions.pathRendering);
1248 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1249 memcpy(params, m, 16 * sizeof(GLfloat));
1250 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001251 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001252
Jamie Madill231c7f52017-04-26 13:45:37 -04001253 default:
1254 mGLState.getFloatv(pname, params);
1255 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001256 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001257}
1258
Jamie Madillc1d770e2017-04-13 17:31:24 -04001259void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001260{
Shannon Woods53a94a82014-06-24 15:20:36 -04001261 // Queries about context capabilities and maximums are answered by Context.
1262 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001263
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001264 switch (pname)
1265 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001266 case GL_MAX_VERTEX_ATTRIBS:
1267 *params = mCaps.maxVertexAttributes;
1268 break;
1269 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1270 *params = mCaps.maxVertexUniformVectors;
1271 break;
1272 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
1273 *params = mCaps.maxVertexUniformComponents;
1274 break;
1275 case GL_MAX_VARYING_VECTORS:
1276 *params = mCaps.maxVaryingVectors;
1277 break;
1278 case GL_MAX_VARYING_COMPONENTS:
1279 *params = mCaps.maxVertexOutputComponents;
1280 break;
1281 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1282 *params = mCaps.maxCombinedTextureImageUnits;
1283 break;
1284 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
1285 *params = mCaps.maxVertexTextureImageUnits;
1286 break;
1287 case GL_MAX_TEXTURE_IMAGE_UNITS:
1288 *params = mCaps.maxTextureImageUnits;
1289 break;
1290 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1291 *params = mCaps.maxFragmentUniformVectors;
1292 break;
1293 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
1294 *params = mCaps.maxFragmentUniformComponents;
1295 break;
1296 case GL_MAX_RENDERBUFFER_SIZE:
1297 *params = mCaps.maxRenderbufferSize;
1298 break;
1299 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1300 *params = mCaps.maxColorAttachments;
1301 break;
1302 case GL_MAX_DRAW_BUFFERS_EXT:
1303 *params = mCaps.maxDrawBuffers;
1304 break;
1305 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1306 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1307 case GL_SUBPIXEL_BITS:
1308 *params = 4;
1309 break;
1310 case GL_MAX_TEXTURE_SIZE:
1311 *params = mCaps.max2DTextureSize;
1312 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001313 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1314 *params = mCaps.maxRectangleTextureSize;
1315 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001316 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1317 *params = mCaps.maxCubeMapTextureSize;
1318 break;
1319 case GL_MAX_3D_TEXTURE_SIZE:
1320 *params = mCaps.max3DTextureSize;
1321 break;
1322 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1323 *params = mCaps.maxArrayTextureLayers;
1324 break;
1325 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1326 *params = mCaps.uniformBufferOffsetAlignment;
1327 break;
1328 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1329 *params = mCaps.maxUniformBufferBindings;
1330 break;
1331 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
1332 *params = mCaps.maxVertexUniformBlocks;
1333 break;
1334 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
1335 *params = mCaps.maxFragmentUniformBlocks;
1336 break;
1337 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1338 *params = mCaps.maxCombinedTextureImageUnits;
1339 break;
1340 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1341 *params = mCaps.maxVertexOutputComponents;
1342 break;
1343 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1344 *params = mCaps.maxFragmentInputComponents;
1345 break;
1346 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1347 *params = mCaps.minProgramTexelOffset;
1348 break;
1349 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1350 *params = mCaps.maxProgramTexelOffset;
1351 break;
1352 case GL_MAJOR_VERSION:
1353 *params = getClientVersion().major;
1354 break;
1355 case GL_MINOR_VERSION:
1356 *params = getClientVersion().minor;
1357 break;
1358 case GL_MAX_ELEMENTS_INDICES:
1359 *params = mCaps.maxElementsIndices;
1360 break;
1361 case GL_MAX_ELEMENTS_VERTICES:
1362 *params = mCaps.maxElementsVertices;
1363 break;
1364 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1365 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1366 break;
1367 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1368 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1369 break;
1370 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1371 *params = mCaps.maxTransformFeedbackSeparateComponents;
1372 break;
1373 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1374 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1375 break;
1376 case GL_MAX_SAMPLES_ANGLE:
1377 *params = mCaps.maxSamples;
1378 break;
1379 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001380 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001381 params[0] = mCaps.maxViewportWidth;
1382 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001383 }
1384 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001385 case GL_COMPRESSED_TEXTURE_FORMATS:
1386 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1387 params);
1388 break;
1389 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1390 *params = mResetStrategy;
1391 break;
1392 case GL_NUM_SHADER_BINARY_FORMATS:
1393 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1394 break;
1395 case GL_SHADER_BINARY_FORMATS:
1396 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1397 break;
1398 case GL_NUM_PROGRAM_BINARY_FORMATS:
1399 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1400 break;
1401 case GL_PROGRAM_BINARY_FORMATS:
1402 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1403 break;
1404 case GL_NUM_EXTENSIONS:
1405 *params = static_cast<GLint>(mExtensionStrings.size());
1406 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001407
Jamie Madill231c7f52017-04-26 13:45:37 -04001408 // GL_KHR_debug
1409 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1410 *params = mExtensions.maxDebugMessageLength;
1411 break;
1412 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1413 *params = mExtensions.maxDebugLoggedMessages;
1414 break;
1415 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1416 *params = mExtensions.maxDebugGroupStackDepth;
1417 break;
1418 case GL_MAX_LABEL_LENGTH:
1419 *params = mExtensions.maxLabelLength;
1420 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001421
Martin Radeve5285d22017-07-14 16:23:53 +03001422 // GL_ANGLE_multiview
1423 case GL_MAX_VIEWS_ANGLE:
1424 *params = mExtensions.maxViews;
1425 break;
1426
Jamie Madill231c7f52017-04-26 13:45:37 -04001427 // GL_EXT_disjoint_timer_query
1428 case GL_GPU_DISJOINT_EXT:
1429 *params = mImplementation->getGPUDisjoint();
1430 break;
1431 case GL_MAX_FRAMEBUFFER_WIDTH:
1432 *params = mCaps.maxFramebufferWidth;
1433 break;
1434 case GL_MAX_FRAMEBUFFER_HEIGHT:
1435 *params = mCaps.maxFramebufferHeight;
1436 break;
1437 case GL_MAX_FRAMEBUFFER_SAMPLES:
1438 *params = mCaps.maxFramebufferSamples;
1439 break;
1440 case GL_MAX_SAMPLE_MASK_WORDS:
1441 *params = mCaps.maxSampleMaskWords;
1442 break;
1443 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1444 *params = mCaps.maxColorTextureSamples;
1445 break;
1446 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1447 *params = mCaps.maxDepthTextureSamples;
1448 break;
1449 case GL_MAX_INTEGER_SAMPLES:
1450 *params = mCaps.maxIntegerSamples;
1451 break;
1452 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1453 *params = mCaps.maxVertexAttribRelativeOffset;
1454 break;
1455 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1456 *params = mCaps.maxVertexAttribBindings;
1457 break;
1458 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1459 *params = mCaps.maxVertexAttribStride;
1460 break;
1461 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
1462 *params = mCaps.maxVertexAtomicCounterBuffers;
1463 break;
1464 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
1465 *params = mCaps.maxVertexAtomicCounters;
1466 break;
1467 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
1468 *params = mCaps.maxVertexImageUniforms;
1469 break;
1470 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
1471 *params = mCaps.maxVertexShaderStorageBlocks;
1472 break;
1473 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
1474 *params = mCaps.maxFragmentAtomicCounterBuffers;
1475 break;
1476 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
1477 *params = mCaps.maxFragmentAtomicCounters;
1478 break;
1479 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
1480 *params = mCaps.maxFragmentImageUniforms;
1481 break;
1482 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
1483 *params = mCaps.maxFragmentShaderStorageBlocks;
1484 break;
1485 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1486 *params = mCaps.minProgramTextureGatherOffset;
1487 break;
1488 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1489 *params = mCaps.maxProgramTextureGatherOffset;
1490 break;
1491 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1492 *params = mCaps.maxComputeWorkGroupInvocations;
1493 break;
1494 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
1495 *params = mCaps.maxComputeUniformBlocks;
1496 break;
1497 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
1498 *params = mCaps.maxComputeTextureImageUnits;
1499 break;
1500 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1501 *params = mCaps.maxComputeSharedMemorySize;
1502 break;
1503 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
1504 *params = mCaps.maxComputeUniformComponents;
1505 break;
1506 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
1507 *params = mCaps.maxComputeAtomicCounterBuffers;
1508 break;
1509 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
1510 *params = mCaps.maxComputeAtomicCounters;
1511 break;
1512 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
1513 *params = mCaps.maxComputeImageUniforms;
1514 break;
1515 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
1516 *params = mCaps.maxCombinedComputeUniformComponents;
1517 break;
1518 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
1519 *params = mCaps.maxComputeShaderStorageBlocks;
1520 break;
1521 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1522 *params = mCaps.maxCombinedShaderOutputResources;
1523 break;
1524 case GL_MAX_UNIFORM_LOCATIONS:
1525 *params = mCaps.maxUniformLocations;
1526 break;
1527 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1528 *params = mCaps.maxAtomicCounterBufferBindings;
1529 break;
1530 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1531 *params = mCaps.maxAtomicCounterBufferSize;
1532 break;
1533 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1534 *params = mCaps.maxCombinedAtomicCounterBuffers;
1535 break;
1536 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1537 *params = mCaps.maxCombinedAtomicCounters;
1538 break;
1539 case GL_MAX_IMAGE_UNITS:
1540 *params = mCaps.maxImageUnits;
1541 break;
1542 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1543 *params = mCaps.maxCombinedImageUniforms;
1544 break;
1545 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1546 *params = mCaps.maxShaderStorageBufferBindings;
1547 break;
1548 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1549 *params = mCaps.maxCombinedShaderStorageBlocks;
1550 break;
1551 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1552 *params = mCaps.shaderStorageBufferOffsetAlignment;
1553 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001554
1555 // GL_EXT_geometry_shader
1556 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1557 *params = mCaps.maxFramebufferLayers;
1558 break;
1559 case GL_LAYER_PROVOKING_VERTEX_EXT:
1560 *params = mCaps.layerProvokingVertex;
1561 break;
1562 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
1563 *params = mCaps.maxGeometryUniformComponents;
1564 break;
1565 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
1566 *params = mCaps.maxGeometryUniformBlocks;
1567 break;
1568 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
1569 *params = mCaps.maxCombinedGeometryUniformComponents;
1570 break;
1571 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1572 *params = mCaps.maxGeometryInputComponents;
1573 break;
1574 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1575 *params = mCaps.maxGeometryOutputComponents;
1576 break;
1577 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1578 *params = mCaps.maxGeometryOutputVertices;
1579 break;
1580 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1581 *params = mCaps.maxGeometryTotalOutputComponents;
1582 break;
1583 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1584 *params = mCaps.maxGeometryShaderInvocations;
1585 break;
1586 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
1587 *params = mCaps.maxGeometryTextureImageUnits;
1588 break;
1589 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
1590 *params = mCaps.maxGeometryAtomicCounterBuffers;
1591 break;
1592 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
1593 *params = mCaps.maxGeometryAtomicCounters;
1594 break;
1595 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
1596 *params = mCaps.maxGeometryImageUniforms;
1597 break;
1598 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
1599 *params = mCaps.maxGeometryShaderStorageBlocks;
1600 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001601 // GLES1 emulation: Caps queries
1602 case GL_MAX_TEXTURE_UNITS:
1603 *params = mCaps.maxMultitextureUnits;
1604 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001605 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001606 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001607 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001608 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001609}
1610
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001611void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001612{
Shannon Woods53a94a82014-06-24 15:20:36 -04001613 // Queries about context capabilities and maximums are answered by Context.
1614 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001615 switch (pname)
1616 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001617 case GL_MAX_ELEMENT_INDEX:
1618 *params = mCaps.maxElementIndex;
1619 break;
1620 case GL_MAX_UNIFORM_BLOCK_SIZE:
1621 *params = mCaps.maxUniformBlockSize;
1622 break;
1623 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
1624 *params = mCaps.maxCombinedVertexUniformComponents;
1625 break;
1626 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
1627 *params = mCaps.maxCombinedFragmentUniformComponents;
1628 break;
1629 case GL_MAX_SERVER_WAIT_TIMEOUT:
1630 *params = mCaps.maxServerWaitTimeout;
1631 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001632
Jamie Madill231c7f52017-04-26 13:45:37 -04001633 // GL_EXT_disjoint_timer_query
1634 case GL_TIMESTAMP_EXT:
1635 *params = mImplementation->getTimestamp();
1636 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001637
Jamie Madill231c7f52017-04-26 13:45:37 -04001638 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1639 *params = mCaps.maxShaderStorageBlockSize;
1640 break;
1641 default:
1642 UNREACHABLE();
1643 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001644 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001645}
1646
Geoff Lang70d0f492015-12-10 17:45:46 -05001647void Context::getPointerv(GLenum pname, void **params) const
1648{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001649 mGLState.getPointerv(pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001650}
1651
Martin Radev66fb8202016-07-28 11:45:20 +03001652void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001653{
Shannon Woods53a94a82014-06-24 15:20:36 -04001654 // Queries about context capabilities and maximums are answered by Context.
1655 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001656
1657 GLenum nativeType;
1658 unsigned int numParams;
1659 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1660 ASSERT(queryStatus);
1661
1662 if (nativeType == GL_INT)
1663 {
1664 switch (target)
1665 {
1666 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1667 ASSERT(index < 3u);
1668 *data = mCaps.maxComputeWorkGroupCount[index];
1669 break;
1670 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1671 ASSERT(index < 3u);
1672 *data = mCaps.maxComputeWorkGroupSize[index];
1673 break;
1674 default:
1675 mGLState.getIntegeri_v(target, index, data);
1676 }
1677 }
1678 else
1679 {
1680 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1681 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001682}
1683
Martin Radev66fb8202016-07-28 11:45:20 +03001684void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001685{
Shannon Woods53a94a82014-06-24 15:20:36 -04001686 // Queries about context capabilities and maximums are answered by Context.
1687 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001688
1689 GLenum nativeType;
1690 unsigned int numParams;
1691 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1692 ASSERT(queryStatus);
1693
1694 if (nativeType == GL_INT_64_ANGLEX)
1695 {
1696 mGLState.getInteger64i_v(target, index, data);
1697 }
1698 else
1699 {
1700 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1701 }
1702}
1703
1704void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1705{
1706 // Queries about context capabilities and maximums are answered by Context.
1707 // Queries about current GL state values are answered by State.
1708
1709 GLenum nativeType;
1710 unsigned int numParams;
1711 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1712 ASSERT(queryStatus);
1713
1714 if (nativeType == GL_BOOL)
1715 {
1716 mGLState.getBooleani_v(target, index, data);
1717 }
1718 else
1719 {
1720 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1721 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001722}
1723
Corentin Wallez336129f2017-10-17 15:55:40 -04001724void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001725{
1726 Buffer *buffer = mGLState.getTargetBuffer(target);
1727 QueryBufferParameteriv(buffer, pname, params);
1728}
1729
1730void Context::getFramebufferAttachmentParameteriv(GLenum target,
1731 GLenum attachment,
1732 GLenum pname,
1733 GLint *params)
1734{
1735 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08001736 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08001737}
1738
1739void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
1740{
1741 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
1742 QueryRenderbufferiv(this, renderbuffer, pname, params);
1743}
1744
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001745void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001746{
1747 Texture *texture = getTargetTexture(target);
1748 QueryTexParameterfv(texture, pname, params);
1749}
1750
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001751void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001752{
1753 Texture *texture = getTargetTexture(target);
1754 QueryTexParameteriv(texture, pname, params);
1755}
Jiajia Qin5451d532017-11-16 17:16:34 +08001756
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001757void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08001758{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001759 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05001760 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08001761}
1762
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001763void Context::getTexLevelParameterfv(TextureTarget target,
1764 GLint level,
1765 GLenum pname,
1766 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08001767{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001768 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05001769 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08001770}
1771
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001772void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08001773{
1774 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001775 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04001776 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001777}
1778
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001779void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001780{
1781 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001782 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04001783 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001784}
1785
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001786void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08001787{
1788 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001789 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04001790 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001791}
1792
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001793void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001794{
1795 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001796 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04001797 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001798}
1799
Jamie Madill675fe712016-12-19 13:07:54 -05001800void Context::drawArrays(GLenum mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001801{
Jamie Madill9fdaa492018-02-16 10:52:11 -05001802 // No-op if zero count
1803 if (count == 0)
1804 {
1805 return;
1806 }
1807
Jamie Madill05b35b22017-10-03 09:01:44 -04001808 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001809 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04001810 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001811}
1812
Jamie Madill675fe712016-12-19 13:07:54 -05001813void Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04001814{
Jamie Madill9fdaa492018-02-16 10:52:11 -05001815 // No-op if zero count
1816 if (count == 0 || instanceCount == 0)
1817 {
1818 return;
1819 }
1820
Jamie Madill05b35b22017-10-03 09:01:44 -04001821 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001822 ANGLE_CONTEXT_TRY(
1823 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04001824 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
1825 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04001826}
1827
Jamie Madill876429b2017-04-20 15:46:24 -04001828void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001829{
Jamie Madill9fdaa492018-02-16 10:52:11 -05001830 // No-op if zero count
1831 if (count == 0)
1832 {
1833 return;
1834 }
1835
Jamie Madill05b35b22017-10-03 09:01:44 -04001836 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001837 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04001838}
1839
Jamie Madill675fe712016-12-19 13:07:54 -05001840void Context::drawElementsInstanced(GLenum mode,
1841 GLsizei count,
1842 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04001843 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04001844 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04001845{
Jamie Madill9fdaa492018-02-16 10:52:11 -05001846 // No-op if zero count
1847 if (count == 0 || instances == 0)
1848 {
1849 return;
1850 }
1851
Jamie Madill05b35b22017-10-03 09:01:44 -04001852 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001853 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08001854 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04001855}
1856
Jamie Madill675fe712016-12-19 13:07:54 -05001857void Context::drawRangeElements(GLenum mode,
1858 GLuint start,
1859 GLuint end,
1860 GLsizei count,
1861 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04001862 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04001863{
Jamie Madill9fdaa492018-02-16 10:52:11 -05001864 // No-op if zero count
1865 if (count == 0)
1866 {
1867 return;
1868 }
1869
Jamie Madill05b35b22017-10-03 09:01:44 -04001870 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001871 ANGLE_CONTEXT_TRY(
1872 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001873}
1874
Jamie Madill876429b2017-04-20 15:46:24 -04001875void Context::drawArraysIndirect(GLenum mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08001876{
Jamie Madill05b35b22017-10-03 09:01:44 -04001877 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001878 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08001879}
1880
Jamie Madill876429b2017-04-20 15:46:24 -04001881void Context::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08001882{
Jamie Madill05b35b22017-10-03 09:01:44 -04001883 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001884 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08001885}
1886
Jamie Madill675fe712016-12-19 13:07:54 -05001887void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001888{
Jamie Madillafa02a22017-11-23 12:57:38 -05001889 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05001890}
1891
Jamie Madill675fe712016-12-19 13:07:54 -05001892void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05001893{
Jamie Madillafa02a22017-11-23 12:57:38 -05001894 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001895}
1896
Austin Kinross6ee1e782015-05-29 17:05:37 -07001897void Context::insertEventMarker(GLsizei length, const char *marker)
1898{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001899 ASSERT(mImplementation);
1900 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07001901}
1902
1903void Context::pushGroupMarker(GLsizei length, const char *marker)
1904{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001905 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05001906
1907 if (marker == nullptr)
1908 {
1909 // From the EXT_debug_marker spec,
1910 // "If <marker> is null then an empty string is pushed on the stack."
1911 mImplementation->pushGroupMarker(length, "");
1912 }
1913 else
1914 {
1915 mImplementation->pushGroupMarker(length, marker);
1916 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07001917}
1918
1919void Context::popGroupMarker()
1920{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001921 ASSERT(mImplementation);
1922 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07001923}
1924
Geoff Langd8605522016-04-13 10:19:12 -04001925void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
1926{
1927 Program *programObject = getProgram(program);
1928 ASSERT(programObject);
1929
1930 programObject->bindUniformLocation(location, name);
1931}
1932
Sami Väisänena797e062016-05-12 15:23:40 +03001933void Context::setCoverageModulation(GLenum components)
1934{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001935 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03001936}
1937
Sami Väisänene45e53b2016-05-25 10:36:04 +03001938void Context::loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix)
1939{
1940 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
1941}
1942
1943void Context::loadPathRenderingIdentityMatrix(GLenum matrixMode)
1944{
1945 GLfloat I[16];
1946 angle::Matrix<GLfloat>::setToIdentity(I);
1947
1948 mGLState.loadPathRenderingMatrix(matrixMode, I);
1949}
1950
1951void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
1952{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001953 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001954 if (!pathObj)
1955 return;
1956
1957 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05001958 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03001959
1960 mImplementation->stencilFillPath(pathObj, fillMode, mask);
1961}
1962
1963void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
1964{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001965 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001966 if (!pathObj)
1967 return;
1968
1969 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05001970 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03001971
1972 mImplementation->stencilStrokePath(pathObj, reference, mask);
1973}
1974
1975void Context::coverFillPath(GLuint path, GLenum coverMode)
1976{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001977 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001978 if (!pathObj)
1979 return;
1980
1981 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05001982 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03001983
1984 mImplementation->coverFillPath(pathObj, coverMode);
1985}
1986
1987void Context::coverStrokePath(GLuint path, GLenum coverMode)
1988{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001989 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001990 if (!pathObj)
1991 return;
1992
1993 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05001994 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03001995
1996 mImplementation->coverStrokePath(pathObj, coverMode);
1997}
1998
1999void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2000{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002001 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002002 if (!pathObj)
2003 return;
2004
2005 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002006 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002007
2008 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2009}
2010
2011void Context::stencilThenCoverStrokePath(GLuint path,
2012 GLint reference,
2013 GLuint mask,
2014 GLenum coverMode)
2015{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002016 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002017 if (!pathObj)
2018 return;
2019
2020 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002021 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002022
2023 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2024}
2025
Sami Väisänend59ca052016-06-21 16:10:00 +03002026void Context::coverFillPathInstanced(GLsizei numPaths,
2027 GLenum pathNameType,
2028 const void *paths,
2029 GLuint pathBase,
2030 GLenum coverMode,
2031 GLenum transformType,
2032 const GLfloat *transformValues)
2033{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002034 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002035
2036 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002037 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002038
2039 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2040}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002041
Sami Väisänend59ca052016-06-21 16:10:00 +03002042void Context::coverStrokePathInstanced(GLsizei numPaths,
2043 GLenum pathNameType,
2044 const void *paths,
2045 GLuint pathBase,
2046 GLenum coverMode,
2047 GLenum transformType,
2048 const GLfloat *transformValues)
2049{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002050 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002051
2052 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002053 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002054
2055 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2056 transformValues);
2057}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002058
Sami Väisänend59ca052016-06-21 16:10:00 +03002059void Context::stencilFillPathInstanced(GLsizei numPaths,
2060 GLenum pathNameType,
2061 const void *paths,
2062 GLuint pathBase,
2063 GLenum fillMode,
2064 GLuint mask,
2065 GLenum transformType,
2066 const GLfloat *transformValues)
2067{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002068 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002069
2070 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002071 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002072
2073 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2074 transformValues);
2075}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002076
Sami Väisänend59ca052016-06-21 16:10:00 +03002077void Context::stencilStrokePathInstanced(GLsizei numPaths,
2078 GLenum pathNameType,
2079 const void *paths,
2080 GLuint pathBase,
2081 GLint reference,
2082 GLuint mask,
2083 GLenum transformType,
2084 const GLfloat *transformValues)
2085{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002086 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002087
2088 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002089 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002090
2091 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2092 transformValues);
2093}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002094
Sami Väisänend59ca052016-06-21 16:10:00 +03002095void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2096 GLenum pathNameType,
2097 const void *paths,
2098 GLuint pathBase,
2099 GLenum fillMode,
2100 GLuint mask,
2101 GLenum coverMode,
2102 GLenum transformType,
2103 const GLfloat *transformValues)
2104{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002105 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002106
2107 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002108 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002109
2110 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2111 transformType, transformValues);
2112}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002113
Sami Väisänend59ca052016-06-21 16:10:00 +03002114void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2115 GLenum pathNameType,
2116 const void *paths,
2117 GLuint pathBase,
2118 GLint reference,
2119 GLuint mask,
2120 GLenum coverMode,
2121 GLenum transformType,
2122 const GLfloat *transformValues)
2123{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002124 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002125
2126 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002127 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002128
2129 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2130 transformType, transformValues);
2131}
2132
Sami Väisänen46eaa942016-06-29 10:26:37 +03002133void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2134{
2135 auto *programObject = getProgram(program);
2136
2137 programObject->bindFragmentInputLocation(location, name);
2138}
2139
2140void Context::programPathFragmentInputGen(GLuint program,
2141 GLint location,
2142 GLenum genMode,
2143 GLint components,
2144 const GLfloat *coeffs)
2145{
2146 auto *programObject = getProgram(program);
2147
Jamie Madillbd044ed2017-06-05 12:59:21 -04002148 programObject->pathFragmentInputGen(this, location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002149}
2150
jchen1015015f72017-03-16 13:54:21 +08002151GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2152{
jchen10fd7c3b52017-03-21 15:36:03 +08002153 const auto *programObject = getProgram(program);
jchen1015015f72017-03-16 13:54:21 +08002154 return QueryProgramResourceIndex(programObject, programInterface, name);
2155}
2156
jchen10fd7c3b52017-03-21 15:36:03 +08002157void Context::getProgramResourceName(GLuint program,
2158 GLenum programInterface,
2159 GLuint index,
2160 GLsizei bufSize,
2161 GLsizei *length,
2162 GLchar *name)
2163{
2164 const auto *programObject = getProgram(program);
2165 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2166}
2167
jchen10191381f2017-04-11 13:59:04 +08002168GLint Context::getProgramResourceLocation(GLuint program,
2169 GLenum programInterface,
2170 const GLchar *name)
2171{
2172 const auto *programObject = getProgram(program);
2173 return QueryProgramResourceLocation(programObject, programInterface, name);
2174}
2175
jchen10880683b2017-04-12 16:21:55 +08002176void Context::getProgramResourceiv(GLuint program,
2177 GLenum programInterface,
2178 GLuint index,
2179 GLsizei propCount,
2180 const GLenum *props,
2181 GLsizei bufSize,
2182 GLsizei *length,
2183 GLint *params)
2184{
2185 const auto *programObject = getProgram(program);
2186 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2187 length, params);
2188}
2189
jchen10d9cd7b72017-08-30 15:04:25 +08002190void Context::getProgramInterfaceiv(GLuint program,
2191 GLenum programInterface,
2192 GLenum pname,
2193 GLint *params)
2194{
2195 const auto *programObject = getProgram(program);
2196 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2197}
2198
Jamie Madill71c88b32017-09-14 22:20:29 -04002199void Context::handleError(const Error &error)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002200{
Geoff Langda5777c2014-07-11 09:52:58 -04002201 if (error.isError())
2202 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002203 GLenum code = error.getCode();
2204 mErrors.insert(code);
2205 if (code == GL_OUT_OF_MEMORY && getWorkarounds().loseContextOnOutOfMemory)
2206 {
2207 markContextLost();
2208 }
Geoff Lang70d0f492015-12-10 17:45:46 -05002209
Geoff Langee6884e2017-11-09 16:51:11 -05002210 ASSERT(!error.getMessage().empty());
2211 mGLState.getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, error.getID(),
2212 GL_DEBUG_SEVERITY_HIGH, error.getMessage());
Geoff Langda5777c2014-07-11 09:52:58 -04002213 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002214}
2215
2216// Get one of the recorded errors and clear its flag, if any.
2217// [OpenGL ES 2.0.24] section 2.5 page 13.
2218GLenum Context::getError()
2219{
Geoff Langda5777c2014-07-11 09:52:58 -04002220 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002221 {
Geoff Langda5777c2014-07-11 09:52:58 -04002222 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002223 }
Geoff Langda5777c2014-07-11 09:52:58 -04002224 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002225 {
Geoff Langda5777c2014-07-11 09:52:58 -04002226 GLenum error = *mErrors.begin();
2227 mErrors.erase(mErrors.begin());
2228 return error;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002229 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002230}
2231
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002232// NOTE: this function should not assume that this context is current!
2233void Context::markContextLost()
2234{
2235 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002236 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002237 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002238 mContextLostForced = true;
2239 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002240 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002241}
2242
2243bool Context::isContextLost()
2244{
2245 return mContextLost;
2246}
2247
Jamie Madillfa920eb2018-01-04 11:45:50 -05002248GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002249{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002250 // Even if the application doesn't want to know about resets, we want to know
2251 // as it will allow us to skip all the calls.
2252 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002253 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002254 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002255 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002256 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002257 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002258
2259 // EXT_robustness, section 2.6: If the reset notification behavior is
2260 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2261 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2262 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002263 }
2264
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002265 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2266 // status should be returned at least once, and GL_NO_ERROR should be returned
2267 // once the device has finished resetting.
2268 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002269 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002270 ASSERT(mResetStatus == GL_NO_ERROR);
2271 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002272
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002273 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002274 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002275 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002276 }
2277 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002278 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002279 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002280 // If markContextLost was used to mark the context lost then
2281 // assume that is not recoverable, and continue to report the
2282 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002283 mResetStatus = mImplementation->getResetStatus();
2284 }
Jamie Madill893ab082014-05-16 16:56:10 -04002285
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002286 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002287}
2288
2289bool Context::isResetNotificationEnabled()
2290{
2291 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2292}
2293
Corentin Walleze3b10e82015-05-20 11:06:25 -04002294const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002295{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002296 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002297}
2298
2299EGLenum Context::getClientType() const
2300{
2301 return mClientType;
2302}
2303
2304EGLenum Context::getRenderBuffer() const
2305{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002306 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2307 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002308 {
2309 return EGL_NONE;
2310 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002311
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002312 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002313 ASSERT(backAttachment != nullptr);
2314 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002315}
2316
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002317VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002318{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002319 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002320 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2321 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002322 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002323 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2324 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002325
Jamie Madill96a483b2017-06-27 16:49:21 -04002326 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002327 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002328
2329 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002330}
2331
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002332TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002333{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002334 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002335 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2336 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002337 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002338 transformFeedback =
2339 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002340 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002341 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002342 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002343
2344 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002345}
2346
2347bool Context::isVertexArrayGenerated(GLuint vertexArray)
2348{
Jamie Madill96a483b2017-06-27 16:49:21 -04002349 ASSERT(mVertexArrayMap.contains(0));
2350 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002351}
2352
2353bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2354{
Jamie Madill96a483b2017-06-27 16:49:21 -04002355 ASSERT(mTransformFeedbackMap.contains(0));
2356 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002357}
2358
Shannon Woods53a94a82014-06-24 15:20:36 -04002359void Context::detachTexture(GLuint texture)
2360{
2361 // Simple pass-through to State's detachTexture method, as textures do not require
2362 // allocation map management either here or in the resource manager at detach time.
2363 // Zero textures are held by the Context, and we don't attempt to request them from
2364 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002365 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002366}
2367
James Darpinian4d9d4832018-03-13 12:43:28 -07002368void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002369{
Yuly Novikov5807a532015-12-03 13:01:22 -05002370 // Simple pass-through to State's detachBuffer method, since
2371 // only buffer attachments to container objects that are bound to the current context
2372 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002373
Yuly Novikov5807a532015-12-03 13:01:22 -05002374 // [OpenGL ES 3.2] section 5.1.2 page 45:
2375 // Attachments to unbound container objects, such as
2376 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2377 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002378 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002379}
2380
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002381void Context::detachFramebuffer(GLuint framebuffer)
2382{
Shannon Woods53a94a82014-06-24 15:20:36 -04002383 // Framebuffer detachment is handled by Context, because 0 is a valid
2384 // Framebuffer object, and a pointer to it must be passed from Context
2385 // to State at binding time.
2386
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002387 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002388 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2389 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2390 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002391
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002392 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002393 {
2394 bindReadFramebuffer(0);
2395 }
2396
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002397 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002398 {
2399 bindDrawFramebuffer(0);
2400 }
2401}
2402
2403void Context::detachRenderbuffer(GLuint renderbuffer)
2404{
Jamie Madilla02315b2017-02-23 14:14:47 -05002405 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002406}
2407
Jamie Madill57a89722013-07-02 11:57:03 -04002408void Context::detachVertexArray(GLuint vertexArray)
2409{
Jamie Madill77a72f62015-04-14 11:18:32 -04002410 // Vertex array detachment is handled by Context, because 0 is a valid
2411 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002412 // binding time.
2413
Jamie Madill57a89722013-07-02 11:57:03 -04002414 // [OpenGL ES 3.0.2] section 2.10 page 43:
2415 // If a vertex array object that is currently bound is deleted, the binding
2416 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002417 if (mGLState.removeVertexArrayBinding(vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002418 {
2419 bindVertexArray(0);
2420 }
2421}
2422
Geoff Langc8058452014-02-03 12:04:11 -05002423void Context::detachTransformFeedback(GLuint transformFeedback)
2424{
Corentin Walleza2257da2016-04-19 16:43:12 -04002425 // Transform feedback detachment is handled by Context, because 0 is a valid
2426 // transform feedback, and a pointer to it must be passed from Context to State at
2427 // binding time.
2428
2429 // The OpenGL specification doesn't mention what should happen when the currently bound
2430 // transform feedback object is deleted. Since it is a container object, we treat it like
2431 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002432 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002433 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002434 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002435 }
Geoff Langc8058452014-02-03 12:04:11 -05002436}
2437
Jamie Madilldc356042013-07-19 16:36:57 -04002438void Context::detachSampler(GLuint sampler)
2439{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002440 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002441}
2442
Yunchao Hea336b902017-08-02 16:05:21 +08002443void Context::detachProgramPipeline(GLuint pipeline)
2444{
2445 mGLState.detachProgramPipeline(this, pipeline);
2446}
2447
Jamie Madill3ef140a2017-08-26 23:11:21 -04002448void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002449{
Shaodde78e82017-05-22 14:13:27 +08002450 mGLState.setVertexAttribDivisor(this, index, divisor);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002451}
2452
Jamie Madille29d1672013-07-19 16:36:57 -04002453void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2454{
Geoff Langc1984ed2016-10-07 12:41:00 -04002455 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002456 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002457 SetSamplerParameteri(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002458 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002459}
Jamie Madille29d1672013-07-19 16:36:57 -04002460
Geoff Langc1984ed2016-10-07 12:41:00 -04002461void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2462{
2463 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002464 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002465 SetSamplerParameteriv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002466 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002467}
2468
2469void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2470{
Geoff Langc1984ed2016-10-07 12:41:00 -04002471 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002472 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002473 SetSamplerParameterf(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002474 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002475}
2476
Geoff Langc1984ed2016-10-07 12:41:00 -04002477void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002478{
Geoff Langc1984ed2016-10-07 12:41:00 -04002479 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002480 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002481 SetSamplerParameterfv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002482 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002483}
2484
Geoff Langc1984ed2016-10-07 12:41:00 -04002485void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002486{
Geoff Langc1984ed2016-10-07 12:41:00 -04002487 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002488 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002489 QuerySamplerParameteriv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002490 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002491}
Jamie Madill9675b802013-07-19 16:36:59 -04002492
Geoff Langc1984ed2016-10-07 12:41:00 -04002493void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2494{
2495 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002496 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002497 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002498 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002499}
2500
Olli Etuahof0fee072016-03-30 15:11:58 +03002501void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2502{
2503 gl::Program *programObject = getProgram(program);
Yunchao He61afff12017-03-14 15:34:03 +08002504 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002505}
2506
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002507void Context::initRendererString()
2508{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002509 std::ostringstream rendererString;
2510 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002511 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002512 rendererString << ")";
2513
Geoff Langcec35902014-04-16 10:52:36 -04002514 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002515}
2516
Geoff Langc339c4e2016-11-29 10:37:36 -05002517void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002518{
Geoff Langc339c4e2016-11-29 10:37:36 -05002519 const Version &clientVersion = getClientVersion();
2520
2521 std::ostringstream versionString;
2522 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2523 << ANGLE_VERSION_STRING << ")";
2524 mVersionString = MakeStaticString(versionString.str());
2525
2526 std::ostringstream shadingLanguageVersionString;
2527 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2528 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2529 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
2530 << ")";
2531 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002532}
2533
Geoff Langcec35902014-04-16 10:52:36 -04002534void Context::initExtensionStrings()
2535{
Geoff Langc339c4e2016-11-29 10:37:36 -05002536 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
2537 std::ostringstream combinedStringStream;
2538 std::copy(strings.begin(), strings.end(),
2539 std::ostream_iterator<const char *>(combinedStringStream, " "));
2540 return MakeStaticString(combinedStringStream.str());
2541 };
2542
2543 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002544 for (const auto &extensionString : mExtensions.getStrings())
2545 {
2546 mExtensionStrings.push_back(MakeStaticString(extensionString));
2547 }
Geoff Langc339c4e2016-11-29 10:37:36 -05002548 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002549
Bryan Bernhart58806562017-01-05 13:09:31 -08002550 const gl::Extensions &nativeExtensions = mImplementation->getNativeExtensions();
2551
Geoff Langc339c4e2016-11-29 10:37:36 -05002552 mRequestableExtensionStrings.clear();
2553 for (const auto &extensionInfo : GetExtensionInfoMap())
2554 {
2555 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08002556 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
2557 nativeExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05002558 {
2559 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
2560 }
2561 }
2562 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002563}
2564
Geoff Langc339c4e2016-11-29 10:37:36 -05002565const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04002566{
Geoff Langc339c4e2016-11-29 10:37:36 -05002567 switch (name)
2568 {
2569 case GL_VENDOR:
2570 return reinterpret_cast<const GLubyte *>("Google Inc.");
2571
2572 case GL_RENDERER:
2573 return reinterpret_cast<const GLubyte *>(mRendererString);
2574
2575 case GL_VERSION:
2576 return reinterpret_cast<const GLubyte *>(mVersionString);
2577
2578 case GL_SHADING_LANGUAGE_VERSION:
2579 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
2580
2581 case GL_EXTENSIONS:
2582 return reinterpret_cast<const GLubyte *>(mExtensionString);
2583
2584 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
2585 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
2586
2587 default:
2588 UNREACHABLE();
2589 return nullptr;
2590 }
Geoff Langcec35902014-04-16 10:52:36 -04002591}
2592
Geoff Langc339c4e2016-11-29 10:37:36 -05002593const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04002594{
Geoff Langc339c4e2016-11-29 10:37:36 -05002595 switch (name)
2596 {
2597 case GL_EXTENSIONS:
2598 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
2599
2600 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
2601 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
2602
2603 default:
2604 UNREACHABLE();
2605 return nullptr;
2606 }
Geoff Langcec35902014-04-16 10:52:36 -04002607}
2608
2609size_t Context::getExtensionStringCount() const
2610{
2611 return mExtensionStrings.size();
2612}
2613
Geoff Lang111a99e2017-10-17 10:58:41 -04002614bool Context::isExtensionRequestable(const char *name)
2615{
2616 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
2617 auto extension = extensionInfos.find(name);
2618
2619 const Extensions &nativeExtensions = mImplementation->getNativeExtensions();
2620 return extension != extensionInfos.end() && extension->second.Requestable &&
2621 nativeExtensions.*(extension->second.ExtensionsMember);
2622}
2623
Geoff Langc339c4e2016-11-29 10:37:36 -05002624void Context::requestExtension(const char *name)
2625{
2626 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
2627 ASSERT(extensionInfos.find(name) != extensionInfos.end());
2628 const auto &extension = extensionInfos.at(name);
2629 ASSERT(extension.Requestable);
Geoff Lang111a99e2017-10-17 10:58:41 -04002630 ASSERT(mImplementation->getNativeExtensions().*(extension.ExtensionsMember));
Geoff Langc339c4e2016-11-29 10:37:36 -05002631
2632 if (mExtensions.*(extension.ExtensionsMember))
2633 {
2634 // Extension already enabled
2635 return;
2636 }
2637
2638 mExtensions.*(extension.ExtensionsMember) = true;
2639 updateCaps();
2640 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08002641
Jamie Madill2f348d22017-06-05 10:50:59 -04002642 // Release the shader compiler so it will be re-created with the requested extensions enabled.
2643 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04002644
Jamie Madill81c2e252017-09-09 23:32:46 -04002645 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
2646 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05002647 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04002648 for (auto &zeroTexture : mZeroTextures)
2649 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002650 if (zeroTexture.get() != nullptr)
2651 {
2652 zeroTexture->signalDirty(this, InitState::Initialized);
2653 }
Geoff Lang9aded172017-04-05 11:07:56 -04002654 }
2655
2656 mState.mFramebuffers->invalidateFramebufferComplenessCache();
Geoff Langc339c4e2016-11-29 10:37:36 -05002657}
2658
2659size_t Context::getRequestableExtensionStringCount() const
2660{
2661 return mRequestableExtensionStrings.size();
2662}
2663
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002664void Context::beginTransformFeedback(GLenum primitiveMode)
2665{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002666 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002667 ASSERT(transformFeedback != nullptr);
2668 ASSERT(!transformFeedback->isPaused());
2669
Jamie Madill6c1f6712017-02-14 19:08:04 -05002670 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002671}
2672
2673bool Context::hasActiveTransformFeedback(GLuint program) const
2674{
2675 for (auto pair : mTransformFeedbackMap)
2676 {
2677 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
2678 {
2679 return true;
2680 }
2681 }
2682 return false;
2683}
2684
Geoff Langb433e872017-10-05 14:01:47 -04002685void Context::initCaps(const egl::DisplayExtensions &displayExtensions, bool robustResourceInit)
Geoff Lang493daf52014-07-03 13:38:44 -04002686{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002687 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04002688
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08002689 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
2690 if (getClientVersion() < Version(2, 0))
2691 {
2692 mCaps.maxMultitextureUnits = 4;
2693 mCaps.maxClipPlanes = 6;
2694 mCaps.maxLights = 8;
2695 mCaps.maxModelviewMatrixStackDepth = 16;
2696 mCaps.maxProjectionMatrixStackDepth = 16;
2697 mCaps.maxTextureMatrixStackDepth = 16;
2698 }
2699
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002700 mExtensions = mImplementation->getNativeExtensions();
Geoff Lang493daf52014-07-03 13:38:44 -04002701
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002702 mLimitations = mImplementation->getNativeLimitations();
Austin Kinross02df7962015-07-01 10:03:42 -07002703
Geoff Langeb66a6e2016-10-31 13:06:12 -04002704 if (getClientVersion() < Version(3, 0))
Geoff Lang493daf52014-07-03 13:38:44 -04002705 {
2706 // Disable ES3+ extensions
Jamie Madill231c7f52017-04-26 13:45:37 -04002707 mExtensions.colorBufferFloat = false;
Geoff Langb66a9092016-05-16 15:59:14 -04002708 mExtensions.eglImageExternalEssl3 = false;
Vincent Lang25ab4512016-05-13 18:13:59 +02002709 mExtensions.textureNorm16 = false;
Martin Radev137032d2017-07-13 10:11:12 +03002710 mExtensions.multiview = false;
2711 mExtensions.maxViews = 1u;
Geoff Lang493daf52014-07-03 13:38:44 -04002712 }
2713
Jiawei Shao89be29a2017-11-06 14:36:45 +08002714 if (getClientVersion() < ES_3_1)
2715 {
2716 // Disable ES3.1+ extensions
2717 mExtensions.geometryShader = false;
2718 }
2719
Geoff Langeb66a6e2016-10-31 13:06:12 -04002720 if (getClientVersion() > Version(2, 0))
Geoff Lang493daf52014-07-03 13:38:44 -04002721 {
2722 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
Jamie Madill231c7f52017-04-26 13:45:37 -04002723 // mExtensions.sRGB = false;
Geoff Lang493daf52014-07-03 13:38:44 -04002724 }
2725
Jamie Madill00ed7a12016-05-19 13:13:38 -04002726 // Some extensions are always available because they are implemented in the GL layer.
Jamie Madill231c7f52017-04-26 13:45:37 -04002727 mExtensions.bindUniformLocation = true;
2728 mExtensions.vertexArrayObject = true;
Geoff Langf41a7152016-09-19 15:11:17 -04002729 mExtensions.bindGeneratesResource = true;
Geoff Langfeb8c682017-02-13 16:07:35 -05002730 mExtensions.clientArrays = true;
Geoff Langc339c4e2016-11-29 10:37:36 -05002731 mExtensions.requestExtension = true;
Jamie Madill00ed7a12016-05-19 13:13:38 -04002732
2733 // Enable the no error extension if the context was created with the flag.
2734 mExtensions.noError = mSkipValidation;
2735
Corentin Wallezccab69d2017-01-27 16:57:15 -05002736 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Corentin Wallezc295e512017-01-27 17:47:50 -05002737 mExtensions.surfacelessContext = displayExtensions.surfacelessContext;
Corentin Wallezccab69d2017-01-27 16:57:15 -05002738
Geoff Lang70d0f492015-12-10 17:45:46 -05002739 // Explicitly enable GL_KHR_debug
2740 mExtensions.debug = true;
2741 mExtensions.maxDebugMessageLength = 1024;
2742 mExtensions.maxDebugLoggedMessages = 1024;
2743 mExtensions.maxDebugGroupStackDepth = 1024;
2744 mExtensions.maxLabelLength = 1024;
2745
Geoff Langff5b2d52016-09-07 11:32:23 -04002746 // Explicitly enable GL_ANGLE_robust_client_memory
2747 mExtensions.robustClientMemory = true;
2748
Jamie Madille08a1d32017-03-07 17:24:06 -05002749 // Determine robust resource init availability from EGL.
Geoff Langb433e872017-10-05 14:01:47 -04002750 mExtensions.robustResourceInitialization = robustResourceInit;
Jamie Madille08a1d32017-03-07 17:24:06 -05002751
Jiajia Qin8a7b3a02017-08-25 16:05:48 +08002752 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
2753 // supports it.
2754 mExtensions.robustBufferAccessBehavior =
2755 mRobustAccess && mExtensions.robustBufferAccessBehavior;
2756
Jamie Madillc43be722017-07-13 16:22:14 -04002757 // Enable the cache control query unconditionally.
2758 mExtensions.programCacheControl = true;
2759
Geoff Lang301d1612014-07-09 10:34:37 -04002760 // Apply implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04002761 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002762
Jamie Madill0f80ed82017-09-19 00:24:56 -04002763 if (getClientVersion() < ES_3_1)
2764 {
2765 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
2766 }
2767 else
2768 {
2769 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
2770 }
Geoff Lang301d1612014-07-09 10:34:37 -04002771
Jamie Madill0f80ed82017-09-19 00:24:56 -04002772 LimitCap(&mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
2773 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
2774 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
2775
2776 // Limit textures as well, so we can use fast bitsets with texture bindings.
2777 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
2778 LimitCap(&mCaps.maxVertexTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
2779 LimitCap(&mCaps.maxTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04002780
Jiawei Shaodb342272017-09-27 10:21:45 +08002781 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
2782
Geoff Langc287ea62016-09-16 14:46:51 -04002783 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05002784 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04002785 for (const auto &extensionInfo : GetExtensionInfoMap())
2786 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04002787 // If the user has requested that extensions start disabled and they are requestable,
2788 // disable them.
2789 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04002790 {
2791 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
2792 }
2793 }
2794
2795 // Generate texture caps
2796 updateCaps();
2797}
2798
2799void Context::updateCaps()
2800{
Geoff Lang900013c2014-07-07 11:32:19 -04002801 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002802 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04002803
Jamie Madill7b62cf92017-11-02 15:20:49 -04002804 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04002805 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04002806 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04002807 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04002808
Geoff Lang0d8b7242015-09-09 14:56:53 -04002809 // Update the format caps based on the client version and extensions.
2810 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
2811 // ES3.
2812 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002813 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04002814 formatCaps.renderable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002815 formatCaps.renderable && formatInfo.renderSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04002816 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002817 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04002818
He Yunchaoccd8c9b2017-01-18 17:36:14 +08002819 // OpenGL ES does not support multisampling with non-rendererable formats
2820 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Olli Etuaho50c562d2017-06-06 14:43:30 +03002821 if (!formatCaps.renderable ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08002822 (getClientVersion() < ES_3_1 &&
2823 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04002824 {
Geoff Langd87878e2014-09-19 15:42:59 -04002825 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04002826 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03002827 else
2828 {
2829 // We may have limited the max samples for some required renderbuffer formats due to
2830 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
2831 GLuint formatMaxSamples = formatCaps.getMaxSamples();
2832
2833 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
2834 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
2835 // exception of signed and unsigned integer formats."
2836 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
2837 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
2838 {
2839 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
2840 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
2841 }
2842
2843 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
2844 if (getClientVersion() >= ES_3_1)
2845 {
2846 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
2847 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
2848 // the exception that the signed and unsigned integer formats are required only to
2849 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
2850 // multisamples, which must be at least one."
2851 if (formatInfo.componentType == GL_INT ||
2852 formatInfo.componentType == GL_UNSIGNED_INT)
2853 {
2854 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
2855 }
2856
2857 // GLES 3.1 section 19.3.1.
2858 if (formatCaps.texturable)
2859 {
2860 if (formatInfo.depthBits > 0)
2861 {
2862 mCaps.maxDepthTextureSamples =
2863 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
2864 }
2865 else if (formatInfo.redBits > 0)
2866 {
2867 mCaps.maxColorTextureSamples =
2868 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
2869 }
2870 }
2871 }
2872 }
Geoff Langd87878e2014-09-19 15:42:59 -04002873
2874 if (formatCaps.texturable && formatInfo.compressed)
2875 {
Geoff Langca271392017-04-05 12:30:00 -04002876 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04002877 }
2878
Geoff Langca271392017-04-05 12:30:00 -04002879 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04002880 }
Jamie Madill32447362017-06-28 14:53:52 -04002881
2882 // If program binary is disabled, blank out the memory cache pointer.
2883 if (!mImplementation->getNativeExtensions().getProgramBinary)
2884 {
2885 mMemoryProgramCache = nullptr;
2886 }
Corentin Walleze4477002017-12-01 14:39:58 -05002887
2888 // Compute which buffer types are allowed
2889 mValidBufferBindings.reset();
2890 mValidBufferBindings.set(BufferBinding::ElementArray);
2891 mValidBufferBindings.set(BufferBinding::Array);
2892
2893 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
2894 {
2895 mValidBufferBindings.set(BufferBinding::PixelPack);
2896 mValidBufferBindings.set(BufferBinding::PixelUnpack);
2897 }
2898
2899 if (getClientVersion() >= ES_3_0)
2900 {
2901 mValidBufferBindings.set(BufferBinding::CopyRead);
2902 mValidBufferBindings.set(BufferBinding::CopyWrite);
2903 mValidBufferBindings.set(BufferBinding::TransformFeedback);
2904 mValidBufferBindings.set(BufferBinding::Uniform);
2905 }
2906
2907 if (getClientVersion() >= ES_3_1)
2908 {
2909 mValidBufferBindings.set(BufferBinding::AtomicCounter);
2910 mValidBufferBindings.set(BufferBinding::ShaderStorage);
2911 mValidBufferBindings.set(BufferBinding::DrawIndirect);
2912 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
2913 }
Geoff Lang493daf52014-07-03 13:38:44 -04002914}
2915
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002916void Context::initWorkarounds()
2917{
Jamie Madill761b02c2017-06-23 16:27:06 -04002918 // Apply back-end workarounds.
2919 mImplementation->applyNativeWorkarounds(&mWorkarounds);
2920
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002921 // Lose the context upon out of memory error if the application is
2922 // expecting to watch for those events.
2923 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2924}
2925
Jamie Madill05b35b22017-10-03 09:01:44 -04002926Error Context::prepareForDraw()
2927{
Geoff Langa8cb2872018-03-09 16:09:40 -05002928 ANGLE_TRY(syncDirtyObjects());
Jamie Madilla59fc192017-11-02 12:57:58 -04002929
2930 if (isRobustResourceInitEnabled())
2931 {
2932 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
2933 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
2934 }
2935
Geoff Langa8cb2872018-03-09 16:09:40 -05002936 ANGLE_TRY(syncDirtyBits());
Geoff Langd4fff502017-09-22 11:28:28 -04002937 return NoError();
2938}
2939
2940Error Context::prepareForClear(GLbitfield mask)
2941{
Geoff Langa8cb2872018-03-09 16:09:40 -05002942 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04002943 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05002944 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04002945 return NoError();
2946}
2947
2948Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
2949{
Geoff Langa8cb2872018-03-09 16:09:40 -05002950 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04002951 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
2952 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05002953 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04002954 return NoError();
2955}
2956
Geoff Langa8cb2872018-03-09 16:09:40 -05002957Error Context::syncState()
Jamie Madill1b94d432015-08-07 13:23:23 -04002958{
Geoff Langa8cb2872018-03-09 16:09:40 -05002959 ANGLE_TRY(syncDirtyObjects());
2960 ANGLE_TRY(syncDirtyBits());
Jamie Madillbc918e72018-03-08 09:47:21 -05002961 return NoError();
Jamie Madill1b94d432015-08-07 13:23:23 -04002962}
2963
Geoff Langa8cb2872018-03-09 16:09:40 -05002964Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04002965{
Geoff Langa8cb2872018-03-09 16:09:40 -05002966 ANGLE_TRY(syncDirtyObjects(objectMask));
2967 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04002968 return NoError();
2969}
2970
Geoff Langa8cb2872018-03-09 16:09:40 -05002971Error Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04002972{
2973 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
2974 mImplementation->syncState(this, dirtyBits);
2975 mGLState.clearDirtyBits();
2976 return NoError();
2977}
2978
Geoff Langa8cb2872018-03-09 16:09:40 -05002979Error Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04002980{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002981 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madillfe548342017-06-19 11:13:24 -04002982 mImplementation->syncState(this, dirtyBits);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002983 mGLState.clearDirtyBits(dirtyBits);
Jamie Madillbc918e72018-03-08 09:47:21 -05002984 return NoError();
Jamie Madill1b94d432015-08-07 13:23:23 -04002985}
Jamie Madillc29968b2016-01-20 11:17:23 -05002986
Geoff Langa8cb2872018-03-09 16:09:40 -05002987Error Context::syncDirtyObjects()
Geoff Langd4fff502017-09-22 11:28:28 -04002988{
2989 return mGLState.syncDirtyObjects(this);
2990}
2991
Geoff Langa8cb2872018-03-09 16:09:40 -05002992Error Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04002993{
2994 return mGLState.syncDirtyObjects(this, objectMask);
2995}
2996
Jamie Madillc29968b2016-01-20 11:17:23 -05002997void Context::blitFramebuffer(GLint srcX0,
2998 GLint srcY0,
2999 GLint srcX1,
3000 GLint srcY1,
3001 GLint dstX0,
3002 GLint dstY0,
3003 GLint dstX1,
3004 GLint dstY1,
3005 GLbitfield mask,
3006 GLenum filter)
3007{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003008 if (mask == 0)
3009 {
3010 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3011 // buffers are copied.
3012 return;
3013 }
3014
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003015 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003016 ASSERT(drawFramebuffer);
3017
3018 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3019 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3020
Jamie Madillbc918e72018-03-08 09:47:21 -05003021 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003022
Jamie Madillc564c072017-06-01 12:45:42 -04003023 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003024}
Jamie Madillc29968b2016-01-20 11:17:23 -05003025
3026void Context::clear(GLbitfield mask)
3027{
Geoff Langd4fff502017-09-22 11:28:28 -04003028 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3029 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003030}
3031
3032void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3033{
Geoff Langd4fff502017-09-22 11:28:28 -04003034 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3035 ANGLE_CONTEXT_TRY(
3036 mGLState.getDrawFramebuffer()->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003037}
3038
3039void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3040{
Geoff Langd4fff502017-09-22 11:28:28 -04003041 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3042 ANGLE_CONTEXT_TRY(
3043 mGLState.getDrawFramebuffer()->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003044}
3045
3046void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3047{
Geoff Langd4fff502017-09-22 11:28:28 -04003048 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3049 ANGLE_CONTEXT_TRY(
3050 mGLState.getDrawFramebuffer()->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003051}
3052
3053void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3054{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003055 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003056 ASSERT(framebufferObject);
3057
3058 // If a buffer is not present, the clear has no effect
3059 if (framebufferObject->getDepthbuffer() == nullptr &&
3060 framebufferObject->getStencilbuffer() == nullptr)
3061 {
3062 return;
3063 }
3064
Geoff Langd4fff502017-09-22 11:28:28 -04003065 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3066 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003067}
3068
3069void Context::readPixels(GLint x,
3070 GLint y,
3071 GLsizei width,
3072 GLsizei height,
3073 GLenum format,
3074 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003075 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003076{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003077 if (width == 0 || height == 0)
3078 {
3079 return;
3080 }
3081
Jamie Madillbc918e72018-03-08 09:47:21 -05003082 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003083
Jamie Madillb6664922017-07-25 12:55:04 -04003084 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3085 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003086
3087 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003088 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003089}
3090
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003091void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003092 GLint level,
3093 GLenum internalformat,
3094 GLint x,
3095 GLint y,
3096 GLsizei width,
3097 GLsizei height,
3098 GLint border)
3099{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003100 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003101 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003102
Jamie Madillc29968b2016-01-20 11:17:23 -05003103 Rectangle sourceArea(x, y, width, height);
3104
Jamie Madill05b35b22017-10-03 09:01:44 -04003105 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003106 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003107 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003108}
3109
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003110void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003111 GLint level,
3112 GLint xoffset,
3113 GLint yoffset,
3114 GLint x,
3115 GLint y,
3116 GLsizei width,
3117 GLsizei height)
3118{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003119 if (width == 0 || height == 0)
3120 {
3121 return;
3122 }
3123
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003124 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003125 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003126
Jamie Madillc29968b2016-01-20 11:17:23 -05003127 Offset destOffset(xoffset, yoffset, 0);
3128 Rectangle sourceArea(x, y, width, height);
3129
Jamie Madill05b35b22017-10-03 09:01:44 -04003130 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003131 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003132 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003133}
3134
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003135void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003136 GLint level,
3137 GLint xoffset,
3138 GLint yoffset,
3139 GLint zoffset,
3140 GLint x,
3141 GLint y,
3142 GLsizei width,
3143 GLsizei height)
3144{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003145 if (width == 0 || height == 0)
3146 {
3147 return;
3148 }
3149
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003150 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003151 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003152
Jamie Madillc29968b2016-01-20 11:17:23 -05003153 Offset destOffset(xoffset, yoffset, zoffset);
3154 Rectangle sourceArea(x, y, width, height);
3155
Jamie Madill05b35b22017-10-03 09:01:44 -04003156 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3157 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003158 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3159 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003160}
3161
3162void Context::framebufferTexture2D(GLenum target,
3163 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003164 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003165 GLuint texture,
3166 GLint level)
3167{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003168 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003169 ASSERT(framebuffer);
3170
3171 if (texture != 0)
3172 {
3173 Texture *textureObj = getTexture(texture);
3174
3175 ImageIndex index = ImageIndex::MakeInvalid();
3176
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003177 if (textarget == TextureTarget::_2D)
Jamie Madillc29968b2016-01-20 11:17:23 -05003178 {
3179 index = ImageIndex::Make2D(level);
3180 }
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003181 else if (textarget == TextureTarget::Rectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -04003182 {
3183 index = ImageIndex::MakeRectangle(level);
3184 }
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003185 else if (textarget == TextureTarget::_2DMultisample)
JiangYizhoubddc46b2016-12-09 09:50:51 +08003186 {
3187 ASSERT(level == 0);
3188 index = ImageIndex::Make2DMultisample();
3189 }
Jamie Madillc29968b2016-01-20 11:17:23 -05003190 else
3191 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003192 ASSERT(TextureTargetToType(textarget) == TextureType::CubeMap);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003193 index = ImageIndex::MakeCube(textarget, level);
Jamie Madillc29968b2016-01-20 11:17:23 -05003194 }
3195
Jamie Madilla02315b2017-02-23 14:14:47 -05003196 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003197 }
3198 else
3199 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003200 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003201 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003202
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003203 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003204}
3205
3206void Context::framebufferRenderbuffer(GLenum target,
3207 GLenum attachment,
3208 GLenum renderbuffertarget,
3209 GLuint renderbuffer)
3210{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003211 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003212 ASSERT(framebuffer);
3213
3214 if (renderbuffer != 0)
3215 {
3216 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003217
3218 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex::MakeInvalid(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003219 renderbufferObject);
3220 }
3221 else
3222 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003223 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003224 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003225
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003226 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003227}
3228
3229void Context::framebufferTextureLayer(GLenum target,
3230 GLenum attachment,
3231 GLuint texture,
3232 GLint level,
3233 GLint layer)
3234{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003235 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003236 ASSERT(framebuffer);
3237
3238 if (texture != 0)
3239 {
3240 Texture *textureObject = getTexture(texture);
3241
3242 ImageIndex index = ImageIndex::MakeInvalid();
3243
Corentin Wallez99d492c2018-02-27 15:17:10 -05003244 if (textureObject->getType() == TextureType::_3D)
Jamie Madillc29968b2016-01-20 11:17:23 -05003245 {
3246 index = ImageIndex::Make3D(level, layer);
3247 }
3248 else
3249 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05003250 ASSERT(textureObject->getType() == TextureType::_2DArray);
Jamie Madillc29968b2016-01-20 11:17:23 -05003251 index = ImageIndex::Make2DArray(level, layer);
3252 }
3253
Jamie Madilla02315b2017-02-23 14:14:47 -05003254 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003255 }
3256 else
3257 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003258 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003259 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003260
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003261 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003262}
3263
Martin Radev137032d2017-07-13 10:11:12 +03003264void Context::framebufferTextureMultiviewLayeredANGLE(GLenum target,
3265 GLenum attachment,
3266 GLuint texture,
3267 GLint level,
3268 GLint baseViewIndex,
3269 GLsizei numViews)
3270{
Martin Radev82ef7742017-08-08 17:44:58 +03003271 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3272 ASSERT(framebuffer);
3273
3274 if (texture != 0)
3275 {
3276 Texture *textureObj = getTexture(texture);
3277
Martin Radev18b75ba2017-08-15 15:50:40 +03003278 ImageIndex index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
Martin Radev82ef7742017-08-08 17:44:58 +03003279 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3280 numViews, baseViewIndex);
3281 }
3282 else
3283 {
3284 framebuffer->resetAttachment(this, attachment);
3285 }
3286
3287 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003288}
3289
3290void Context::framebufferTextureMultiviewSideBySideANGLE(GLenum target,
3291 GLenum attachment,
3292 GLuint texture,
3293 GLint level,
3294 GLsizei numViews,
3295 const GLint *viewportOffsets)
3296{
Martin Radev5dae57b2017-07-14 16:15:55 +03003297 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3298 ASSERT(framebuffer);
3299
3300 if (texture != 0)
3301 {
3302 Texture *textureObj = getTexture(texture);
3303
3304 ImageIndex index = ImageIndex::Make2D(level);
3305 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3306 textureObj, numViews, viewportOffsets);
3307 }
3308 else
3309 {
3310 framebuffer->resetAttachment(this, attachment);
3311 }
3312
3313 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003314}
3315
Jamie Madillc29968b2016-01-20 11:17:23 -05003316void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3317{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003318 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003319 ASSERT(framebuffer);
3320 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003321 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003322}
3323
3324void Context::readBuffer(GLenum mode)
3325{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003326 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003327 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003328 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003329}
3330
3331void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3332{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003333 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003334 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003335
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003336 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003337 ASSERT(framebuffer);
3338
3339 // The specification isn't clear what should be done when the framebuffer isn't complete.
3340 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003341 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003342}
3343
3344void Context::invalidateFramebuffer(GLenum target,
3345 GLsizei numAttachments,
3346 const GLenum *attachments)
3347{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003348 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003349 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003350
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003351 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003352 ASSERT(framebuffer);
3353
Jamie Madille98b1b52018-03-08 09:47:23 -05003354 bool complete = false;
3355 ANGLE_CONTEXT_TRY(framebuffer->isComplete(this, &complete));
3356 if (!complete)
Jamie Madillc29968b2016-01-20 11:17:23 -05003357 {
Jamie Madill437fa652016-05-03 15:13:24 -04003358 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003359 }
Jamie Madill437fa652016-05-03 15:13:24 -04003360
Jamie Madill4928b7c2017-06-20 12:57:39 -04003361 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003362}
3363
3364void Context::invalidateSubFramebuffer(GLenum target,
3365 GLsizei numAttachments,
3366 const GLenum *attachments,
3367 GLint x,
3368 GLint y,
3369 GLsizei width,
3370 GLsizei height)
3371{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003372 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003373 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003374
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003375 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003376 ASSERT(framebuffer);
3377
Jamie Madille98b1b52018-03-08 09:47:23 -05003378 bool complete = false;
3379 ANGLE_CONTEXT_TRY(framebuffer->isComplete(this, &complete));
3380 if (!complete)
Jamie Madillc29968b2016-01-20 11:17:23 -05003381 {
Jamie Madill437fa652016-05-03 15:13:24 -04003382 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003383 }
Jamie Madill437fa652016-05-03 15:13:24 -04003384
3385 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003386 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003387}
3388
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003389void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003390 GLint level,
3391 GLint internalformat,
3392 GLsizei width,
3393 GLsizei height,
3394 GLint border,
3395 GLenum format,
3396 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003397 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003398{
Jamie Madillbc918e72018-03-08 09:47:21 -05003399 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003400
3401 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003402 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003403 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
3404 size, format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003405}
3406
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003407void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003408 GLint level,
3409 GLint internalformat,
3410 GLsizei width,
3411 GLsizei height,
3412 GLsizei depth,
3413 GLint border,
3414 GLenum format,
3415 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003416 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003417{
Jamie Madillbc918e72018-03-08 09:47:21 -05003418 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003419
3420 Extents size(width, height, depth);
3421 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003422 handleError(texture->setImage(this, mGLState.getUnpackState(),
3423 NonCubeTextureTypeToTarget(target), level, internalformat, size,
3424 format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003425}
3426
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003427void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003428 GLint level,
3429 GLint xoffset,
3430 GLint yoffset,
3431 GLsizei width,
3432 GLsizei height,
3433 GLenum format,
3434 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003435 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003436{
3437 // Zero sized uploads are valid but no-ops
3438 if (width == 0 || height == 0)
3439 {
3440 return;
3441 }
3442
Jamie Madillbc918e72018-03-08 09:47:21 -05003443 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003444
3445 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003446 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003447 handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
3448 type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003449}
3450
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003451void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003452 GLint level,
3453 GLint xoffset,
3454 GLint yoffset,
3455 GLint zoffset,
3456 GLsizei width,
3457 GLsizei height,
3458 GLsizei depth,
3459 GLenum format,
3460 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003461 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003462{
3463 // Zero sized uploads are valid but no-ops
3464 if (width == 0 || height == 0 || depth == 0)
3465 {
3466 return;
3467 }
3468
Jamie Madillbc918e72018-03-08 09:47:21 -05003469 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003470
3471 Box area(xoffset, yoffset, zoffset, width, height, depth);
3472 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003473 handleError(texture->setSubImage(this, mGLState.getUnpackState(),
3474 NonCubeTextureTypeToTarget(target), level, area, format, type,
3475 reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003476}
3477
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003478void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003479 GLint level,
3480 GLenum internalformat,
3481 GLsizei width,
3482 GLsizei height,
3483 GLint border,
3484 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003485 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003486{
Jamie Madillbc918e72018-03-08 09:47:21 -05003487 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003488
3489 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003490 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003491 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
3492 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04003493 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003494}
3495
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003496void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003497 GLint level,
3498 GLenum internalformat,
3499 GLsizei width,
3500 GLsizei height,
3501 GLsizei depth,
3502 GLint border,
3503 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003504 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003505{
Jamie Madillbc918e72018-03-08 09:47:21 -05003506 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003507
3508 Extents size(width, height, depth);
3509 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003510 handleError(texture->setCompressedImage(
3511 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
3512 size, imageSize, reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003513}
3514
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003515void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003516 GLint level,
3517 GLint xoffset,
3518 GLint yoffset,
3519 GLsizei width,
3520 GLsizei height,
3521 GLenum format,
3522 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003523 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003524{
Jamie Madillbc918e72018-03-08 09:47:21 -05003525 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003526
3527 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003528 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003529 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
3530 format, imageSize,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003531 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003532}
3533
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003534void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003535 GLint level,
3536 GLint xoffset,
3537 GLint yoffset,
3538 GLint zoffset,
3539 GLsizei width,
3540 GLsizei height,
3541 GLsizei depth,
3542 GLenum format,
3543 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003544 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003545{
3546 // Zero sized uploads are valid but no-ops
3547 if (width == 0 || height == 0)
3548 {
3549 return;
3550 }
3551
Jamie Madillbc918e72018-03-08 09:47:21 -05003552 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003553
3554 Box area(xoffset, yoffset, zoffset, width, height, depth);
3555 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003556 handleError(texture->setCompressedSubImage(
3557 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
3558 imageSize, reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003559}
3560
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003561void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03003562{
3563 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003564 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03003565}
3566
Jamie Madill007530e2017-12-28 14:27:04 -05003567void Context::copyTexture(GLuint sourceId,
3568 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05003569 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05003570 GLuint destId,
3571 GLint destLevel,
3572 GLint internalFormat,
3573 GLenum destType,
3574 GLboolean unpackFlipY,
3575 GLboolean unpackPremultiplyAlpha,
3576 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07003577{
Jamie Madillbc918e72018-03-08 09:47:21 -05003578 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07003579
3580 gl::Texture *sourceTexture = getTexture(sourceId);
3581 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05003582 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
3583 sourceLevel, ConvertToBool(unpackFlipY),
3584 ConvertToBool(unpackPremultiplyAlpha),
3585 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07003586}
3587
Jamie Madill007530e2017-12-28 14:27:04 -05003588void Context::copySubTexture(GLuint sourceId,
3589 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05003590 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05003591 GLuint destId,
3592 GLint destLevel,
3593 GLint xoffset,
3594 GLint yoffset,
3595 GLint x,
3596 GLint y,
3597 GLsizei width,
3598 GLsizei height,
3599 GLboolean unpackFlipY,
3600 GLboolean unpackPremultiplyAlpha,
3601 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07003602{
3603 // Zero sized copies are valid but no-ops
3604 if (width == 0 || height == 0)
3605 {
3606 return;
3607 }
3608
Jamie Madillbc918e72018-03-08 09:47:21 -05003609 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07003610
3611 gl::Texture *sourceTexture = getTexture(sourceId);
3612 gl::Texture *destTexture = getTexture(destId);
3613 Offset offset(xoffset, yoffset, 0);
3614 Rectangle area(x, y, width, height);
Geoff Lang92019432017-11-20 13:09:34 -05003615 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, area,
3616 ConvertToBool(unpackFlipY),
3617 ConvertToBool(unpackPremultiplyAlpha),
3618 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07003619}
3620
Jamie Madill007530e2017-12-28 14:27:04 -05003621void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07003622{
Jamie Madillbc918e72018-03-08 09:47:21 -05003623 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07003624
3625 gl::Texture *sourceTexture = getTexture(sourceId);
3626 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05003627 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07003628}
3629
Corentin Wallez336129f2017-10-17 15:55:40 -04003630void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03003631{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003632 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003633 ASSERT(buffer);
3634
Geoff Lang496c02d2016-10-20 11:38:11 -07003635 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03003636}
3637
Corentin Wallez336129f2017-10-17 15:55:40 -04003638void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03003639{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003640 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003641 ASSERT(buffer);
3642
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003643 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03003644 if (error.isError())
3645 {
Jamie Madill437fa652016-05-03 15:13:24 -04003646 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003647 return nullptr;
3648 }
3649
3650 return buffer->getMapPointer();
3651}
3652
Corentin Wallez336129f2017-10-17 15:55:40 -04003653GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03003654{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003655 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003656 ASSERT(buffer);
3657
3658 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003659 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03003660 if (error.isError())
3661 {
Jamie Madill437fa652016-05-03 15:13:24 -04003662 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003663 return GL_FALSE;
3664 }
3665
3666 return result;
3667}
3668
Corentin Wallez336129f2017-10-17 15:55:40 -04003669void *Context::mapBufferRange(BufferBinding target,
3670 GLintptr offset,
3671 GLsizeiptr length,
3672 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03003673{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003674 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003675 ASSERT(buffer);
3676
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003677 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03003678 if (error.isError())
3679 {
Jamie Madill437fa652016-05-03 15:13:24 -04003680 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003681 return nullptr;
3682 }
3683
3684 return buffer->getMapPointer();
3685}
3686
Corentin Wallez336129f2017-10-17 15:55:40 -04003687void Context::flushMappedBufferRange(BufferBinding /*target*/,
3688 GLintptr /*offset*/,
3689 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03003690{
3691 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
3692}
3693
Jamie Madillbc918e72018-03-08 09:47:21 -05003694Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05003695{
Geoff Langa8cb2872018-03-09 16:09:40 -05003696 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05003697}
3698
Jamie Madillbc918e72018-03-08 09:47:21 -05003699Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05003700{
Geoff Langa8cb2872018-03-09 16:09:40 -05003701 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05003702}
3703
Jamie Madillbc918e72018-03-08 09:47:21 -05003704Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05003705{
Geoff Langa8cb2872018-03-09 16:09:40 -05003706 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05003707}
3708
Jiajia Qin5451d532017-11-16 17:16:34 +08003709void Context::activeShaderProgram(GLuint pipeline, GLuint program)
3710{
3711 UNIMPLEMENTED();
3712}
3713
Jamie Madillc20ab272016-06-09 07:20:46 -07003714void Context::activeTexture(GLenum texture)
3715{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003716 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07003717}
3718
Jamie Madill876429b2017-04-20 15:46:24 -04003719void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07003720{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003721 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07003722}
3723
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05003724void Context::blendEquation(GLenum mode)
3725{
3726 mGLState.setBlendEquation(mode, mode);
3727}
3728
Jamie Madillc20ab272016-06-09 07:20:46 -07003729void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
3730{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003731 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003732}
3733
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05003734void Context::blendFunc(GLenum sfactor, GLenum dfactor)
3735{
3736 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
3737}
3738
Jamie Madillc20ab272016-06-09 07:20:46 -07003739void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
3740{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003741 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003742}
3743
Jamie Madill876429b2017-04-20 15:46:24 -04003744void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07003745{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003746 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003747}
3748
Jamie Madill876429b2017-04-20 15:46:24 -04003749void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07003750{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003751 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07003752}
3753
3754void Context::clearStencil(GLint s)
3755{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003756 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07003757}
3758
3759void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
3760{
Geoff Lang92019432017-11-20 13:09:34 -05003761 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
3762 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07003763}
3764
Corentin Wallez2e568cf2017-09-18 17:05:22 -04003765void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07003766{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003767 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003768}
3769
3770void Context::depthFunc(GLenum func)
3771{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003772 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07003773}
3774
3775void Context::depthMask(GLboolean flag)
3776{
Geoff Lang92019432017-11-20 13:09:34 -05003777 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07003778}
3779
Jamie Madill876429b2017-04-20 15:46:24 -04003780void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07003781{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003782 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07003783}
3784
3785void Context::disable(GLenum cap)
3786{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003787 mGLState.setEnableFeature(cap, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07003788}
3789
3790void Context::disableVertexAttribArray(GLuint index)
3791{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003792 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07003793}
3794
3795void Context::enable(GLenum cap)
3796{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003797 mGLState.setEnableFeature(cap, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07003798}
3799
3800void Context::enableVertexAttribArray(GLuint index)
3801{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003802 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07003803}
3804
3805void Context::frontFace(GLenum mode)
3806{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003807 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003808}
3809
3810void Context::hint(GLenum target, GLenum mode)
3811{
3812 switch (target)
3813 {
3814 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003815 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003816 break;
3817
3818 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003819 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003820 break;
3821
3822 default:
3823 UNREACHABLE();
3824 return;
3825 }
3826}
3827
3828void Context::lineWidth(GLfloat width)
3829{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003830 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07003831}
3832
3833void Context::pixelStorei(GLenum pname, GLint param)
3834{
3835 switch (pname)
3836 {
3837 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003838 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003839 break;
3840
3841 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003842 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003843 break;
3844
3845 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003846 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07003847 break;
3848
3849 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03003850 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003851 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003852 break;
3853
3854 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03003855 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003856 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003857 break;
3858
3859 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03003860 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003861 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003862 break;
3863
3864 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03003865 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003866 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003867 break;
3868
3869 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03003870 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003871 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003872 break;
3873
3874 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03003875 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003876 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003877 break;
3878
3879 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03003880 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003881 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003882 break;
3883
3884 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03003885 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003886 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003887 break;
3888
3889 default:
3890 UNREACHABLE();
3891 return;
3892 }
3893}
3894
3895void Context::polygonOffset(GLfloat factor, GLfloat units)
3896{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003897 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07003898}
3899
Jamie Madill876429b2017-04-20 15:46:24 -04003900void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07003901{
Geoff Lang92019432017-11-20 13:09:34 -05003902 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07003903}
3904
Jiawei Shaodb342272017-09-27 10:21:45 +08003905void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
3906{
3907 mGLState.setSampleMaskParams(maskNumber, mask);
3908}
3909
Jamie Madillc20ab272016-06-09 07:20:46 -07003910void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
3911{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003912 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07003913}
3914
3915void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
3916{
3917 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3918 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003919 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003920 }
3921
3922 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3923 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003924 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003925 }
3926}
3927
3928void Context::stencilMaskSeparate(GLenum face, GLuint mask)
3929{
3930 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3931 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003932 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003933 }
3934
3935 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3936 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003937 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003938 }
3939}
3940
3941void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
3942{
3943 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3944 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003945 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07003946 }
3947
3948 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3949 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003950 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07003951 }
3952}
3953
3954void Context::vertexAttrib1f(GLuint index, GLfloat x)
3955{
3956 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003957 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003958}
3959
3960void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
3961{
3962 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003963 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003964}
3965
3966void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
3967{
3968 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003969 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003970}
3971
3972void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
3973{
3974 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003975 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003976}
3977
3978void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
3979{
3980 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003981 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003982}
3983
3984void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
3985{
3986 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003987 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003988}
3989
3990void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
3991{
3992 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003993 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003994}
3995
3996void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
3997{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003998 mGLState.setVertexAttribf(index, values);
Jamie Madillc20ab272016-06-09 07:20:46 -07003999}
4000
4001void Context::vertexAttribPointer(GLuint index,
4002 GLint size,
4003 GLenum type,
4004 GLboolean normalized,
4005 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004006 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004007{
Corentin Wallez336129f2017-10-17 15:55:40 -04004008 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004009 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc20ab272016-06-09 07:20:46 -07004010}
4011
Shao80957d92017-02-20 21:25:59 +08004012void Context::vertexAttribFormat(GLuint attribIndex,
4013 GLint size,
4014 GLenum type,
4015 GLboolean normalized,
4016 GLuint relativeOffset)
4017{
Geoff Lang92019432017-11-20 13:09:34 -05004018 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004019 relativeOffset);
4020}
4021
4022void Context::vertexAttribIFormat(GLuint attribIndex,
4023 GLint size,
4024 GLenum type,
4025 GLuint relativeOffset)
4026{
4027 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
4028}
4029
4030void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4031{
Shaodde78e82017-05-22 14:13:27 +08004032 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Shao80957d92017-02-20 21:25:59 +08004033}
4034
Jiajia Qin5451d532017-11-16 17:16:34 +08004035void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004036{
4037 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
4038}
4039
Jamie Madillc20ab272016-06-09 07:20:46 -07004040void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4041{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004042 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004043}
4044
4045void Context::vertexAttribIPointer(GLuint index,
4046 GLint size,
4047 GLenum type,
4048 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004049 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004050{
Corentin Wallez336129f2017-10-17 15:55:40 -04004051 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4052 size, type, false, true, stride, pointer);
Jamie Madillc20ab272016-06-09 07:20:46 -07004053}
4054
4055void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4056{
4057 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004058 mGLState.setVertexAttribi(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004059}
4060
4061void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4062{
4063 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004064 mGLState.setVertexAttribu(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004065}
4066
4067void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4068{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004069 mGLState.setVertexAttribi(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07004070}
4071
4072void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4073{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004074 mGLState.setVertexAttribu(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07004075}
4076
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004077void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4078{
4079 const VertexAttribCurrentValueData &currentValues =
4080 getGLState().getVertexAttribCurrentValue(index);
4081 const VertexArray *vao = getGLState().getVertexArray();
4082 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4083 currentValues, pname, params);
4084}
4085
4086void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4087{
4088 const VertexAttribCurrentValueData &currentValues =
4089 getGLState().getVertexAttribCurrentValue(index);
4090 const VertexArray *vao = getGLState().getVertexArray();
4091 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4092 currentValues, pname, params);
4093}
4094
4095void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4096{
4097 const VertexAttribCurrentValueData &currentValues =
4098 getGLState().getVertexAttribCurrentValue(index);
4099 const VertexArray *vao = getGLState().getVertexArray();
4100 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4101 currentValues, pname, params);
4102}
4103
4104void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4105{
4106 const VertexAttribCurrentValueData &currentValues =
4107 getGLState().getVertexAttribCurrentValue(index);
4108 const VertexArray *vao = getGLState().getVertexArray();
4109 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4110 currentValues, pname, params);
4111}
4112
Jamie Madill876429b2017-04-20 15:46:24 -04004113void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004114{
4115 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4116 QueryVertexAttribPointerv(attrib, pname, pointer);
4117}
4118
Jamie Madillc20ab272016-06-09 07:20:46 -07004119void Context::debugMessageControl(GLenum source,
4120 GLenum type,
4121 GLenum severity,
4122 GLsizei count,
4123 const GLuint *ids,
4124 GLboolean enabled)
4125{
4126 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004127 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05004128 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07004129}
4130
4131void Context::debugMessageInsert(GLenum source,
4132 GLenum type,
4133 GLuint id,
4134 GLenum severity,
4135 GLsizei length,
4136 const GLchar *buf)
4137{
4138 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004139 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07004140}
4141
4142void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
4143{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004144 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07004145}
4146
4147GLuint Context::getDebugMessageLog(GLuint count,
4148 GLsizei bufSize,
4149 GLenum *sources,
4150 GLenum *types,
4151 GLuint *ids,
4152 GLenum *severities,
4153 GLsizei *lengths,
4154 GLchar *messageLog)
4155{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004156 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
4157 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07004158}
4159
4160void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
4161{
4162 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004163 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05004164 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07004165}
4166
4167void Context::popDebugGroup()
4168{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004169 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05004170 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07004171}
4172
Corentin Wallez336129f2017-10-17 15:55:40 -04004173void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04004174{
4175 Buffer *buffer = mGLState.getTargetBuffer(target);
4176 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004177 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04004178}
4179
Corentin Wallez336129f2017-10-17 15:55:40 -04004180void Context::bufferSubData(BufferBinding target,
4181 GLintptr offset,
4182 GLsizeiptr size,
4183 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04004184{
4185 if (data == nullptr)
4186 {
4187 return;
4188 }
4189
4190 Buffer *buffer = mGLState.getTargetBuffer(target);
4191 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004192 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04004193}
4194
Jamie Madillef300b12016-10-07 15:12:09 -04004195void Context::attachShader(GLuint program, GLuint shader)
4196{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05004197 Program *programObject = mState.mShaderPrograms->getProgram(program);
4198 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04004199 ASSERT(programObject && shaderObject);
4200 programObject->attachShader(shaderObject);
4201}
4202
Kenneth Russellf2f6f652016-10-05 19:53:23 -07004203const Workarounds &Context::getWorkarounds() const
4204{
4205 return mWorkarounds;
4206}
4207
Corentin Wallez336129f2017-10-17 15:55:40 -04004208void Context::copyBufferSubData(BufferBinding readTarget,
4209 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04004210 GLintptr readOffset,
4211 GLintptr writeOffset,
4212 GLsizeiptr size)
4213{
4214 // if size is zero, the copy is a successful no-op
4215 if (size == 0)
4216 {
4217 return;
4218 }
4219
4220 // TODO(jmadill): cache these.
4221 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
4222 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
4223
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004224 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04004225}
4226
Jamie Madill01a80ee2016-11-07 12:06:18 -05004227void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
4228{
4229 Program *programObject = getProgram(program);
4230 // TODO(jmadill): Re-use this from the validation if possible.
4231 ASSERT(programObject);
4232 programObject->bindAttributeLocation(index, name);
4233}
4234
Corentin Wallez336129f2017-10-17 15:55:40 -04004235void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004236{
Corentin Wallez336129f2017-10-17 15:55:40 -04004237 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4238 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004239}
4240
Corentin Wallez336129f2017-10-17 15:55:40 -04004241void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08004242{
4243 bindBufferRange(target, index, buffer, 0, 0);
4244}
4245
Corentin Wallez336129f2017-10-17 15:55:40 -04004246void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08004247 GLuint index,
4248 GLuint buffer,
4249 GLintptr offset,
4250 GLsizeiptr size)
4251{
Corentin Wallez336129f2017-10-17 15:55:40 -04004252 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4253 mGLState.setIndexedBufferBinding(this, target, index, bufferObject, offset, size);
Jiajia Qin6eafb042016-12-27 17:04:07 +08004254}
4255
Jamie Madill01a80ee2016-11-07 12:06:18 -05004256void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
4257{
4258 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4259 {
4260 bindReadFramebuffer(framebuffer);
4261 }
4262
4263 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4264 {
4265 bindDrawFramebuffer(framebuffer);
4266 }
4267}
4268
4269void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
4270{
4271 ASSERT(target == GL_RENDERBUFFER);
4272 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05004273 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004274 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004275}
4276
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004277void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08004278 GLsizei samples,
4279 GLenum internalformat,
4280 GLsizei width,
4281 GLsizei height,
4282 GLboolean fixedsamplelocations)
4283{
4284 Extents size(width, height, 1);
4285 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004286 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
4287 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08004288}
4289
4290void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
4291{
JiangYizhou5b03f472017-01-09 10:22:53 +08004292 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
4293 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05004294 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08004295 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08004296
4297 switch (pname)
4298 {
4299 case GL_SAMPLE_POSITION:
4300 handleError(framebuffer->getSamplePosition(index, val));
4301 break;
4302 default:
4303 UNREACHABLE();
4304 }
4305}
4306
Jamie Madille8fb6402017-02-14 17:56:40 -05004307void Context::renderbufferStorage(GLenum target,
4308 GLenum internalformat,
4309 GLsizei width,
4310 GLsizei height)
4311{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004312 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4313 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
4314
Jamie Madille8fb6402017-02-14 17:56:40 -05004315 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04004316 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004317}
4318
4319void Context::renderbufferStorageMultisample(GLenum target,
4320 GLsizei samples,
4321 GLenum internalformat,
4322 GLsizei width,
4323 GLsizei height)
4324{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004325 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4326 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05004327
4328 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004329 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04004330 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004331}
4332
Geoff Lang38f2cfb2017-04-11 15:23:08 -04004333void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
4334{
Jamie Madill70b5bb02017-08-28 13:32:37 -04004335 const Sync *syncObject = getSync(sync);
Geoff Lang82483b92017-04-11 15:33:00 -04004336 handleError(QuerySynciv(syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04004337}
4338
JiangYizhoue18e6392017-02-20 10:32:23 +08004339void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
4340{
4341 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4342 QueryFramebufferParameteriv(framebuffer, pname, params);
4343}
4344
Jiajia Qin5451d532017-11-16 17:16:34 +08004345void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08004346{
4347 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4348 SetFramebufferParameteri(framebuffer, pname, param);
4349}
4350
Jamie Madillb3f26b92017-07-19 15:07:41 -04004351Error Context::getScratchBuffer(size_t requstedSizeBytes,
4352 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05004353{
Jamie Madillb3f26b92017-07-19 15:07:41 -04004354 if (!mScratchBuffer.get(requstedSizeBytes, scratchBufferOut))
4355 {
4356 return OutOfMemory() << "Failed to allocate internal buffer.";
4357 }
4358 return NoError();
4359}
4360
4361Error Context::getZeroFilledBuffer(size_t requstedSizeBytes,
4362 angle::MemoryBuffer **zeroBufferOut) const
4363{
4364 if (!mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0))
Jamie Madille14951e2017-03-09 18:55:16 -05004365 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05004366 return OutOfMemory() << "Failed to allocate internal buffer.";
Jamie Madille14951e2017-03-09 18:55:16 -05004367 }
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05004368 return NoError();
Jamie Madille14951e2017-03-09 18:55:16 -05004369}
4370
Xinghua Cao10a4d432017-11-28 14:46:26 +08004371Error Context::prepareForDispatch()
4372{
Geoff Langa8cb2872018-03-09 16:09:40 -05004373 ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08004374
4375 if (isRobustResourceInitEnabled())
4376 {
4377 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
4378 }
4379
4380 return NoError();
4381}
4382
Xinghua Cao2b396592017-03-29 15:36:04 +08004383void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
4384{
4385 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
4386 {
4387 return;
4388 }
4389
Xinghua Cao10a4d432017-11-28 14:46:26 +08004390 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04004391 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08004392}
4393
Jiajia Qin5451d532017-11-16 17:16:34 +08004394void Context::dispatchComputeIndirect(GLintptr indirect)
4395{
Qin Jiajia62fcf622017-11-30 16:16:12 +08004396 ANGLE_CONTEXT_TRY(prepareForDispatch());
4397 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08004398}
4399
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004400void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08004401 GLsizei levels,
4402 GLenum internalFormat,
4403 GLsizei width,
4404 GLsizei height)
4405{
4406 Extents size(width, height, 1);
4407 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004408 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08004409}
4410
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004411void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08004412 GLsizei levels,
4413 GLenum internalFormat,
4414 GLsizei width,
4415 GLsizei height,
4416 GLsizei depth)
4417{
4418 Extents size(width, height, depth);
4419 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004420 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08004421}
4422
Jiajia Qin5451d532017-11-16 17:16:34 +08004423void Context::memoryBarrier(GLbitfield barriers)
4424{
Xinghua Cao89c422a2017-11-29 18:24:20 +08004425 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08004426}
4427
4428void Context::memoryBarrierByRegion(GLbitfield barriers)
4429{
Xinghua Cao89c422a2017-11-29 18:24:20 +08004430 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08004431}
4432
Jamie Madillc1d770e2017-04-13 17:31:24 -04004433GLenum Context::checkFramebufferStatus(GLenum target)
4434{
4435 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4436 ASSERT(framebuffer);
4437
Jamie Madille98b1b52018-03-08 09:47:23 -05004438 GLenum status = GL_NONE;
4439 Error err = framebuffer->checkStatus(this, &status);
4440 if (err.isError())
4441 {
4442 handleError(err);
4443 return 0;
4444 }
4445 return status;
Jamie Madillc1d770e2017-04-13 17:31:24 -04004446}
4447
4448void Context::compileShader(GLuint shader)
4449{
4450 Shader *shaderObject = GetValidShader(this, shader);
4451 if (!shaderObject)
4452 {
4453 return;
4454 }
4455 shaderObject->compile(this);
4456}
4457
4458void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
4459{
4460 for (int i = 0; i < n; i++)
4461 {
4462 deleteBuffer(buffers[i]);
4463 }
4464}
4465
4466void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
4467{
4468 for (int i = 0; i < n; i++)
4469 {
4470 if (framebuffers[i] != 0)
4471 {
4472 deleteFramebuffer(framebuffers[i]);
4473 }
4474 }
4475}
4476
4477void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
4478{
4479 for (int i = 0; i < n; i++)
4480 {
4481 deleteRenderbuffer(renderbuffers[i]);
4482 }
4483}
4484
4485void Context::deleteTextures(GLsizei n, const GLuint *textures)
4486{
4487 for (int i = 0; i < n; i++)
4488 {
4489 if (textures[i] != 0)
4490 {
4491 deleteTexture(textures[i]);
4492 }
4493 }
4494}
4495
4496void Context::detachShader(GLuint program, GLuint shader)
4497{
4498 Program *programObject = getProgram(program);
4499 ASSERT(programObject);
4500
4501 Shader *shaderObject = getShader(shader);
4502 ASSERT(shaderObject);
4503
4504 programObject->detachShader(this, shaderObject);
4505}
4506
4507void Context::genBuffers(GLsizei n, GLuint *buffers)
4508{
4509 for (int i = 0; i < n; i++)
4510 {
4511 buffers[i] = createBuffer();
4512 }
4513}
4514
4515void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
4516{
4517 for (int i = 0; i < n; i++)
4518 {
4519 framebuffers[i] = createFramebuffer();
4520 }
4521}
4522
4523void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
4524{
4525 for (int i = 0; i < n; i++)
4526 {
4527 renderbuffers[i] = createRenderbuffer();
4528 }
4529}
4530
4531void Context::genTextures(GLsizei n, GLuint *textures)
4532{
4533 for (int i = 0; i < n; i++)
4534 {
4535 textures[i] = createTexture();
4536 }
4537}
4538
4539void Context::getActiveAttrib(GLuint program,
4540 GLuint index,
4541 GLsizei bufsize,
4542 GLsizei *length,
4543 GLint *size,
4544 GLenum *type,
4545 GLchar *name)
4546{
4547 Program *programObject = getProgram(program);
4548 ASSERT(programObject);
4549 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
4550}
4551
4552void Context::getActiveUniform(GLuint program,
4553 GLuint index,
4554 GLsizei bufsize,
4555 GLsizei *length,
4556 GLint *size,
4557 GLenum *type,
4558 GLchar *name)
4559{
4560 Program *programObject = getProgram(program);
4561 ASSERT(programObject);
4562 programObject->getActiveUniform(index, bufsize, length, size, type, name);
4563}
4564
4565void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
4566{
4567 Program *programObject = getProgram(program);
4568 ASSERT(programObject);
4569 programObject->getAttachedShaders(maxcount, count, shaders);
4570}
4571
4572GLint Context::getAttribLocation(GLuint program, const GLchar *name)
4573{
4574 Program *programObject = getProgram(program);
4575 ASSERT(programObject);
4576 return programObject->getAttributeLocation(name);
4577}
4578
4579void Context::getBooleanv(GLenum pname, GLboolean *params)
4580{
4581 GLenum nativeType;
4582 unsigned int numParams = 0;
4583 getQueryParameterInfo(pname, &nativeType, &numParams);
4584
4585 if (nativeType == GL_BOOL)
4586 {
4587 getBooleanvImpl(pname, params);
4588 }
4589 else
4590 {
4591 CastStateValues(this, nativeType, pname, numParams, params);
4592 }
4593}
4594
4595void Context::getFloatv(GLenum pname, GLfloat *params)
4596{
4597 GLenum nativeType;
4598 unsigned int numParams = 0;
4599 getQueryParameterInfo(pname, &nativeType, &numParams);
4600
4601 if (nativeType == GL_FLOAT)
4602 {
4603 getFloatvImpl(pname, params);
4604 }
4605 else
4606 {
4607 CastStateValues(this, nativeType, pname, numParams, params);
4608 }
4609}
4610
4611void Context::getIntegerv(GLenum pname, GLint *params)
4612{
4613 GLenum nativeType;
4614 unsigned int numParams = 0;
4615 getQueryParameterInfo(pname, &nativeType, &numParams);
4616
4617 if (nativeType == GL_INT)
4618 {
4619 getIntegervImpl(pname, params);
4620 }
4621 else
4622 {
4623 CastStateValues(this, nativeType, pname, numParams, params);
4624 }
4625}
4626
4627void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
4628{
4629 Program *programObject = getProgram(program);
4630 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04004631 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004632}
4633
Jiajia Qin5451d532017-11-16 17:16:34 +08004634void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
4635{
4636 UNIMPLEMENTED();
4637}
4638
Jamie Madillbe849e42017-05-02 15:49:00 -04004639void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04004640{
4641 Program *programObject = getProgram(program);
4642 ASSERT(programObject);
4643 programObject->getInfoLog(bufsize, length, infolog);
4644}
4645
Jiajia Qin5451d532017-11-16 17:16:34 +08004646void Context::getProgramPipelineInfoLog(GLuint pipeline,
4647 GLsizei bufSize,
4648 GLsizei *length,
4649 GLchar *infoLog)
4650{
4651 UNIMPLEMENTED();
4652}
4653
Jamie Madillc1d770e2017-04-13 17:31:24 -04004654void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
4655{
4656 Shader *shaderObject = getShader(shader);
4657 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04004658 QueryShaderiv(this, shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004659}
4660
4661void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
4662{
4663 Shader *shaderObject = getShader(shader);
4664 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04004665 shaderObject->getInfoLog(this, bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004666}
4667
4668void Context::getShaderPrecisionFormat(GLenum shadertype,
4669 GLenum precisiontype,
4670 GLint *range,
4671 GLint *precision)
4672{
4673 // TODO(jmadill): Compute shaders.
4674
4675 switch (shadertype)
4676 {
4677 case GL_VERTEX_SHADER:
4678 switch (precisiontype)
4679 {
4680 case GL_LOW_FLOAT:
4681 mCaps.vertexLowpFloat.get(range, precision);
4682 break;
4683 case GL_MEDIUM_FLOAT:
4684 mCaps.vertexMediumpFloat.get(range, precision);
4685 break;
4686 case GL_HIGH_FLOAT:
4687 mCaps.vertexHighpFloat.get(range, precision);
4688 break;
4689
4690 case GL_LOW_INT:
4691 mCaps.vertexLowpInt.get(range, precision);
4692 break;
4693 case GL_MEDIUM_INT:
4694 mCaps.vertexMediumpInt.get(range, precision);
4695 break;
4696 case GL_HIGH_INT:
4697 mCaps.vertexHighpInt.get(range, precision);
4698 break;
4699
4700 default:
4701 UNREACHABLE();
4702 return;
4703 }
4704 break;
4705
4706 case GL_FRAGMENT_SHADER:
4707 switch (precisiontype)
4708 {
4709 case GL_LOW_FLOAT:
4710 mCaps.fragmentLowpFloat.get(range, precision);
4711 break;
4712 case GL_MEDIUM_FLOAT:
4713 mCaps.fragmentMediumpFloat.get(range, precision);
4714 break;
4715 case GL_HIGH_FLOAT:
4716 mCaps.fragmentHighpFloat.get(range, precision);
4717 break;
4718
4719 case GL_LOW_INT:
4720 mCaps.fragmentLowpInt.get(range, precision);
4721 break;
4722 case GL_MEDIUM_INT:
4723 mCaps.fragmentMediumpInt.get(range, precision);
4724 break;
4725 case GL_HIGH_INT:
4726 mCaps.fragmentHighpInt.get(range, precision);
4727 break;
4728
4729 default:
4730 UNREACHABLE();
4731 return;
4732 }
4733 break;
4734
4735 default:
4736 UNREACHABLE();
4737 return;
4738 }
4739}
4740
4741void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
4742{
4743 Shader *shaderObject = getShader(shader);
4744 ASSERT(shaderObject);
4745 shaderObject->getSource(bufsize, length, source);
4746}
4747
4748void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
4749{
4750 Program *programObject = getProgram(program);
4751 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04004752 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004753}
4754
4755void Context::getUniformiv(GLuint program, GLint location, GLint *params)
4756{
4757 Program *programObject = getProgram(program);
4758 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04004759 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004760}
4761
4762GLint Context::getUniformLocation(GLuint program, const GLchar *name)
4763{
4764 Program *programObject = getProgram(program);
4765 ASSERT(programObject);
4766 return programObject->getUniformLocation(name);
4767}
4768
4769GLboolean Context::isBuffer(GLuint buffer)
4770{
4771 if (buffer == 0)
4772 {
4773 return GL_FALSE;
4774 }
4775
4776 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
4777}
4778
4779GLboolean Context::isEnabled(GLenum cap)
4780{
4781 return mGLState.getEnableFeature(cap);
4782}
4783
4784GLboolean Context::isFramebuffer(GLuint framebuffer)
4785{
4786 if (framebuffer == 0)
4787 {
4788 return GL_FALSE;
4789 }
4790
4791 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
4792}
4793
4794GLboolean Context::isProgram(GLuint program)
4795{
4796 if (program == 0)
4797 {
4798 return GL_FALSE;
4799 }
4800
4801 return (getProgram(program) ? GL_TRUE : GL_FALSE);
4802}
4803
4804GLboolean Context::isRenderbuffer(GLuint renderbuffer)
4805{
4806 if (renderbuffer == 0)
4807 {
4808 return GL_FALSE;
4809 }
4810
4811 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
4812}
4813
4814GLboolean Context::isShader(GLuint shader)
4815{
4816 if (shader == 0)
4817 {
4818 return GL_FALSE;
4819 }
4820
4821 return (getShader(shader) ? GL_TRUE : GL_FALSE);
4822}
4823
4824GLboolean Context::isTexture(GLuint texture)
4825{
4826 if (texture == 0)
4827 {
4828 return GL_FALSE;
4829 }
4830
4831 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
4832}
4833
4834void Context::linkProgram(GLuint program)
4835{
4836 Program *programObject = getProgram(program);
4837 ASSERT(programObject);
4838 handleError(programObject->link(this));
Martin Radev0abb7a22017-08-28 15:34:45 +03004839 mGLState.onProgramExecutableChange(programObject);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004840}
4841
4842void Context::releaseShaderCompiler()
4843{
Jamie Madill4928b7c2017-06-20 12:57:39 -04004844 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004845}
4846
4847void Context::shaderBinary(GLsizei n,
4848 const GLuint *shaders,
4849 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04004850 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04004851 GLsizei length)
4852{
4853 // No binary shader formats are supported.
4854 UNIMPLEMENTED();
4855}
4856
4857void Context::shaderSource(GLuint shader,
4858 GLsizei count,
4859 const GLchar *const *string,
4860 const GLint *length)
4861{
4862 Shader *shaderObject = getShader(shader);
4863 ASSERT(shaderObject);
4864 shaderObject->setSource(count, string, length);
4865}
4866
4867void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
4868{
4869 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
4870}
4871
4872void Context::stencilMask(GLuint mask)
4873{
4874 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4875}
4876
4877void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4878{
4879 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4880}
4881
4882void Context::uniform1f(GLint location, GLfloat x)
4883{
4884 Program *program = mGLState.getProgram();
4885 program->setUniform1fv(location, 1, &x);
4886}
4887
4888void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
4889{
4890 Program *program = mGLState.getProgram();
4891 program->setUniform1fv(location, count, v);
4892}
4893
4894void Context::uniform1i(GLint location, GLint x)
4895{
4896 Program *program = mGLState.getProgram();
Jamie Madill81c2e252017-09-09 23:32:46 -04004897 if (program->setUniform1iv(location, 1, &x) == Program::SetUniformResult::SamplerChanged)
4898 {
4899 mGLState.setObjectDirty(GL_PROGRAM);
4900 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04004901}
4902
4903void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
4904{
4905 Program *program = mGLState.getProgram();
Jamie Madill81c2e252017-09-09 23:32:46 -04004906 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
4907 {
4908 mGLState.setObjectDirty(GL_PROGRAM);
4909 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04004910}
4911
4912void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
4913{
4914 GLfloat xy[2] = {x, y};
4915 Program *program = mGLState.getProgram();
4916 program->setUniform2fv(location, 1, xy);
4917}
4918
4919void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
4920{
4921 Program *program = mGLState.getProgram();
4922 program->setUniform2fv(location, count, v);
4923}
4924
4925void Context::uniform2i(GLint location, GLint x, GLint y)
4926{
4927 GLint xy[2] = {x, y};
4928 Program *program = mGLState.getProgram();
4929 program->setUniform2iv(location, 1, xy);
4930}
4931
4932void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
4933{
4934 Program *program = mGLState.getProgram();
4935 program->setUniform2iv(location, count, v);
4936}
4937
4938void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
4939{
4940 GLfloat xyz[3] = {x, y, z};
4941 Program *program = mGLState.getProgram();
4942 program->setUniform3fv(location, 1, xyz);
4943}
4944
4945void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
4946{
4947 Program *program = mGLState.getProgram();
4948 program->setUniform3fv(location, count, v);
4949}
4950
4951void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
4952{
4953 GLint xyz[3] = {x, y, z};
4954 Program *program = mGLState.getProgram();
4955 program->setUniform3iv(location, 1, xyz);
4956}
4957
4958void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
4959{
4960 Program *program = mGLState.getProgram();
4961 program->setUniform3iv(location, count, v);
4962}
4963
4964void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4965{
4966 GLfloat xyzw[4] = {x, y, z, w};
4967 Program *program = mGLState.getProgram();
4968 program->setUniform4fv(location, 1, xyzw);
4969}
4970
4971void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
4972{
4973 Program *program = mGLState.getProgram();
4974 program->setUniform4fv(location, count, v);
4975}
4976
4977void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
4978{
4979 GLint xyzw[4] = {x, y, z, w};
4980 Program *program = mGLState.getProgram();
4981 program->setUniform4iv(location, 1, xyzw);
4982}
4983
4984void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
4985{
4986 Program *program = mGLState.getProgram();
4987 program->setUniform4iv(location, count, v);
4988}
4989
4990void Context::uniformMatrix2fv(GLint location,
4991 GLsizei count,
4992 GLboolean transpose,
4993 const GLfloat *value)
4994{
4995 Program *program = mGLState.getProgram();
4996 program->setUniformMatrix2fv(location, count, transpose, value);
4997}
4998
4999void Context::uniformMatrix3fv(GLint location,
5000 GLsizei count,
5001 GLboolean transpose,
5002 const GLfloat *value)
5003{
5004 Program *program = mGLState.getProgram();
5005 program->setUniformMatrix3fv(location, count, transpose, value);
5006}
5007
5008void Context::uniformMatrix4fv(GLint location,
5009 GLsizei count,
5010 GLboolean transpose,
5011 const GLfloat *value)
5012{
5013 Program *program = mGLState.getProgram();
5014 program->setUniformMatrix4fv(location, count, transpose, value);
5015}
5016
5017void Context::validateProgram(GLuint program)
5018{
5019 Program *programObject = getProgram(program);
5020 ASSERT(programObject);
5021 programObject->validate(mCaps);
5022}
5023
Jiajia Qin5451d532017-11-16 17:16:34 +08005024void Context::validateProgramPipeline(GLuint pipeline)
5025{
5026 UNIMPLEMENTED();
5027}
5028
Jamie Madilld04908b2017-06-09 14:15:35 -04005029void Context::getProgramBinary(GLuint program,
5030 GLsizei bufSize,
5031 GLsizei *length,
5032 GLenum *binaryFormat,
5033 void *binary)
5034{
5035 Program *programObject = getProgram(program);
5036 ASSERT(programObject != nullptr);
5037
5038 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
5039}
5040
5041void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
5042{
5043 Program *programObject = getProgram(program);
5044 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04005045
Jamie Madilld04908b2017-06-09 14:15:35 -04005046 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
5047}
5048
Jamie Madillff325f12017-08-26 15:06:05 -04005049void Context::uniform1ui(GLint location, GLuint v0)
5050{
5051 Program *program = mGLState.getProgram();
5052 program->setUniform1uiv(location, 1, &v0);
5053}
5054
5055void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
5056{
5057 Program *program = mGLState.getProgram();
5058 const GLuint xy[] = {v0, v1};
5059 program->setUniform2uiv(location, 1, xy);
5060}
5061
5062void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
5063{
5064 Program *program = mGLState.getProgram();
5065 const GLuint xyz[] = {v0, v1, v2};
5066 program->setUniform3uiv(location, 1, xyz);
5067}
5068
5069void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
5070{
5071 Program *program = mGLState.getProgram();
5072 const GLuint xyzw[] = {v0, v1, v2, v3};
5073 program->setUniform4uiv(location, 1, xyzw);
5074}
5075
5076void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
5077{
5078 Program *program = mGLState.getProgram();
5079 program->setUniform1uiv(location, count, value);
5080}
5081void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
5082{
5083 Program *program = mGLState.getProgram();
5084 program->setUniform2uiv(location, count, value);
5085}
5086
5087void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
5088{
5089 Program *program = mGLState.getProgram();
5090 program->setUniform3uiv(location, count, value);
5091}
5092
5093void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
5094{
5095 Program *program = mGLState.getProgram();
5096 program->setUniform4uiv(location, count, value);
5097}
5098
Jamie Madillf0e04492017-08-26 15:28:42 -04005099void Context::genQueries(GLsizei n, GLuint *ids)
5100{
5101 for (GLsizei i = 0; i < n; i++)
5102 {
5103 GLuint handle = mQueryHandleAllocator.allocate();
5104 mQueryMap.assign(handle, nullptr);
5105 ids[i] = handle;
5106 }
5107}
5108
5109void Context::deleteQueries(GLsizei n, const GLuint *ids)
5110{
5111 for (int i = 0; i < n; i++)
5112 {
5113 GLuint query = ids[i];
5114
5115 Query *queryObject = nullptr;
5116 if (mQueryMap.erase(query, &queryObject))
5117 {
5118 mQueryHandleAllocator.release(query);
5119 if (queryObject)
5120 {
5121 queryObject->release(this);
5122 }
5123 }
5124 }
5125}
5126
5127GLboolean Context::isQuery(GLuint id)
5128{
5129 return (getQuery(id, false, GL_NONE) != nullptr) ? GL_TRUE : GL_FALSE;
5130}
5131
Jamie Madillc8c95812017-08-26 18:40:09 -04005132void Context::uniformMatrix2x3fv(GLint location,
5133 GLsizei count,
5134 GLboolean transpose,
5135 const GLfloat *value)
5136{
5137 Program *program = mGLState.getProgram();
5138 program->setUniformMatrix2x3fv(location, count, transpose, value);
5139}
5140
5141void Context::uniformMatrix3x2fv(GLint location,
5142 GLsizei count,
5143 GLboolean transpose,
5144 const GLfloat *value)
5145{
5146 Program *program = mGLState.getProgram();
5147 program->setUniformMatrix3x2fv(location, count, transpose, value);
5148}
5149
5150void Context::uniformMatrix2x4fv(GLint location,
5151 GLsizei count,
5152 GLboolean transpose,
5153 const GLfloat *value)
5154{
5155 Program *program = mGLState.getProgram();
5156 program->setUniformMatrix2x4fv(location, count, transpose, value);
5157}
5158
5159void Context::uniformMatrix4x2fv(GLint location,
5160 GLsizei count,
5161 GLboolean transpose,
5162 const GLfloat *value)
5163{
5164 Program *program = mGLState.getProgram();
5165 program->setUniformMatrix4x2fv(location, count, transpose, value);
5166}
5167
5168void Context::uniformMatrix3x4fv(GLint location,
5169 GLsizei count,
5170 GLboolean transpose,
5171 const GLfloat *value)
5172{
5173 Program *program = mGLState.getProgram();
5174 program->setUniformMatrix3x4fv(location, count, transpose, value);
5175}
5176
5177void Context::uniformMatrix4x3fv(GLint location,
5178 GLsizei count,
5179 GLboolean transpose,
5180 const GLfloat *value)
5181{
5182 Program *program = mGLState.getProgram();
5183 program->setUniformMatrix4x3fv(location, count, transpose, value);
5184}
5185
Jamie Madilld7576732017-08-26 18:49:50 -04005186void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
5187{
5188 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5189 {
5190 GLuint vertexArray = arrays[arrayIndex];
5191
5192 if (arrays[arrayIndex] != 0)
5193 {
5194 VertexArray *vertexArrayObject = nullptr;
5195 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
5196 {
5197 if (vertexArrayObject != nullptr)
5198 {
5199 detachVertexArray(vertexArray);
5200 vertexArrayObject->onDestroy(this);
5201 }
5202
5203 mVertexArrayHandleAllocator.release(vertexArray);
5204 }
5205 }
5206 }
5207}
5208
5209void Context::genVertexArrays(GLsizei n, GLuint *arrays)
5210{
5211 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5212 {
5213 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
5214 mVertexArrayMap.assign(vertexArray, nullptr);
5215 arrays[arrayIndex] = vertexArray;
5216 }
5217}
5218
5219bool Context::isVertexArray(GLuint array)
5220{
5221 if (array == 0)
5222 {
5223 return GL_FALSE;
5224 }
5225
5226 VertexArray *vao = getVertexArray(array);
5227 return (vao != nullptr ? GL_TRUE : GL_FALSE);
5228}
5229
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04005230void Context::endTransformFeedback()
5231{
5232 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5233 transformFeedback->end(this);
5234}
5235
5236void Context::transformFeedbackVaryings(GLuint program,
5237 GLsizei count,
5238 const GLchar *const *varyings,
5239 GLenum bufferMode)
5240{
5241 Program *programObject = getProgram(program);
5242 ASSERT(programObject);
5243 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
5244}
5245
5246void Context::getTransformFeedbackVarying(GLuint program,
5247 GLuint index,
5248 GLsizei bufSize,
5249 GLsizei *length,
5250 GLsizei *size,
5251 GLenum *type,
5252 GLchar *name)
5253{
5254 Program *programObject = getProgram(program);
5255 ASSERT(programObject);
5256 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
5257}
5258
5259void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
5260{
5261 for (int i = 0; i < n; i++)
5262 {
5263 GLuint transformFeedback = ids[i];
5264 if (transformFeedback == 0)
5265 {
5266 continue;
5267 }
5268
5269 TransformFeedback *transformFeedbackObject = nullptr;
5270 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
5271 {
5272 if (transformFeedbackObject != nullptr)
5273 {
5274 detachTransformFeedback(transformFeedback);
5275 transformFeedbackObject->release(this);
5276 }
5277
5278 mTransformFeedbackHandleAllocator.release(transformFeedback);
5279 }
5280 }
5281}
5282
5283void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
5284{
5285 for (int i = 0; i < n; i++)
5286 {
5287 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
5288 mTransformFeedbackMap.assign(transformFeedback, nullptr);
5289 ids[i] = transformFeedback;
5290 }
5291}
5292
5293bool Context::isTransformFeedback(GLuint id)
5294{
5295 if (id == 0)
5296 {
5297 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
5298 // returns FALSE
5299 return GL_FALSE;
5300 }
5301
5302 const TransformFeedback *transformFeedback = getTransformFeedback(id);
5303 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
5304}
5305
5306void Context::pauseTransformFeedback()
5307{
5308 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5309 transformFeedback->pause();
5310}
5311
5312void Context::resumeTransformFeedback()
5313{
5314 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5315 transformFeedback->resume();
5316}
5317
Jamie Madill12e957f2017-08-26 21:42:26 -04005318void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
5319{
5320 const Program *programObject = getProgram(program);
Jamie Madill54164b02017-08-28 15:17:37 -04005321 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04005322}
5323
5324GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
5325{
5326 const Program *programObject = getProgram(program);
5327 return programObject->getFragDataLocation(name);
5328}
5329
5330void Context::getUniformIndices(GLuint program,
5331 GLsizei uniformCount,
5332 const GLchar *const *uniformNames,
5333 GLuint *uniformIndices)
5334{
5335 const Program *programObject = getProgram(program);
5336 if (!programObject->isLinked())
5337 {
5338 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5339 {
5340 uniformIndices[uniformId] = GL_INVALID_INDEX;
5341 }
5342 }
5343 else
5344 {
5345 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5346 {
5347 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
5348 }
5349 }
5350}
5351
5352void Context::getActiveUniformsiv(GLuint program,
5353 GLsizei uniformCount,
5354 const GLuint *uniformIndices,
5355 GLenum pname,
5356 GLint *params)
5357{
5358 const Program *programObject = getProgram(program);
5359 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5360 {
5361 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08005362 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04005363 }
5364}
5365
5366GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
5367{
5368 const Program *programObject = getProgram(program);
5369 return programObject->getUniformBlockIndex(uniformBlockName);
5370}
5371
5372void Context::getActiveUniformBlockiv(GLuint program,
5373 GLuint uniformBlockIndex,
5374 GLenum pname,
5375 GLint *params)
5376{
5377 const Program *programObject = getProgram(program);
5378 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
5379}
5380
5381void Context::getActiveUniformBlockName(GLuint program,
5382 GLuint uniformBlockIndex,
5383 GLsizei bufSize,
5384 GLsizei *length,
5385 GLchar *uniformBlockName)
5386{
5387 const Program *programObject = getProgram(program);
5388 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
5389}
5390
5391void Context::uniformBlockBinding(GLuint program,
5392 GLuint uniformBlockIndex,
5393 GLuint uniformBlockBinding)
5394{
5395 Program *programObject = getProgram(program);
5396 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
5397}
5398
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005399GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
5400{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005401 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
5402 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005403
Jamie Madill70b5bb02017-08-28 13:32:37 -04005404 Sync *syncObject = getSync(syncHandle);
5405 Error error = syncObject->set(condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005406 if (error.isError())
5407 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04005408 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005409 handleError(error);
5410 return nullptr;
5411 }
5412
Jamie Madill70b5bb02017-08-28 13:32:37 -04005413 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005414}
5415
5416GLboolean Context::isSync(GLsync sync)
5417{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005418 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005419}
5420
5421GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
5422{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005423 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005424
5425 GLenum result = GL_WAIT_FAILED;
5426 handleError(syncObject->clientWait(flags, timeout, &result));
5427 return result;
5428}
5429
5430void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
5431{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005432 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005433 handleError(syncObject->serverWait(flags, timeout));
5434}
5435
5436void Context::getInteger64v(GLenum pname, GLint64 *params)
5437{
5438 GLenum nativeType = GL_NONE;
5439 unsigned int numParams = 0;
5440 getQueryParameterInfo(pname, &nativeType, &numParams);
5441
5442 if (nativeType == GL_INT_64_ANGLEX)
5443 {
5444 getInteger64vImpl(pname, params);
5445 }
5446 else
5447 {
5448 CastStateValues(this, nativeType, pname, numParams, params);
5449 }
5450}
5451
Corentin Wallez336129f2017-10-17 15:55:40 -04005452void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04005453{
5454 Buffer *buffer = mGLState.getTargetBuffer(target);
5455 QueryBufferParameteri64v(buffer, pname, params);
5456}
5457
5458void Context::genSamplers(GLsizei count, GLuint *samplers)
5459{
5460 for (int i = 0; i < count; i++)
5461 {
5462 samplers[i] = mState.mSamplers->createSampler();
5463 }
5464}
5465
5466void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
5467{
5468 for (int i = 0; i < count; i++)
5469 {
5470 GLuint sampler = samplers[i];
5471
5472 if (mState.mSamplers->getSampler(sampler))
5473 {
5474 detachSampler(sampler);
5475 }
5476
5477 mState.mSamplers->deleteObject(this, sampler);
5478 }
5479}
5480
5481void Context::getInternalformativ(GLenum target,
5482 GLenum internalformat,
5483 GLenum pname,
5484 GLsizei bufSize,
5485 GLint *params)
5486{
5487 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
5488 QueryInternalFormativ(formatCaps, pname, bufSize, params);
5489}
5490
Jiajia Qin5451d532017-11-16 17:16:34 +08005491void Context::programUniform1i(GLuint program, GLint location, GLint v0)
5492{
5493 programUniform1iv(program, location, 1, &v0);
5494}
5495
5496void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
5497{
5498 GLint xy[2] = {v0, v1};
5499 programUniform2iv(program, location, 1, xy);
5500}
5501
5502void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
5503{
5504 GLint xyz[3] = {v0, v1, v2};
5505 programUniform3iv(program, location, 1, xyz);
5506}
5507
5508void Context::programUniform4i(GLuint program,
5509 GLint location,
5510 GLint v0,
5511 GLint v1,
5512 GLint v2,
5513 GLint v3)
5514{
5515 GLint xyzw[4] = {v0, v1, v2, v3};
5516 programUniform4iv(program, location, 1, xyzw);
5517}
5518
5519void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
5520{
5521 programUniform1uiv(program, location, 1, &v0);
5522}
5523
5524void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
5525{
5526 GLuint xy[2] = {v0, v1};
5527 programUniform2uiv(program, location, 1, xy);
5528}
5529
5530void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
5531{
5532 GLuint xyz[3] = {v0, v1, v2};
5533 programUniform3uiv(program, location, 1, xyz);
5534}
5535
5536void Context::programUniform4ui(GLuint program,
5537 GLint location,
5538 GLuint v0,
5539 GLuint v1,
5540 GLuint v2,
5541 GLuint v3)
5542{
5543 GLuint xyzw[4] = {v0, v1, v2, v3};
5544 programUniform4uiv(program, location, 1, xyzw);
5545}
5546
5547void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
5548{
5549 programUniform1fv(program, location, 1, &v0);
5550}
5551
5552void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
5553{
5554 GLfloat xy[2] = {v0, v1};
5555 programUniform2fv(program, location, 1, xy);
5556}
5557
5558void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
5559{
5560 GLfloat xyz[3] = {v0, v1, v2};
5561 programUniform3fv(program, location, 1, xyz);
5562}
5563
5564void Context::programUniform4f(GLuint program,
5565 GLint location,
5566 GLfloat v0,
5567 GLfloat v1,
5568 GLfloat v2,
5569 GLfloat v3)
5570{
5571 GLfloat xyzw[4] = {v0, v1, v2, v3};
5572 programUniform4fv(program, location, 1, xyzw);
5573}
5574
Jamie Madill81c2e252017-09-09 23:32:46 -04005575void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
5576{
5577 Program *programObject = getProgram(program);
5578 ASSERT(programObject);
5579 if (programObject->setUniform1iv(location, count, value) ==
5580 Program::SetUniformResult::SamplerChanged)
5581 {
5582 mGLState.setObjectDirty(GL_PROGRAM);
5583 }
5584}
5585
Jiajia Qin5451d532017-11-16 17:16:34 +08005586void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
5587{
5588 Program *programObject = getProgram(program);
5589 ASSERT(programObject);
5590 programObject->setUniform2iv(location, count, value);
5591}
5592
5593void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
5594{
5595 Program *programObject = getProgram(program);
5596 ASSERT(programObject);
5597 programObject->setUniform3iv(location, count, value);
5598}
5599
5600void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
5601{
5602 Program *programObject = getProgram(program);
5603 ASSERT(programObject);
5604 programObject->setUniform4iv(location, count, value);
5605}
5606
5607void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
5608{
5609 Program *programObject = getProgram(program);
5610 ASSERT(programObject);
5611 programObject->setUniform1uiv(location, count, value);
5612}
5613
5614void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
5615{
5616 Program *programObject = getProgram(program);
5617 ASSERT(programObject);
5618 programObject->setUniform2uiv(location, count, value);
5619}
5620
5621void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
5622{
5623 Program *programObject = getProgram(program);
5624 ASSERT(programObject);
5625 programObject->setUniform3uiv(location, count, value);
5626}
5627
5628void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
5629{
5630 Program *programObject = getProgram(program);
5631 ASSERT(programObject);
5632 programObject->setUniform4uiv(location, count, value);
5633}
5634
5635void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
5636{
5637 Program *programObject = getProgram(program);
5638 ASSERT(programObject);
5639 programObject->setUniform1fv(location, count, value);
5640}
5641
5642void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
5643{
5644 Program *programObject = getProgram(program);
5645 ASSERT(programObject);
5646 programObject->setUniform2fv(location, count, value);
5647}
5648
5649void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
5650{
5651 Program *programObject = getProgram(program);
5652 ASSERT(programObject);
5653 programObject->setUniform3fv(location, count, value);
5654}
5655
5656void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
5657{
5658 Program *programObject = getProgram(program);
5659 ASSERT(programObject);
5660 programObject->setUniform4fv(location, count, value);
5661}
5662
5663void Context::programUniformMatrix2fv(GLuint program,
5664 GLint location,
5665 GLsizei count,
5666 GLboolean transpose,
5667 const GLfloat *value)
5668{
5669 Program *programObject = getProgram(program);
5670 ASSERT(programObject);
5671 programObject->setUniformMatrix2fv(location, count, transpose, value);
5672}
5673
5674void Context::programUniformMatrix3fv(GLuint program,
5675 GLint location,
5676 GLsizei count,
5677 GLboolean transpose,
5678 const GLfloat *value)
5679{
5680 Program *programObject = getProgram(program);
5681 ASSERT(programObject);
5682 programObject->setUniformMatrix3fv(location, count, transpose, value);
5683}
5684
5685void Context::programUniformMatrix4fv(GLuint program,
5686 GLint location,
5687 GLsizei count,
5688 GLboolean transpose,
5689 const GLfloat *value)
5690{
5691 Program *programObject = getProgram(program);
5692 ASSERT(programObject);
5693 programObject->setUniformMatrix4fv(location, count, transpose, value);
5694}
5695
5696void Context::programUniformMatrix2x3fv(GLuint program,
5697 GLint location,
5698 GLsizei count,
5699 GLboolean transpose,
5700 const GLfloat *value)
5701{
5702 Program *programObject = getProgram(program);
5703 ASSERT(programObject);
5704 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
5705}
5706
5707void Context::programUniformMatrix3x2fv(GLuint program,
5708 GLint location,
5709 GLsizei count,
5710 GLboolean transpose,
5711 const GLfloat *value)
5712{
5713 Program *programObject = getProgram(program);
5714 ASSERT(programObject);
5715 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
5716}
5717
5718void Context::programUniformMatrix2x4fv(GLuint program,
5719 GLint location,
5720 GLsizei count,
5721 GLboolean transpose,
5722 const GLfloat *value)
5723{
5724 Program *programObject = getProgram(program);
5725 ASSERT(programObject);
5726 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
5727}
5728
5729void Context::programUniformMatrix4x2fv(GLuint program,
5730 GLint location,
5731 GLsizei count,
5732 GLboolean transpose,
5733 const GLfloat *value)
5734{
5735 Program *programObject = getProgram(program);
5736 ASSERT(programObject);
5737 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
5738}
5739
5740void Context::programUniformMatrix3x4fv(GLuint program,
5741 GLint location,
5742 GLsizei count,
5743 GLboolean transpose,
5744 const GLfloat *value)
5745{
5746 Program *programObject = getProgram(program);
5747 ASSERT(programObject);
5748 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
5749}
5750
5751void Context::programUniformMatrix4x3fv(GLuint program,
5752 GLint location,
5753 GLsizei count,
5754 GLboolean transpose,
5755 const GLfloat *value)
5756{
5757 Program *programObject = getProgram(program);
5758 ASSERT(programObject);
5759 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
5760}
5761
Jamie Madill81c2e252017-09-09 23:32:46 -04005762void Context::onTextureChange(const Texture *texture)
5763{
5764 // Conservatively assume all textures are dirty.
5765 // TODO(jmadill): More fine-grained update.
5766 mGLState.setObjectDirty(GL_TEXTURE);
5767}
5768
James Darpiniane8a93c62018-01-04 18:02:24 -08005769bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
5770{
5771 return mGLState.isCurrentTransformFeedback(tf);
5772}
5773bool Context::isCurrentVertexArray(const VertexArray *va) const
5774{
5775 return mGLState.isCurrentVertexArray(va);
5776}
5777
Yunchao Hea336b902017-08-02 16:05:21 +08005778void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
5779{
5780 for (int i = 0; i < count; i++)
5781 {
5782 pipelines[i] = createProgramPipeline();
5783 }
5784}
5785
5786void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
5787{
5788 for (int i = 0; i < count; i++)
5789 {
5790 if (pipelines[i] != 0)
5791 {
5792 deleteProgramPipeline(pipelines[i]);
5793 }
5794 }
5795}
5796
5797GLboolean Context::isProgramPipeline(GLuint pipeline)
5798{
5799 if (pipeline == 0)
5800 {
5801 return GL_FALSE;
5802 }
5803
5804 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
5805}
5806
Jamie Madill2b7bbc22017-12-21 17:30:38 -05005807void Context::finishFenceNV(GLuint fence)
5808{
5809 FenceNV *fenceObject = getFenceNV(fence);
5810
5811 ASSERT(fenceObject && fenceObject->isSet());
5812 handleError(fenceObject->finish());
5813}
5814
5815void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
5816{
5817 FenceNV *fenceObject = getFenceNV(fence);
5818
5819 ASSERT(fenceObject && fenceObject->isSet());
5820
5821 switch (pname)
5822 {
5823 case GL_FENCE_STATUS_NV:
5824 {
5825 // GL_NV_fence spec:
5826 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
5827 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
5828 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
5829 GLboolean status = GL_TRUE;
5830 if (fenceObject->getStatus() != GL_TRUE)
5831 {
5832 ANGLE_CONTEXT_TRY(fenceObject->test(&status));
5833 }
5834 *params = status;
5835 break;
5836 }
5837
5838 case GL_FENCE_CONDITION_NV:
5839 {
5840 *params = static_cast<GLint>(fenceObject->getCondition());
5841 break;
5842 }
5843
5844 default:
5845 UNREACHABLE();
5846 }
5847}
5848
5849void Context::getTranslatedShaderSource(GLuint shader,
5850 GLsizei bufsize,
5851 GLsizei *length,
5852 GLchar *source)
5853{
5854 Shader *shaderObject = getShader(shader);
5855 ASSERT(shaderObject);
5856 shaderObject->getTranslatedSourceWithDebugInfo(this, bufsize, length, source);
5857}
5858
5859void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
5860{
5861 Program *programObject = getProgram(program);
5862 ASSERT(programObject);
5863
5864 programObject->getUniformfv(this, location, params);
5865}
5866
5867void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
5868{
5869 Program *programObject = getProgram(program);
5870 ASSERT(programObject);
5871
5872 programObject->getUniformiv(this, location, params);
5873}
5874
5875GLboolean Context::isFenceNV(GLuint fence)
5876{
5877 FenceNV *fenceObject = getFenceNV(fence);
5878
5879 if (fenceObject == nullptr)
5880 {
5881 return GL_FALSE;
5882 }
5883
5884 // GL_NV_fence spec:
5885 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
5886 // existing fence.
5887 return fenceObject->isSet();
5888}
5889
5890void Context::readnPixels(GLint x,
5891 GLint y,
5892 GLsizei width,
5893 GLsizei height,
5894 GLenum format,
5895 GLenum type,
5896 GLsizei bufSize,
5897 void *data)
5898{
5899 return readPixels(x, y, width, height, format, type, data);
5900}
5901
Jamie Madill007530e2017-12-28 14:27:04 -05005902void Context::setFenceNV(GLuint fence, GLenum condition)
5903{
5904 ASSERT(condition == GL_ALL_COMPLETED_NV);
5905
5906 FenceNV *fenceObject = getFenceNV(fence);
5907 ASSERT(fenceObject != nullptr);
5908 handleError(fenceObject->set(condition));
5909}
5910
5911GLboolean Context::testFenceNV(GLuint fence)
5912{
5913 FenceNV *fenceObject = getFenceNV(fence);
5914
5915 ASSERT(fenceObject != nullptr);
5916 ASSERT(fenceObject->isSet() == GL_TRUE);
5917
5918 GLboolean result = GL_TRUE;
5919 Error error = fenceObject->test(&result);
5920 if (error.isError())
5921 {
5922 handleError(error);
5923 return GL_TRUE;
5924 }
5925
5926 return result;
5927}
5928
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005929void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05005930{
5931 Texture *texture = getTargetTexture(target);
5932 egl::Image *imageObject = reinterpret_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005933 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05005934}
5935
Jamie Madillfa920eb2018-01-04 11:45:50 -05005936void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05005937{
5938 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
5939 egl::Image *imageObject = reinterpret_cast<egl::Image *>(image);
5940 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
5941}
5942
Jamie Madillfa920eb2018-01-04 11:45:50 -05005943void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
5944{
5945 UNIMPLEMENTED();
5946}
5947
Jamie Madill5b772312018-03-08 20:28:32 -05005948bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
5949{
5950 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
5951 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
5952 // to the fact that it is stored internally as a float, and so would require conversion
5953 // if returned from Context::getIntegerv. Since this conversion is already implemented
5954 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
5955 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
5956 // application.
5957 switch (pname)
5958 {
5959 case GL_COMPRESSED_TEXTURE_FORMATS:
5960 {
5961 *type = GL_INT;
5962 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
5963 return true;
5964 }
5965 case GL_SHADER_BINARY_FORMATS:
5966 {
5967 *type = GL_INT;
5968 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
5969 return true;
5970 }
5971
5972 case GL_MAX_VERTEX_ATTRIBS:
5973 case GL_MAX_VERTEX_UNIFORM_VECTORS:
5974 case GL_MAX_VARYING_VECTORS:
5975 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
5976 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
5977 case GL_MAX_TEXTURE_IMAGE_UNITS:
5978 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
5979 case GL_MAX_RENDERBUFFER_SIZE:
5980 case GL_NUM_SHADER_BINARY_FORMATS:
5981 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
5982 case GL_ARRAY_BUFFER_BINDING:
5983 case GL_FRAMEBUFFER_BINDING:
5984 case GL_RENDERBUFFER_BINDING:
5985 case GL_CURRENT_PROGRAM:
5986 case GL_PACK_ALIGNMENT:
5987 case GL_UNPACK_ALIGNMENT:
5988 case GL_GENERATE_MIPMAP_HINT:
5989 case GL_RED_BITS:
5990 case GL_GREEN_BITS:
5991 case GL_BLUE_BITS:
5992 case GL_ALPHA_BITS:
5993 case GL_DEPTH_BITS:
5994 case GL_STENCIL_BITS:
5995 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
5996 case GL_CULL_FACE_MODE:
5997 case GL_FRONT_FACE:
5998 case GL_ACTIVE_TEXTURE:
5999 case GL_STENCIL_FUNC:
6000 case GL_STENCIL_VALUE_MASK:
6001 case GL_STENCIL_REF:
6002 case GL_STENCIL_FAIL:
6003 case GL_STENCIL_PASS_DEPTH_FAIL:
6004 case GL_STENCIL_PASS_DEPTH_PASS:
6005 case GL_STENCIL_BACK_FUNC:
6006 case GL_STENCIL_BACK_VALUE_MASK:
6007 case GL_STENCIL_BACK_REF:
6008 case GL_STENCIL_BACK_FAIL:
6009 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
6010 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
6011 case GL_DEPTH_FUNC:
6012 case GL_BLEND_SRC_RGB:
6013 case GL_BLEND_SRC_ALPHA:
6014 case GL_BLEND_DST_RGB:
6015 case GL_BLEND_DST_ALPHA:
6016 case GL_BLEND_EQUATION_RGB:
6017 case GL_BLEND_EQUATION_ALPHA:
6018 case GL_STENCIL_WRITEMASK:
6019 case GL_STENCIL_BACK_WRITEMASK:
6020 case GL_STENCIL_CLEAR_VALUE:
6021 case GL_SUBPIXEL_BITS:
6022 case GL_MAX_TEXTURE_SIZE:
6023 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
6024 case GL_SAMPLE_BUFFERS:
6025 case GL_SAMPLES:
6026 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
6027 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
6028 case GL_TEXTURE_BINDING_2D:
6029 case GL_TEXTURE_BINDING_CUBE_MAP:
6030 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
6031 {
6032 *type = GL_INT;
6033 *numParams = 1;
6034 return true;
6035 }
6036 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
6037 {
6038 if (!getExtensions().packReverseRowOrder)
6039 {
6040 return false;
6041 }
6042 *type = GL_INT;
6043 *numParams = 1;
6044 return true;
6045 }
6046 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
6047 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
6048 {
6049 if (!getExtensions().textureRectangle)
6050 {
6051 return false;
6052 }
6053 *type = GL_INT;
6054 *numParams = 1;
6055 return true;
6056 }
6057 case GL_MAX_DRAW_BUFFERS_EXT:
6058 case GL_MAX_COLOR_ATTACHMENTS_EXT:
6059 {
6060 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
6061 {
6062 return false;
6063 }
6064 *type = GL_INT;
6065 *numParams = 1;
6066 return true;
6067 }
6068 case GL_MAX_VIEWPORT_DIMS:
6069 {
6070 *type = GL_INT;
6071 *numParams = 2;
6072 return true;
6073 }
6074 case GL_VIEWPORT:
6075 case GL_SCISSOR_BOX:
6076 {
6077 *type = GL_INT;
6078 *numParams = 4;
6079 return true;
6080 }
6081 case GL_SHADER_COMPILER:
6082 case GL_SAMPLE_COVERAGE_INVERT:
6083 case GL_DEPTH_WRITEMASK:
6084 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
6085 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
6086 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
6087 // bool-natural
6088 case GL_SAMPLE_COVERAGE:
6089 case GL_SCISSOR_TEST:
6090 case GL_STENCIL_TEST:
6091 case GL_DEPTH_TEST:
6092 case GL_BLEND:
6093 case GL_DITHER:
6094 case GL_CONTEXT_ROBUST_ACCESS_EXT:
6095 {
6096 *type = GL_BOOL;
6097 *numParams = 1;
6098 return true;
6099 }
6100 case GL_COLOR_WRITEMASK:
6101 {
6102 *type = GL_BOOL;
6103 *numParams = 4;
6104 return true;
6105 }
6106 case GL_POLYGON_OFFSET_FACTOR:
6107 case GL_POLYGON_OFFSET_UNITS:
6108 case GL_SAMPLE_COVERAGE_VALUE:
6109 case GL_DEPTH_CLEAR_VALUE:
6110 case GL_LINE_WIDTH:
6111 {
6112 *type = GL_FLOAT;
6113 *numParams = 1;
6114 return true;
6115 }
6116 case GL_ALIASED_LINE_WIDTH_RANGE:
6117 case GL_ALIASED_POINT_SIZE_RANGE:
6118 case GL_DEPTH_RANGE:
6119 {
6120 *type = GL_FLOAT;
6121 *numParams = 2;
6122 return true;
6123 }
6124 case GL_COLOR_CLEAR_VALUE:
6125 case GL_BLEND_COLOR:
6126 {
6127 *type = GL_FLOAT;
6128 *numParams = 4;
6129 return true;
6130 }
6131 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
6132 if (!getExtensions().textureFilterAnisotropic)
6133 {
6134 return false;
6135 }
6136 *type = GL_FLOAT;
6137 *numParams = 1;
6138 return true;
6139 case GL_TIMESTAMP_EXT:
6140 if (!getExtensions().disjointTimerQuery)
6141 {
6142 return false;
6143 }
6144 *type = GL_INT_64_ANGLEX;
6145 *numParams = 1;
6146 return true;
6147 case GL_GPU_DISJOINT_EXT:
6148 if (!getExtensions().disjointTimerQuery)
6149 {
6150 return false;
6151 }
6152 *type = GL_INT;
6153 *numParams = 1;
6154 return true;
6155 case GL_COVERAGE_MODULATION_CHROMIUM:
6156 if (!getExtensions().framebufferMixedSamples)
6157 {
6158 return false;
6159 }
6160 *type = GL_INT;
6161 *numParams = 1;
6162 return true;
6163 case GL_TEXTURE_BINDING_EXTERNAL_OES:
6164 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
6165 {
6166 return false;
6167 }
6168 *type = GL_INT;
6169 *numParams = 1;
6170 return true;
6171 }
6172
6173 if (getExtensions().debug)
6174 {
6175 switch (pname)
6176 {
6177 case GL_DEBUG_LOGGED_MESSAGES:
6178 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
6179 case GL_DEBUG_GROUP_STACK_DEPTH:
6180 case GL_MAX_DEBUG_MESSAGE_LENGTH:
6181 case GL_MAX_DEBUG_LOGGED_MESSAGES:
6182 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
6183 case GL_MAX_LABEL_LENGTH:
6184 *type = GL_INT;
6185 *numParams = 1;
6186 return true;
6187
6188 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
6189 case GL_DEBUG_OUTPUT:
6190 *type = GL_BOOL;
6191 *numParams = 1;
6192 return true;
6193 }
6194 }
6195
6196 if (getExtensions().multisampleCompatibility)
6197 {
6198 switch (pname)
6199 {
6200 case GL_MULTISAMPLE_EXT:
6201 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
6202 *type = GL_BOOL;
6203 *numParams = 1;
6204 return true;
6205 }
6206 }
6207
6208 if (getExtensions().pathRendering)
6209 {
6210 switch (pname)
6211 {
6212 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
6213 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
6214 *type = GL_FLOAT;
6215 *numParams = 16;
6216 return true;
6217 }
6218 }
6219
6220 if (getExtensions().bindGeneratesResource)
6221 {
6222 switch (pname)
6223 {
6224 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
6225 *type = GL_BOOL;
6226 *numParams = 1;
6227 return true;
6228 }
6229 }
6230
6231 if (getExtensions().clientArrays)
6232 {
6233 switch (pname)
6234 {
6235 case GL_CLIENT_ARRAYS_ANGLE:
6236 *type = GL_BOOL;
6237 *numParams = 1;
6238 return true;
6239 }
6240 }
6241
6242 if (getExtensions().sRGBWriteControl)
6243 {
6244 switch (pname)
6245 {
6246 case GL_FRAMEBUFFER_SRGB_EXT:
6247 *type = GL_BOOL;
6248 *numParams = 1;
6249 return true;
6250 }
6251 }
6252
6253 if (getExtensions().robustResourceInitialization &&
6254 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
6255 {
6256 *type = GL_BOOL;
6257 *numParams = 1;
6258 return true;
6259 }
6260
6261 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
6262 {
6263 *type = GL_BOOL;
6264 *numParams = 1;
6265 return true;
6266 }
6267
6268 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
6269 switch (pname)
6270 {
6271 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
6272 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
6273 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
6274 {
6275 return false;
6276 }
6277 *type = GL_INT;
6278 *numParams = 1;
6279 return true;
6280
6281 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
6282 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
6283 {
6284 return false;
6285 }
6286 *type = GL_INT;
6287 *numParams = 1;
6288 return true;
6289
6290 case GL_PROGRAM_BINARY_FORMATS_OES:
6291 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
6292 {
6293 return false;
6294 }
6295 *type = GL_INT;
6296 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
6297 return true;
6298
6299 case GL_PACK_ROW_LENGTH:
6300 case GL_PACK_SKIP_ROWS:
6301 case GL_PACK_SKIP_PIXELS:
6302 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
6303 {
6304 return false;
6305 }
6306 *type = GL_INT;
6307 *numParams = 1;
6308 return true;
6309 case GL_UNPACK_ROW_LENGTH:
6310 case GL_UNPACK_SKIP_ROWS:
6311 case GL_UNPACK_SKIP_PIXELS:
6312 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
6313 {
6314 return false;
6315 }
6316 *type = GL_INT;
6317 *numParams = 1;
6318 return true;
6319 case GL_VERTEX_ARRAY_BINDING:
6320 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
6321 {
6322 return false;
6323 }
6324 *type = GL_INT;
6325 *numParams = 1;
6326 return true;
6327 case GL_PIXEL_PACK_BUFFER_BINDING:
6328 case GL_PIXEL_UNPACK_BUFFER_BINDING:
6329 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
6330 {
6331 return false;
6332 }
6333 *type = GL_INT;
6334 *numParams = 1;
6335 return true;
6336 case GL_MAX_SAMPLES:
6337 {
6338 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
6339 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
6340 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
6341 {
6342 return false;
6343 }
6344 *type = GL_INT;
6345 *numParams = 1;
6346 return true;
6347
6348 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
6349 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
6350 {
6351 return false;
6352 }
6353 *type = GL_INT;
6354 *numParams = 1;
6355 return true;
6356 }
6357 }
6358
6359 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
6360 {
6361 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
6362 {
6363 return false;
6364 }
6365 *type = GL_INT;
6366 *numParams = 1;
6367 return true;
6368 }
6369
6370 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
6371 {
6372 *type = GL_INT;
6373 *numParams = 1;
6374 return true;
6375 }
6376
Lingfeng Yang13b708f2018-03-21 12:14:10 -07006377 if (getClientVersion() < Version(2, 0))
6378 {
6379 switch (pname)
6380 {
6381 case GL_ALPHA_TEST_FUNC:
6382 *type = GL_INT;
6383 *numParams = 1;
6384 return true;
6385 case GL_ALPHA_TEST_REF:
6386 *type = GL_FLOAT;
6387 *numParams = 1;
6388 return true;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07006389 case GL_MAX_TEXTURE_UNITS:
6390 *type = GL_INT;
6391 *numParams = 1;
6392 return true;
6393 case GL_CLIENT_ACTIVE_TEXTURE:
6394 *type = GL_INT;
6395 *numParams = 1;
6396 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07006397 case GL_CURRENT_COLOR:
6398 *type = GL_FLOAT;
6399 *numParams = 4;
6400 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07006401 case GL_CURRENT_NORMAL:
6402 *type = GL_FLOAT;
6403 *numParams = 3;
6404 return true;
Lingfeng Yang038dd532018-03-29 17:31:52 -07006405 case GL_CURRENT_TEXTURE_COORDS:
6406 *type = GL_FLOAT;
6407 *numParams = 4;
6408 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07006409 }
6410 }
6411
Jamie Madill5b772312018-03-08 20:28:32 -05006412 if (getClientVersion() < Version(3, 0))
6413 {
6414 return false;
6415 }
6416
6417 // Check for ES3.0+ parameter names
6418 switch (pname)
6419 {
6420 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
6421 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
6422 case GL_UNIFORM_BUFFER_BINDING:
6423 case GL_TRANSFORM_FEEDBACK_BINDING:
6424 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
6425 case GL_COPY_READ_BUFFER_BINDING:
6426 case GL_COPY_WRITE_BUFFER_BINDING:
6427 case GL_SAMPLER_BINDING:
6428 case GL_READ_BUFFER:
6429 case GL_TEXTURE_BINDING_3D:
6430 case GL_TEXTURE_BINDING_2D_ARRAY:
6431 case GL_MAX_3D_TEXTURE_SIZE:
6432 case GL_MAX_ARRAY_TEXTURE_LAYERS:
6433 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
6434 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
6435 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
6436 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
6437 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
6438 case GL_MAX_VARYING_COMPONENTS:
6439 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
6440 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
6441 case GL_MIN_PROGRAM_TEXEL_OFFSET:
6442 case GL_MAX_PROGRAM_TEXEL_OFFSET:
6443 case GL_NUM_EXTENSIONS:
6444 case GL_MAJOR_VERSION:
6445 case GL_MINOR_VERSION:
6446 case GL_MAX_ELEMENTS_INDICES:
6447 case GL_MAX_ELEMENTS_VERTICES:
6448 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
6449 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
6450 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
6451 case GL_UNPACK_IMAGE_HEIGHT:
6452 case GL_UNPACK_SKIP_IMAGES:
6453 {
6454 *type = GL_INT;
6455 *numParams = 1;
6456 return true;
6457 }
6458
6459 case GL_MAX_ELEMENT_INDEX:
6460 case GL_MAX_UNIFORM_BLOCK_SIZE:
6461 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
6462 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
6463 case GL_MAX_SERVER_WAIT_TIMEOUT:
6464 {
6465 *type = GL_INT_64_ANGLEX;
6466 *numParams = 1;
6467 return true;
6468 }
6469
6470 case GL_TRANSFORM_FEEDBACK_ACTIVE:
6471 case GL_TRANSFORM_FEEDBACK_PAUSED:
6472 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
6473 case GL_RASTERIZER_DISCARD:
6474 {
6475 *type = GL_BOOL;
6476 *numParams = 1;
6477 return true;
6478 }
6479
6480 case GL_MAX_TEXTURE_LOD_BIAS:
6481 {
6482 *type = GL_FLOAT;
6483 *numParams = 1;
6484 return true;
6485 }
6486 }
6487
6488 if (getExtensions().requestExtension)
6489 {
6490 switch (pname)
6491 {
6492 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
6493 *type = GL_INT;
6494 *numParams = 1;
6495 return true;
6496 }
6497 }
6498
6499 if (getClientVersion() < Version(3, 1))
6500 {
6501 return false;
6502 }
6503
6504 switch (pname)
6505 {
6506 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
6507 case GL_DRAW_INDIRECT_BUFFER_BINDING:
6508 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
6509 case GL_MAX_FRAMEBUFFER_WIDTH:
6510 case GL_MAX_FRAMEBUFFER_HEIGHT:
6511 case GL_MAX_FRAMEBUFFER_SAMPLES:
6512 case GL_MAX_SAMPLE_MASK_WORDS:
6513 case GL_MAX_COLOR_TEXTURE_SAMPLES:
6514 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
6515 case GL_MAX_INTEGER_SAMPLES:
6516 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
6517 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
6518 case GL_MAX_VERTEX_ATTRIB_STRIDE:
6519 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
6520 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
6521 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
6522 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
6523 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
6524 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
6525 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
6526 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
6527 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
6528 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
6529 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
6530 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
6531 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
6532 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
6533 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
6534 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
6535 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
6536 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
6537 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
6538 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
6539 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
6540 case GL_MAX_UNIFORM_LOCATIONS:
6541 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
6542 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
6543 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
6544 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
6545 case GL_MAX_IMAGE_UNITS:
6546 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
6547 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
6548 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
6549 case GL_SHADER_STORAGE_BUFFER_BINDING:
6550 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
6551 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
6552 *type = GL_INT;
6553 *numParams = 1;
6554 return true;
6555 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
6556 *type = GL_INT_64_ANGLEX;
6557 *numParams = 1;
6558 return true;
6559 case GL_SAMPLE_MASK:
6560 *type = GL_BOOL;
6561 *numParams = 1;
6562 return true;
6563 }
6564
6565 if (getExtensions().geometryShader)
6566 {
6567 switch (pname)
6568 {
6569 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
6570 case GL_LAYER_PROVOKING_VERTEX_EXT:
6571 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
6572 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
6573 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
6574 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
6575 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
6576 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
6577 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
6578 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
6579 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
6580 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
6581 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
6582 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
6583 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
6584 *type = GL_INT;
6585 *numParams = 1;
6586 return true;
6587 }
6588 }
6589
6590 return false;
6591}
6592
6593bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
6594{
6595 if (getClientVersion() < Version(3, 0))
6596 {
6597 return false;
6598 }
6599
6600 switch (target)
6601 {
6602 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
6603 case GL_UNIFORM_BUFFER_BINDING:
6604 {
6605 *type = GL_INT;
6606 *numParams = 1;
6607 return true;
6608 }
6609 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
6610 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
6611 case GL_UNIFORM_BUFFER_START:
6612 case GL_UNIFORM_BUFFER_SIZE:
6613 {
6614 *type = GL_INT_64_ANGLEX;
6615 *numParams = 1;
6616 return true;
6617 }
6618 }
6619
6620 if (getClientVersion() < Version(3, 1))
6621 {
6622 return false;
6623 }
6624
6625 switch (target)
6626 {
6627 case GL_IMAGE_BINDING_LAYERED:
6628 {
6629 *type = GL_BOOL;
6630 *numParams = 1;
6631 return true;
6632 }
6633 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
6634 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
6635 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
6636 case GL_SHADER_STORAGE_BUFFER_BINDING:
6637 case GL_VERTEX_BINDING_BUFFER:
6638 case GL_VERTEX_BINDING_DIVISOR:
6639 case GL_VERTEX_BINDING_OFFSET:
6640 case GL_VERTEX_BINDING_STRIDE:
6641 case GL_SAMPLE_MASK_VALUE:
6642 case GL_IMAGE_BINDING_NAME:
6643 case GL_IMAGE_BINDING_LEVEL:
6644 case GL_IMAGE_BINDING_LAYER:
6645 case GL_IMAGE_BINDING_ACCESS:
6646 case GL_IMAGE_BINDING_FORMAT:
6647 {
6648 *type = GL_INT;
6649 *numParams = 1;
6650 return true;
6651 }
6652 case GL_ATOMIC_COUNTER_BUFFER_START:
6653 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
6654 case GL_SHADER_STORAGE_BUFFER_START:
6655 case GL_SHADER_STORAGE_BUFFER_SIZE:
6656 {
6657 *type = GL_INT_64_ANGLEX;
6658 *numParams = 1;
6659 return true;
6660 }
6661 }
6662
6663 return false;
6664}
6665
6666Program *Context::getProgram(GLuint handle) const
6667{
6668 return mState.mShaderPrograms->getProgram(handle);
6669}
6670
6671Shader *Context::getShader(GLuint handle) const
6672{
6673 return mState.mShaderPrograms->getShader(handle);
6674}
6675
6676bool Context::isTextureGenerated(GLuint texture) const
6677{
6678 return mState.mTextures->isHandleGenerated(texture);
6679}
6680
6681bool Context::isBufferGenerated(GLuint buffer) const
6682{
6683 return mState.mBuffers->isHandleGenerated(buffer);
6684}
6685
6686bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
6687{
6688 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
6689}
6690
6691bool Context::isFramebufferGenerated(GLuint framebuffer) const
6692{
6693 return mState.mFramebuffers->isHandleGenerated(framebuffer);
6694}
6695
6696bool Context::isProgramPipelineGenerated(GLuint pipeline) const
6697{
6698 return mState.mPipelines->isHandleGenerated(pipeline);
6699}
6700
6701bool Context::usingDisplayTextureShareGroup() const
6702{
6703 return mDisplayTextureShareGroup;
6704}
6705
6706GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
6707{
6708 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
6709 internalformat == GL_DEPTH_STENCIL
6710 ? GL_DEPTH24_STENCIL8
6711 : internalformat;
6712}
6713
Jamie Madillc29968b2016-01-20 11:17:23 -05006714} // namespace gl