blob: 914087009f2036a107c26fa8541b94f015bda9a3 [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
James Darpinian30b604d2018-03-12 17:26:57 -0700132void MarkTransformFeedbackBufferUsage(gl::TransformFeedback *transformFeedback,
133 GLsizei count,
134 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -0400135{
Geoff Lang1a683462015-09-29 15:09:59 -0400136 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400137 {
James Darpinian30b604d2018-03-12 17:26:57 -0700138 transformFeedback->onVerticesDrawn(count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -0400139 }
140}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500141
142// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300143EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500144{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400145 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500146}
147
Martin Radev1be913c2016-07-11 17:59:16 +0300148EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
149{
150 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
151}
152
Geoff Langeb66a6e2016-10-31 13:06:12 -0400153gl::Version GetClientVersion(const egl::AttributeMap &attribs)
154{
155 return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
156}
157
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500158GLenum GetResetStrategy(const egl::AttributeMap &attribs)
159{
Lingfeng Yangb27b03a2018-02-19 13:38:48 -0800160 EGLAttrib attrib =
161 attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500162 switch (attrib)
163 {
164 case EGL_NO_RESET_NOTIFICATION:
165 return GL_NO_RESET_NOTIFICATION_EXT;
166 case EGL_LOSE_CONTEXT_ON_RESET:
167 return GL_LOSE_CONTEXT_ON_RESET_EXT;
168 default:
169 UNREACHABLE();
170 return GL_NONE;
171 }
172}
173
174bool GetRobustAccess(const egl::AttributeMap &attribs)
175{
Geoff Lang077f20a2016-11-01 10:08:02 -0400176 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
177 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
178 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500179}
180
181bool GetDebug(const egl::AttributeMap &attribs)
182{
Geoff Lang077f20a2016-11-01 10:08:02 -0400183 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
184 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500185}
186
187bool GetNoError(const egl::AttributeMap &attribs)
188{
189 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
190}
191
Geoff Langc287ea62016-09-16 14:46:51 -0400192bool GetWebGLContext(const egl::AttributeMap &attribs)
193{
194 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
195}
196
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400197bool GetExtensionsEnabled(const egl::AttributeMap &attribs, bool webGLContext)
198{
199 // If the context is WebGL, extensions are disabled by default
200 EGLAttrib defaultValue = webGLContext ? EGL_FALSE : EGL_TRUE;
201 return (attribs.get(EGL_EXTENSIONS_ENABLED_ANGLE, defaultValue) == EGL_TRUE);
202}
203
Geoff Langf41a7152016-09-19 15:11:17 -0400204bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
205{
206 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
207}
208
Geoff Langfeb8c682017-02-13 16:07:35 -0500209bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
210{
211 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
212}
213
Geoff Langb433e872017-10-05 14:01:47 -0400214bool GetRobustResourceInit(const egl::AttributeMap &attribs)
215{
216 return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
217}
218
Martin Radev9d901792016-07-15 15:58:58 +0300219std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
220{
221 std::string labelName;
222 if (label != nullptr)
223 {
224 size_t labelLength = length < 0 ? strlen(label) : length;
225 labelName = std::string(label, labelLength);
226 }
227 return labelName;
228}
229
230void GetObjectLabelBase(const std::string &objectLabel,
231 GLsizei bufSize,
232 GLsizei *length,
233 GLchar *label)
234{
235 size_t writeLength = objectLabel.length();
236 if (label != nullptr && bufSize > 0)
237 {
238 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
239 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
240 label[writeLength] = '\0';
241 }
242
243 if (length != nullptr)
244 {
245 *length = static_cast<GLsizei>(writeLength);
246 }
247}
248
Jamie Madill0f80ed82017-09-19 00:24:56 -0400249template <typename CapT, typename MaxT>
250void LimitCap(CapT *cap, MaxT maximum)
251{
252 *cap = std::min(*cap, static_cast<CapT>(maximum));
253}
254
Geoff Langf6db0982015-08-25 13:04:00 -0400255} // anonymous namespace
256
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000257namespace gl
258{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000259
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400260Context::Context(rx::EGLImplFactory *implFactory,
261 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400262 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500263 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400264 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500265 const egl::AttributeMap &attribs,
Geoff Langb433e872017-10-05 14:01:47 -0400266 const egl::DisplayExtensions &displayExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500267 : mState(reinterpret_cast<ContextID>(this),
268 shareContext ? &shareContext->mState : nullptr,
269 shareTextures,
270 GetClientVersion(attribs),
271 &mGLState,
272 mCaps,
273 mTextureCaps,
274 mExtensions,
275 mLimitations),
276 mSkipValidation(GetNoError(attribs)),
277 mDisplayTextureShareGroup(shareTextures != nullptr),
278 mSavedArgsType(nullptr),
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700279 mImplementation(implFactory->createContext(mState)),
Jamie Madill2f348d22017-06-05 10:50:59 -0400280 mCompiler(),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400281 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500282 mClientType(EGL_OPENGL_ES_API),
283 mHasBeenCurrent(false),
284 mContextLost(false),
285 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700286 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500287 mResetStrategy(GetResetStrategy(attribs)),
288 mRobustAccess(GetRobustAccess(attribs)),
Jamie Madill61e16b42017-06-19 11:13:23 -0400289 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
290 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500291 mSurfacelessFramebuffer(nullptr),
Jamie Madille14951e2017-03-09 18:55:16 -0500292 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400293 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400294 mMemoryProgramCache(memoryProgramCache),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400295 mScratchBuffer(1000u),
296 mZeroFilledBuffer(1000u)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000297{
Jamie Madill5b772312018-03-08 20:28:32 -0500298 // Needed to solve a Clang warning of unused variables.
299 UNUSED_VARIABLE(mSavedArgsType);
300 UNUSED_VARIABLE(mParamsBuffer);
301
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400302 mImplementation->setMemoryProgramCache(memoryProgramCache);
303
Geoff Langb433e872017-10-05 14:01:47 -0400304 bool robustResourceInit = GetRobustResourceInit(attribs);
305 initCaps(displayExtensions, robustResourceInit);
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700306 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400307
Jamie Madill4928b7c2017-06-20 12:57:39 -0400308 mGLState.initialize(this, GetDebug(attribs), GetBindGeneratesResource(attribs),
Jamie Madillc43be722017-07-13 16:22:14 -0400309 GetClientArraysEnabled(attribs), robustResourceInit,
310 mMemoryProgramCache != nullptr);
Régis Fénéon83107972015-02-05 12:57:44 +0100311
Shannon Woods53a94a82014-06-24 15:20:36 -0400312 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400313
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000314 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400315 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000316 // and cube map texture state vectors respectively associated with them.
317 // In order that access to these initial textures not be lost, they are treated as texture
318 // objects all of whose names are 0.
319
Corentin Wallez99d492c2018-02-27 15:17:10 -0500320 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800321 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500322
Corentin Wallez99d492c2018-02-27 15:17:10 -0500323 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800324 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400325
Geoff Langeb66a6e2016-10-31 13:06:12 -0400326 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400327 {
328 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500329 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800330 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400331
Corentin Wallez99d492c2018-02-27 15:17:10 -0500332 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800333 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400334 }
Geoff Lang3b573612016-10-31 14:08:10 -0400335 if (getClientVersion() >= Version(3, 1))
336 {
337 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500338 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800339 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800340
Jiajia Qin6eafb042016-12-27 17:04:07 +0800341 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
342 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800343 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800344 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800345
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800346 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
347 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400348 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800349 }
Geoff Lang3b573612016-10-31 14:08:10 -0400350 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000351
Geoff Lang4751aab2017-10-30 15:14:52 -0400352 const Extensions &nativeExtensions = mImplementation->getNativeExtensions();
353 if (nativeExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400354 {
355 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500356 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800357 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400358 }
359
Geoff Lang4751aab2017-10-30 15:14:52 -0400360 if (nativeExtensions.eglImageExternal || nativeExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400361 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500362 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800363 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400364 }
365
Jamie Madill4928b7c2017-06-20 12:57:39 -0400366 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500367
Jamie Madill57a89722013-07-02 11:57:03 -0400368 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000369
Geoff Langeb66a6e2016-10-31 13:06:12 -0400370 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400371 {
372 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
373 // In the initial state, a default transform feedback object is bound and treated as
374 // a transform feedback object with a name of zero. That object is bound any time
375 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400376 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400377 }
Geoff Langc8058452014-02-03 12:04:11 -0500378
Corentin Wallez336129f2017-10-17 15:55:40 -0400379 for (auto type : angle::AllEnums<BufferBinding>())
380 {
381 bindBuffer(type, 0);
382 }
383
384 bindRenderbuffer(GL_RENDERBUFFER, 0);
385
386 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
387 {
388 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
389 }
390
Jamie Madillad9f24e2016-02-12 09:27:24 -0500391 // Initialize dirty bit masks
Jamie Madillc67323a2017-11-02 23:11:41 -0400392 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500393 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500394 // No dirty objects.
395
396 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400397 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500398 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500399 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
400
401 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
402 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
403 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
404 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
405 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
406 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
407 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
408 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
409 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
410 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
411 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
412 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
413
414 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
415 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700416 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500417 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
418 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400419
Xinghua Cao10a4d432017-11-28 14:46:26 +0800420 // TODO(xinghua.cao@intel.com): add other dirty bits and dirty objects.
421 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
422 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
423 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
424 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
425 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800426 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800427 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800428
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400429 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000430}
431
Jamie Madill4928b7c2017-06-20 12:57:39 -0400432egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000433{
Corentin Wallez80b24112015-08-25 16:41:57 -0400434 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000435 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400436 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000437 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400438 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000439
Corentin Wallez80b24112015-08-25 16:41:57 -0400440 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000441 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400442 if (query.second != nullptr)
443 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400444 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400445 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000446 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400447 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000448
Corentin Wallez80b24112015-08-25 16:41:57 -0400449 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400450 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400451 if (vertexArray.second)
452 {
453 vertexArray.second->onDestroy(this);
454 }
Jamie Madill57a89722013-07-02 11:57:03 -0400455 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400456 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400457
Corentin Wallez80b24112015-08-25 16:41:57 -0400458 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500459 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500460 if (transformFeedback.second != nullptr)
461 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500462 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500463 }
Geoff Langc8058452014-02-03 12:04:11 -0500464 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400465 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500466
Jamie Madill5b772312018-03-08 20:28:32 -0500467 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400468 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800469 if (zeroTexture.get() != nullptr)
470 {
471 ANGLE_TRY(zeroTexture->onDestroy(this));
472 zeroTexture.set(this, nullptr);
473 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400474 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000475
Corentin Wallezccab69d2017-01-27 16:57:15 -0500476 SafeDelete(mSurfacelessFramebuffer);
477
Jamie Madill4928b7c2017-06-20 12:57:39 -0400478 ANGLE_TRY(releaseSurface(display));
Jamie Madill2f348d22017-06-05 10:50:59 -0400479 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500480
Jamie Madill4928b7c2017-06-20 12:57:39 -0400481 mGLState.reset(this);
482
Jamie Madill6c1f6712017-02-14 19:08:04 -0500483 mState.mBuffers->release(this);
484 mState.mShaderPrograms->release(this);
485 mState.mTextures->release(this);
486 mState.mRenderbuffers->release(this);
487 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400488 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500489 mState.mPaths->release(this);
490 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800491 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400492
Jamie Madill76e471e2017-10-21 09:56:01 -0400493 mImplementation->onDestroy(this);
494
Jamie Madill4928b7c2017-06-20 12:57:39 -0400495 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000496}
497
Jamie Madill70ee0f62017-02-06 16:04:20 -0500498Context::~Context()
499{
500}
501
Jamie Madill4928b7c2017-06-20 12:57:39 -0400502egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000503{
Jamie Madill61e16b42017-06-19 11:13:23 -0400504 mCurrentDisplay = display;
505
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000506 if (!mHasBeenCurrent)
507 {
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000508 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500509 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400510 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000511
Corentin Wallezc295e512017-01-27 17:47:50 -0500512 int width = 0;
513 int height = 0;
514 if (surface != nullptr)
515 {
516 width = surface->getWidth();
517 height = surface->getHeight();
518 }
519
520 mGLState.setViewportParams(0, 0, width, height);
521 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000522
523 mHasBeenCurrent = true;
524 }
525
Jamie Madill1b94d432015-08-07 13:23:23 -0400526 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700527 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400528 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400529
Jamie Madill4928b7c2017-06-20 12:57:39 -0400530 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500531
532 Framebuffer *newDefault = nullptr;
533 if (surface != nullptr)
534 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400535 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500536 mCurrentSurface = surface;
537 newDefault = surface->getDefaultFramebuffer();
538 }
539 else
540 {
541 if (mSurfacelessFramebuffer == nullptr)
542 {
543 mSurfacelessFramebuffer = new Framebuffer(mImplementation.get());
544 }
545
546 newDefault = mSurfacelessFramebuffer;
547 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000548
Corentin Wallez37c39792015-08-20 14:19:46 -0400549 // Update default framebuffer, the binding of the previous default
550 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400551 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700552 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400553 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700554 mGLState.setReadFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400555 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700556 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400557 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700558 mGLState.setDrawFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400559 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500560 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400561 }
Ian Ewell292f0052016-02-04 10:37:32 -0500562
563 // Notify the renderer of a context switch
Jamie Madill4928b7c2017-06-20 12:57:39 -0400564 mImplementation->onMakeCurrent(this);
565 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000566}
567
Jamie Madill4928b7c2017-06-20 12:57:39 -0400568egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400569{
Corentin Wallez37c39792015-08-20 14:19:46 -0400570 // Remove the default framebuffer
Corentin Wallezc295e512017-01-27 17:47:50 -0500571 Framebuffer *currentDefault = nullptr;
572 if (mCurrentSurface != nullptr)
Corentin Wallez51706ea2015-08-07 14:39:22 -0400573 {
Corentin Wallezc295e512017-01-27 17:47:50 -0500574 currentDefault = mCurrentSurface->getDefaultFramebuffer();
575 }
576 else if (mSurfacelessFramebuffer != nullptr)
577 {
578 currentDefault = mSurfacelessFramebuffer;
Corentin Wallez51706ea2015-08-07 14:39:22 -0400579 }
580
Corentin Wallezc295e512017-01-27 17:47:50 -0500581 if (mGLState.getReadFramebuffer() == currentDefault)
582 {
583 mGLState.setReadFramebufferBinding(nullptr);
584 }
585 if (mGLState.getDrawFramebuffer() == currentDefault)
586 {
587 mGLState.setDrawFramebufferBinding(nullptr);
588 }
589 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
590
591 if (mCurrentSurface)
592 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400593 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500594 mCurrentSurface = nullptr;
595 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400596
597 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400598}
599
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000600GLuint Context::createBuffer()
601{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500602 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000603}
604
605GLuint Context::createProgram()
606{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500607 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000608}
609
Jiawei Shao385b3e02018-03-21 09:43:28 +0800610GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000611{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500612 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000613}
614
615GLuint Context::createTexture()
616{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500617 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000618}
619
620GLuint Context::createRenderbuffer()
621{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500622 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000623}
624
Sami Väisänene45e53b2016-05-25 10:36:04 +0300625GLuint Context::createPaths(GLsizei range)
626{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500627 auto resultOrError = mState.mPaths->createPaths(mImplementation.get(), range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300628 if (resultOrError.isError())
629 {
630 handleError(resultOrError.getError());
631 return 0;
632 }
633 return resultOrError.getResult();
634}
635
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000636// Returns an unused framebuffer name
637GLuint Context::createFramebuffer()
638{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500639 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000640}
641
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500642void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000643{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500644 for (int i = 0; i < n; i++)
645 {
646 GLuint handle = mFenceNVHandleAllocator.allocate();
647 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
648 fences[i] = handle;
649 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000650}
651
Yunchao Hea336b902017-08-02 16:05:21 +0800652GLuint Context::createProgramPipeline()
653{
654 return mState.mPipelines->createProgramPipeline();
655}
656
Jiawei Shao385b3e02018-03-21 09:43:28 +0800657GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800658{
659 UNIMPLEMENTED();
660 return 0u;
661}
662
James Darpinian4d9d4832018-03-13 12:43:28 -0700663void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000664{
James Darpinian4d9d4832018-03-13 12:43:28 -0700665 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
666 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000667 {
668 detachBuffer(buffer);
669 }
Jamie Madill893ab082014-05-16 16:56:10 -0400670
James Darpinian4d9d4832018-03-13 12:43:28 -0700671 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000672}
673
674void Context::deleteShader(GLuint shader)
675{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500676 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000677}
678
679void Context::deleteProgram(GLuint program)
680{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500681 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000682}
683
684void Context::deleteTexture(GLuint texture)
685{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500686 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000687 {
688 detachTexture(texture);
689 }
690
Jamie Madill6c1f6712017-02-14 19:08:04 -0500691 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000692}
693
694void Context::deleteRenderbuffer(GLuint renderbuffer)
695{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500696 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000697 {
698 detachRenderbuffer(renderbuffer);
699 }
Jamie Madill893ab082014-05-16 16:56:10 -0400700
Jamie Madill6c1f6712017-02-14 19:08:04 -0500701 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000702}
703
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400704void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400705{
706 // The spec specifies the underlying Fence object is not deleted until all current
707 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
708 // and since our API is currently designed for being called from a single thread, we can delete
709 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400710 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400711}
712
Yunchao Hea336b902017-08-02 16:05:21 +0800713void Context::deleteProgramPipeline(GLuint pipeline)
714{
715 if (mState.mPipelines->getProgramPipeline(pipeline))
716 {
717 detachProgramPipeline(pipeline);
718 }
719
720 mState.mPipelines->deleteObject(this, pipeline);
721}
722
Sami Väisänene45e53b2016-05-25 10:36:04 +0300723void Context::deletePaths(GLuint first, GLsizei range)
724{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500725 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300726}
727
728bool Context::hasPathData(GLuint path) const
729{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500730 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300731 if (pathObj == nullptr)
732 return false;
733
734 return pathObj->hasPathData();
735}
736
737bool Context::hasPath(GLuint path) const
738{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500739 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300740}
741
742void Context::setPathCommands(GLuint path,
743 GLsizei numCommands,
744 const GLubyte *commands,
745 GLsizei numCoords,
746 GLenum coordType,
747 const void *coords)
748{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500749 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300750
751 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
752}
753
Jamie Madill007530e2017-12-28 14:27:04 -0500754void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300755{
Jamie Madill007530e2017-12-28 14:27:04 -0500756 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300757
758 switch (pname)
759 {
760 case GL_PATH_STROKE_WIDTH_CHROMIUM:
761 pathObj->setStrokeWidth(value);
762 break;
763 case GL_PATH_END_CAPS_CHROMIUM:
764 pathObj->setEndCaps(static_cast<GLenum>(value));
765 break;
766 case GL_PATH_JOIN_STYLE_CHROMIUM:
767 pathObj->setJoinStyle(static_cast<GLenum>(value));
768 break;
769 case GL_PATH_MITER_LIMIT_CHROMIUM:
770 pathObj->setMiterLimit(value);
771 break;
772 case GL_PATH_STROKE_BOUND_CHROMIUM:
773 pathObj->setStrokeBound(value);
774 break;
775 default:
776 UNREACHABLE();
777 break;
778 }
779}
780
Jamie Madill007530e2017-12-28 14:27:04 -0500781void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300782{
Jamie Madill007530e2017-12-28 14:27:04 -0500783 // TODO(jmadill): Should use proper clamping/casting.
784 pathParameterf(path, pname, static_cast<GLfloat>(value));
785}
786
787void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
788{
789 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300790
791 switch (pname)
792 {
793 case GL_PATH_STROKE_WIDTH_CHROMIUM:
794 *value = pathObj->getStrokeWidth();
795 break;
796 case GL_PATH_END_CAPS_CHROMIUM:
797 *value = static_cast<GLfloat>(pathObj->getEndCaps());
798 break;
799 case GL_PATH_JOIN_STYLE_CHROMIUM:
800 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
801 break;
802 case GL_PATH_MITER_LIMIT_CHROMIUM:
803 *value = pathObj->getMiterLimit();
804 break;
805 case GL_PATH_STROKE_BOUND_CHROMIUM:
806 *value = pathObj->getStrokeBound();
807 break;
808 default:
809 UNREACHABLE();
810 break;
811 }
812}
813
Jamie Madill007530e2017-12-28 14:27:04 -0500814void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
815{
816 GLfloat val = 0.0f;
817 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
818 if (value)
819 *value = static_cast<GLint>(val);
820}
821
Sami Väisänene45e53b2016-05-25 10:36:04 +0300822void Context::setPathStencilFunc(GLenum func, GLint ref, GLuint mask)
823{
824 mGLState.setPathStencilFunc(func, ref, mask);
825}
826
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000827void Context::deleteFramebuffer(GLuint framebuffer)
828{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500829 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000830 {
831 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000832 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500833
Jamie Madill6c1f6712017-02-14 19:08:04 -0500834 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000835}
836
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500837void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000838{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500839 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000840 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500841 GLuint fence = fences[i];
842
843 FenceNV *fenceObject = nullptr;
844 if (mFenceNVMap.erase(fence, &fenceObject))
845 {
846 mFenceNVHandleAllocator.release(fence);
847 delete fenceObject;
848 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000849 }
850}
851
Geoff Lang70d0f492015-12-10 17:45:46 -0500852Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000853{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500854 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000855}
856
Jamie Madill570f7c82014-07-03 10:38:54 -0400857Texture *Context::getTexture(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000858{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500859 return mState.mTextures->getTexture(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000860}
861
Geoff Lang70d0f492015-12-10 17:45:46 -0500862Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000863{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500864 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000865}
866
Jamie Madill70b5bb02017-08-28 13:32:37 -0400867Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400868{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400869 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400870}
871
Jamie Madill57a89722013-07-02 11:57:03 -0400872VertexArray *Context::getVertexArray(GLuint handle) const
873{
Jamie Madill96a483b2017-06-27 16:49:21 -0400874 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400875}
876
Jamie Madilldc356042013-07-19 16:36:57 -0400877Sampler *Context::getSampler(GLuint handle) const
878{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500879 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -0400880}
881
Geoff Langc8058452014-02-03 12:04:11 -0500882TransformFeedback *Context::getTransformFeedback(GLuint handle) const
883{
Jamie Madill96a483b2017-06-27 16:49:21 -0400884 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -0500885}
886
Yunchao Hea336b902017-08-02 16:05:21 +0800887ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
888{
889 return mState.mPipelines->getProgramPipeline(handle);
890}
891
Geoff Lang70d0f492015-12-10 17:45:46 -0500892LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
893{
894 switch (identifier)
895 {
896 case GL_BUFFER:
897 return getBuffer(name);
898 case GL_SHADER:
899 return getShader(name);
900 case GL_PROGRAM:
901 return getProgram(name);
902 case GL_VERTEX_ARRAY:
903 return getVertexArray(name);
904 case GL_QUERY:
905 return getQuery(name);
906 case GL_TRANSFORM_FEEDBACK:
907 return getTransformFeedback(name);
908 case GL_SAMPLER:
909 return getSampler(name);
910 case GL_TEXTURE:
911 return getTexture(name);
912 case GL_RENDERBUFFER:
913 return getRenderbuffer(name);
914 case GL_FRAMEBUFFER:
915 return getFramebuffer(name);
916 default:
917 UNREACHABLE();
918 return nullptr;
919 }
920}
921
922LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
923{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400924 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -0500925}
926
Martin Radev9d901792016-07-15 15:58:58 +0300927void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
928{
929 LabeledObject *object = getLabeledObject(identifier, name);
930 ASSERT(object != nullptr);
931
932 std::string labelName = GetObjectLabelFromPointer(length, label);
933 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -0400934
935 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
936 // specified object is active until we do this.
937 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +0300938}
939
940void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
941{
942 LabeledObject *object = getLabeledObjectFromPtr(ptr);
943 ASSERT(object != nullptr);
944
945 std::string labelName = GetObjectLabelFromPointer(length, label);
946 object->setLabel(labelName);
947}
948
949void Context::getObjectLabel(GLenum identifier,
950 GLuint name,
951 GLsizei bufSize,
952 GLsizei *length,
953 GLchar *label) const
954{
955 LabeledObject *object = getLabeledObject(identifier, name);
956 ASSERT(object != nullptr);
957
958 const std::string &objectLabel = object->getLabel();
959 GetObjectLabelBase(objectLabel, bufSize, length, label);
960}
961
962void Context::getObjectPtrLabel(const void *ptr,
963 GLsizei bufSize,
964 GLsizei *length,
965 GLchar *label) const
966{
967 LabeledObject *object = getLabeledObjectFromPtr(ptr);
968 ASSERT(object != nullptr);
969
970 const std::string &objectLabel = object->getLabel();
971 GetObjectLabelBase(objectLabel, bufSize, length, label);
972}
973
Jamie Madilldc356042013-07-19 16:36:57 -0400974bool Context::isSampler(GLuint samplerName) const
975{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500976 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -0400977}
978
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800979void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000980{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500981 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000982
Jamie Madilldedd7b92014-11-05 16:30:36 -0500983 if (handle == 0)
984 {
985 texture = mZeroTextures[target].get();
986 }
987 else
988 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500989 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500990 }
991
992 ASSERT(texture);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400993 mGLState.setSamplerTexture(this, target, texture);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000994}
995
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500996void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000997{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500998 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
999 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001000 mGLState.setReadFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001001}
1002
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001003void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001004{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001005 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1006 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001007 mGLState.setDrawFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001008}
1009
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001010void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001011{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001012 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001013 mGLState.setVertexArrayBinding(vertexArray);
Jamie Madill57a89722013-07-02 11:57:03 -04001014}
1015
Shao80957d92017-02-20 21:25:59 +08001016void Context::bindVertexBuffer(GLuint bindingIndex,
1017 GLuint bufferHandle,
1018 GLintptr offset,
1019 GLsizei stride)
1020{
1021 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001022 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Shao80957d92017-02-20 21:25:59 +08001023}
1024
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001025void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001026{
Geoff Lang76b10c92014-09-05 16:28:14 -04001027 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001028 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001029 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001030 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001031}
1032
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001033void Context::bindImageTexture(GLuint unit,
1034 GLuint texture,
1035 GLint level,
1036 GLboolean layered,
1037 GLint layer,
1038 GLenum access,
1039 GLenum format)
1040{
1041 Texture *tex = mState.mTextures->getTexture(texture);
1042 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1043}
1044
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001045void Context::useProgram(GLuint program)
1046{
Jamie Madill6c1f6712017-02-14 19:08:04 -05001047 mGLState.setProgram(this, getProgram(program));
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001048}
1049
Jiajia Qin5451d532017-11-16 17:16:34 +08001050void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1051{
1052 UNIMPLEMENTED();
1053}
1054
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001055void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001056{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001057 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001058 TransformFeedback *transformFeedback =
1059 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001060 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -05001061}
1062
Yunchao Hea336b902017-08-02 16:05:21 +08001063void Context::bindProgramPipeline(GLuint pipelineHandle)
1064{
1065 ProgramPipeline *pipeline =
1066 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1067 mGLState.setProgramPipelineBinding(this, pipeline);
1068}
1069
Jamie Madillf0e04492017-08-26 15:28:42 -04001070void Context::beginQuery(GLenum target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001071{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001072 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001073 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001074
Geoff Lang5aad9672014-09-08 11:10:42 -04001075 // begin query
Jamie Madillf0e04492017-08-26 15:28:42 -04001076 ANGLE_CONTEXT_TRY(queryObject->begin());
Geoff Lang5aad9672014-09-08 11:10:42 -04001077
1078 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001079 mGLState.setActiveQuery(this, target, queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001080}
1081
Jamie Madillf0e04492017-08-26 15:28:42 -04001082void Context::endQuery(GLenum target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001083{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001084 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001085 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001086
Jamie Madillf0e04492017-08-26 15:28:42 -04001087 handleError(queryObject->end());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001088
Geoff Lang5aad9672014-09-08 11:10:42 -04001089 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001090 mGLState.setActiveQuery(this, target, nullptr);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001091}
1092
Jamie Madillf0e04492017-08-26 15:28:42 -04001093void Context::queryCounter(GLuint id, GLenum target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001094{
1095 ASSERT(target == GL_TIMESTAMP_EXT);
1096
1097 Query *queryObject = getQuery(id, true, target);
1098 ASSERT(queryObject);
1099
Jamie Madillf0e04492017-08-26 15:28:42 -04001100 handleError(queryObject->queryCounter());
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001101}
1102
1103void Context::getQueryiv(GLenum target, GLenum pname, GLint *params)
1104{
1105 switch (pname)
1106 {
1107 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001108 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001109 break;
1110 case GL_QUERY_COUNTER_BITS_EXT:
1111 switch (target)
1112 {
1113 case GL_TIME_ELAPSED_EXT:
1114 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1115 break;
1116 case GL_TIMESTAMP_EXT:
1117 params[0] = getExtensions().queryCounterBitsTimestamp;
1118 break;
1119 default:
1120 UNREACHABLE();
1121 params[0] = 0;
1122 break;
1123 }
1124 break;
1125 default:
1126 UNREACHABLE();
1127 return;
1128 }
1129}
1130
Geoff Lang2186c382016-10-14 10:54:54 -04001131void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001132{
Geoff Lang2186c382016-10-14 10:54:54 -04001133 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001134}
1135
Geoff Lang2186c382016-10-14 10:54:54 -04001136void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001137{
Geoff Lang2186c382016-10-14 10:54:54 -04001138 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001139}
1140
Geoff Lang2186c382016-10-14 10:54:54 -04001141void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001142{
Geoff Lang2186c382016-10-14 10:54:54 -04001143 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001144}
1145
Geoff Lang2186c382016-10-14 10:54:54 -04001146void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001147{
Geoff Lang2186c382016-10-14 10:54:54 -04001148 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001149}
1150
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001151Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001152{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001153 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001154}
1155
Jamie Madill2f348d22017-06-05 10:50:59 -04001156FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001157{
Jamie Madill96a483b2017-06-27 16:49:21 -04001158 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001159}
1160
Jamie Madill2f348d22017-06-05 10:50:59 -04001161Query *Context::getQuery(GLuint handle, bool create, GLenum type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001162{
Jamie Madill96a483b2017-06-27 16:49:21 -04001163 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001164 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001165 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001166 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001167
1168 Query *query = mQueryMap.query(handle);
1169 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001170 {
Jamie Madill96a483b2017-06-27 16:49:21 -04001171 query = new Query(mImplementation->createQuery(type), handle);
1172 query->addRef();
1173 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001174 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001175 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001176}
1177
Geoff Lang70d0f492015-12-10 17:45:46 -05001178Query *Context::getQuery(GLuint handle) const
1179{
Jamie Madill96a483b2017-06-27 16:49:21 -04001180 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001181}
1182
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001183Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001184{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001185 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1186 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001187}
1188
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001189Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001190{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001191 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001192}
1193
Geoff Lang492a7e42014-11-05 13:27:06 -05001194Compiler *Context::getCompiler() const
1195{
Jamie Madill2f348d22017-06-05 10:50:59 -04001196 if (mCompiler.get() == nullptr)
1197 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001198 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001199 }
1200 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001201}
1202
Jamie Madillc1d770e2017-04-13 17:31:24 -04001203void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001204{
1205 switch (pname)
1206 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001207 case GL_SHADER_COMPILER:
1208 *params = GL_TRUE;
1209 break;
1210 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1211 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1212 break;
1213 default:
1214 mGLState.getBooleanv(pname, params);
1215 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001216 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001217}
1218
Jamie Madillc1d770e2017-04-13 17:31:24 -04001219void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001220{
Shannon Woods53a94a82014-06-24 15:20:36 -04001221 // Queries about context capabilities and maximums are answered by Context.
1222 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001223 switch (pname)
1224 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001225 case GL_ALIASED_LINE_WIDTH_RANGE:
1226 params[0] = mCaps.minAliasedLineWidth;
1227 params[1] = mCaps.maxAliasedLineWidth;
1228 break;
1229 case GL_ALIASED_POINT_SIZE_RANGE:
1230 params[0] = mCaps.minAliasedPointSize;
1231 params[1] = mCaps.maxAliasedPointSize;
1232 break;
1233 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1234 ASSERT(mExtensions.textureFilterAnisotropic);
1235 *params = mExtensions.maxTextureAnisotropy;
1236 break;
1237 case GL_MAX_TEXTURE_LOD_BIAS:
1238 *params = mCaps.maxLODBias;
1239 break;
1240
1241 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1242 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1243 {
1244 ASSERT(mExtensions.pathRendering);
1245 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1246 memcpy(params, m, 16 * sizeof(GLfloat));
1247 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001248 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001249
Jamie Madill231c7f52017-04-26 13:45:37 -04001250 default:
1251 mGLState.getFloatv(pname, params);
1252 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001253 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001254}
1255
Jamie Madillc1d770e2017-04-13 17:31:24 -04001256void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001257{
Shannon Woods53a94a82014-06-24 15:20:36 -04001258 // Queries about context capabilities and maximums are answered by Context.
1259 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001260
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001261 switch (pname)
1262 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001263 case GL_MAX_VERTEX_ATTRIBS:
1264 *params = mCaps.maxVertexAttributes;
1265 break;
1266 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1267 *params = mCaps.maxVertexUniformVectors;
1268 break;
1269 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
1270 *params = mCaps.maxVertexUniformComponents;
1271 break;
1272 case GL_MAX_VARYING_VECTORS:
1273 *params = mCaps.maxVaryingVectors;
1274 break;
1275 case GL_MAX_VARYING_COMPONENTS:
1276 *params = mCaps.maxVertexOutputComponents;
1277 break;
1278 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1279 *params = mCaps.maxCombinedTextureImageUnits;
1280 break;
1281 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
1282 *params = mCaps.maxVertexTextureImageUnits;
1283 break;
1284 case GL_MAX_TEXTURE_IMAGE_UNITS:
1285 *params = mCaps.maxTextureImageUnits;
1286 break;
1287 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1288 *params = mCaps.maxFragmentUniformVectors;
1289 break;
1290 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
1291 *params = mCaps.maxFragmentUniformComponents;
1292 break;
1293 case GL_MAX_RENDERBUFFER_SIZE:
1294 *params = mCaps.maxRenderbufferSize;
1295 break;
1296 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1297 *params = mCaps.maxColorAttachments;
1298 break;
1299 case GL_MAX_DRAW_BUFFERS_EXT:
1300 *params = mCaps.maxDrawBuffers;
1301 break;
1302 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1303 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1304 case GL_SUBPIXEL_BITS:
1305 *params = 4;
1306 break;
1307 case GL_MAX_TEXTURE_SIZE:
1308 *params = mCaps.max2DTextureSize;
1309 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001310 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1311 *params = mCaps.maxRectangleTextureSize;
1312 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001313 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1314 *params = mCaps.maxCubeMapTextureSize;
1315 break;
1316 case GL_MAX_3D_TEXTURE_SIZE:
1317 *params = mCaps.max3DTextureSize;
1318 break;
1319 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1320 *params = mCaps.maxArrayTextureLayers;
1321 break;
1322 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1323 *params = mCaps.uniformBufferOffsetAlignment;
1324 break;
1325 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1326 *params = mCaps.maxUniformBufferBindings;
1327 break;
1328 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
1329 *params = mCaps.maxVertexUniformBlocks;
1330 break;
1331 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
1332 *params = mCaps.maxFragmentUniformBlocks;
1333 break;
1334 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1335 *params = mCaps.maxCombinedTextureImageUnits;
1336 break;
1337 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1338 *params = mCaps.maxVertexOutputComponents;
1339 break;
1340 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1341 *params = mCaps.maxFragmentInputComponents;
1342 break;
1343 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1344 *params = mCaps.minProgramTexelOffset;
1345 break;
1346 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1347 *params = mCaps.maxProgramTexelOffset;
1348 break;
1349 case GL_MAJOR_VERSION:
1350 *params = getClientVersion().major;
1351 break;
1352 case GL_MINOR_VERSION:
1353 *params = getClientVersion().minor;
1354 break;
1355 case GL_MAX_ELEMENTS_INDICES:
1356 *params = mCaps.maxElementsIndices;
1357 break;
1358 case GL_MAX_ELEMENTS_VERTICES:
1359 *params = mCaps.maxElementsVertices;
1360 break;
1361 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1362 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1363 break;
1364 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1365 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1366 break;
1367 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1368 *params = mCaps.maxTransformFeedbackSeparateComponents;
1369 break;
1370 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1371 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1372 break;
1373 case GL_MAX_SAMPLES_ANGLE:
1374 *params = mCaps.maxSamples;
1375 break;
1376 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001377 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001378 params[0] = mCaps.maxViewportWidth;
1379 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001380 }
1381 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001382 case GL_COMPRESSED_TEXTURE_FORMATS:
1383 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1384 params);
1385 break;
1386 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1387 *params = mResetStrategy;
1388 break;
1389 case GL_NUM_SHADER_BINARY_FORMATS:
1390 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1391 break;
1392 case GL_SHADER_BINARY_FORMATS:
1393 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1394 break;
1395 case GL_NUM_PROGRAM_BINARY_FORMATS:
1396 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1397 break;
1398 case GL_PROGRAM_BINARY_FORMATS:
1399 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1400 break;
1401 case GL_NUM_EXTENSIONS:
1402 *params = static_cast<GLint>(mExtensionStrings.size());
1403 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001404
Jamie Madill231c7f52017-04-26 13:45:37 -04001405 // GL_KHR_debug
1406 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1407 *params = mExtensions.maxDebugMessageLength;
1408 break;
1409 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1410 *params = mExtensions.maxDebugLoggedMessages;
1411 break;
1412 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1413 *params = mExtensions.maxDebugGroupStackDepth;
1414 break;
1415 case GL_MAX_LABEL_LENGTH:
1416 *params = mExtensions.maxLabelLength;
1417 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001418
Martin Radeve5285d22017-07-14 16:23:53 +03001419 // GL_ANGLE_multiview
1420 case GL_MAX_VIEWS_ANGLE:
1421 *params = mExtensions.maxViews;
1422 break;
1423
Jamie Madill231c7f52017-04-26 13:45:37 -04001424 // GL_EXT_disjoint_timer_query
1425 case GL_GPU_DISJOINT_EXT:
1426 *params = mImplementation->getGPUDisjoint();
1427 break;
1428 case GL_MAX_FRAMEBUFFER_WIDTH:
1429 *params = mCaps.maxFramebufferWidth;
1430 break;
1431 case GL_MAX_FRAMEBUFFER_HEIGHT:
1432 *params = mCaps.maxFramebufferHeight;
1433 break;
1434 case GL_MAX_FRAMEBUFFER_SAMPLES:
1435 *params = mCaps.maxFramebufferSamples;
1436 break;
1437 case GL_MAX_SAMPLE_MASK_WORDS:
1438 *params = mCaps.maxSampleMaskWords;
1439 break;
1440 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1441 *params = mCaps.maxColorTextureSamples;
1442 break;
1443 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1444 *params = mCaps.maxDepthTextureSamples;
1445 break;
1446 case GL_MAX_INTEGER_SAMPLES:
1447 *params = mCaps.maxIntegerSamples;
1448 break;
1449 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1450 *params = mCaps.maxVertexAttribRelativeOffset;
1451 break;
1452 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1453 *params = mCaps.maxVertexAttribBindings;
1454 break;
1455 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1456 *params = mCaps.maxVertexAttribStride;
1457 break;
1458 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
1459 *params = mCaps.maxVertexAtomicCounterBuffers;
1460 break;
1461 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
1462 *params = mCaps.maxVertexAtomicCounters;
1463 break;
1464 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
1465 *params = mCaps.maxVertexImageUniforms;
1466 break;
1467 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
1468 *params = mCaps.maxVertexShaderStorageBlocks;
1469 break;
1470 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
1471 *params = mCaps.maxFragmentAtomicCounterBuffers;
1472 break;
1473 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
1474 *params = mCaps.maxFragmentAtomicCounters;
1475 break;
1476 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
1477 *params = mCaps.maxFragmentImageUniforms;
1478 break;
1479 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
1480 *params = mCaps.maxFragmentShaderStorageBlocks;
1481 break;
1482 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1483 *params = mCaps.minProgramTextureGatherOffset;
1484 break;
1485 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1486 *params = mCaps.maxProgramTextureGatherOffset;
1487 break;
1488 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1489 *params = mCaps.maxComputeWorkGroupInvocations;
1490 break;
1491 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
1492 *params = mCaps.maxComputeUniformBlocks;
1493 break;
1494 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
1495 *params = mCaps.maxComputeTextureImageUnits;
1496 break;
1497 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1498 *params = mCaps.maxComputeSharedMemorySize;
1499 break;
1500 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
1501 *params = mCaps.maxComputeUniformComponents;
1502 break;
1503 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
1504 *params = mCaps.maxComputeAtomicCounterBuffers;
1505 break;
1506 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
1507 *params = mCaps.maxComputeAtomicCounters;
1508 break;
1509 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
1510 *params = mCaps.maxComputeImageUniforms;
1511 break;
1512 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
1513 *params = mCaps.maxCombinedComputeUniformComponents;
1514 break;
1515 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
1516 *params = mCaps.maxComputeShaderStorageBlocks;
1517 break;
1518 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1519 *params = mCaps.maxCombinedShaderOutputResources;
1520 break;
1521 case GL_MAX_UNIFORM_LOCATIONS:
1522 *params = mCaps.maxUniformLocations;
1523 break;
1524 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1525 *params = mCaps.maxAtomicCounterBufferBindings;
1526 break;
1527 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1528 *params = mCaps.maxAtomicCounterBufferSize;
1529 break;
1530 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1531 *params = mCaps.maxCombinedAtomicCounterBuffers;
1532 break;
1533 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1534 *params = mCaps.maxCombinedAtomicCounters;
1535 break;
1536 case GL_MAX_IMAGE_UNITS:
1537 *params = mCaps.maxImageUnits;
1538 break;
1539 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1540 *params = mCaps.maxCombinedImageUniforms;
1541 break;
1542 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1543 *params = mCaps.maxShaderStorageBufferBindings;
1544 break;
1545 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1546 *params = mCaps.maxCombinedShaderStorageBlocks;
1547 break;
1548 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1549 *params = mCaps.shaderStorageBufferOffsetAlignment;
1550 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001551
1552 // GL_EXT_geometry_shader
1553 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1554 *params = mCaps.maxFramebufferLayers;
1555 break;
1556 case GL_LAYER_PROVOKING_VERTEX_EXT:
1557 *params = mCaps.layerProvokingVertex;
1558 break;
1559 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
1560 *params = mCaps.maxGeometryUniformComponents;
1561 break;
1562 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
1563 *params = mCaps.maxGeometryUniformBlocks;
1564 break;
1565 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
1566 *params = mCaps.maxCombinedGeometryUniformComponents;
1567 break;
1568 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1569 *params = mCaps.maxGeometryInputComponents;
1570 break;
1571 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1572 *params = mCaps.maxGeometryOutputComponents;
1573 break;
1574 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1575 *params = mCaps.maxGeometryOutputVertices;
1576 break;
1577 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1578 *params = mCaps.maxGeometryTotalOutputComponents;
1579 break;
1580 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1581 *params = mCaps.maxGeometryShaderInvocations;
1582 break;
1583 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
1584 *params = mCaps.maxGeometryTextureImageUnits;
1585 break;
1586 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
1587 *params = mCaps.maxGeometryAtomicCounterBuffers;
1588 break;
1589 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
1590 *params = mCaps.maxGeometryAtomicCounters;
1591 break;
1592 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
1593 *params = mCaps.maxGeometryImageUniforms;
1594 break;
1595 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
1596 *params = mCaps.maxGeometryShaderStorageBlocks;
1597 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001598 // GLES1 emulation: Caps queries
1599 case GL_MAX_TEXTURE_UNITS:
1600 *params = mCaps.maxMultitextureUnits;
1601 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001602 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001603 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001604 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001605 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001606}
1607
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001608void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001609{
Shannon Woods53a94a82014-06-24 15:20:36 -04001610 // Queries about context capabilities and maximums are answered by Context.
1611 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001612 switch (pname)
1613 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001614 case GL_MAX_ELEMENT_INDEX:
1615 *params = mCaps.maxElementIndex;
1616 break;
1617 case GL_MAX_UNIFORM_BLOCK_SIZE:
1618 *params = mCaps.maxUniformBlockSize;
1619 break;
1620 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
1621 *params = mCaps.maxCombinedVertexUniformComponents;
1622 break;
1623 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
1624 *params = mCaps.maxCombinedFragmentUniformComponents;
1625 break;
1626 case GL_MAX_SERVER_WAIT_TIMEOUT:
1627 *params = mCaps.maxServerWaitTimeout;
1628 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001629
Jamie Madill231c7f52017-04-26 13:45:37 -04001630 // GL_EXT_disjoint_timer_query
1631 case GL_TIMESTAMP_EXT:
1632 *params = mImplementation->getTimestamp();
1633 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001634
Jamie Madill231c7f52017-04-26 13:45:37 -04001635 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1636 *params = mCaps.maxShaderStorageBlockSize;
1637 break;
1638 default:
1639 UNREACHABLE();
1640 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001641 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001642}
1643
Geoff Lang70d0f492015-12-10 17:45:46 -05001644void Context::getPointerv(GLenum pname, void **params) const
1645{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001646 mGLState.getPointerv(pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001647}
1648
Martin Radev66fb8202016-07-28 11:45:20 +03001649void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001650{
Shannon Woods53a94a82014-06-24 15:20:36 -04001651 // Queries about context capabilities and maximums are answered by Context.
1652 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001653
1654 GLenum nativeType;
1655 unsigned int numParams;
1656 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1657 ASSERT(queryStatus);
1658
1659 if (nativeType == GL_INT)
1660 {
1661 switch (target)
1662 {
1663 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1664 ASSERT(index < 3u);
1665 *data = mCaps.maxComputeWorkGroupCount[index];
1666 break;
1667 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1668 ASSERT(index < 3u);
1669 *data = mCaps.maxComputeWorkGroupSize[index];
1670 break;
1671 default:
1672 mGLState.getIntegeri_v(target, index, data);
1673 }
1674 }
1675 else
1676 {
1677 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1678 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001679}
1680
Martin Radev66fb8202016-07-28 11:45:20 +03001681void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001682{
Shannon Woods53a94a82014-06-24 15:20:36 -04001683 // Queries about context capabilities and maximums are answered by Context.
1684 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001685
1686 GLenum nativeType;
1687 unsigned int numParams;
1688 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1689 ASSERT(queryStatus);
1690
1691 if (nativeType == GL_INT_64_ANGLEX)
1692 {
1693 mGLState.getInteger64i_v(target, index, data);
1694 }
1695 else
1696 {
1697 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1698 }
1699}
1700
1701void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1702{
1703 // Queries about context capabilities and maximums are answered by Context.
1704 // Queries about current GL state values are answered by State.
1705
1706 GLenum nativeType;
1707 unsigned int numParams;
1708 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1709 ASSERT(queryStatus);
1710
1711 if (nativeType == GL_BOOL)
1712 {
1713 mGLState.getBooleani_v(target, index, data);
1714 }
1715 else
1716 {
1717 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1718 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001719}
1720
Corentin Wallez336129f2017-10-17 15:55:40 -04001721void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001722{
1723 Buffer *buffer = mGLState.getTargetBuffer(target);
1724 QueryBufferParameteriv(buffer, pname, params);
1725}
1726
1727void Context::getFramebufferAttachmentParameteriv(GLenum target,
1728 GLenum attachment,
1729 GLenum pname,
1730 GLint *params)
1731{
1732 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08001733 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08001734}
1735
1736void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
1737{
1738 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
1739 QueryRenderbufferiv(this, renderbuffer, pname, params);
1740}
1741
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001742void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001743{
1744 Texture *texture = getTargetTexture(target);
1745 QueryTexParameterfv(texture, pname, params);
1746}
1747
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001748void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001749{
1750 Texture *texture = getTargetTexture(target);
1751 QueryTexParameteriv(texture, pname, params);
1752}
Jiajia Qin5451d532017-11-16 17:16:34 +08001753
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001754void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08001755{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001756 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05001757 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08001758}
1759
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001760void Context::getTexLevelParameterfv(TextureTarget target,
1761 GLint level,
1762 GLenum pname,
1763 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08001764{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001765 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05001766 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08001767}
1768
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001769void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08001770{
1771 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001772 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04001773 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001774}
1775
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001776void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001777{
1778 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001779 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04001780 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001781}
1782
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001783void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08001784{
1785 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001786 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04001787 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001788}
1789
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001790void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001791{
1792 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001793 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04001794 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001795}
1796
Jamie Madill675fe712016-12-19 13:07:54 -05001797void Context::drawArrays(GLenum mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001798{
Jamie Madill9fdaa492018-02-16 10:52:11 -05001799 // No-op if zero count
1800 if (count == 0)
1801 {
1802 return;
1803 }
1804
Jamie Madill05b35b22017-10-03 09:01:44 -04001805 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001806 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
James Darpinian30b604d2018-03-12 17:26:57 -07001807 MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001808}
1809
Jamie Madill675fe712016-12-19 13:07:54 -05001810void Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04001811{
Jamie Madill9fdaa492018-02-16 10:52:11 -05001812 // No-op if zero count
1813 if (count == 0 || instanceCount == 0)
1814 {
1815 return;
1816 }
1817
Jamie Madill05b35b22017-10-03 09:01:44 -04001818 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001819 ANGLE_CONTEXT_TRY(
1820 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
James Darpinian30b604d2018-03-12 17:26:57 -07001821 MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback(), count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04001822}
1823
Jamie Madill876429b2017-04-20 15:46:24 -04001824void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001825{
Jamie Madill9fdaa492018-02-16 10:52:11 -05001826 // No-op if zero count
1827 if (count == 0)
1828 {
1829 return;
1830 }
1831
Jamie Madill05b35b22017-10-03 09:01:44 -04001832 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001833 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04001834}
1835
Jamie Madill675fe712016-12-19 13:07:54 -05001836void Context::drawElementsInstanced(GLenum mode,
1837 GLsizei count,
1838 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04001839 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04001840 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04001841{
Jamie Madill9fdaa492018-02-16 10:52:11 -05001842 // No-op if zero count
1843 if (count == 0 || instances == 0)
1844 {
1845 return;
1846 }
1847
Jamie Madill05b35b22017-10-03 09:01:44 -04001848 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001849 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08001850 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04001851}
1852
Jamie Madill675fe712016-12-19 13:07:54 -05001853void Context::drawRangeElements(GLenum mode,
1854 GLuint start,
1855 GLuint end,
1856 GLsizei count,
1857 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04001858 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04001859{
Jamie Madill9fdaa492018-02-16 10:52:11 -05001860 // No-op if zero count
1861 if (count == 0)
1862 {
1863 return;
1864 }
1865
Jamie Madill05b35b22017-10-03 09:01:44 -04001866 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001867 ANGLE_CONTEXT_TRY(
1868 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001869}
1870
Jamie Madill876429b2017-04-20 15:46:24 -04001871void Context::drawArraysIndirect(GLenum mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08001872{
Jamie Madill05b35b22017-10-03 09:01:44 -04001873 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001874 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08001875}
1876
Jamie Madill876429b2017-04-20 15:46:24 -04001877void Context::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08001878{
Jamie Madill05b35b22017-10-03 09:01:44 -04001879 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001880 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08001881}
1882
Jamie Madill675fe712016-12-19 13:07:54 -05001883void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001884{
Jamie Madillafa02a22017-11-23 12:57:38 -05001885 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05001886}
1887
Jamie Madill675fe712016-12-19 13:07:54 -05001888void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05001889{
Jamie Madillafa02a22017-11-23 12:57:38 -05001890 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001891}
1892
Austin Kinross6ee1e782015-05-29 17:05:37 -07001893void Context::insertEventMarker(GLsizei length, const char *marker)
1894{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001895 ASSERT(mImplementation);
1896 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07001897}
1898
1899void Context::pushGroupMarker(GLsizei length, const char *marker)
1900{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001901 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05001902
1903 if (marker == nullptr)
1904 {
1905 // From the EXT_debug_marker spec,
1906 // "If <marker> is null then an empty string is pushed on the stack."
1907 mImplementation->pushGroupMarker(length, "");
1908 }
1909 else
1910 {
1911 mImplementation->pushGroupMarker(length, marker);
1912 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07001913}
1914
1915void Context::popGroupMarker()
1916{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001917 ASSERT(mImplementation);
1918 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07001919}
1920
Geoff Langd8605522016-04-13 10:19:12 -04001921void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
1922{
1923 Program *programObject = getProgram(program);
1924 ASSERT(programObject);
1925
1926 programObject->bindUniformLocation(location, name);
1927}
1928
Sami Väisänena797e062016-05-12 15:23:40 +03001929void Context::setCoverageModulation(GLenum components)
1930{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001931 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03001932}
1933
Sami Väisänene45e53b2016-05-25 10:36:04 +03001934void Context::loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix)
1935{
1936 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
1937}
1938
1939void Context::loadPathRenderingIdentityMatrix(GLenum matrixMode)
1940{
1941 GLfloat I[16];
1942 angle::Matrix<GLfloat>::setToIdentity(I);
1943
1944 mGLState.loadPathRenderingMatrix(matrixMode, I);
1945}
1946
1947void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
1948{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001949 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001950 if (!pathObj)
1951 return;
1952
1953 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05001954 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03001955
1956 mImplementation->stencilFillPath(pathObj, fillMode, mask);
1957}
1958
1959void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
1960{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001961 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001962 if (!pathObj)
1963 return;
1964
1965 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05001966 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03001967
1968 mImplementation->stencilStrokePath(pathObj, reference, mask);
1969}
1970
1971void Context::coverFillPath(GLuint path, GLenum coverMode)
1972{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001973 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001974 if (!pathObj)
1975 return;
1976
1977 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05001978 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03001979
1980 mImplementation->coverFillPath(pathObj, coverMode);
1981}
1982
1983void Context::coverStrokePath(GLuint path, GLenum coverMode)
1984{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001985 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001986 if (!pathObj)
1987 return;
1988
1989 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05001990 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03001991
1992 mImplementation->coverStrokePath(pathObj, coverMode);
1993}
1994
1995void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
1996{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001997 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001998 if (!pathObj)
1999 return;
2000
2001 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002002 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002003
2004 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2005}
2006
2007void Context::stencilThenCoverStrokePath(GLuint path,
2008 GLint reference,
2009 GLuint mask,
2010 GLenum coverMode)
2011{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002012 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002013 if (!pathObj)
2014 return;
2015
2016 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002017 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002018
2019 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2020}
2021
Sami Väisänend59ca052016-06-21 16:10:00 +03002022void Context::coverFillPathInstanced(GLsizei numPaths,
2023 GLenum pathNameType,
2024 const void *paths,
2025 GLuint pathBase,
2026 GLenum coverMode,
2027 GLenum transformType,
2028 const GLfloat *transformValues)
2029{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002030 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002031
2032 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002033 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002034
2035 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2036}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002037
Sami Väisänend59ca052016-06-21 16:10:00 +03002038void Context::coverStrokePathInstanced(GLsizei numPaths,
2039 GLenum pathNameType,
2040 const void *paths,
2041 GLuint pathBase,
2042 GLenum coverMode,
2043 GLenum transformType,
2044 const GLfloat *transformValues)
2045{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002046 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002047
2048 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002049 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002050
2051 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2052 transformValues);
2053}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002054
Sami Väisänend59ca052016-06-21 16:10:00 +03002055void Context::stencilFillPathInstanced(GLsizei numPaths,
2056 GLenum pathNameType,
2057 const void *paths,
2058 GLuint pathBase,
2059 GLenum fillMode,
2060 GLuint mask,
2061 GLenum transformType,
2062 const GLfloat *transformValues)
2063{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002064 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002065
2066 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002067 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002068
2069 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2070 transformValues);
2071}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002072
Sami Väisänend59ca052016-06-21 16:10:00 +03002073void Context::stencilStrokePathInstanced(GLsizei numPaths,
2074 GLenum pathNameType,
2075 const void *paths,
2076 GLuint pathBase,
2077 GLint reference,
2078 GLuint mask,
2079 GLenum transformType,
2080 const GLfloat *transformValues)
2081{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002082 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002083
2084 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002085 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002086
2087 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2088 transformValues);
2089}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002090
Sami Väisänend59ca052016-06-21 16:10:00 +03002091void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2092 GLenum pathNameType,
2093 const void *paths,
2094 GLuint pathBase,
2095 GLenum fillMode,
2096 GLuint mask,
2097 GLenum coverMode,
2098 GLenum transformType,
2099 const GLfloat *transformValues)
2100{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002101 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002102
2103 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002104 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002105
2106 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2107 transformType, transformValues);
2108}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002109
Sami Väisänend59ca052016-06-21 16:10:00 +03002110void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2111 GLenum pathNameType,
2112 const void *paths,
2113 GLuint pathBase,
2114 GLint reference,
2115 GLuint mask,
2116 GLenum coverMode,
2117 GLenum transformType,
2118 const GLfloat *transformValues)
2119{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002120 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002121
2122 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002123 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002124
2125 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2126 transformType, transformValues);
2127}
2128
Sami Väisänen46eaa942016-06-29 10:26:37 +03002129void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2130{
2131 auto *programObject = getProgram(program);
2132
2133 programObject->bindFragmentInputLocation(location, name);
2134}
2135
2136void Context::programPathFragmentInputGen(GLuint program,
2137 GLint location,
2138 GLenum genMode,
2139 GLint components,
2140 const GLfloat *coeffs)
2141{
2142 auto *programObject = getProgram(program);
2143
Jamie Madillbd044ed2017-06-05 12:59:21 -04002144 programObject->pathFragmentInputGen(this, location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002145}
2146
jchen1015015f72017-03-16 13:54:21 +08002147GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2148{
jchen10fd7c3b52017-03-21 15:36:03 +08002149 const auto *programObject = getProgram(program);
jchen1015015f72017-03-16 13:54:21 +08002150 return QueryProgramResourceIndex(programObject, programInterface, name);
2151}
2152
jchen10fd7c3b52017-03-21 15:36:03 +08002153void Context::getProgramResourceName(GLuint program,
2154 GLenum programInterface,
2155 GLuint index,
2156 GLsizei bufSize,
2157 GLsizei *length,
2158 GLchar *name)
2159{
2160 const auto *programObject = getProgram(program);
2161 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2162}
2163
jchen10191381f2017-04-11 13:59:04 +08002164GLint Context::getProgramResourceLocation(GLuint program,
2165 GLenum programInterface,
2166 const GLchar *name)
2167{
2168 const auto *programObject = getProgram(program);
2169 return QueryProgramResourceLocation(programObject, programInterface, name);
2170}
2171
jchen10880683b2017-04-12 16:21:55 +08002172void Context::getProgramResourceiv(GLuint program,
2173 GLenum programInterface,
2174 GLuint index,
2175 GLsizei propCount,
2176 const GLenum *props,
2177 GLsizei bufSize,
2178 GLsizei *length,
2179 GLint *params)
2180{
2181 const auto *programObject = getProgram(program);
2182 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2183 length, params);
2184}
2185
jchen10d9cd7b72017-08-30 15:04:25 +08002186void Context::getProgramInterfaceiv(GLuint program,
2187 GLenum programInterface,
2188 GLenum pname,
2189 GLint *params)
2190{
2191 const auto *programObject = getProgram(program);
2192 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2193}
2194
Jamie Madill71c88b32017-09-14 22:20:29 -04002195void Context::handleError(const Error &error)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002196{
Geoff Langda5777c2014-07-11 09:52:58 -04002197 if (error.isError())
2198 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002199 GLenum code = error.getCode();
2200 mErrors.insert(code);
2201 if (code == GL_OUT_OF_MEMORY && getWorkarounds().loseContextOnOutOfMemory)
2202 {
2203 markContextLost();
2204 }
Geoff Lang70d0f492015-12-10 17:45:46 -05002205
Geoff Langee6884e2017-11-09 16:51:11 -05002206 ASSERT(!error.getMessage().empty());
2207 mGLState.getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, error.getID(),
2208 GL_DEBUG_SEVERITY_HIGH, error.getMessage());
Geoff Langda5777c2014-07-11 09:52:58 -04002209 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002210}
2211
2212// Get one of the recorded errors and clear its flag, if any.
2213// [OpenGL ES 2.0.24] section 2.5 page 13.
2214GLenum Context::getError()
2215{
Geoff Langda5777c2014-07-11 09:52:58 -04002216 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002217 {
Geoff Langda5777c2014-07-11 09:52:58 -04002218 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002219 }
Geoff Langda5777c2014-07-11 09:52:58 -04002220 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002221 {
Geoff Langda5777c2014-07-11 09:52:58 -04002222 GLenum error = *mErrors.begin();
2223 mErrors.erase(mErrors.begin());
2224 return error;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002225 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002226}
2227
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002228// NOTE: this function should not assume that this context is current!
2229void Context::markContextLost()
2230{
2231 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002232 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002233 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002234 mContextLostForced = true;
2235 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002236 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002237}
2238
2239bool Context::isContextLost()
2240{
2241 return mContextLost;
2242}
2243
Jamie Madillfa920eb2018-01-04 11:45:50 -05002244GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002245{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002246 // Even if the application doesn't want to know about resets, we want to know
2247 // as it will allow us to skip all the calls.
2248 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002249 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002250 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002251 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002252 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002253 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002254
2255 // EXT_robustness, section 2.6: If the reset notification behavior is
2256 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2257 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2258 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002259 }
2260
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002261 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2262 // status should be returned at least once, and GL_NO_ERROR should be returned
2263 // once the device has finished resetting.
2264 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002265 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002266 ASSERT(mResetStatus == GL_NO_ERROR);
2267 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002268
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002269 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002270 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002271 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002272 }
2273 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002274 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002275 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002276 // If markContextLost was used to mark the context lost then
2277 // assume that is not recoverable, and continue to report the
2278 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002279 mResetStatus = mImplementation->getResetStatus();
2280 }
Jamie Madill893ab082014-05-16 16:56:10 -04002281
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002282 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002283}
2284
2285bool Context::isResetNotificationEnabled()
2286{
2287 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2288}
2289
Corentin Walleze3b10e82015-05-20 11:06:25 -04002290const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002291{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002292 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002293}
2294
2295EGLenum Context::getClientType() const
2296{
2297 return mClientType;
2298}
2299
2300EGLenum Context::getRenderBuffer() const
2301{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002302 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2303 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002304 {
2305 return EGL_NONE;
2306 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002307
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002308 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002309 ASSERT(backAttachment != nullptr);
2310 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002311}
2312
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002313VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002314{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002315 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002316 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2317 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002318 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002319 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2320 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002321
Jamie Madill96a483b2017-06-27 16:49:21 -04002322 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002323 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002324
2325 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002326}
2327
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002328TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002329{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002330 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002331 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2332 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002333 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002334 transformFeedback =
2335 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002336 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002337 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002338 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002339
2340 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002341}
2342
2343bool Context::isVertexArrayGenerated(GLuint vertexArray)
2344{
Jamie Madill96a483b2017-06-27 16:49:21 -04002345 ASSERT(mVertexArrayMap.contains(0));
2346 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002347}
2348
2349bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2350{
Jamie Madill96a483b2017-06-27 16:49:21 -04002351 ASSERT(mTransformFeedbackMap.contains(0));
2352 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002353}
2354
Shannon Woods53a94a82014-06-24 15:20:36 -04002355void Context::detachTexture(GLuint texture)
2356{
2357 // Simple pass-through to State's detachTexture method, as textures do not require
2358 // allocation map management either here or in the resource manager at detach time.
2359 // Zero textures are held by the Context, and we don't attempt to request them from
2360 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002361 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002362}
2363
James Darpinian4d9d4832018-03-13 12:43:28 -07002364void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002365{
Yuly Novikov5807a532015-12-03 13:01:22 -05002366 // Simple pass-through to State's detachBuffer method, since
2367 // only buffer attachments to container objects that are bound to the current context
2368 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002369
Yuly Novikov5807a532015-12-03 13:01:22 -05002370 // [OpenGL ES 3.2] section 5.1.2 page 45:
2371 // Attachments to unbound container objects, such as
2372 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2373 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002374 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002375}
2376
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002377void Context::detachFramebuffer(GLuint framebuffer)
2378{
Shannon Woods53a94a82014-06-24 15:20:36 -04002379 // Framebuffer detachment is handled by Context, because 0 is a valid
2380 // Framebuffer object, and a pointer to it must be passed from Context
2381 // to State at binding time.
2382
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002383 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002384 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2385 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2386 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002387
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002388 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002389 {
2390 bindReadFramebuffer(0);
2391 }
2392
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002393 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002394 {
2395 bindDrawFramebuffer(0);
2396 }
2397}
2398
2399void Context::detachRenderbuffer(GLuint renderbuffer)
2400{
Jamie Madilla02315b2017-02-23 14:14:47 -05002401 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002402}
2403
Jamie Madill57a89722013-07-02 11:57:03 -04002404void Context::detachVertexArray(GLuint vertexArray)
2405{
Jamie Madill77a72f62015-04-14 11:18:32 -04002406 // Vertex array detachment is handled by Context, because 0 is a valid
2407 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002408 // binding time.
2409
Jamie Madill57a89722013-07-02 11:57:03 -04002410 // [OpenGL ES 3.0.2] section 2.10 page 43:
2411 // If a vertex array object that is currently bound is deleted, the binding
2412 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002413 if (mGLState.removeVertexArrayBinding(vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002414 {
2415 bindVertexArray(0);
2416 }
2417}
2418
Geoff Langc8058452014-02-03 12:04:11 -05002419void Context::detachTransformFeedback(GLuint transformFeedback)
2420{
Corentin Walleza2257da2016-04-19 16:43:12 -04002421 // Transform feedback detachment is handled by Context, because 0 is a valid
2422 // transform feedback, and a pointer to it must be passed from Context to State at
2423 // binding time.
2424
2425 // The OpenGL specification doesn't mention what should happen when the currently bound
2426 // transform feedback object is deleted. Since it is a container object, we treat it like
2427 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002428 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002429 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002430 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002431 }
Geoff Langc8058452014-02-03 12:04:11 -05002432}
2433
Jamie Madilldc356042013-07-19 16:36:57 -04002434void Context::detachSampler(GLuint sampler)
2435{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002436 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002437}
2438
Yunchao Hea336b902017-08-02 16:05:21 +08002439void Context::detachProgramPipeline(GLuint pipeline)
2440{
2441 mGLState.detachProgramPipeline(this, pipeline);
2442}
2443
Jamie Madill3ef140a2017-08-26 23:11:21 -04002444void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002445{
Shaodde78e82017-05-22 14:13:27 +08002446 mGLState.setVertexAttribDivisor(this, index, divisor);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002447}
2448
Jamie Madille29d1672013-07-19 16:36:57 -04002449void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2450{
Geoff Langc1984ed2016-10-07 12:41:00 -04002451 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002452 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002453 SetSamplerParameteri(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002454 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002455}
Jamie Madille29d1672013-07-19 16:36:57 -04002456
Geoff Langc1984ed2016-10-07 12:41:00 -04002457void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2458{
2459 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002460 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002461 SetSamplerParameteriv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002462 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002463}
2464
2465void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2466{
Geoff Langc1984ed2016-10-07 12:41:00 -04002467 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002468 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002469 SetSamplerParameterf(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002470 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002471}
2472
Geoff Langc1984ed2016-10-07 12:41:00 -04002473void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002474{
Geoff Langc1984ed2016-10-07 12:41:00 -04002475 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002476 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002477 SetSamplerParameterfv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002478 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002479}
2480
Geoff Langc1984ed2016-10-07 12:41:00 -04002481void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002482{
Geoff Langc1984ed2016-10-07 12:41:00 -04002483 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002484 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002485 QuerySamplerParameteriv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002486 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002487}
Jamie Madill9675b802013-07-19 16:36:59 -04002488
Geoff Langc1984ed2016-10-07 12:41:00 -04002489void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2490{
2491 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002492 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002493 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002494 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002495}
2496
Olli Etuahof0fee072016-03-30 15:11:58 +03002497void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2498{
2499 gl::Program *programObject = getProgram(program);
Yunchao He61afff12017-03-14 15:34:03 +08002500 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002501}
2502
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002503void Context::initRendererString()
2504{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002505 std::ostringstream rendererString;
2506 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002507 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002508 rendererString << ")";
2509
Geoff Langcec35902014-04-16 10:52:36 -04002510 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002511}
2512
Geoff Langc339c4e2016-11-29 10:37:36 -05002513void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002514{
Geoff Langc339c4e2016-11-29 10:37:36 -05002515 const Version &clientVersion = getClientVersion();
2516
2517 std::ostringstream versionString;
2518 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2519 << ANGLE_VERSION_STRING << ")";
2520 mVersionString = MakeStaticString(versionString.str());
2521
2522 std::ostringstream shadingLanguageVersionString;
2523 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2524 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2525 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
2526 << ")";
2527 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002528}
2529
Geoff Langcec35902014-04-16 10:52:36 -04002530void Context::initExtensionStrings()
2531{
Geoff Langc339c4e2016-11-29 10:37:36 -05002532 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
2533 std::ostringstream combinedStringStream;
2534 std::copy(strings.begin(), strings.end(),
2535 std::ostream_iterator<const char *>(combinedStringStream, " "));
2536 return MakeStaticString(combinedStringStream.str());
2537 };
2538
2539 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002540 for (const auto &extensionString : mExtensions.getStrings())
2541 {
2542 mExtensionStrings.push_back(MakeStaticString(extensionString));
2543 }
Geoff Langc339c4e2016-11-29 10:37:36 -05002544 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002545
Bryan Bernhart58806562017-01-05 13:09:31 -08002546 const gl::Extensions &nativeExtensions = mImplementation->getNativeExtensions();
2547
Geoff Langc339c4e2016-11-29 10:37:36 -05002548 mRequestableExtensionStrings.clear();
2549 for (const auto &extensionInfo : GetExtensionInfoMap())
2550 {
2551 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08002552 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
2553 nativeExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05002554 {
2555 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
2556 }
2557 }
2558 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002559}
2560
Geoff Langc339c4e2016-11-29 10:37:36 -05002561const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04002562{
Geoff Langc339c4e2016-11-29 10:37:36 -05002563 switch (name)
2564 {
2565 case GL_VENDOR:
2566 return reinterpret_cast<const GLubyte *>("Google Inc.");
2567
2568 case GL_RENDERER:
2569 return reinterpret_cast<const GLubyte *>(mRendererString);
2570
2571 case GL_VERSION:
2572 return reinterpret_cast<const GLubyte *>(mVersionString);
2573
2574 case GL_SHADING_LANGUAGE_VERSION:
2575 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
2576
2577 case GL_EXTENSIONS:
2578 return reinterpret_cast<const GLubyte *>(mExtensionString);
2579
2580 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
2581 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
2582
2583 default:
2584 UNREACHABLE();
2585 return nullptr;
2586 }
Geoff Langcec35902014-04-16 10:52:36 -04002587}
2588
Geoff Langc339c4e2016-11-29 10:37:36 -05002589const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04002590{
Geoff Langc339c4e2016-11-29 10:37:36 -05002591 switch (name)
2592 {
2593 case GL_EXTENSIONS:
2594 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
2595
2596 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
2597 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
2598
2599 default:
2600 UNREACHABLE();
2601 return nullptr;
2602 }
Geoff Langcec35902014-04-16 10:52:36 -04002603}
2604
2605size_t Context::getExtensionStringCount() const
2606{
2607 return mExtensionStrings.size();
2608}
2609
Geoff Lang111a99e2017-10-17 10:58:41 -04002610bool Context::isExtensionRequestable(const char *name)
2611{
2612 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
2613 auto extension = extensionInfos.find(name);
2614
2615 const Extensions &nativeExtensions = mImplementation->getNativeExtensions();
2616 return extension != extensionInfos.end() && extension->second.Requestable &&
2617 nativeExtensions.*(extension->second.ExtensionsMember);
2618}
2619
Geoff Langc339c4e2016-11-29 10:37:36 -05002620void Context::requestExtension(const char *name)
2621{
2622 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
2623 ASSERT(extensionInfos.find(name) != extensionInfos.end());
2624 const auto &extension = extensionInfos.at(name);
2625 ASSERT(extension.Requestable);
Geoff Lang111a99e2017-10-17 10:58:41 -04002626 ASSERT(mImplementation->getNativeExtensions().*(extension.ExtensionsMember));
Geoff Langc339c4e2016-11-29 10:37:36 -05002627
2628 if (mExtensions.*(extension.ExtensionsMember))
2629 {
2630 // Extension already enabled
2631 return;
2632 }
2633
2634 mExtensions.*(extension.ExtensionsMember) = true;
2635 updateCaps();
2636 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08002637
Jamie Madill2f348d22017-06-05 10:50:59 -04002638 // Release the shader compiler so it will be re-created with the requested extensions enabled.
2639 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04002640
Jamie Madill81c2e252017-09-09 23:32:46 -04002641 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
2642 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05002643 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04002644 for (auto &zeroTexture : mZeroTextures)
2645 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002646 if (zeroTexture.get() != nullptr)
2647 {
2648 zeroTexture->signalDirty(this, InitState::Initialized);
2649 }
Geoff Lang9aded172017-04-05 11:07:56 -04002650 }
2651
2652 mState.mFramebuffers->invalidateFramebufferComplenessCache();
Geoff Langc339c4e2016-11-29 10:37:36 -05002653}
2654
2655size_t Context::getRequestableExtensionStringCount() const
2656{
2657 return mRequestableExtensionStrings.size();
2658}
2659
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002660void Context::beginTransformFeedback(GLenum primitiveMode)
2661{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002662 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002663 ASSERT(transformFeedback != nullptr);
2664 ASSERT(!transformFeedback->isPaused());
2665
Jamie Madill6c1f6712017-02-14 19:08:04 -05002666 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002667}
2668
2669bool Context::hasActiveTransformFeedback(GLuint program) const
2670{
2671 for (auto pair : mTransformFeedbackMap)
2672 {
2673 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
2674 {
2675 return true;
2676 }
2677 }
2678 return false;
2679}
2680
Geoff Langb433e872017-10-05 14:01:47 -04002681void Context::initCaps(const egl::DisplayExtensions &displayExtensions, bool robustResourceInit)
Geoff Lang493daf52014-07-03 13:38:44 -04002682{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002683 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04002684
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08002685 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
2686 if (getClientVersion() < Version(2, 0))
2687 {
2688 mCaps.maxMultitextureUnits = 4;
2689 mCaps.maxClipPlanes = 6;
2690 mCaps.maxLights = 8;
2691 mCaps.maxModelviewMatrixStackDepth = 16;
2692 mCaps.maxProjectionMatrixStackDepth = 16;
2693 mCaps.maxTextureMatrixStackDepth = 16;
2694 }
2695
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002696 mExtensions = mImplementation->getNativeExtensions();
Geoff Lang493daf52014-07-03 13:38:44 -04002697
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002698 mLimitations = mImplementation->getNativeLimitations();
Austin Kinross02df7962015-07-01 10:03:42 -07002699
Geoff Langeb66a6e2016-10-31 13:06:12 -04002700 if (getClientVersion() < Version(3, 0))
Geoff Lang493daf52014-07-03 13:38:44 -04002701 {
2702 // Disable ES3+ extensions
Jamie Madill231c7f52017-04-26 13:45:37 -04002703 mExtensions.colorBufferFloat = false;
Geoff Langb66a9092016-05-16 15:59:14 -04002704 mExtensions.eglImageExternalEssl3 = false;
Vincent Lang25ab4512016-05-13 18:13:59 +02002705 mExtensions.textureNorm16 = false;
Martin Radev137032d2017-07-13 10:11:12 +03002706 mExtensions.multiview = false;
2707 mExtensions.maxViews = 1u;
Geoff Lang493daf52014-07-03 13:38:44 -04002708 }
2709
Jiawei Shao89be29a2017-11-06 14:36:45 +08002710 if (getClientVersion() < ES_3_1)
2711 {
2712 // Disable ES3.1+ extensions
2713 mExtensions.geometryShader = false;
2714 }
2715
Geoff Langeb66a6e2016-10-31 13:06:12 -04002716 if (getClientVersion() > Version(2, 0))
Geoff Lang493daf52014-07-03 13:38:44 -04002717 {
2718 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
Jamie Madill231c7f52017-04-26 13:45:37 -04002719 // mExtensions.sRGB = false;
Geoff Lang493daf52014-07-03 13:38:44 -04002720 }
2721
Jamie Madill00ed7a12016-05-19 13:13:38 -04002722 // Some extensions are always available because they are implemented in the GL layer.
Jamie Madill231c7f52017-04-26 13:45:37 -04002723 mExtensions.bindUniformLocation = true;
2724 mExtensions.vertexArrayObject = true;
Geoff Langf41a7152016-09-19 15:11:17 -04002725 mExtensions.bindGeneratesResource = true;
Geoff Langfeb8c682017-02-13 16:07:35 -05002726 mExtensions.clientArrays = true;
Geoff Langc339c4e2016-11-29 10:37:36 -05002727 mExtensions.requestExtension = true;
Jamie Madill00ed7a12016-05-19 13:13:38 -04002728
2729 // Enable the no error extension if the context was created with the flag.
2730 mExtensions.noError = mSkipValidation;
2731
Corentin Wallezccab69d2017-01-27 16:57:15 -05002732 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Corentin Wallezc295e512017-01-27 17:47:50 -05002733 mExtensions.surfacelessContext = displayExtensions.surfacelessContext;
Corentin Wallezccab69d2017-01-27 16:57:15 -05002734
Geoff Lang70d0f492015-12-10 17:45:46 -05002735 // Explicitly enable GL_KHR_debug
2736 mExtensions.debug = true;
2737 mExtensions.maxDebugMessageLength = 1024;
2738 mExtensions.maxDebugLoggedMessages = 1024;
2739 mExtensions.maxDebugGroupStackDepth = 1024;
2740 mExtensions.maxLabelLength = 1024;
2741
Geoff Langff5b2d52016-09-07 11:32:23 -04002742 // Explicitly enable GL_ANGLE_robust_client_memory
2743 mExtensions.robustClientMemory = true;
2744
Jamie Madille08a1d32017-03-07 17:24:06 -05002745 // Determine robust resource init availability from EGL.
Geoff Langb433e872017-10-05 14:01:47 -04002746 mExtensions.robustResourceInitialization = robustResourceInit;
Jamie Madille08a1d32017-03-07 17:24:06 -05002747
Jiajia Qin8a7b3a02017-08-25 16:05:48 +08002748 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
2749 // supports it.
2750 mExtensions.robustBufferAccessBehavior =
2751 mRobustAccess && mExtensions.robustBufferAccessBehavior;
2752
Jamie Madillc43be722017-07-13 16:22:14 -04002753 // Enable the cache control query unconditionally.
2754 mExtensions.programCacheControl = true;
2755
Geoff Lang301d1612014-07-09 10:34:37 -04002756 // Apply implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04002757 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002758
Jamie Madill0f80ed82017-09-19 00:24:56 -04002759 if (getClientVersion() < ES_3_1)
2760 {
2761 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
2762 }
2763 else
2764 {
2765 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
2766 }
Geoff Lang301d1612014-07-09 10:34:37 -04002767
Jamie Madill0f80ed82017-09-19 00:24:56 -04002768 LimitCap(&mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
2769 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
2770 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
2771
2772 // Limit textures as well, so we can use fast bitsets with texture bindings.
2773 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
2774 LimitCap(&mCaps.maxVertexTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
2775 LimitCap(&mCaps.maxTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04002776
Jiawei Shaodb342272017-09-27 10:21:45 +08002777 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
2778
Geoff Langc287ea62016-09-16 14:46:51 -04002779 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05002780 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04002781 for (const auto &extensionInfo : GetExtensionInfoMap())
2782 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04002783 // If the user has requested that extensions start disabled and they are requestable,
2784 // disable them.
2785 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04002786 {
2787 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
2788 }
2789 }
2790
2791 // Generate texture caps
2792 updateCaps();
2793}
2794
2795void Context::updateCaps()
2796{
Geoff Lang900013c2014-07-07 11:32:19 -04002797 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002798 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04002799
Jamie Madill7b62cf92017-11-02 15:20:49 -04002800 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04002801 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04002802 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04002803 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04002804
Geoff Lang0d8b7242015-09-09 14:56:53 -04002805 // Update the format caps based on the client version and extensions.
2806 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
2807 // ES3.
2808 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002809 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04002810 formatCaps.renderable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002811 formatCaps.renderable && formatInfo.renderSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04002812 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002813 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04002814
He Yunchaoccd8c9b2017-01-18 17:36:14 +08002815 // OpenGL ES does not support multisampling with non-rendererable formats
2816 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Olli Etuaho50c562d2017-06-06 14:43:30 +03002817 if (!formatCaps.renderable ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08002818 (getClientVersion() < ES_3_1 &&
2819 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04002820 {
Geoff Langd87878e2014-09-19 15:42:59 -04002821 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04002822 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03002823 else
2824 {
2825 // We may have limited the max samples for some required renderbuffer formats due to
2826 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
2827 GLuint formatMaxSamples = formatCaps.getMaxSamples();
2828
2829 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
2830 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
2831 // exception of signed and unsigned integer formats."
2832 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
2833 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
2834 {
2835 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
2836 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
2837 }
2838
2839 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
2840 if (getClientVersion() >= ES_3_1)
2841 {
2842 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
2843 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
2844 // the exception that the signed and unsigned integer formats are required only to
2845 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
2846 // multisamples, which must be at least one."
2847 if (formatInfo.componentType == GL_INT ||
2848 formatInfo.componentType == GL_UNSIGNED_INT)
2849 {
2850 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
2851 }
2852
2853 // GLES 3.1 section 19.3.1.
2854 if (formatCaps.texturable)
2855 {
2856 if (formatInfo.depthBits > 0)
2857 {
2858 mCaps.maxDepthTextureSamples =
2859 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
2860 }
2861 else if (formatInfo.redBits > 0)
2862 {
2863 mCaps.maxColorTextureSamples =
2864 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
2865 }
2866 }
2867 }
2868 }
Geoff Langd87878e2014-09-19 15:42:59 -04002869
2870 if (formatCaps.texturable && formatInfo.compressed)
2871 {
Geoff Langca271392017-04-05 12:30:00 -04002872 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04002873 }
2874
Geoff Langca271392017-04-05 12:30:00 -04002875 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04002876 }
Jamie Madill32447362017-06-28 14:53:52 -04002877
2878 // If program binary is disabled, blank out the memory cache pointer.
2879 if (!mImplementation->getNativeExtensions().getProgramBinary)
2880 {
2881 mMemoryProgramCache = nullptr;
2882 }
Corentin Walleze4477002017-12-01 14:39:58 -05002883
2884 // Compute which buffer types are allowed
2885 mValidBufferBindings.reset();
2886 mValidBufferBindings.set(BufferBinding::ElementArray);
2887 mValidBufferBindings.set(BufferBinding::Array);
2888
2889 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
2890 {
2891 mValidBufferBindings.set(BufferBinding::PixelPack);
2892 mValidBufferBindings.set(BufferBinding::PixelUnpack);
2893 }
2894
2895 if (getClientVersion() >= ES_3_0)
2896 {
2897 mValidBufferBindings.set(BufferBinding::CopyRead);
2898 mValidBufferBindings.set(BufferBinding::CopyWrite);
2899 mValidBufferBindings.set(BufferBinding::TransformFeedback);
2900 mValidBufferBindings.set(BufferBinding::Uniform);
2901 }
2902
2903 if (getClientVersion() >= ES_3_1)
2904 {
2905 mValidBufferBindings.set(BufferBinding::AtomicCounter);
2906 mValidBufferBindings.set(BufferBinding::ShaderStorage);
2907 mValidBufferBindings.set(BufferBinding::DrawIndirect);
2908 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
2909 }
Geoff Lang493daf52014-07-03 13:38:44 -04002910}
2911
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002912void Context::initWorkarounds()
2913{
Jamie Madill761b02c2017-06-23 16:27:06 -04002914 // Apply back-end workarounds.
2915 mImplementation->applyNativeWorkarounds(&mWorkarounds);
2916
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002917 // Lose the context upon out of memory error if the application is
2918 // expecting to watch for those events.
2919 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2920}
2921
Jamie Madill05b35b22017-10-03 09:01:44 -04002922Error Context::prepareForDraw()
2923{
Geoff Langa8cb2872018-03-09 16:09:40 -05002924 ANGLE_TRY(syncDirtyObjects());
Jamie Madilla59fc192017-11-02 12:57:58 -04002925
2926 if (isRobustResourceInitEnabled())
2927 {
2928 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
2929 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
2930 }
2931
Geoff Langa8cb2872018-03-09 16:09:40 -05002932 ANGLE_TRY(syncDirtyBits());
Geoff Langd4fff502017-09-22 11:28:28 -04002933 return NoError();
2934}
2935
2936Error Context::prepareForClear(GLbitfield mask)
2937{
Geoff Langa8cb2872018-03-09 16:09:40 -05002938 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04002939 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05002940 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04002941 return NoError();
2942}
2943
2944Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
2945{
Geoff Langa8cb2872018-03-09 16:09:40 -05002946 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04002947 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
2948 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05002949 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04002950 return NoError();
2951}
2952
Geoff Langa8cb2872018-03-09 16:09:40 -05002953Error Context::syncState()
Jamie Madill1b94d432015-08-07 13:23:23 -04002954{
Geoff Langa8cb2872018-03-09 16:09:40 -05002955 ANGLE_TRY(syncDirtyObjects());
2956 ANGLE_TRY(syncDirtyBits());
Jamie Madillbc918e72018-03-08 09:47:21 -05002957 return NoError();
Jamie Madill1b94d432015-08-07 13:23:23 -04002958}
2959
Geoff Langa8cb2872018-03-09 16:09:40 -05002960Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04002961{
Geoff Langa8cb2872018-03-09 16:09:40 -05002962 ANGLE_TRY(syncDirtyObjects(objectMask));
2963 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04002964 return NoError();
2965}
2966
Geoff Langa8cb2872018-03-09 16:09:40 -05002967Error Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04002968{
2969 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
2970 mImplementation->syncState(this, dirtyBits);
2971 mGLState.clearDirtyBits();
2972 return NoError();
2973}
2974
Geoff Langa8cb2872018-03-09 16:09:40 -05002975Error Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04002976{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002977 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madillfe548342017-06-19 11:13:24 -04002978 mImplementation->syncState(this, dirtyBits);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002979 mGLState.clearDirtyBits(dirtyBits);
Jamie Madillbc918e72018-03-08 09:47:21 -05002980 return NoError();
Jamie Madill1b94d432015-08-07 13:23:23 -04002981}
Jamie Madillc29968b2016-01-20 11:17:23 -05002982
Geoff Langa8cb2872018-03-09 16:09:40 -05002983Error Context::syncDirtyObjects()
Geoff Langd4fff502017-09-22 11:28:28 -04002984{
2985 return mGLState.syncDirtyObjects(this);
2986}
2987
Geoff Langa8cb2872018-03-09 16:09:40 -05002988Error Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04002989{
2990 return mGLState.syncDirtyObjects(this, objectMask);
2991}
2992
Jamie Madillc29968b2016-01-20 11:17:23 -05002993void Context::blitFramebuffer(GLint srcX0,
2994 GLint srcY0,
2995 GLint srcX1,
2996 GLint srcY1,
2997 GLint dstX0,
2998 GLint dstY0,
2999 GLint dstX1,
3000 GLint dstY1,
3001 GLbitfield mask,
3002 GLenum filter)
3003{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003004 if (mask == 0)
3005 {
3006 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3007 // buffers are copied.
3008 return;
3009 }
3010
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003011 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003012 ASSERT(drawFramebuffer);
3013
3014 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3015 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3016
Jamie Madillbc918e72018-03-08 09:47:21 -05003017 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003018
Jamie Madillc564c072017-06-01 12:45:42 -04003019 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003020}
Jamie Madillc29968b2016-01-20 11:17:23 -05003021
3022void Context::clear(GLbitfield mask)
3023{
Geoff Langd4fff502017-09-22 11:28:28 -04003024 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3025 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003026}
3027
3028void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3029{
Geoff Langd4fff502017-09-22 11:28:28 -04003030 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3031 ANGLE_CONTEXT_TRY(
3032 mGLState.getDrawFramebuffer()->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003033}
3034
3035void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3036{
Geoff Langd4fff502017-09-22 11:28:28 -04003037 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3038 ANGLE_CONTEXT_TRY(
3039 mGLState.getDrawFramebuffer()->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003040}
3041
3042void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3043{
Geoff Langd4fff502017-09-22 11:28:28 -04003044 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3045 ANGLE_CONTEXT_TRY(
3046 mGLState.getDrawFramebuffer()->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003047}
3048
3049void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3050{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003051 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003052 ASSERT(framebufferObject);
3053
3054 // If a buffer is not present, the clear has no effect
3055 if (framebufferObject->getDepthbuffer() == nullptr &&
3056 framebufferObject->getStencilbuffer() == nullptr)
3057 {
3058 return;
3059 }
3060
Geoff Langd4fff502017-09-22 11:28:28 -04003061 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3062 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003063}
3064
3065void Context::readPixels(GLint x,
3066 GLint y,
3067 GLsizei width,
3068 GLsizei height,
3069 GLenum format,
3070 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003071 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003072{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003073 if (width == 0 || height == 0)
3074 {
3075 return;
3076 }
3077
Jamie Madillbc918e72018-03-08 09:47:21 -05003078 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003079
Jamie Madillb6664922017-07-25 12:55:04 -04003080 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3081 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003082
3083 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003084 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003085}
3086
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003087void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003088 GLint level,
3089 GLenum internalformat,
3090 GLint x,
3091 GLint y,
3092 GLsizei width,
3093 GLsizei height,
3094 GLint border)
3095{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003096 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003097 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003098
Jamie Madillc29968b2016-01-20 11:17:23 -05003099 Rectangle sourceArea(x, y, width, height);
3100
Jamie Madill05b35b22017-10-03 09:01:44 -04003101 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003102 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003103 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003104}
3105
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003106void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003107 GLint level,
3108 GLint xoffset,
3109 GLint yoffset,
3110 GLint x,
3111 GLint y,
3112 GLsizei width,
3113 GLsizei height)
3114{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003115 if (width == 0 || height == 0)
3116 {
3117 return;
3118 }
3119
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003120 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003121 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003122
Jamie Madillc29968b2016-01-20 11:17:23 -05003123 Offset destOffset(xoffset, yoffset, 0);
3124 Rectangle sourceArea(x, y, width, height);
3125
Jamie Madill05b35b22017-10-03 09:01:44 -04003126 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003127 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003128 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003129}
3130
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003131void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003132 GLint level,
3133 GLint xoffset,
3134 GLint yoffset,
3135 GLint zoffset,
3136 GLint x,
3137 GLint y,
3138 GLsizei width,
3139 GLsizei height)
3140{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003141 if (width == 0 || height == 0)
3142 {
3143 return;
3144 }
3145
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003146 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003147 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003148
Jamie Madillc29968b2016-01-20 11:17:23 -05003149 Offset destOffset(xoffset, yoffset, zoffset);
3150 Rectangle sourceArea(x, y, width, height);
3151
Jamie Madill05b35b22017-10-03 09:01:44 -04003152 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3153 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003154 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3155 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003156}
3157
3158void Context::framebufferTexture2D(GLenum target,
3159 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003160 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003161 GLuint texture,
3162 GLint level)
3163{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003164 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003165 ASSERT(framebuffer);
3166
3167 if (texture != 0)
3168 {
3169 Texture *textureObj = getTexture(texture);
3170
3171 ImageIndex index = ImageIndex::MakeInvalid();
3172
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003173 if (textarget == TextureTarget::_2D)
Jamie Madillc29968b2016-01-20 11:17:23 -05003174 {
3175 index = ImageIndex::Make2D(level);
3176 }
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003177 else if (textarget == TextureTarget::Rectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -04003178 {
3179 index = ImageIndex::MakeRectangle(level);
3180 }
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003181 else if (textarget == TextureTarget::_2DMultisample)
JiangYizhoubddc46b2016-12-09 09:50:51 +08003182 {
3183 ASSERT(level == 0);
3184 index = ImageIndex::Make2DMultisample();
3185 }
Jamie Madillc29968b2016-01-20 11:17:23 -05003186 else
3187 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003188 ASSERT(TextureTargetToType(textarget) == TextureType::CubeMap);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003189 index = ImageIndex::MakeCube(textarget, level);
Jamie Madillc29968b2016-01-20 11:17:23 -05003190 }
3191
Jamie Madilla02315b2017-02-23 14:14:47 -05003192 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003193 }
3194 else
3195 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003196 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003197 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003198
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003199 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003200}
3201
3202void Context::framebufferRenderbuffer(GLenum target,
3203 GLenum attachment,
3204 GLenum renderbuffertarget,
3205 GLuint renderbuffer)
3206{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003207 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003208 ASSERT(framebuffer);
3209
3210 if (renderbuffer != 0)
3211 {
3212 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003213
3214 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex::MakeInvalid(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003215 renderbufferObject);
3216 }
3217 else
3218 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003219 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003220 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003221
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003222 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003223}
3224
3225void Context::framebufferTextureLayer(GLenum target,
3226 GLenum attachment,
3227 GLuint texture,
3228 GLint level,
3229 GLint layer)
3230{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003231 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003232 ASSERT(framebuffer);
3233
3234 if (texture != 0)
3235 {
3236 Texture *textureObject = getTexture(texture);
3237
3238 ImageIndex index = ImageIndex::MakeInvalid();
3239
Corentin Wallez99d492c2018-02-27 15:17:10 -05003240 if (textureObject->getType() == TextureType::_3D)
Jamie Madillc29968b2016-01-20 11:17:23 -05003241 {
3242 index = ImageIndex::Make3D(level, layer);
3243 }
3244 else
3245 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05003246 ASSERT(textureObject->getType() == TextureType::_2DArray);
Jamie Madillc29968b2016-01-20 11:17:23 -05003247 index = ImageIndex::Make2DArray(level, layer);
3248 }
3249
Jamie Madilla02315b2017-02-23 14:14:47 -05003250 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003251 }
3252 else
3253 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003254 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003255 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003256
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003257 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003258}
3259
Martin Radev137032d2017-07-13 10:11:12 +03003260void Context::framebufferTextureMultiviewLayeredANGLE(GLenum target,
3261 GLenum attachment,
3262 GLuint texture,
3263 GLint level,
3264 GLint baseViewIndex,
3265 GLsizei numViews)
3266{
Martin Radev82ef7742017-08-08 17:44:58 +03003267 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3268 ASSERT(framebuffer);
3269
3270 if (texture != 0)
3271 {
3272 Texture *textureObj = getTexture(texture);
3273
Martin Radev18b75ba2017-08-15 15:50:40 +03003274 ImageIndex index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
Martin Radev82ef7742017-08-08 17:44:58 +03003275 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3276 numViews, baseViewIndex);
3277 }
3278 else
3279 {
3280 framebuffer->resetAttachment(this, attachment);
3281 }
3282
3283 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003284}
3285
3286void Context::framebufferTextureMultiviewSideBySideANGLE(GLenum target,
3287 GLenum attachment,
3288 GLuint texture,
3289 GLint level,
3290 GLsizei numViews,
3291 const GLint *viewportOffsets)
3292{
Martin Radev5dae57b2017-07-14 16:15:55 +03003293 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3294 ASSERT(framebuffer);
3295
3296 if (texture != 0)
3297 {
3298 Texture *textureObj = getTexture(texture);
3299
3300 ImageIndex index = ImageIndex::Make2D(level);
3301 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3302 textureObj, numViews, viewportOffsets);
3303 }
3304 else
3305 {
3306 framebuffer->resetAttachment(this, attachment);
3307 }
3308
3309 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003310}
3311
Jamie Madillc29968b2016-01-20 11:17:23 -05003312void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3313{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003314 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003315 ASSERT(framebuffer);
3316 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003317 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003318}
3319
3320void Context::readBuffer(GLenum mode)
3321{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003322 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003323 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003324 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003325}
3326
3327void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3328{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003329 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003330 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003331
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003332 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003333 ASSERT(framebuffer);
3334
3335 // The specification isn't clear what should be done when the framebuffer isn't complete.
3336 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003337 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003338}
3339
3340void Context::invalidateFramebuffer(GLenum target,
3341 GLsizei numAttachments,
3342 const GLenum *attachments)
3343{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003344 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003345 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003346
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003347 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003348 ASSERT(framebuffer);
3349
Jamie Madille98b1b52018-03-08 09:47:23 -05003350 bool complete = false;
3351 ANGLE_CONTEXT_TRY(framebuffer->isComplete(this, &complete));
3352 if (!complete)
Jamie Madillc29968b2016-01-20 11:17:23 -05003353 {
Jamie Madill437fa652016-05-03 15:13:24 -04003354 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003355 }
Jamie Madill437fa652016-05-03 15:13:24 -04003356
Jamie Madill4928b7c2017-06-20 12:57:39 -04003357 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003358}
3359
3360void Context::invalidateSubFramebuffer(GLenum target,
3361 GLsizei numAttachments,
3362 const GLenum *attachments,
3363 GLint x,
3364 GLint y,
3365 GLsizei width,
3366 GLsizei height)
3367{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003368 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003369 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003370
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003371 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003372 ASSERT(framebuffer);
3373
Jamie Madille98b1b52018-03-08 09:47:23 -05003374 bool complete = false;
3375 ANGLE_CONTEXT_TRY(framebuffer->isComplete(this, &complete));
3376 if (!complete)
Jamie Madillc29968b2016-01-20 11:17:23 -05003377 {
Jamie Madill437fa652016-05-03 15:13:24 -04003378 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003379 }
Jamie Madill437fa652016-05-03 15:13:24 -04003380
3381 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003382 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003383}
3384
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003385void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003386 GLint level,
3387 GLint internalformat,
3388 GLsizei width,
3389 GLsizei height,
3390 GLint border,
3391 GLenum format,
3392 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003393 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003394{
Jamie Madillbc918e72018-03-08 09:47:21 -05003395 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003396
3397 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003398 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003399 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
3400 size, format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003401}
3402
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003403void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003404 GLint level,
3405 GLint internalformat,
3406 GLsizei width,
3407 GLsizei height,
3408 GLsizei depth,
3409 GLint border,
3410 GLenum format,
3411 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003412 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003413{
Jamie Madillbc918e72018-03-08 09:47:21 -05003414 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003415
3416 Extents size(width, height, depth);
3417 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003418 handleError(texture->setImage(this, mGLState.getUnpackState(),
3419 NonCubeTextureTypeToTarget(target), level, internalformat, size,
3420 format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003421}
3422
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003423void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003424 GLint level,
3425 GLint xoffset,
3426 GLint yoffset,
3427 GLsizei width,
3428 GLsizei height,
3429 GLenum format,
3430 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003431 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003432{
3433 // Zero sized uploads are valid but no-ops
3434 if (width == 0 || height == 0)
3435 {
3436 return;
3437 }
3438
Jamie Madillbc918e72018-03-08 09:47:21 -05003439 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003440
3441 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003442 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003443 handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
3444 type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003445}
3446
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003447void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003448 GLint level,
3449 GLint xoffset,
3450 GLint yoffset,
3451 GLint zoffset,
3452 GLsizei width,
3453 GLsizei height,
3454 GLsizei depth,
3455 GLenum format,
3456 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003457 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003458{
3459 // Zero sized uploads are valid but no-ops
3460 if (width == 0 || height == 0 || depth == 0)
3461 {
3462 return;
3463 }
3464
Jamie Madillbc918e72018-03-08 09:47:21 -05003465 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003466
3467 Box area(xoffset, yoffset, zoffset, width, height, depth);
3468 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003469 handleError(texture->setSubImage(this, mGLState.getUnpackState(),
3470 NonCubeTextureTypeToTarget(target), level, area, format, type,
3471 reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003472}
3473
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003474void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003475 GLint level,
3476 GLenum internalformat,
3477 GLsizei width,
3478 GLsizei height,
3479 GLint border,
3480 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003481 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003482{
Jamie Madillbc918e72018-03-08 09:47:21 -05003483 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003484
3485 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003486 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003487 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
3488 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04003489 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003490}
3491
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003492void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003493 GLint level,
3494 GLenum internalformat,
3495 GLsizei width,
3496 GLsizei height,
3497 GLsizei depth,
3498 GLint border,
3499 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003500 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003501{
Jamie Madillbc918e72018-03-08 09:47:21 -05003502 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003503
3504 Extents size(width, height, depth);
3505 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003506 handleError(texture->setCompressedImage(
3507 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
3508 size, imageSize, reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003509}
3510
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003511void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003512 GLint level,
3513 GLint xoffset,
3514 GLint yoffset,
3515 GLsizei width,
3516 GLsizei height,
3517 GLenum format,
3518 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003519 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003520{
Jamie Madillbc918e72018-03-08 09:47:21 -05003521 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003522
3523 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003524 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003525 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
3526 format, imageSize,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003527 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003528}
3529
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003530void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003531 GLint level,
3532 GLint xoffset,
3533 GLint yoffset,
3534 GLint zoffset,
3535 GLsizei width,
3536 GLsizei height,
3537 GLsizei depth,
3538 GLenum format,
3539 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003540 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003541{
3542 // Zero sized uploads are valid but no-ops
3543 if (width == 0 || height == 0)
3544 {
3545 return;
3546 }
3547
Jamie Madillbc918e72018-03-08 09:47:21 -05003548 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003549
3550 Box area(xoffset, yoffset, zoffset, width, height, depth);
3551 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003552 handleError(texture->setCompressedSubImage(
3553 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
3554 imageSize, reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003555}
3556
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003557void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03003558{
3559 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003560 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03003561}
3562
Jamie Madill007530e2017-12-28 14:27:04 -05003563void Context::copyTexture(GLuint sourceId,
3564 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05003565 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05003566 GLuint destId,
3567 GLint destLevel,
3568 GLint internalFormat,
3569 GLenum destType,
3570 GLboolean unpackFlipY,
3571 GLboolean unpackPremultiplyAlpha,
3572 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07003573{
Jamie Madillbc918e72018-03-08 09:47:21 -05003574 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07003575
3576 gl::Texture *sourceTexture = getTexture(sourceId);
3577 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05003578 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
3579 sourceLevel, ConvertToBool(unpackFlipY),
3580 ConvertToBool(unpackPremultiplyAlpha),
3581 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07003582}
3583
Jamie Madill007530e2017-12-28 14:27:04 -05003584void Context::copySubTexture(GLuint sourceId,
3585 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05003586 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05003587 GLuint destId,
3588 GLint destLevel,
3589 GLint xoffset,
3590 GLint yoffset,
3591 GLint x,
3592 GLint y,
3593 GLsizei width,
3594 GLsizei height,
3595 GLboolean unpackFlipY,
3596 GLboolean unpackPremultiplyAlpha,
3597 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07003598{
3599 // Zero sized copies are valid but no-ops
3600 if (width == 0 || height == 0)
3601 {
3602 return;
3603 }
3604
Jamie Madillbc918e72018-03-08 09:47:21 -05003605 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07003606
3607 gl::Texture *sourceTexture = getTexture(sourceId);
3608 gl::Texture *destTexture = getTexture(destId);
3609 Offset offset(xoffset, yoffset, 0);
3610 Rectangle area(x, y, width, height);
Geoff Lang92019432017-11-20 13:09:34 -05003611 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, area,
3612 ConvertToBool(unpackFlipY),
3613 ConvertToBool(unpackPremultiplyAlpha),
3614 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07003615}
3616
Jamie Madill007530e2017-12-28 14:27:04 -05003617void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07003618{
Jamie Madillbc918e72018-03-08 09:47:21 -05003619 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07003620
3621 gl::Texture *sourceTexture = getTexture(sourceId);
3622 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05003623 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07003624}
3625
Corentin Wallez336129f2017-10-17 15:55:40 -04003626void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03003627{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003628 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003629 ASSERT(buffer);
3630
Geoff Lang496c02d2016-10-20 11:38:11 -07003631 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03003632}
3633
Corentin Wallez336129f2017-10-17 15:55:40 -04003634void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03003635{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003636 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003637 ASSERT(buffer);
3638
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003639 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03003640 if (error.isError())
3641 {
Jamie Madill437fa652016-05-03 15:13:24 -04003642 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003643 return nullptr;
3644 }
3645
3646 return buffer->getMapPointer();
3647}
3648
Corentin Wallez336129f2017-10-17 15:55:40 -04003649GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03003650{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003651 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003652 ASSERT(buffer);
3653
3654 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003655 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03003656 if (error.isError())
3657 {
Jamie Madill437fa652016-05-03 15:13:24 -04003658 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003659 return GL_FALSE;
3660 }
3661
3662 return result;
3663}
3664
Corentin Wallez336129f2017-10-17 15:55:40 -04003665void *Context::mapBufferRange(BufferBinding target,
3666 GLintptr offset,
3667 GLsizeiptr length,
3668 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03003669{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003670 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003671 ASSERT(buffer);
3672
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003673 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03003674 if (error.isError())
3675 {
Jamie Madill437fa652016-05-03 15:13:24 -04003676 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003677 return nullptr;
3678 }
3679
3680 return buffer->getMapPointer();
3681}
3682
Corentin Wallez336129f2017-10-17 15:55:40 -04003683void Context::flushMappedBufferRange(BufferBinding /*target*/,
3684 GLintptr /*offset*/,
3685 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03003686{
3687 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
3688}
3689
Jamie Madillbc918e72018-03-08 09:47:21 -05003690Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05003691{
Geoff Langa8cb2872018-03-09 16:09:40 -05003692 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05003693}
3694
Jamie Madillbc918e72018-03-08 09:47:21 -05003695Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05003696{
Geoff Langa8cb2872018-03-09 16:09:40 -05003697 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05003698}
3699
Jamie Madillbc918e72018-03-08 09:47:21 -05003700Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05003701{
Geoff Langa8cb2872018-03-09 16:09:40 -05003702 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05003703}
3704
Jiajia Qin5451d532017-11-16 17:16:34 +08003705void Context::activeShaderProgram(GLuint pipeline, GLuint program)
3706{
3707 UNIMPLEMENTED();
3708}
3709
Jamie Madillc20ab272016-06-09 07:20:46 -07003710void Context::activeTexture(GLenum texture)
3711{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003712 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07003713}
3714
Jamie Madill876429b2017-04-20 15:46:24 -04003715void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07003716{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003717 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07003718}
3719
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05003720void Context::blendEquation(GLenum mode)
3721{
3722 mGLState.setBlendEquation(mode, mode);
3723}
3724
Jamie Madillc20ab272016-06-09 07:20:46 -07003725void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
3726{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003727 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003728}
3729
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05003730void Context::blendFunc(GLenum sfactor, GLenum dfactor)
3731{
3732 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
3733}
3734
Jamie Madillc20ab272016-06-09 07:20:46 -07003735void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
3736{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003737 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003738}
3739
Jamie Madill876429b2017-04-20 15:46:24 -04003740void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07003741{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003742 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003743}
3744
Jamie Madill876429b2017-04-20 15:46:24 -04003745void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07003746{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003747 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07003748}
3749
3750void Context::clearStencil(GLint s)
3751{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003752 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07003753}
3754
3755void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
3756{
Geoff Lang92019432017-11-20 13:09:34 -05003757 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
3758 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07003759}
3760
Corentin Wallez2e568cf2017-09-18 17:05:22 -04003761void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07003762{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003763 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003764}
3765
3766void Context::depthFunc(GLenum func)
3767{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003768 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07003769}
3770
3771void Context::depthMask(GLboolean flag)
3772{
Geoff Lang92019432017-11-20 13:09:34 -05003773 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07003774}
3775
Jamie Madill876429b2017-04-20 15:46:24 -04003776void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07003777{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003778 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07003779}
3780
3781void Context::disable(GLenum cap)
3782{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003783 mGLState.setEnableFeature(cap, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07003784}
3785
3786void Context::disableVertexAttribArray(GLuint index)
3787{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003788 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07003789}
3790
3791void Context::enable(GLenum cap)
3792{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003793 mGLState.setEnableFeature(cap, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07003794}
3795
3796void Context::enableVertexAttribArray(GLuint index)
3797{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003798 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07003799}
3800
3801void Context::frontFace(GLenum mode)
3802{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003803 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003804}
3805
3806void Context::hint(GLenum target, GLenum mode)
3807{
3808 switch (target)
3809 {
3810 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003811 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003812 break;
3813
3814 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003815 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003816 break;
3817
3818 default:
3819 UNREACHABLE();
3820 return;
3821 }
3822}
3823
3824void Context::lineWidth(GLfloat width)
3825{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003826 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07003827}
3828
3829void Context::pixelStorei(GLenum pname, GLint param)
3830{
3831 switch (pname)
3832 {
3833 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003834 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003835 break;
3836
3837 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003838 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003839 break;
3840
3841 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003842 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07003843 break;
3844
3845 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03003846 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003847 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003848 break;
3849
3850 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03003851 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003852 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003853 break;
3854
3855 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03003856 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003857 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003858 break;
3859
3860 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03003861 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003862 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003863 break;
3864
3865 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03003866 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003867 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003868 break;
3869
3870 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03003871 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003872 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003873 break;
3874
3875 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03003876 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003877 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003878 break;
3879
3880 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03003881 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003882 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003883 break;
3884
3885 default:
3886 UNREACHABLE();
3887 return;
3888 }
3889}
3890
3891void Context::polygonOffset(GLfloat factor, GLfloat units)
3892{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003893 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07003894}
3895
Jamie Madill876429b2017-04-20 15:46:24 -04003896void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07003897{
Geoff Lang92019432017-11-20 13:09:34 -05003898 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07003899}
3900
Jiawei Shaodb342272017-09-27 10:21:45 +08003901void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
3902{
3903 mGLState.setSampleMaskParams(maskNumber, mask);
3904}
3905
Jamie Madillc20ab272016-06-09 07:20:46 -07003906void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
3907{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003908 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07003909}
3910
3911void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
3912{
3913 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3914 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003915 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003916 }
3917
3918 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3919 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003920 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003921 }
3922}
3923
3924void Context::stencilMaskSeparate(GLenum face, GLuint mask)
3925{
3926 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3927 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003928 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003929 }
3930
3931 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3932 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003933 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003934 }
3935}
3936
3937void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
3938{
3939 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3940 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003941 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07003942 }
3943
3944 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3945 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003946 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07003947 }
3948}
3949
3950void Context::vertexAttrib1f(GLuint index, GLfloat x)
3951{
3952 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003953 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003954}
3955
3956void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
3957{
3958 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003959 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003960}
3961
3962void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
3963{
3964 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003965 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003966}
3967
3968void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
3969{
3970 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003971 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003972}
3973
3974void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
3975{
3976 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003977 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003978}
3979
3980void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
3981{
3982 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003983 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003984}
3985
3986void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
3987{
3988 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003989 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003990}
3991
3992void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
3993{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003994 mGLState.setVertexAttribf(index, values);
Jamie Madillc20ab272016-06-09 07:20:46 -07003995}
3996
3997void Context::vertexAttribPointer(GLuint index,
3998 GLint size,
3999 GLenum type,
4000 GLboolean normalized,
4001 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004002 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004003{
Corentin Wallez336129f2017-10-17 15:55:40 -04004004 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004005 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc20ab272016-06-09 07:20:46 -07004006}
4007
Shao80957d92017-02-20 21:25:59 +08004008void Context::vertexAttribFormat(GLuint attribIndex,
4009 GLint size,
4010 GLenum type,
4011 GLboolean normalized,
4012 GLuint relativeOffset)
4013{
Geoff Lang92019432017-11-20 13:09:34 -05004014 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004015 relativeOffset);
4016}
4017
4018void Context::vertexAttribIFormat(GLuint attribIndex,
4019 GLint size,
4020 GLenum type,
4021 GLuint relativeOffset)
4022{
4023 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
4024}
4025
4026void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4027{
Shaodde78e82017-05-22 14:13:27 +08004028 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Shao80957d92017-02-20 21:25:59 +08004029}
4030
Jiajia Qin5451d532017-11-16 17:16:34 +08004031void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004032{
4033 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
4034}
4035
Jamie Madillc20ab272016-06-09 07:20:46 -07004036void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4037{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004038 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004039}
4040
4041void Context::vertexAttribIPointer(GLuint index,
4042 GLint size,
4043 GLenum type,
4044 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004045 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004046{
Corentin Wallez336129f2017-10-17 15:55:40 -04004047 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4048 size, type, false, true, stride, pointer);
Jamie Madillc20ab272016-06-09 07:20:46 -07004049}
4050
4051void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4052{
4053 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004054 mGLState.setVertexAttribi(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004055}
4056
4057void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4058{
4059 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004060 mGLState.setVertexAttribu(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004061}
4062
4063void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4064{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004065 mGLState.setVertexAttribi(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07004066}
4067
4068void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4069{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004070 mGLState.setVertexAttribu(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07004071}
4072
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004073void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4074{
4075 const VertexAttribCurrentValueData &currentValues =
4076 getGLState().getVertexAttribCurrentValue(index);
4077 const VertexArray *vao = getGLState().getVertexArray();
4078 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4079 currentValues, pname, params);
4080}
4081
4082void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4083{
4084 const VertexAttribCurrentValueData &currentValues =
4085 getGLState().getVertexAttribCurrentValue(index);
4086 const VertexArray *vao = getGLState().getVertexArray();
4087 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4088 currentValues, pname, params);
4089}
4090
4091void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4092{
4093 const VertexAttribCurrentValueData &currentValues =
4094 getGLState().getVertexAttribCurrentValue(index);
4095 const VertexArray *vao = getGLState().getVertexArray();
4096 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4097 currentValues, pname, params);
4098}
4099
4100void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4101{
4102 const VertexAttribCurrentValueData &currentValues =
4103 getGLState().getVertexAttribCurrentValue(index);
4104 const VertexArray *vao = getGLState().getVertexArray();
4105 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4106 currentValues, pname, params);
4107}
4108
Jamie Madill876429b2017-04-20 15:46:24 -04004109void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004110{
4111 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4112 QueryVertexAttribPointerv(attrib, pname, pointer);
4113}
4114
Jamie Madillc20ab272016-06-09 07:20:46 -07004115void Context::debugMessageControl(GLenum source,
4116 GLenum type,
4117 GLenum severity,
4118 GLsizei count,
4119 const GLuint *ids,
4120 GLboolean enabled)
4121{
4122 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004123 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05004124 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07004125}
4126
4127void Context::debugMessageInsert(GLenum source,
4128 GLenum type,
4129 GLuint id,
4130 GLenum severity,
4131 GLsizei length,
4132 const GLchar *buf)
4133{
4134 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004135 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07004136}
4137
4138void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
4139{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004140 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07004141}
4142
4143GLuint Context::getDebugMessageLog(GLuint count,
4144 GLsizei bufSize,
4145 GLenum *sources,
4146 GLenum *types,
4147 GLuint *ids,
4148 GLenum *severities,
4149 GLsizei *lengths,
4150 GLchar *messageLog)
4151{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004152 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
4153 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07004154}
4155
4156void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
4157{
4158 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004159 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05004160 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07004161}
4162
4163void Context::popDebugGroup()
4164{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004165 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05004166 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07004167}
4168
Corentin Wallez336129f2017-10-17 15:55:40 -04004169void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04004170{
4171 Buffer *buffer = mGLState.getTargetBuffer(target);
4172 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004173 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04004174}
4175
Corentin Wallez336129f2017-10-17 15:55:40 -04004176void Context::bufferSubData(BufferBinding target,
4177 GLintptr offset,
4178 GLsizeiptr size,
4179 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04004180{
4181 if (data == nullptr)
4182 {
4183 return;
4184 }
4185
4186 Buffer *buffer = mGLState.getTargetBuffer(target);
4187 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004188 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04004189}
4190
Jamie Madillef300b12016-10-07 15:12:09 -04004191void Context::attachShader(GLuint program, GLuint shader)
4192{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05004193 Program *programObject = mState.mShaderPrograms->getProgram(program);
4194 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04004195 ASSERT(programObject && shaderObject);
4196 programObject->attachShader(shaderObject);
4197}
4198
Kenneth Russellf2f6f652016-10-05 19:53:23 -07004199const Workarounds &Context::getWorkarounds() const
4200{
4201 return mWorkarounds;
4202}
4203
Corentin Wallez336129f2017-10-17 15:55:40 -04004204void Context::copyBufferSubData(BufferBinding readTarget,
4205 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04004206 GLintptr readOffset,
4207 GLintptr writeOffset,
4208 GLsizeiptr size)
4209{
4210 // if size is zero, the copy is a successful no-op
4211 if (size == 0)
4212 {
4213 return;
4214 }
4215
4216 // TODO(jmadill): cache these.
4217 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
4218 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
4219
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004220 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04004221}
4222
Jamie Madill01a80ee2016-11-07 12:06:18 -05004223void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
4224{
4225 Program *programObject = getProgram(program);
4226 // TODO(jmadill): Re-use this from the validation if possible.
4227 ASSERT(programObject);
4228 programObject->bindAttributeLocation(index, name);
4229}
4230
Corentin Wallez336129f2017-10-17 15:55:40 -04004231void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004232{
Corentin Wallez336129f2017-10-17 15:55:40 -04004233 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4234 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004235}
4236
Corentin Wallez336129f2017-10-17 15:55:40 -04004237void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08004238{
4239 bindBufferRange(target, index, buffer, 0, 0);
4240}
4241
Corentin Wallez336129f2017-10-17 15:55:40 -04004242void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08004243 GLuint index,
4244 GLuint buffer,
4245 GLintptr offset,
4246 GLsizeiptr size)
4247{
Corentin Wallez336129f2017-10-17 15:55:40 -04004248 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4249 mGLState.setIndexedBufferBinding(this, target, index, bufferObject, offset, size);
Jiajia Qin6eafb042016-12-27 17:04:07 +08004250}
4251
Jamie Madill01a80ee2016-11-07 12:06:18 -05004252void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
4253{
4254 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4255 {
4256 bindReadFramebuffer(framebuffer);
4257 }
4258
4259 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4260 {
4261 bindDrawFramebuffer(framebuffer);
4262 }
4263}
4264
4265void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
4266{
4267 ASSERT(target == GL_RENDERBUFFER);
4268 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05004269 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004270 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004271}
4272
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004273void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08004274 GLsizei samples,
4275 GLenum internalformat,
4276 GLsizei width,
4277 GLsizei height,
4278 GLboolean fixedsamplelocations)
4279{
4280 Extents size(width, height, 1);
4281 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004282 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
4283 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08004284}
4285
4286void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
4287{
JiangYizhou5b03f472017-01-09 10:22:53 +08004288 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
4289 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05004290 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08004291 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08004292
4293 switch (pname)
4294 {
4295 case GL_SAMPLE_POSITION:
4296 handleError(framebuffer->getSamplePosition(index, val));
4297 break;
4298 default:
4299 UNREACHABLE();
4300 }
4301}
4302
Jamie Madille8fb6402017-02-14 17:56:40 -05004303void Context::renderbufferStorage(GLenum target,
4304 GLenum internalformat,
4305 GLsizei width,
4306 GLsizei height)
4307{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004308 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4309 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
4310
Jamie Madille8fb6402017-02-14 17:56:40 -05004311 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04004312 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004313}
4314
4315void Context::renderbufferStorageMultisample(GLenum target,
4316 GLsizei samples,
4317 GLenum internalformat,
4318 GLsizei width,
4319 GLsizei height)
4320{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004321 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4322 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05004323
4324 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004325 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04004326 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004327}
4328
Geoff Lang38f2cfb2017-04-11 15:23:08 -04004329void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
4330{
Jamie Madill70b5bb02017-08-28 13:32:37 -04004331 const Sync *syncObject = getSync(sync);
Geoff Lang82483b92017-04-11 15:33:00 -04004332 handleError(QuerySynciv(syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04004333}
4334
JiangYizhoue18e6392017-02-20 10:32:23 +08004335void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
4336{
4337 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4338 QueryFramebufferParameteriv(framebuffer, pname, params);
4339}
4340
Jiajia Qin5451d532017-11-16 17:16:34 +08004341void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08004342{
4343 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4344 SetFramebufferParameteri(framebuffer, pname, param);
4345}
4346
Jamie Madillb3f26b92017-07-19 15:07:41 -04004347Error Context::getScratchBuffer(size_t requstedSizeBytes,
4348 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05004349{
Jamie Madillb3f26b92017-07-19 15:07:41 -04004350 if (!mScratchBuffer.get(requstedSizeBytes, scratchBufferOut))
4351 {
4352 return OutOfMemory() << "Failed to allocate internal buffer.";
4353 }
4354 return NoError();
4355}
4356
4357Error Context::getZeroFilledBuffer(size_t requstedSizeBytes,
4358 angle::MemoryBuffer **zeroBufferOut) const
4359{
4360 if (!mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0))
Jamie Madille14951e2017-03-09 18:55:16 -05004361 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05004362 return OutOfMemory() << "Failed to allocate internal buffer.";
Jamie Madille14951e2017-03-09 18:55:16 -05004363 }
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05004364 return NoError();
Jamie Madille14951e2017-03-09 18:55:16 -05004365}
4366
Xinghua Cao10a4d432017-11-28 14:46:26 +08004367Error Context::prepareForDispatch()
4368{
Geoff Langa8cb2872018-03-09 16:09:40 -05004369 ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08004370
4371 if (isRobustResourceInitEnabled())
4372 {
4373 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
4374 }
4375
4376 return NoError();
4377}
4378
Xinghua Cao2b396592017-03-29 15:36:04 +08004379void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
4380{
4381 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
4382 {
4383 return;
4384 }
4385
Xinghua Cao10a4d432017-11-28 14:46:26 +08004386 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04004387 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08004388}
4389
Jiajia Qin5451d532017-11-16 17:16:34 +08004390void Context::dispatchComputeIndirect(GLintptr indirect)
4391{
Qin Jiajia62fcf622017-11-30 16:16:12 +08004392 ANGLE_CONTEXT_TRY(prepareForDispatch());
4393 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08004394}
4395
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004396void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08004397 GLsizei levels,
4398 GLenum internalFormat,
4399 GLsizei width,
4400 GLsizei height)
4401{
4402 Extents size(width, height, 1);
4403 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004404 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08004405}
4406
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004407void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08004408 GLsizei levels,
4409 GLenum internalFormat,
4410 GLsizei width,
4411 GLsizei height,
4412 GLsizei depth)
4413{
4414 Extents size(width, height, depth);
4415 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004416 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08004417}
4418
Jiajia Qin5451d532017-11-16 17:16:34 +08004419void Context::memoryBarrier(GLbitfield barriers)
4420{
Xinghua Cao89c422a2017-11-29 18:24:20 +08004421 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08004422}
4423
4424void Context::memoryBarrierByRegion(GLbitfield barriers)
4425{
Xinghua Cao89c422a2017-11-29 18:24:20 +08004426 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08004427}
4428
Jamie Madillc1d770e2017-04-13 17:31:24 -04004429GLenum Context::checkFramebufferStatus(GLenum target)
4430{
4431 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4432 ASSERT(framebuffer);
4433
Jamie Madille98b1b52018-03-08 09:47:23 -05004434 GLenum status = GL_NONE;
4435 Error err = framebuffer->checkStatus(this, &status);
4436 if (err.isError())
4437 {
4438 handleError(err);
4439 return 0;
4440 }
4441 return status;
Jamie Madillc1d770e2017-04-13 17:31:24 -04004442}
4443
4444void Context::compileShader(GLuint shader)
4445{
4446 Shader *shaderObject = GetValidShader(this, shader);
4447 if (!shaderObject)
4448 {
4449 return;
4450 }
4451 shaderObject->compile(this);
4452}
4453
4454void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
4455{
4456 for (int i = 0; i < n; i++)
4457 {
4458 deleteBuffer(buffers[i]);
4459 }
4460}
4461
4462void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
4463{
4464 for (int i = 0; i < n; i++)
4465 {
4466 if (framebuffers[i] != 0)
4467 {
4468 deleteFramebuffer(framebuffers[i]);
4469 }
4470 }
4471}
4472
4473void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
4474{
4475 for (int i = 0; i < n; i++)
4476 {
4477 deleteRenderbuffer(renderbuffers[i]);
4478 }
4479}
4480
4481void Context::deleteTextures(GLsizei n, const GLuint *textures)
4482{
4483 for (int i = 0; i < n; i++)
4484 {
4485 if (textures[i] != 0)
4486 {
4487 deleteTexture(textures[i]);
4488 }
4489 }
4490}
4491
4492void Context::detachShader(GLuint program, GLuint shader)
4493{
4494 Program *programObject = getProgram(program);
4495 ASSERT(programObject);
4496
4497 Shader *shaderObject = getShader(shader);
4498 ASSERT(shaderObject);
4499
4500 programObject->detachShader(this, shaderObject);
4501}
4502
4503void Context::genBuffers(GLsizei n, GLuint *buffers)
4504{
4505 for (int i = 0; i < n; i++)
4506 {
4507 buffers[i] = createBuffer();
4508 }
4509}
4510
4511void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
4512{
4513 for (int i = 0; i < n; i++)
4514 {
4515 framebuffers[i] = createFramebuffer();
4516 }
4517}
4518
4519void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
4520{
4521 for (int i = 0; i < n; i++)
4522 {
4523 renderbuffers[i] = createRenderbuffer();
4524 }
4525}
4526
4527void Context::genTextures(GLsizei n, GLuint *textures)
4528{
4529 for (int i = 0; i < n; i++)
4530 {
4531 textures[i] = createTexture();
4532 }
4533}
4534
4535void Context::getActiveAttrib(GLuint program,
4536 GLuint index,
4537 GLsizei bufsize,
4538 GLsizei *length,
4539 GLint *size,
4540 GLenum *type,
4541 GLchar *name)
4542{
4543 Program *programObject = getProgram(program);
4544 ASSERT(programObject);
4545 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
4546}
4547
4548void Context::getActiveUniform(GLuint program,
4549 GLuint index,
4550 GLsizei bufsize,
4551 GLsizei *length,
4552 GLint *size,
4553 GLenum *type,
4554 GLchar *name)
4555{
4556 Program *programObject = getProgram(program);
4557 ASSERT(programObject);
4558 programObject->getActiveUniform(index, bufsize, length, size, type, name);
4559}
4560
4561void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
4562{
4563 Program *programObject = getProgram(program);
4564 ASSERT(programObject);
4565 programObject->getAttachedShaders(maxcount, count, shaders);
4566}
4567
4568GLint Context::getAttribLocation(GLuint program, const GLchar *name)
4569{
4570 Program *programObject = getProgram(program);
4571 ASSERT(programObject);
4572 return programObject->getAttributeLocation(name);
4573}
4574
4575void Context::getBooleanv(GLenum pname, GLboolean *params)
4576{
4577 GLenum nativeType;
4578 unsigned int numParams = 0;
4579 getQueryParameterInfo(pname, &nativeType, &numParams);
4580
4581 if (nativeType == GL_BOOL)
4582 {
4583 getBooleanvImpl(pname, params);
4584 }
4585 else
4586 {
4587 CastStateValues(this, nativeType, pname, numParams, params);
4588 }
4589}
4590
4591void Context::getFloatv(GLenum pname, GLfloat *params)
4592{
4593 GLenum nativeType;
4594 unsigned int numParams = 0;
4595 getQueryParameterInfo(pname, &nativeType, &numParams);
4596
4597 if (nativeType == GL_FLOAT)
4598 {
4599 getFloatvImpl(pname, params);
4600 }
4601 else
4602 {
4603 CastStateValues(this, nativeType, pname, numParams, params);
4604 }
4605}
4606
4607void Context::getIntegerv(GLenum pname, GLint *params)
4608{
4609 GLenum nativeType;
4610 unsigned int numParams = 0;
4611 getQueryParameterInfo(pname, &nativeType, &numParams);
4612
4613 if (nativeType == GL_INT)
4614 {
4615 getIntegervImpl(pname, params);
4616 }
4617 else
4618 {
4619 CastStateValues(this, nativeType, pname, numParams, params);
4620 }
4621}
4622
4623void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
4624{
4625 Program *programObject = getProgram(program);
4626 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04004627 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004628}
4629
Jiajia Qin5451d532017-11-16 17:16:34 +08004630void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
4631{
4632 UNIMPLEMENTED();
4633}
4634
Jamie Madillbe849e42017-05-02 15:49:00 -04004635void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04004636{
4637 Program *programObject = getProgram(program);
4638 ASSERT(programObject);
4639 programObject->getInfoLog(bufsize, length, infolog);
4640}
4641
Jiajia Qin5451d532017-11-16 17:16:34 +08004642void Context::getProgramPipelineInfoLog(GLuint pipeline,
4643 GLsizei bufSize,
4644 GLsizei *length,
4645 GLchar *infoLog)
4646{
4647 UNIMPLEMENTED();
4648}
4649
Jamie Madillc1d770e2017-04-13 17:31:24 -04004650void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
4651{
4652 Shader *shaderObject = getShader(shader);
4653 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04004654 QueryShaderiv(this, shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004655}
4656
4657void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
4658{
4659 Shader *shaderObject = getShader(shader);
4660 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04004661 shaderObject->getInfoLog(this, bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004662}
4663
4664void Context::getShaderPrecisionFormat(GLenum shadertype,
4665 GLenum precisiontype,
4666 GLint *range,
4667 GLint *precision)
4668{
4669 // TODO(jmadill): Compute shaders.
4670
4671 switch (shadertype)
4672 {
4673 case GL_VERTEX_SHADER:
4674 switch (precisiontype)
4675 {
4676 case GL_LOW_FLOAT:
4677 mCaps.vertexLowpFloat.get(range, precision);
4678 break;
4679 case GL_MEDIUM_FLOAT:
4680 mCaps.vertexMediumpFloat.get(range, precision);
4681 break;
4682 case GL_HIGH_FLOAT:
4683 mCaps.vertexHighpFloat.get(range, precision);
4684 break;
4685
4686 case GL_LOW_INT:
4687 mCaps.vertexLowpInt.get(range, precision);
4688 break;
4689 case GL_MEDIUM_INT:
4690 mCaps.vertexMediumpInt.get(range, precision);
4691 break;
4692 case GL_HIGH_INT:
4693 mCaps.vertexHighpInt.get(range, precision);
4694 break;
4695
4696 default:
4697 UNREACHABLE();
4698 return;
4699 }
4700 break;
4701
4702 case GL_FRAGMENT_SHADER:
4703 switch (precisiontype)
4704 {
4705 case GL_LOW_FLOAT:
4706 mCaps.fragmentLowpFloat.get(range, precision);
4707 break;
4708 case GL_MEDIUM_FLOAT:
4709 mCaps.fragmentMediumpFloat.get(range, precision);
4710 break;
4711 case GL_HIGH_FLOAT:
4712 mCaps.fragmentHighpFloat.get(range, precision);
4713 break;
4714
4715 case GL_LOW_INT:
4716 mCaps.fragmentLowpInt.get(range, precision);
4717 break;
4718 case GL_MEDIUM_INT:
4719 mCaps.fragmentMediumpInt.get(range, precision);
4720 break;
4721 case GL_HIGH_INT:
4722 mCaps.fragmentHighpInt.get(range, precision);
4723 break;
4724
4725 default:
4726 UNREACHABLE();
4727 return;
4728 }
4729 break;
4730
4731 default:
4732 UNREACHABLE();
4733 return;
4734 }
4735}
4736
4737void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
4738{
4739 Shader *shaderObject = getShader(shader);
4740 ASSERT(shaderObject);
4741 shaderObject->getSource(bufsize, length, source);
4742}
4743
4744void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
4745{
4746 Program *programObject = getProgram(program);
4747 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04004748 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004749}
4750
4751void Context::getUniformiv(GLuint program, GLint location, GLint *params)
4752{
4753 Program *programObject = getProgram(program);
4754 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04004755 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004756}
4757
4758GLint Context::getUniformLocation(GLuint program, const GLchar *name)
4759{
4760 Program *programObject = getProgram(program);
4761 ASSERT(programObject);
4762 return programObject->getUniformLocation(name);
4763}
4764
4765GLboolean Context::isBuffer(GLuint buffer)
4766{
4767 if (buffer == 0)
4768 {
4769 return GL_FALSE;
4770 }
4771
4772 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
4773}
4774
4775GLboolean Context::isEnabled(GLenum cap)
4776{
4777 return mGLState.getEnableFeature(cap);
4778}
4779
4780GLboolean Context::isFramebuffer(GLuint framebuffer)
4781{
4782 if (framebuffer == 0)
4783 {
4784 return GL_FALSE;
4785 }
4786
4787 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
4788}
4789
4790GLboolean Context::isProgram(GLuint program)
4791{
4792 if (program == 0)
4793 {
4794 return GL_FALSE;
4795 }
4796
4797 return (getProgram(program) ? GL_TRUE : GL_FALSE);
4798}
4799
4800GLboolean Context::isRenderbuffer(GLuint renderbuffer)
4801{
4802 if (renderbuffer == 0)
4803 {
4804 return GL_FALSE;
4805 }
4806
4807 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
4808}
4809
4810GLboolean Context::isShader(GLuint shader)
4811{
4812 if (shader == 0)
4813 {
4814 return GL_FALSE;
4815 }
4816
4817 return (getShader(shader) ? GL_TRUE : GL_FALSE);
4818}
4819
4820GLboolean Context::isTexture(GLuint texture)
4821{
4822 if (texture == 0)
4823 {
4824 return GL_FALSE;
4825 }
4826
4827 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
4828}
4829
4830void Context::linkProgram(GLuint program)
4831{
4832 Program *programObject = getProgram(program);
4833 ASSERT(programObject);
4834 handleError(programObject->link(this));
Martin Radev0abb7a22017-08-28 15:34:45 +03004835 mGLState.onProgramExecutableChange(programObject);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004836}
4837
4838void Context::releaseShaderCompiler()
4839{
Jamie Madill4928b7c2017-06-20 12:57:39 -04004840 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004841}
4842
4843void Context::shaderBinary(GLsizei n,
4844 const GLuint *shaders,
4845 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04004846 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04004847 GLsizei length)
4848{
4849 // No binary shader formats are supported.
4850 UNIMPLEMENTED();
4851}
4852
4853void Context::shaderSource(GLuint shader,
4854 GLsizei count,
4855 const GLchar *const *string,
4856 const GLint *length)
4857{
4858 Shader *shaderObject = getShader(shader);
4859 ASSERT(shaderObject);
4860 shaderObject->setSource(count, string, length);
4861}
4862
4863void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
4864{
4865 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
4866}
4867
4868void Context::stencilMask(GLuint mask)
4869{
4870 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4871}
4872
4873void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4874{
4875 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4876}
4877
4878void Context::uniform1f(GLint location, GLfloat x)
4879{
4880 Program *program = mGLState.getProgram();
4881 program->setUniform1fv(location, 1, &x);
4882}
4883
4884void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
4885{
4886 Program *program = mGLState.getProgram();
4887 program->setUniform1fv(location, count, v);
4888}
4889
4890void Context::uniform1i(GLint location, GLint x)
4891{
4892 Program *program = mGLState.getProgram();
Jamie Madill81c2e252017-09-09 23:32:46 -04004893 if (program->setUniform1iv(location, 1, &x) == Program::SetUniformResult::SamplerChanged)
4894 {
4895 mGLState.setObjectDirty(GL_PROGRAM);
4896 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04004897}
4898
4899void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
4900{
4901 Program *program = mGLState.getProgram();
Jamie Madill81c2e252017-09-09 23:32:46 -04004902 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
4903 {
4904 mGLState.setObjectDirty(GL_PROGRAM);
4905 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04004906}
4907
4908void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
4909{
4910 GLfloat xy[2] = {x, y};
4911 Program *program = mGLState.getProgram();
4912 program->setUniform2fv(location, 1, xy);
4913}
4914
4915void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
4916{
4917 Program *program = mGLState.getProgram();
4918 program->setUniform2fv(location, count, v);
4919}
4920
4921void Context::uniform2i(GLint location, GLint x, GLint y)
4922{
4923 GLint xy[2] = {x, y};
4924 Program *program = mGLState.getProgram();
4925 program->setUniform2iv(location, 1, xy);
4926}
4927
4928void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
4929{
4930 Program *program = mGLState.getProgram();
4931 program->setUniform2iv(location, count, v);
4932}
4933
4934void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
4935{
4936 GLfloat xyz[3] = {x, y, z};
4937 Program *program = mGLState.getProgram();
4938 program->setUniform3fv(location, 1, xyz);
4939}
4940
4941void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
4942{
4943 Program *program = mGLState.getProgram();
4944 program->setUniform3fv(location, count, v);
4945}
4946
4947void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
4948{
4949 GLint xyz[3] = {x, y, z};
4950 Program *program = mGLState.getProgram();
4951 program->setUniform3iv(location, 1, xyz);
4952}
4953
4954void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
4955{
4956 Program *program = mGLState.getProgram();
4957 program->setUniform3iv(location, count, v);
4958}
4959
4960void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4961{
4962 GLfloat xyzw[4] = {x, y, z, w};
4963 Program *program = mGLState.getProgram();
4964 program->setUniform4fv(location, 1, xyzw);
4965}
4966
4967void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
4968{
4969 Program *program = mGLState.getProgram();
4970 program->setUniform4fv(location, count, v);
4971}
4972
4973void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
4974{
4975 GLint xyzw[4] = {x, y, z, w};
4976 Program *program = mGLState.getProgram();
4977 program->setUniform4iv(location, 1, xyzw);
4978}
4979
4980void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
4981{
4982 Program *program = mGLState.getProgram();
4983 program->setUniform4iv(location, count, v);
4984}
4985
4986void Context::uniformMatrix2fv(GLint location,
4987 GLsizei count,
4988 GLboolean transpose,
4989 const GLfloat *value)
4990{
4991 Program *program = mGLState.getProgram();
4992 program->setUniformMatrix2fv(location, count, transpose, value);
4993}
4994
4995void Context::uniformMatrix3fv(GLint location,
4996 GLsizei count,
4997 GLboolean transpose,
4998 const GLfloat *value)
4999{
5000 Program *program = mGLState.getProgram();
5001 program->setUniformMatrix3fv(location, count, transpose, value);
5002}
5003
5004void Context::uniformMatrix4fv(GLint location,
5005 GLsizei count,
5006 GLboolean transpose,
5007 const GLfloat *value)
5008{
5009 Program *program = mGLState.getProgram();
5010 program->setUniformMatrix4fv(location, count, transpose, value);
5011}
5012
5013void Context::validateProgram(GLuint program)
5014{
5015 Program *programObject = getProgram(program);
5016 ASSERT(programObject);
5017 programObject->validate(mCaps);
5018}
5019
Jiajia Qin5451d532017-11-16 17:16:34 +08005020void Context::validateProgramPipeline(GLuint pipeline)
5021{
5022 UNIMPLEMENTED();
5023}
5024
Jamie Madilld04908b2017-06-09 14:15:35 -04005025void Context::getProgramBinary(GLuint program,
5026 GLsizei bufSize,
5027 GLsizei *length,
5028 GLenum *binaryFormat,
5029 void *binary)
5030{
5031 Program *programObject = getProgram(program);
5032 ASSERT(programObject != nullptr);
5033
5034 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
5035}
5036
5037void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
5038{
5039 Program *programObject = getProgram(program);
5040 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04005041
Jamie Madilld04908b2017-06-09 14:15:35 -04005042 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
5043}
5044
Jamie Madillff325f12017-08-26 15:06:05 -04005045void Context::uniform1ui(GLint location, GLuint v0)
5046{
5047 Program *program = mGLState.getProgram();
5048 program->setUniform1uiv(location, 1, &v0);
5049}
5050
5051void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
5052{
5053 Program *program = mGLState.getProgram();
5054 const GLuint xy[] = {v0, v1};
5055 program->setUniform2uiv(location, 1, xy);
5056}
5057
5058void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
5059{
5060 Program *program = mGLState.getProgram();
5061 const GLuint xyz[] = {v0, v1, v2};
5062 program->setUniform3uiv(location, 1, xyz);
5063}
5064
5065void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
5066{
5067 Program *program = mGLState.getProgram();
5068 const GLuint xyzw[] = {v0, v1, v2, v3};
5069 program->setUniform4uiv(location, 1, xyzw);
5070}
5071
5072void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
5073{
5074 Program *program = mGLState.getProgram();
5075 program->setUniform1uiv(location, count, value);
5076}
5077void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
5078{
5079 Program *program = mGLState.getProgram();
5080 program->setUniform2uiv(location, count, value);
5081}
5082
5083void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
5084{
5085 Program *program = mGLState.getProgram();
5086 program->setUniform3uiv(location, count, value);
5087}
5088
5089void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
5090{
5091 Program *program = mGLState.getProgram();
5092 program->setUniform4uiv(location, count, value);
5093}
5094
Jamie Madillf0e04492017-08-26 15:28:42 -04005095void Context::genQueries(GLsizei n, GLuint *ids)
5096{
5097 for (GLsizei i = 0; i < n; i++)
5098 {
5099 GLuint handle = mQueryHandleAllocator.allocate();
5100 mQueryMap.assign(handle, nullptr);
5101 ids[i] = handle;
5102 }
5103}
5104
5105void Context::deleteQueries(GLsizei n, const GLuint *ids)
5106{
5107 for (int i = 0; i < n; i++)
5108 {
5109 GLuint query = ids[i];
5110
5111 Query *queryObject = nullptr;
5112 if (mQueryMap.erase(query, &queryObject))
5113 {
5114 mQueryHandleAllocator.release(query);
5115 if (queryObject)
5116 {
5117 queryObject->release(this);
5118 }
5119 }
5120 }
5121}
5122
5123GLboolean Context::isQuery(GLuint id)
5124{
5125 return (getQuery(id, false, GL_NONE) != nullptr) ? GL_TRUE : GL_FALSE;
5126}
5127
Jamie Madillc8c95812017-08-26 18:40:09 -04005128void Context::uniformMatrix2x3fv(GLint location,
5129 GLsizei count,
5130 GLboolean transpose,
5131 const GLfloat *value)
5132{
5133 Program *program = mGLState.getProgram();
5134 program->setUniformMatrix2x3fv(location, count, transpose, value);
5135}
5136
5137void Context::uniformMatrix3x2fv(GLint location,
5138 GLsizei count,
5139 GLboolean transpose,
5140 const GLfloat *value)
5141{
5142 Program *program = mGLState.getProgram();
5143 program->setUniformMatrix3x2fv(location, count, transpose, value);
5144}
5145
5146void Context::uniformMatrix2x4fv(GLint location,
5147 GLsizei count,
5148 GLboolean transpose,
5149 const GLfloat *value)
5150{
5151 Program *program = mGLState.getProgram();
5152 program->setUniformMatrix2x4fv(location, count, transpose, value);
5153}
5154
5155void Context::uniformMatrix4x2fv(GLint location,
5156 GLsizei count,
5157 GLboolean transpose,
5158 const GLfloat *value)
5159{
5160 Program *program = mGLState.getProgram();
5161 program->setUniformMatrix4x2fv(location, count, transpose, value);
5162}
5163
5164void Context::uniformMatrix3x4fv(GLint location,
5165 GLsizei count,
5166 GLboolean transpose,
5167 const GLfloat *value)
5168{
5169 Program *program = mGLState.getProgram();
5170 program->setUniformMatrix3x4fv(location, count, transpose, value);
5171}
5172
5173void Context::uniformMatrix4x3fv(GLint location,
5174 GLsizei count,
5175 GLboolean transpose,
5176 const GLfloat *value)
5177{
5178 Program *program = mGLState.getProgram();
5179 program->setUniformMatrix4x3fv(location, count, transpose, value);
5180}
5181
Jamie Madilld7576732017-08-26 18:49:50 -04005182void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
5183{
5184 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5185 {
5186 GLuint vertexArray = arrays[arrayIndex];
5187
5188 if (arrays[arrayIndex] != 0)
5189 {
5190 VertexArray *vertexArrayObject = nullptr;
5191 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
5192 {
5193 if (vertexArrayObject != nullptr)
5194 {
5195 detachVertexArray(vertexArray);
5196 vertexArrayObject->onDestroy(this);
5197 }
5198
5199 mVertexArrayHandleAllocator.release(vertexArray);
5200 }
5201 }
5202 }
5203}
5204
5205void Context::genVertexArrays(GLsizei n, GLuint *arrays)
5206{
5207 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5208 {
5209 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
5210 mVertexArrayMap.assign(vertexArray, nullptr);
5211 arrays[arrayIndex] = vertexArray;
5212 }
5213}
5214
5215bool Context::isVertexArray(GLuint array)
5216{
5217 if (array == 0)
5218 {
5219 return GL_FALSE;
5220 }
5221
5222 VertexArray *vao = getVertexArray(array);
5223 return (vao != nullptr ? GL_TRUE : GL_FALSE);
5224}
5225
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04005226void Context::endTransformFeedback()
5227{
5228 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5229 transformFeedback->end(this);
5230}
5231
5232void Context::transformFeedbackVaryings(GLuint program,
5233 GLsizei count,
5234 const GLchar *const *varyings,
5235 GLenum bufferMode)
5236{
5237 Program *programObject = getProgram(program);
5238 ASSERT(programObject);
5239 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
5240}
5241
5242void Context::getTransformFeedbackVarying(GLuint program,
5243 GLuint index,
5244 GLsizei bufSize,
5245 GLsizei *length,
5246 GLsizei *size,
5247 GLenum *type,
5248 GLchar *name)
5249{
5250 Program *programObject = getProgram(program);
5251 ASSERT(programObject);
5252 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
5253}
5254
5255void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
5256{
5257 for (int i = 0; i < n; i++)
5258 {
5259 GLuint transformFeedback = ids[i];
5260 if (transformFeedback == 0)
5261 {
5262 continue;
5263 }
5264
5265 TransformFeedback *transformFeedbackObject = nullptr;
5266 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
5267 {
5268 if (transformFeedbackObject != nullptr)
5269 {
5270 detachTransformFeedback(transformFeedback);
5271 transformFeedbackObject->release(this);
5272 }
5273
5274 mTransformFeedbackHandleAllocator.release(transformFeedback);
5275 }
5276 }
5277}
5278
5279void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
5280{
5281 for (int i = 0; i < n; i++)
5282 {
5283 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
5284 mTransformFeedbackMap.assign(transformFeedback, nullptr);
5285 ids[i] = transformFeedback;
5286 }
5287}
5288
5289bool Context::isTransformFeedback(GLuint id)
5290{
5291 if (id == 0)
5292 {
5293 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
5294 // returns FALSE
5295 return GL_FALSE;
5296 }
5297
5298 const TransformFeedback *transformFeedback = getTransformFeedback(id);
5299 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
5300}
5301
5302void Context::pauseTransformFeedback()
5303{
5304 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5305 transformFeedback->pause();
5306}
5307
5308void Context::resumeTransformFeedback()
5309{
5310 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5311 transformFeedback->resume();
5312}
5313
Jamie Madill12e957f2017-08-26 21:42:26 -04005314void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
5315{
5316 const Program *programObject = getProgram(program);
Jamie Madill54164b02017-08-28 15:17:37 -04005317 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04005318}
5319
5320GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
5321{
5322 const Program *programObject = getProgram(program);
5323 return programObject->getFragDataLocation(name);
5324}
5325
5326void Context::getUniformIndices(GLuint program,
5327 GLsizei uniformCount,
5328 const GLchar *const *uniformNames,
5329 GLuint *uniformIndices)
5330{
5331 const Program *programObject = getProgram(program);
5332 if (!programObject->isLinked())
5333 {
5334 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5335 {
5336 uniformIndices[uniformId] = GL_INVALID_INDEX;
5337 }
5338 }
5339 else
5340 {
5341 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5342 {
5343 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
5344 }
5345 }
5346}
5347
5348void Context::getActiveUniformsiv(GLuint program,
5349 GLsizei uniformCount,
5350 const GLuint *uniformIndices,
5351 GLenum pname,
5352 GLint *params)
5353{
5354 const Program *programObject = getProgram(program);
5355 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5356 {
5357 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08005358 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04005359 }
5360}
5361
5362GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
5363{
5364 const Program *programObject = getProgram(program);
5365 return programObject->getUniformBlockIndex(uniformBlockName);
5366}
5367
5368void Context::getActiveUniformBlockiv(GLuint program,
5369 GLuint uniformBlockIndex,
5370 GLenum pname,
5371 GLint *params)
5372{
5373 const Program *programObject = getProgram(program);
5374 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
5375}
5376
5377void Context::getActiveUniformBlockName(GLuint program,
5378 GLuint uniformBlockIndex,
5379 GLsizei bufSize,
5380 GLsizei *length,
5381 GLchar *uniformBlockName)
5382{
5383 const Program *programObject = getProgram(program);
5384 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
5385}
5386
5387void Context::uniformBlockBinding(GLuint program,
5388 GLuint uniformBlockIndex,
5389 GLuint uniformBlockBinding)
5390{
5391 Program *programObject = getProgram(program);
5392 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
5393}
5394
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005395GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
5396{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005397 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
5398 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005399
Jamie Madill70b5bb02017-08-28 13:32:37 -04005400 Sync *syncObject = getSync(syncHandle);
5401 Error error = syncObject->set(condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005402 if (error.isError())
5403 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04005404 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005405 handleError(error);
5406 return nullptr;
5407 }
5408
Jamie Madill70b5bb02017-08-28 13:32:37 -04005409 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005410}
5411
5412GLboolean Context::isSync(GLsync sync)
5413{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005414 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005415}
5416
5417GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
5418{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005419 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005420
5421 GLenum result = GL_WAIT_FAILED;
5422 handleError(syncObject->clientWait(flags, timeout, &result));
5423 return result;
5424}
5425
5426void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
5427{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005428 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005429 handleError(syncObject->serverWait(flags, timeout));
5430}
5431
5432void Context::getInteger64v(GLenum pname, GLint64 *params)
5433{
5434 GLenum nativeType = GL_NONE;
5435 unsigned int numParams = 0;
5436 getQueryParameterInfo(pname, &nativeType, &numParams);
5437
5438 if (nativeType == GL_INT_64_ANGLEX)
5439 {
5440 getInteger64vImpl(pname, params);
5441 }
5442 else
5443 {
5444 CastStateValues(this, nativeType, pname, numParams, params);
5445 }
5446}
5447
Corentin Wallez336129f2017-10-17 15:55:40 -04005448void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04005449{
5450 Buffer *buffer = mGLState.getTargetBuffer(target);
5451 QueryBufferParameteri64v(buffer, pname, params);
5452}
5453
5454void Context::genSamplers(GLsizei count, GLuint *samplers)
5455{
5456 for (int i = 0; i < count; i++)
5457 {
5458 samplers[i] = mState.mSamplers->createSampler();
5459 }
5460}
5461
5462void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
5463{
5464 for (int i = 0; i < count; i++)
5465 {
5466 GLuint sampler = samplers[i];
5467
5468 if (mState.mSamplers->getSampler(sampler))
5469 {
5470 detachSampler(sampler);
5471 }
5472
5473 mState.mSamplers->deleteObject(this, sampler);
5474 }
5475}
5476
5477void Context::getInternalformativ(GLenum target,
5478 GLenum internalformat,
5479 GLenum pname,
5480 GLsizei bufSize,
5481 GLint *params)
5482{
5483 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
5484 QueryInternalFormativ(formatCaps, pname, bufSize, params);
5485}
5486
Jiajia Qin5451d532017-11-16 17:16:34 +08005487void Context::programUniform1i(GLuint program, GLint location, GLint v0)
5488{
5489 programUniform1iv(program, location, 1, &v0);
5490}
5491
5492void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
5493{
5494 GLint xy[2] = {v0, v1};
5495 programUniform2iv(program, location, 1, xy);
5496}
5497
5498void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
5499{
5500 GLint xyz[3] = {v0, v1, v2};
5501 programUniform3iv(program, location, 1, xyz);
5502}
5503
5504void Context::programUniform4i(GLuint program,
5505 GLint location,
5506 GLint v0,
5507 GLint v1,
5508 GLint v2,
5509 GLint v3)
5510{
5511 GLint xyzw[4] = {v0, v1, v2, v3};
5512 programUniform4iv(program, location, 1, xyzw);
5513}
5514
5515void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
5516{
5517 programUniform1uiv(program, location, 1, &v0);
5518}
5519
5520void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
5521{
5522 GLuint xy[2] = {v0, v1};
5523 programUniform2uiv(program, location, 1, xy);
5524}
5525
5526void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
5527{
5528 GLuint xyz[3] = {v0, v1, v2};
5529 programUniform3uiv(program, location, 1, xyz);
5530}
5531
5532void Context::programUniform4ui(GLuint program,
5533 GLint location,
5534 GLuint v0,
5535 GLuint v1,
5536 GLuint v2,
5537 GLuint v3)
5538{
5539 GLuint xyzw[4] = {v0, v1, v2, v3};
5540 programUniform4uiv(program, location, 1, xyzw);
5541}
5542
5543void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
5544{
5545 programUniform1fv(program, location, 1, &v0);
5546}
5547
5548void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
5549{
5550 GLfloat xy[2] = {v0, v1};
5551 programUniform2fv(program, location, 1, xy);
5552}
5553
5554void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
5555{
5556 GLfloat xyz[3] = {v0, v1, v2};
5557 programUniform3fv(program, location, 1, xyz);
5558}
5559
5560void Context::programUniform4f(GLuint program,
5561 GLint location,
5562 GLfloat v0,
5563 GLfloat v1,
5564 GLfloat v2,
5565 GLfloat v3)
5566{
5567 GLfloat xyzw[4] = {v0, v1, v2, v3};
5568 programUniform4fv(program, location, 1, xyzw);
5569}
5570
Jamie Madill81c2e252017-09-09 23:32:46 -04005571void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
5572{
5573 Program *programObject = getProgram(program);
5574 ASSERT(programObject);
5575 if (programObject->setUniform1iv(location, count, value) ==
5576 Program::SetUniformResult::SamplerChanged)
5577 {
5578 mGLState.setObjectDirty(GL_PROGRAM);
5579 }
5580}
5581
Jiajia Qin5451d532017-11-16 17:16:34 +08005582void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
5583{
5584 Program *programObject = getProgram(program);
5585 ASSERT(programObject);
5586 programObject->setUniform2iv(location, count, value);
5587}
5588
5589void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
5590{
5591 Program *programObject = getProgram(program);
5592 ASSERT(programObject);
5593 programObject->setUniform3iv(location, count, value);
5594}
5595
5596void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
5597{
5598 Program *programObject = getProgram(program);
5599 ASSERT(programObject);
5600 programObject->setUniform4iv(location, count, value);
5601}
5602
5603void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
5604{
5605 Program *programObject = getProgram(program);
5606 ASSERT(programObject);
5607 programObject->setUniform1uiv(location, count, value);
5608}
5609
5610void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
5611{
5612 Program *programObject = getProgram(program);
5613 ASSERT(programObject);
5614 programObject->setUniform2uiv(location, count, value);
5615}
5616
5617void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
5618{
5619 Program *programObject = getProgram(program);
5620 ASSERT(programObject);
5621 programObject->setUniform3uiv(location, count, value);
5622}
5623
5624void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
5625{
5626 Program *programObject = getProgram(program);
5627 ASSERT(programObject);
5628 programObject->setUniform4uiv(location, count, value);
5629}
5630
5631void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
5632{
5633 Program *programObject = getProgram(program);
5634 ASSERT(programObject);
5635 programObject->setUniform1fv(location, count, value);
5636}
5637
5638void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
5639{
5640 Program *programObject = getProgram(program);
5641 ASSERT(programObject);
5642 programObject->setUniform2fv(location, count, value);
5643}
5644
5645void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
5646{
5647 Program *programObject = getProgram(program);
5648 ASSERT(programObject);
5649 programObject->setUniform3fv(location, count, value);
5650}
5651
5652void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
5653{
5654 Program *programObject = getProgram(program);
5655 ASSERT(programObject);
5656 programObject->setUniform4fv(location, count, value);
5657}
5658
5659void Context::programUniformMatrix2fv(GLuint program,
5660 GLint location,
5661 GLsizei count,
5662 GLboolean transpose,
5663 const GLfloat *value)
5664{
5665 Program *programObject = getProgram(program);
5666 ASSERT(programObject);
5667 programObject->setUniformMatrix2fv(location, count, transpose, value);
5668}
5669
5670void Context::programUniformMatrix3fv(GLuint program,
5671 GLint location,
5672 GLsizei count,
5673 GLboolean transpose,
5674 const GLfloat *value)
5675{
5676 Program *programObject = getProgram(program);
5677 ASSERT(programObject);
5678 programObject->setUniformMatrix3fv(location, count, transpose, value);
5679}
5680
5681void Context::programUniformMatrix4fv(GLuint program,
5682 GLint location,
5683 GLsizei count,
5684 GLboolean transpose,
5685 const GLfloat *value)
5686{
5687 Program *programObject = getProgram(program);
5688 ASSERT(programObject);
5689 programObject->setUniformMatrix4fv(location, count, transpose, value);
5690}
5691
5692void Context::programUniformMatrix2x3fv(GLuint program,
5693 GLint location,
5694 GLsizei count,
5695 GLboolean transpose,
5696 const GLfloat *value)
5697{
5698 Program *programObject = getProgram(program);
5699 ASSERT(programObject);
5700 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
5701}
5702
5703void Context::programUniformMatrix3x2fv(GLuint program,
5704 GLint location,
5705 GLsizei count,
5706 GLboolean transpose,
5707 const GLfloat *value)
5708{
5709 Program *programObject = getProgram(program);
5710 ASSERT(programObject);
5711 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
5712}
5713
5714void Context::programUniformMatrix2x4fv(GLuint program,
5715 GLint location,
5716 GLsizei count,
5717 GLboolean transpose,
5718 const GLfloat *value)
5719{
5720 Program *programObject = getProgram(program);
5721 ASSERT(programObject);
5722 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
5723}
5724
5725void Context::programUniformMatrix4x2fv(GLuint program,
5726 GLint location,
5727 GLsizei count,
5728 GLboolean transpose,
5729 const GLfloat *value)
5730{
5731 Program *programObject = getProgram(program);
5732 ASSERT(programObject);
5733 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
5734}
5735
5736void Context::programUniformMatrix3x4fv(GLuint program,
5737 GLint location,
5738 GLsizei count,
5739 GLboolean transpose,
5740 const GLfloat *value)
5741{
5742 Program *programObject = getProgram(program);
5743 ASSERT(programObject);
5744 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
5745}
5746
5747void Context::programUniformMatrix4x3fv(GLuint program,
5748 GLint location,
5749 GLsizei count,
5750 GLboolean transpose,
5751 const GLfloat *value)
5752{
5753 Program *programObject = getProgram(program);
5754 ASSERT(programObject);
5755 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
5756}
5757
Jamie Madill81c2e252017-09-09 23:32:46 -04005758void Context::onTextureChange(const Texture *texture)
5759{
5760 // Conservatively assume all textures are dirty.
5761 // TODO(jmadill): More fine-grained update.
5762 mGLState.setObjectDirty(GL_TEXTURE);
5763}
5764
James Darpiniane8a93c62018-01-04 18:02:24 -08005765bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
5766{
5767 return mGLState.isCurrentTransformFeedback(tf);
5768}
5769bool Context::isCurrentVertexArray(const VertexArray *va) const
5770{
5771 return mGLState.isCurrentVertexArray(va);
5772}
5773
Yunchao Hea336b902017-08-02 16:05:21 +08005774void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
5775{
5776 for (int i = 0; i < count; i++)
5777 {
5778 pipelines[i] = createProgramPipeline();
5779 }
5780}
5781
5782void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
5783{
5784 for (int i = 0; i < count; i++)
5785 {
5786 if (pipelines[i] != 0)
5787 {
5788 deleteProgramPipeline(pipelines[i]);
5789 }
5790 }
5791}
5792
5793GLboolean Context::isProgramPipeline(GLuint pipeline)
5794{
5795 if (pipeline == 0)
5796 {
5797 return GL_FALSE;
5798 }
5799
5800 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
5801}
5802
Jamie Madill2b7bbc22017-12-21 17:30:38 -05005803void Context::finishFenceNV(GLuint fence)
5804{
5805 FenceNV *fenceObject = getFenceNV(fence);
5806
5807 ASSERT(fenceObject && fenceObject->isSet());
5808 handleError(fenceObject->finish());
5809}
5810
5811void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
5812{
5813 FenceNV *fenceObject = getFenceNV(fence);
5814
5815 ASSERT(fenceObject && fenceObject->isSet());
5816
5817 switch (pname)
5818 {
5819 case GL_FENCE_STATUS_NV:
5820 {
5821 // GL_NV_fence spec:
5822 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
5823 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
5824 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
5825 GLboolean status = GL_TRUE;
5826 if (fenceObject->getStatus() != GL_TRUE)
5827 {
5828 ANGLE_CONTEXT_TRY(fenceObject->test(&status));
5829 }
5830 *params = status;
5831 break;
5832 }
5833
5834 case GL_FENCE_CONDITION_NV:
5835 {
5836 *params = static_cast<GLint>(fenceObject->getCondition());
5837 break;
5838 }
5839
5840 default:
5841 UNREACHABLE();
5842 }
5843}
5844
5845void Context::getTranslatedShaderSource(GLuint shader,
5846 GLsizei bufsize,
5847 GLsizei *length,
5848 GLchar *source)
5849{
5850 Shader *shaderObject = getShader(shader);
5851 ASSERT(shaderObject);
5852 shaderObject->getTranslatedSourceWithDebugInfo(this, bufsize, length, source);
5853}
5854
5855void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
5856{
5857 Program *programObject = getProgram(program);
5858 ASSERT(programObject);
5859
5860 programObject->getUniformfv(this, location, params);
5861}
5862
5863void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
5864{
5865 Program *programObject = getProgram(program);
5866 ASSERT(programObject);
5867
5868 programObject->getUniformiv(this, location, params);
5869}
5870
5871GLboolean Context::isFenceNV(GLuint fence)
5872{
5873 FenceNV *fenceObject = getFenceNV(fence);
5874
5875 if (fenceObject == nullptr)
5876 {
5877 return GL_FALSE;
5878 }
5879
5880 // GL_NV_fence spec:
5881 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
5882 // existing fence.
5883 return fenceObject->isSet();
5884}
5885
5886void Context::readnPixels(GLint x,
5887 GLint y,
5888 GLsizei width,
5889 GLsizei height,
5890 GLenum format,
5891 GLenum type,
5892 GLsizei bufSize,
5893 void *data)
5894{
5895 return readPixels(x, y, width, height, format, type, data);
5896}
5897
Jamie Madill007530e2017-12-28 14:27:04 -05005898void Context::setFenceNV(GLuint fence, GLenum condition)
5899{
5900 ASSERT(condition == GL_ALL_COMPLETED_NV);
5901
5902 FenceNV *fenceObject = getFenceNV(fence);
5903 ASSERT(fenceObject != nullptr);
5904 handleError(fenceObject->set(condition));
5905}
5906
5907GLboolean Context::testFenceNV(GLuint fence)
5908{
5909 FenceNV *fenceObject = getFenceNV(fence);
5910
5911 ASSERT(fenceObject != nullptr);
5912 ASSERT(fenceObject->isSet() == GL_TRUE);
5913
5914 GLboolean result = GL_TRUE;
5915 Error error = fenceObject->test(&result);
5916 if (error.isError())
5917 {
5918 handleError(error);
5919 return GL_TRUE;
5920 }
5921
5922 return result;
5923}
5924
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005925void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05005926{
5927 Texture *texture = getTargetTexture(target);
5928 egl::Image *imageObject = reinterpret_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005929 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05005930}
5931
Jamie Madillfa920eb2018-01-04 11:45:50 -05005932void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05005933{
5934 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
5935 egl::Image *imageObject = reinterpret_cast<egl::Image *>(image);
5936 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
5937}
5938
Jamie Madillfa920eb2018-01-04 11:45:50 -05005939void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
5940{
5941 UNIMPLEMENTED();
5942}
5943
Jamie Madill5b772312018-03-08 20:28:32 -05005944bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
5945{
5946 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
5947 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
5948 // to the fact that it is stored internally as a float, and so would require conversion
5949 // if returned from Context::getIntegerv. Since this conversion is already implemented
5950 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
5951 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
5952 // application.
5953 switch (pname)
5954 {
5955 case GL_COMPRESSED_TEXTURE_FORMATS:
5956 {
5957 *type = GL_INT;
5958 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
5959 return true;
5960 }
5961 case GL_SHADER_BINARY_FORMATS:
5962 {
5963 *type = GL_INT;
5964 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
5965 return true;
5966 }
5967
5968 case GL_MAX_VERTEX_ATTRIBS:
5969 case GL_MAX_VERTEX_UNIFORM_VECTORS:
5970 case GL_MAX_VARYING_VECTORS:
5971 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
5972 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
5973 case GL_MAX_TEXTURE_IMAGE_UNITS:
5974 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
5975 case GL_MAX_RENDERBUFFER_SIZE:
5976 case GL_NUM_SHADER_BINARY_FORMATS:
5977 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
5978 case GL_ARRAY_BUFFER_BINDING:
5979 case GL_FRAMEBUFFER_BINDING:
5980 case GL_RENDERBUFFER_BINDING:
5981 case GL_CURRENT_PROGRAM:
5982 case GL_PACK_ALIGNMENT:
5983 case GL_UNPACK_ALIGNMENT:
5984 case GL_GENERATE_MIPMAP_HINT:
5985 case GL_RED_BITS:
5986 case GL_GREEN_BITS:
5987 case GL_BLUE_BITS:
5988 case GL_ALPHA_BITS:
5989 case GL_DEPTH_BITS:
5990 case GL_STENCIL_BITS:
5991 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
5992 case GL_CULL_FACE_MODE:
5993 case GL_FRONT_FACE:
5994 case GL_ACTIVE_TEXTURE:
5995 case GL_STENCIL_FUNC:
5996 case GL_STENCIL_VALUE_MASK:
5997 case GL_STENCIL_REF:
5998 case GL_STENCIL_FAIL:
5999 case GL_STENCIL_PASS_DEPTH_FAIL:
6000 case GL_STENCIL_PASS_DEPTH_PASS:
6001 case GL_STENCIL_BACK_FUNC:
6002 case GL_STENCIL_BACK_VALUE_MASK:
6003 case GL_STENCIL_BACK_REF:
6004 case GL_STENCIL_BACK_FAIL:
6005 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
6006 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
6007 case GL_DEPTH_FUNC:
6008 case GL_BLEND_SRC_RGB:
6009 case GL_BLEND_SRC_ALPHA:
6010 case GL_BLEND_DST_RGB:
6011 case GL_BLEND_DST_ALPHA:
6012 case GL_BLEND_EQUATION_RGB:
6013 case GL_BLEND_EQUATION_ALPHA:
6014 case GL_STENCIL_WRITEMASK:
6015 case GL_STENCIL_BACK_WRITEMASK:
6016 case GL_STENCIL_CLEAR_VALUE:
6017 case GL_SUBPIXEL_BITS:
6018 case GL_MAX_TEXTURE_SIZE:
6019 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
6020 case GL_SAMPLE_BUFFERS:
6021 case GL_SAMPLES:
6022 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
6023 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
6024 case GL_TEXTURE_BINDING_2D:
6025 case GL_TEXTURE_BINDING_CUBE_MAP:
6026 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
6027 {
6028 *type = GL_INT;
6029 *numParams = 1;
6030 return true;
6031 }
6032 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
6033 {
6034 if (!getExtensions().packReverseRowOrder)
6035 {
6036 return false;
6037 }
6038 *type = GL_INT;
6039 *numParams = 1;
6040 return true;
6041 }
6042 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
6043 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
6044 {
6045 if (!getExtensions().textureRectangle)
6046 {
6047 return false;
6048 }
6049 *type = GL_INT;
6050 *numParams = 1;
6051 return true;
6052 }
6053 case GL_MAX_DRAW_BUFFERS_EXT:
6054 case GL_MAX_COLOR_ATTACHMENTS_EXT:
6055 {
6056 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
6057 {
6058 return false;
6059 }
6060 *type = GL_INT;
6061 *numParams = 1;
6062 return true;
6063 }
6064 case GL_MAX_VIEWPORT_DIMS:
6065 {
6066 *type = GL_INT;
6067 *numParams = 2;
6068 return true;
6069 }
6070 case GL_VIEWPORT:
6071 case GL_SCISSOR_BOX:
6072 {
6073 *type = GL_INT;
6074 *numParams = 4;
6075 return true;
6076 }
6077 case GL_SHADER_COMPILER:
6078 case GL_SAMPLE_COVERAGE_INVERT:
6079 case GL_DEPTH_WRITEMASK:
6080 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
6081 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
6082 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
6083 // bool-natural
6084 case GL_SAMPLE_COVERAGE:
6085 case GL_SCISSOR_TEST:
6086 case GL_STENCIL_TEST:
6087 case GL_DEPTH_TEST:
6088 case GL_BLEND:
6089 case GL_DITHER:
6090 case GL_CONTEXT_ROBUST_ACCESS_EXT:
6091 {
6092 *type = GL_BOOL;
6093 *numParams = 1;
6094 return true;
6095 }
6096 case GL_COLOR_WRITEMASK:
6097 {
6098 *type = GL_BOOL;
6099 *numParams = 4;
6100 return true;
6101 }
6102 case GL_POLYGON_OFFSET_FACTOR:
6103 case GL_POLYGON_OFFSET_UNITS:
6104 case GL_SAMPLE_COVERAGE_VALUE:
6105 case GL_DEPTH_CLEAR_VALUE:
6106 case GL_LINE_WIDTH:
6107 {
6108 *type = GL_FLOAT;
6109 *numParams = 1;
6110 return true;
6111 }
6112 case GL_ALIASED_LINE_WIDTH_RANGE:
6113 case GL_ALIASED_POINT_SIZE_RANGE:
6114 case GL_DEPTH_RANGE:
6115 {
6116 *type = GL_FLOAT;
6117 *numParams = 2;
6118 return true;
6119 }
6120 case GL_COLOR_CLEAR_VALUE:
6121 case GL_BLEND_COLOR:
6122 {
6123 *type = GL_FLOAT;
6124 *numParams = 4;
6125 return true;
6126 }
6127 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
6128 if (!getExtensions().textureFilterAnisotropic)
6129 {
6130 return false;
6131 }
6132 *type = GL_FLOAT;
6133 *numParams = 1;
6134 return true;
6135 case GL_TIMESTAMP_EXT:
6136 if (!getExtensions().disjointTimerQuery)
6137 {
6138 return false;
6139 }
6140 *type = GL_INT_64_ANGLEX;
6141 *numParams = 1;
6142 return true;
6143 case GL_GPU_DISJOINT_EXT:
6144 if (!getExtensions().disjointTimerQuery)
6145 {
6146 return false;
6147 }
6148 *type = GL_INT;
6149 *numParams = 1;
6150 return true;
6151 case GL_COVERAGE_MODULATION_CHROMIUM:
6152 if (!getExtensions().framebufferMixedSamples)
6153 {
6154 return false;
6155 }
6156 *type = GL_INT;
6157 *numParams = 1;
6158 return true;
6159 case GL_TEXTURE_BINDING_EXTERNAL_OES:
6160 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
6161 {
6162 return false;
6163 }
6164 *type = GL_INT;
6165 *numParams = 1;
6166 return true;
6167 }
6168
6169 if (getExtensions().debug)
6170 {
6171 switch (pname)
6172 {
6173 case GL_DEBUG_LOGGED_MESSAGES:
6174 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
6175 case GL_DEBUG_GROUP_STACK_DEPTH:
6176 case GL_MAX_DEBUG_MESSAGE_LENGTH:
6177 case GL_MAX_DEBUG_LOGGED_MESSAGES:
6178 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
6179 case GL_MAX_LABEL_LENGTH:
6180 *type = GL_INT;
6181 *numParams = 1;
6182 return true;
6183
6184 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
6185 case GL_DEBUG_OUTPUT:
6186 *type = GL_BOOL;
6187 *numParams = 1;
6188 return true;
6189 }
6190 }
6191
6192 if (getExtensions().multisampleCompatibility)
6193 {
6194 switch (pname)
6195 {
6196 case GL_MULTISAMPLE_EXT:
6197 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
6198 *type = GL_BOOL;
6199 *numParams = 1;
6200 return true;
6201 }
6202 }
6203
6204 if (getExtensions().pathRendering)
6205 {
6206 switch (pname)
6207 {
6208 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
6209 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
6210 *type = GL_FLOAT;
6211 *numParams = 16;
6212 return true;
6213 }
6214 }
6215
6216 if (getExtensions().bindGeneratesResource)
6217 {
6218 switch (pname)
6219 {
6220 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
6221 *type = GL_BOOL;
6222 *numParams = 1;
6223 return true;
6224 }
6225 }
6226
6227 if (getExtensions().clientArrays)
6228 {
6229 switch (pname)
6230 {
6231 case GL_CLIENT_ARRAYS_ANGLE:
6232 *type = GL_BOOL;
6233 *numParams = 1;
6234 return true;
6235 }
6236 }
6237
6238 if (getExtensions().sRGBWriteControl)
6239 {
6240 switch (pname)
6241 {
6242 case GL_FRAMEBUFFER_SRGB_EXT:
6243 *type = GL_BOOL;
6244 *numParams = 1;
6245 return true;
6246 }
6247 }
6248
6249 if (getExtensions().robustResourceInitialization &&
6250 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
6251 {
6252 *type = GL_BOOL;
6253 *numParams = 1;
6254 return true;
6255 }
6256
6257 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
6258 {
6259 *type = GL_BOOL;
6260 *numParams = 1;
6261 return true;
6262 }
6263
6264 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
6265 switch (pname)
6266 {
6267 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
6268 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
6269 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
6270 {
6271 return false;
6272 }
6273 *type = GL_INT;
6274 *numParams = 1;
6275 return true;
6276
6277 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
6278 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
6279 {
6280 return false;
6281 }
6282 *type = GL_INT;
6283 *numParams = 1;
6284 return true;
6285
6286 case GL_PROGRAM_BINARY_FORMATS_OES:
6287 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
6288 {
6289 return false;
6290 }
6291 *type = GL_INT;
6292 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
6293 return true;
6294
6295 case GL_PACK_ROW_LENGTH:
6296 case GL_PACK_SKIP_ROWS:
6297 case GL_PACK_SKIP_PIXELS:
6298 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
6299 {
6300 return false;
6301 }
6302 *type = GL_INT;
6303 *numParams = 1;
6304 return true;
6305 case GL_UNPACK_ROW_LENGTH:
6306 case GL_UNPACK_SKIP_ROWS:
6307 case GL_UNPACK_SKIP_PIXELS:
6308 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
6309 {
6310 return false;
6311 }
6312 *type = GL_INT;
6313 *numParams = 1;
6314 return true;
6315 case GL_VERTEX_ARRAY_BINDING:
6316 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
6317 {
6318 return false;
6319 }
6320 *type = GL_INT;
6321 *numParams = 1;
6322 return true;
6323 case GL_PIXEL_PACK_BUFFER_BINDING:
6324 case GL_PIXEL_UNPACK_BUFFER_BINDING:
6325 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
6326 {
6327 return false;
6328 }
6329 *type = GL_INT;
6330 *numParams = 1;
6331 return true;
6332 case GL_MAX_SAMPLES:
6333 {
6334 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
6335 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
6336 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
6337 {
6338 return false;
6339 }
6340 *type = GL_INT;
6341 *numParams = 1;
6342 return true;
6343
6344 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
6345 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
6346 {
6347 return false;
6348 }
6349 *type = GL_INT;
6350 *numParams = 1;
6351 return true;
6352 }
6353 }
6354
6355 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
6356 {
6357 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
6358 {
6359 return false;
6360 }
6361 *type = GL_INT;
6362 *numParams = 1;
6363 return true;
6364 }
6365
6366 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
6367 {
6368 *type = GL_INT;
6369 *numParams = 1;
6370 return true;
6371 }
6372
Lingfeng Yang13b708f2018-03-21 12:14:10 -07006373 if (getClientVersion() < Version(2, 0))
6374 {
6375 switch (pname)
6376 {
6377 case GL_ALPHA_TEST_FUNC:
6378 *type = GL_INT;
6379 *numParams = 1;
6380 return true;
6381 case GL_ALPHA_TEST_REF:
6382 *type = GL_FLOAT;
6383 *numParams = 1;
6384 return true;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07006385 case GL_MAX_TEXTURE_UNITS:
6386 *type = GL_INT;
6387 *numParams = 1;
6388 return true;
6389 case GL_CLIENT_ACTIVE_TEXTURE:
6390 *type = GL_INT;
6391 *numParams = 1;
6392 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07006393 case GL_CURRENT_COLOR:
6394 *type = GL_FLOAT;
6395 *numParams = 4;
6396 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07006397 case GL_CURRENT_NORMAL:
6398 *type = GL_FLOAT;
6399 *numParams = 3;
6400 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07006401 }
6402 }
6403
Jamie Madill5b772312018-03-08 20:28:32 -05006404 if (getClientVersion() < Version(3, 0))
6405 {
6406 return false;
6407 }
6408
6409 // Check for ES3.0+ parameter names
6410 switch (pname)
6411 {
6412 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
6413 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
6414 case GL_UNIFORM_BUFFER_BINDING:
6415 case GL_TRANSFORM_FEEDBACK_BINDING:
6416 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
6417 case GL_COPY_READ_BUFFER_BINDING:
6418 case GL_COPY_WRITE_BUFFER_BINDING:
6419 case GL_SAMPLER_BINDING:
6420 case GL_READ_BUFFER:
6421 case GL_TEXTURE_BINDING_3D:
6422 case GL_TEXTURE_BINDING_2D_ARRAY:
6423 case GL_MAX_3D_TEXTURE_SIZE:
6424 case GL_MAX_ARRAY_TEXTURE_LAYERS:
6425 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
6426 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
6427 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
6428 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
6429 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
6430 case GL_MAX_VARYING_COMPONENTS:
6431 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
6432 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
6433 case GL_MIN_PROGRAM_TEXEL_OFFSET:
6434 case GL_MAX_PROGRAM_TEXEL_OFFSET:
6435 case GL_NUM_EXTENSIONS:
6436 case GL_MAJOR_VERSION:
6437 case GL_MINOR_VERSION:
6438 case GL_MAX_ELEMENTS_INDICES:
6439 case GL_MAX_ELEMENTS_VERTICES:
6440 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
6441 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
6442 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
6443 case GL_UNPACK_IMAGE_HEIGHT:
6444 case GL_UNPACK_SKIP_IMAGES:
6445 {
6446 *type = GL_INT;
6447 *numParams = 1;
6448 return true;
6449 }
6450
6451 case GL_MAX_ELEMENT_INDEX:
6452 case GL_MAX_UNIFORM_BLOCK_SIZE:
6453 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
6454 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
6455 case GL_MAX_SERVER_WAIT_TIMEOUT:
6456 {
6457 *type = GL_INT_64_ANGLEX;
6458 *numParams = 1;
6459 return true;
6460 }
6461
6462 case GL_TRANSFORM_FEEDBACK_ACTIVE:
6463 case GL_TRANSFORM_FEEDBACK_PAUSED:
6464 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
6465 case GL_RASTERIZER_DISCARD:
6466 {
6467 *type = GL_BOOL;
6468 *numParams = 1;
6469 return true;
6470 }
6471
6472 case GL_MAX_TEXTURE_LOD_BIAS:
6473 {
6474 *type = GL_FLOAT;
6475 *numParams = 1;
6476 return true;
6477 }
6478 }
6479
6480 if (getExtensions().requestExtension)
6481 {
6482 switch (pname)
6483 {
6484 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
6485 *type = GL_INT;
6486 *numParams = 1;
6487 return true;
6488 }
6489 }
6490
6491 if (getClientVersion() < Version(3, 1))
6492 {
6493 return false;
6494 }
6495
6496 switch (pname)
6497 {
6498 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
6499 case GL_DRAW_INDIRECT_BUFFER_BINDING:
6500 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
6501 case GL_MAX_FRAMEBUFFER_WIDTH:
6502 case GL_MAX_FRAMEBUFFER_HEIGHT:
6503 case GL_MAX_FRAMEBUFFER_SAMPLES:
6504 case GL_MAX_SAMPLE_MASK_WORDS:
6505 case GL_MAX_COLOR_TEXTURE_SAMPLES:
6506 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
6507 case GL_MAX_INTEGER_SAMPLES:
6508 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
6509 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
6510 case GL_MAX_VERTEX_ATTRIB_STRIDE:
6511 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
6512 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
6513 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
6514 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
6515 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
6516 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
6517 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
6518 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
6519 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
6520 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
6521 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
6522 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
6523 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
6524 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
6525 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
6526 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
6527 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
6528 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
6529 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
6530 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
6531 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
6532 case GL_MAX_UNIFORM_LOCATIONS:
6533 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
6534 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
6535 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
6536 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
6537 case GL_MAX_IMAGE_UNITS:
6538 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
6539 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
6540 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
6541 case GL_SHADER_STORAGE_BUFFER_BINDING:
6542 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
6543 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
6544 *type = GL_INT;
6545 *numParams = 1;
6546 return true;
6547 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
6548 *type = GL_INT_64_ANGLEX;
6549 *numParams = 1;
6550 return true;
6551 case GL_SAMPLE_MASK:
6552 *type = GL_BOOL;
6553 *numParams = 1;
6554 return true;
6555 }
6556
6557 if (getExtensions().geometryShader)
6558 {
6559 switch (pname)
6560 {
6561 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
6562 case GL_LAYER_PROVOKING_VERTEX_EXT:
6563 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
6564 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
6565 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
6566 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
6567 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
6568 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
6569 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
6570 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
6571 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
6572 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
6573 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
6574 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
6575 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
6576 *type = GL_INT;
6577 *numParams = 1;
6578 return true;
6579 }
6580 }
6581
6582 return false;
6583}
6584
6585bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
6586{
6587 if (getClientVersion() < Version(3, 0))
6588 {
6589 return false;
6590 }
6591
6592 switch (target)
6593 {
6594 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
6595 case GL_UNIFORM_BUFFER_BINDING:
6596 {
6597 *type = GL_INT;
6598 *numParams = 1;
6599 return true;
6600 }
6601 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
6602 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
6603 case GL_UNIFORM_BUFFER_START:
6604 case GL_UNIFORM_BUFFER_SIZE:
6605 {
6606 *type = GL_INT_64_ANGLEX;
6607 *numParams = 1;
6608 return true;
6609 }
6610 }
6611
6612 if (getClientVersion() < Version(3, 1))
6613 {
6614 return false;
6615 }
6616
6617 switch (target)
6618 {
6619 case GL_IMAGE_BINDING_LAYERED:
6620 {
6621 *type = GL_BOOL;
6622 *numParams = 1;
6623 return true;
6624 }
6625 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
6626 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
6627 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
6628 case GL_SHADER_STORAGE_BUFFER_BINDING:
6629 case GL_VERTEX_BINDING_BUFFER:
6630 case GL_VERTEX_BINDING_DIVISOR:
6631 case GL_VERTEX_BINDING_OFFSET:
6632 case GL_VERTEX_BINDING_STRIDE:
6633 case GL_SAMPLE_MASK_VALUE:
6634 case GL_IMAGE_BINDING_NAME:
6635 case GL_IMAGE_BINDING_LEVEL:
6636 case GL_IMAGE_BINDING_LAYER:
6637 case GL_IMAGE_BINDING_ACCESS:
6638 case GL_IMAGE_BINDING_FORMAT:
6639 {
6640 *type = GL_INT;
6641 *numParams = 1;
6642 return true;
6643 }
6644 case GL_ATOMIC_COUNTER_BUFFER_START:
6645 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
6646 case GL_SHADER_STORAGE_BUFFER_START:
6647 case GL_SHADER_STORAGE_BUFFER_SIZE:
6648 {
6649 *type = GL_INT_64_ANGLEX;
6650 *numParams = 1;
6651 return true;
6652 }
6653 }
6654
6655 return false;
6656}
6657
6658Program *Context::getProgram(GLuint handle) const
6659{
6660 return mState.mShaderPrograms->getProgram(handle);
6661}
6662
6663Shader *Context::getShader(GLuint handle) const
6664{
6665 return mState.mShaderPrograms->getShader(handle);
6666}
6667
6668bool Context::isTextureGenerated(GLuint texture) const
6669{
6670 return mState.mTextures->isHandleGenerated(texture);
6671}
6672
6673bool Context::isBufferGenerated(GLuint buffer) const
6674{
6675 return mState.mBuffers->isHandleGenerated(buffer);
6676}
6677
6678bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
6679{
6680 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
6681}
6682
6683bool Context::isFramebufferGenerated(GLuint framebuffer) const
6684{
6685 return mState.mFramebuffers->isHandleGenerated(framebuffer);
6686}
6687
6688bool Context::isProgramPipelineGenerated(GLuint pipeline) const
6689{
6690 return mState.mPipelines->isHandleGenerated(pipeline);
6691}
6692
6693bool Context::usingDisplayTextureShareGroup() const
6694{
6695 return mDisplayTextureShareGroup;
6696}
6697
6698GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
6699{
6700 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
6701 internalformat == GL_DEPTH_STENCIL
6702 ? GL_DEPTH24_STENCIL8
6703 : internalformat;
6704}
6705
Jamie Madillc29968b2016-01-20 11:17:23 -05006706} // namespace gl