blob: caebc206cc88f755141983381877dc7d42efd916 [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
Geoff Langf6db0982015-08-25 13:04:00 -0400132void MarkTransformFeedbackBufferUsage(gl::TransformFeedback *transformFeedback)
133{
Geoff Lang1a683462015-09-29 15:09:59 -0400134 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400135 {
136 for (size_t tfBufferIndex = 0; tfBufferIndex < transformFeedback->getIndexedBufferCount();
137 tfBufferIndex++)
138 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400139 const gl::OffsetBindingPointer<gl::Buffer> &buffer =
Geoff Langf6db0982015-08-25 13:04:00 -0400140 transformFeedback->getIndexedBuffer(tfBufferIndex);
141 if (buffer.get() != nullptr)
142 {
143 buffer->onTransformFeedback();
144 }
145 }
146 }
147}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500148
149// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300150EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500151{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400152 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500153}
154
Martin Radev1be913c2016-07-11 17:59:16 +0300155EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
156{
157 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
158}
159
Geoff Langeb66a6e2016-10-31 13:06:12 -0400160gl::Version GetClientVersion(const egl::AttributeMap &attribs)
161{
162 return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
163}
164
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500165GLenum GetResetStrategy(const egl::AttributeMap &attribs)
166{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400167 EGLAttrib attrib = attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT,
Jeff Gilbertc5de4d22017-10-31 15:07:53 -0700168 EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500169 switch (attrib)
170 {
171 case EGL_NO_RESET_NOTIFICATION:
172 return GL_NO_RESET_NOTIFICATION_EXT;
173 case EGL_LOSE_CONTEXT_ON_RESET:
174 return GL_LOSE_CONTEXT_ON_RESET_EXT;
175 default:
176 UNREACHABLE();
177 return GL_NONE;
178 }
179}
180
181bool GetRobustAccess(const egl::AttributeMap &attribs)
182{
Geoff Lang077f20a2016-11-01 10:08:02 -0400183 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
184 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
185 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500186}
187
188bool GetDebug(const egl::AttributeMap &attribs)
189{
Geoff Lang077f20a2016-11-01 10:08:02 -0400190 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
191 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500192}
193
194bool GetNoError(const egl::AttributeMap &attribs)
195{
196 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
197}
198
Geoff Langc287ea62016-09-16 14:46:51 -0400199bool GetWebGLContext(const egl::AttributeMap &attribs)
200{
201 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == 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)
Martin Radev1be913c2016-07-11 17:59:16 +0300267
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500268 : ValidationContext(shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500269 shareTextures,
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500270 GetClientVersion(attribs),
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700271 &mGLState,
Jamie Madillf25855c2015-11-03 11:06:18 -0500272 mCaps,
273 mTextureCaps,
274 mExtensions,
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500275 mLimitations,
276 GetNoError(attribs)),
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700277 mImplementation(implFactory->createContext(mState)),
Jamie Madill2f348d22017-06-05 10:50:59 -0400278 mCompiler(),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400279 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500280 mClientType(EGL_OPENGL_ES_API),
281 mHasBeenCurrent(false),
282 mContextLost(false),
283 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700284 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500285 mResetStrategy(GetResetStrategy(attribs)),
286 mRobustAccess(GetRobustAccess(attribs)),
Jamie Madill61e16b42017-06-19 11:13:23 -0400287 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
288 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500289 mSurfacelessFramebuffer(nullptr),
Jamie Madille14951e2017-03-09 18:55:16 -0500290 mWebGLContext(GetWebGLContext(attribs)),
Jamie Madill32447362017-06-28 14:53:52 -0400291 mMemoryProgramCache(memoryProgramCache),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400292 mScratchBuffer(1000u),
293 mZeroFilledBuffer(1000u)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000294{
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400295 mImplementation->setMemoryProgramCache(memoryProgramCache);
296
Geoff Langb433e872017-10-05 14:01:47 -0400297 bool robustResourceInit = GetRobustResourceInit(attribs);
298 initCaps(displayExtensions, robustResourceInit);
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700299 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400300
Jamie Madill4928b7c2017-06-20 12:57:39 -0400301 mGLState.initialize(this, GetDebug(attribs), GetBindGeneratesResource(attribs),
Jamie Madillc43be722017-07-13 16:22:14 -0400302 GetClientArraysEnabled(attribs), robustResourceInit,
303 mMemoryProgramCache != nullptr);
Régis Fénéon83107972015-02-05 12:57:44 +0100304
Shannon Woods53a94a82014-06-24 15:20:36 -0400305 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400306
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000307 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400308 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000309 // and cube map texture state vectors respectively associated with them.
310 // In order that access to these initial textures not be lost, they are treated as texture
311 // objects all of whose names are 0.
312
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400313 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, GL_TEXTURE_2D);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400314 mZeroTextures[GL_TEXTURE_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500315
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400316 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, GL_TEXTURE_CUBE_MAP);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400317 mZeroTextures[GL_TEXTURE_CUBE_MAP].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400318
Geoff Langeb66a6e2016-10-31 13:06:12 -0400319 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400320 {
321 // TODO: These could also be enabled via extension
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400322 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, GL_TEXTURE_3D);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400323 mZeroTextures[GL_TEXTURE_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400324
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400325 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, GL_TEXTURE_2D_ARRAY);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400326 mZeroTextures[GL_TEXTURE_2D_ARRAY].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400327 }
Geoff Lang3b573612016-10-31 14:08:10 -0400328 if (getClientVersion() >= Version(3, 1))
329 {
330 Texture *zeroTexture2DMultisample =
331 new Texture(mImplementation.get(), 0, GL_TEXTURE_2D_MULTISAMPLE);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400332 mZeroTextures[GL_TEXTURE_2D_MULTISAMPLE].set(this, zeroTexture2DMultisample);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800333
Jiajia Qin6eafb042016-12-27 17:04:07 +0800334 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
335 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400336 bindBufferRange(BufferBinding::AtomicCounter, 0, i, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800337 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800338
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800339 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
340 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400341 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800342 }
Geoff Lang3b573612016-10-31 14:08:10 -0400343 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000344
Geoff Lang4751aab2017-10-30 15:14:52 -0400345 const Extensions &nativeExtensions = mImplementation->getNativeExtensions();
346 if (nativeExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400347 {
348 Texture *zeroTextureRectangle =
349 new Texture(mImplementation.get(), 0, GL_TEXTURE_RECTANGLE_ANGLE);
350 mZeroTextures[GL_TEXTURE_RECTANGLE_ANGLE].set(this, zeroTextureRectangle);
351 }
352
Geoff Lang4751aab2017-10-30 15:14:52 -0400353 if (nativeExtensions.eglImageExternal || nativeExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400354 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400355 Texture *zeroTextureExternal =
356 new Texture(mImplementation.get(), 0, GL_TEXTURE_EXTERNAL_OES);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400357 mZeroTextures[GL_TEXTURE_EXTERNAL_OES].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400358 }
359
Jamie Madill4928b7c2017-06-20 12:57:39 -0400360 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500361
Jamie Madill57a89722013-07-02 11:57:03 -0400362 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000363
Geoff Langeb66a6e2016-10-31 13:06:12 -0400364 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400365 {
366 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
367 // In the initial state, a default transform feedback object is bound and treated as
368 // a transform feedback object with a name of zero. That object is bound any time
369 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400370 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400371 }
Geoff Langc8058452014-02-03 12:04:11 -0500372
Corentin Wallez336129f2017-10-17 15:55:40 -0400373 for (auto type : angle::AllEnums<BufferBinding>())
374 {
375 bindBuffer(type, 0);
376 }
377
378 bindRenderbuffer(GL_RENDERBUFFER, 0);
379
380 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
381 {
382 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
383 }
384
Jamie Madillad9f24e2016-02-12 09:27:24 -0500385 // Initialize dirty bit masks
Jamie Madillc67323a2017-11-02 23:11:41 -0400386 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500387 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500388 // No dirty objects.
389
390 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400391 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500392 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500393 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
394
395 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
396 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
397 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
398 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
399 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
400 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
401 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
402 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
403 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
404 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
405 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
406 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
407
408 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
409 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700410 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500411 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
412 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400413
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400414 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000415}
416
Jamie Madill4928b7c2017-06-20 12:57:39 -0400417egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000418{
Corentin Wallez80b24112015-08-25 16:41:57 -0400419 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000420 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400421 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000422 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400423 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000424
Corentin Wallez80b24112015-08-25 16:41:57 -0400425 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000426 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400427 if (query.second != nullptr)
428 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400429 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400430 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000431 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400432 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000433
Corentin Wallez80b24112015-08-25 16:41:57 -0400434 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400435 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400436 if (vertexArray.second)
437 {
438 vertexArray.second->onDestroy(this);
439 }
Jamie Madill57a89722013-07-02 11:57:03 -0400440 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400441 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400442
Corentin Wallez80b24112015-08-25 16:41:57 -0400443 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500444 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500445 if (transformFeedback.second != nullptr)
446 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500447 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500448 }
Geoff Langc8058452014-02-03 12:04:11 -0500449 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400450 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500451
Jamie Madilldedd7b92014-11-05 16:30:36 -0500452 for (auto &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400453 {
Jamie Madill71c88b32017-09-14 22:20:29 -0400454 ANGLE_TRY(zeroTexture.second->onDestroy(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400455 zeroTexture.second.set(this, nullptr);
Geoff Lang76b10c92014-09-05 16:28:14 -0400456 }
457 mZeroTextures.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000458
Corentin Wallezccab69d2017-01-27 16:57:15 -0500459 SafeDelete(mSurfacelessFramebuffer);
460
Jamie Madill4928b7c2017-06-20 12:57:39 -0400461 ANGLE_TRY(releaseSurface(display));
Jamie Madill2f348d22017-06-05 10:50:59 -0400462 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500463
Jamie Madill4928b7c2017-06-20 12:57:39 -0400464 mGLState.reset(this);
465
Jamie Madill6c1f6712017-02-14 19:08:04 -0500466 mState.mBuffers->release(this);
467 mState.mShaderPrograms->release(this);
468 mState.mTextures->release(this);
469 mState.mRenderbuffers->release(this);
470 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400471 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500472 mState.mPaths->release(this);
473 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800474 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400475
Jamie Madill76e471e2017-10-21 09:56:01 -0400476 mImplementation->onDestroy(this);
477
Jamie Madill4928b7c2017-06-20 12:57:39 -0400478 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000479}
480
Jamie Madill70ee0f62017-02-06 16:04:20 -0500481Context::~Context()
482{
483}
484
Jamie Madill4928b7c2017-06-20 12:57:39 -0400485egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000486{
Jamie Madill61e16b42017-06-19 11:13:23 -0400487 mCurrentDisplay = display;
488
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000489 if (!mHasBeenCurrent)
490 {
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000491 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500492 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400493 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000494
Corentin Wallezc295e512017-01-27 17:47:50 -0500495 int width = 0;
496 int height = 0;
497 if (surface != nullptr)
498 {
499 width = surface->getWidth();
500 height = surface->getHeight();
501 }
502
503 mGLState.setViewportParams(0, 0, width, height);
504 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000505
506 mHasBeenCurrent = true;
507 }
508
Jamie Madill1b94d432015-08-07 13:23:23 -0400509 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700510 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400511 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400512
Jamie Madill4928b7c2017-06-20 12:57:39 -0400513 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500514
515 Framebuffer *newDefault = nullptr;
516 if (surface != nullptr)
517 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400518 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500519 mCurrentSurface = surface;
520 newDefault = surface->getDefaultFramebuffer();
521 }
522 else
523 {
524 if (mSurfacelessFramebuffer == nullptr)
525 {
526 mSurfacelessFramebuffer = new Framebuffer(mImplementation.get());
527 }
528
529 newDefault = mSurfacelessFramebuffer;
530 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000531
Corentin Wallez37c39792015-08-20 14:19:46 -0400532 // Update default framebuffer, the binding of the previous default
533 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400534 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700535 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400536 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700537 mGLState.setReadFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400538 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700539 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400540 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700541 mGLState.setDrawFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400542 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500543 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400544 }
Ian Ewell292f0052016-02-04 10:37:32 -0500545
546 // Notify the renderer of a context switch
Jamie Madill4928b7c2017-06-20 12:57:39 -0400547 mImplementation->onMakeCurrent(this);
548 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000549}
550
Jamie Madill4928b7c2017-06-20 12:57:39 -0400551egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400552{
Corentin Wallez37c39792015-08-20 14:19:46 -0400553 // Remove the default framebuffer
Corentin Wallezc295e512017-01-27 17:47:50 -0500554 Framebuffer *currentDefault = nullptr;
555 if (mCurrentSurface != nullptr)
Corentin Wallez51706ea2015-08-07 14:39:22 -0400556 {
Corentin Wallezc295e512017-01-27 17:47:50 -0500557 currentDefault = mCurrentSurface->getDefaultFramebuffer();
558 }
559 else if (mSurfacelessFramebuffer != nullptr)
560 {
561 currentDefault = mSurfacelessFramebuffer;
Corentin Wallez51706ea2015-08-07 14:39:22 -0400562 }
563
Corentin Wallezc295e512017-01-27 17:47:50 -0500564 if (mGLState.getReadFramebuffer() == currentDefault)
565 {
566 mGLState.setReadFramebufferBinding(nullptr);
567 }
568 if (mGLState.getDrawFramebuffer() == currentDefault)
569 {
570 mGLState.setDrawFramebufferBinding(nullptr);
571 }
572 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
573
574 if (mCurrentSurface)
575 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400576 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500577 mCurrentSurface = nullptr;
578 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400579
580 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400581}
582
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000583GLuint Context::createBuffer()
584{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500585 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000586}
587
588GLuint Context::createProgram()
589{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500590 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000591}
592
593GLuint Context::createShader(GLenum type)
594{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500595 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000596}
597
598GLuint Context::createTexture()
599{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500600 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000601}
602
603GLuint Context::createRenderbuffer()
604{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500605 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000606}
607
Sami Väisänene45e53b2016-05-25 10:36:04 +0300608GLuint Context::createPaths(GLsizei range)
609{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500610 auto resultOrError = mState.mPaths->createPaths(mImplementation.get(), range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300611 if (resultOrError.isError())
612 {
613 handleError(resultOrError.getError());
614 return 0;
615 }
616 return resultOrError.getResult();
617}
618
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000619// Returns an unused framebuffer name
620GLuint Context::createFramebuffer()
621{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500622 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000623}
624
Jamie Madill33dc8432013-07-26 11:55:05 -0400625GLuint Context::createFenceNV()
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000626{
Jamie Madill33dc8432013-07-26 11:55:05 -0400627 GLuint handle = mFenceNVHandleAllocator.allocate();
Jamie Madill96a483b2017-06-27 16:49:21 -0400628 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000629 return handle;
630}
631
Yunchao Hea336b902017-08-02 16:05:21 +0800632GLuint Context::createProgramPipeline()
633{
634 return mState.mPipelines->createProgramPipeline();
635}
636
Jiajia Qin5451d532017-11-16 17:16:34 +0800637GLuint Context::createShaderProgramv(GLenum type, GLsizei count, const GLchar *const *strings)
638{
639 UNIMPLEMENTED();
640 return 0u;
641}
642
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000643void Context::deleteBuffer(GLuint buffer)
644{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500645 if (mState.mBuffers->getBuffer(buffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000646 {
647 detachBuffer(buffer);
648 }
Jamie Madill893ab082014-05-16 16:56:10 -0400649
Jamie Madill6c1f6712017-02-14 19:08:04 -0500650 mState.mBuffers->deleteObject(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000651}
652
653void Context::deleteShader(GLuint shader)
654{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500655 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000656}
657
658void Context::deleteProgram(GLuint program)
659{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500660 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000661}
662
663void Context::deleteTexture(GLuint texture)
664{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500665 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000666 {
667 detachTexture(texture);
668 }
669
Jamie Madill6c1f6712017-02-14 19:08:04 -0500670 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000671}
672
673void Context::deleteRenderbuffer(GLuint renderbuffer)
674{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500675 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000676 {
677 detachRenderbuffer(renderbuffer);
678 }
Jamie Madill893ab082014-05-16 16:56:10 -0400679
Jamie Madill6c1f6712017-02-14 19:08:04 -0500680 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000681}
682
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400683void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400684{
685 // The spec specifies the underlying Fence object is not deleted until all current
686 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
687 // and since our API is currently designed for being called from a single thread, we can delete
688 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400689 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400690}
691
Yunchao Hea336b902017-08-02 16:05:21 +0800692void Context::deleteProgramPipeline(GLuint pipeline)
693{
694 if (mState.mPipelines->getProgramPipeline(pipeline))
695 {
696 detachProgramPipeline(pipeline);
697 }
698
699 mState.mPipelines->deleteObject(this, pipeline);
700}
701
Sami Väisänene45e53b2016-05-25 10:36:04 +0300702void Context::deletePaths(GLuint first, GLsizei range)
703{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500704 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300705}
706
707bool Context::hasPathData(GLuint path) const
708{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500709 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300710 if (pathObj == nullptr)
711 return false;
712
713 return pathObj->hasPathData();
714}
715
716bool Context::hasPath(GLuint path) const
717{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500718 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300719}
720
721void Context::setPathCommands(GLuint path,
722 GLsizei numCommands,
723 const GLubyte *commands,
724 GLsizei numCoords,
725 GLenum coordType,
726 const void *coords)
727{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500728 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300729
730 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
731}
732
733void Context::setPathParameterf(GLuint path, GLenum pname, GLfloat value)
734{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500735 auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300736
737 switch (pname)
738 {
739 case GL_PATH_STROKE_WIDTH_CHROMIUM:
740 pathObj->setStrokeWidth(value);
741 break;
742 case GL_PATH_END_CAPS_CHROMIUM:
743 pathObj->setEndCaps(static_cast<GLenum>(value));
744 break;
745 case GL_PATH_JOIN_STYLE_CHROMIUM:
746 pathObj->setJoinStyle(static_cast<GLenum>(value));
747 break;
748 case GL_PATH_MITER_LIMIT_CHROMIUM:
749 pathObj->setMiterLimit(value);
750 break;
751 case GL_PATH_STROKE_BOUND_CHROMIUM:
752 pathObj->setStrokeBound(value);
753 break;
754 default:
755 UNREACHABLE();
756 break;
757 }
758}
759
760void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value) const
761{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500762 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300763
764 switch (pname)
765 {
766 case GL_PATH_STROKE_WIDTH_CHROMIUM:
767 *value = pathObj->getStrokeWidth();
768 break;
769 case GL_PATH_END_CAPS_CHROMIUM:
770 *value = static_cast<GLfloat>(pathObj->getEndCaps());
771 break;
772 case GL_PATH_JOIN_STYLE_CHROMIUM:
773 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
774 break;
775 case GL_PATH_MITER_LIMIT_CHROMIUM:
776 *value = pathObj->getMiterLimit();
777 break;
778 case GL_PATH_STROKE_BOUND_CHROMIUM:
779 *value = pathObj->getStrokeBound();
780 break;
781 default:
782 UNREACHABLE();
783 break;
784 }
785}
786
787void Context::setPathStencilFunc(GLenum func, GLint ref, GLuint mask)
788{
789 mGLState.setPathStencilFunc(func, ref, mask);
790}
791
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000792void Context::deleteFramebuffer(GLuint framebuffer)
793{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500794 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000795 {
796 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000797 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500798
Jamie Madill6c1f6712017-02-14 19:08:04 -0500799 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000800}
801
Jamie Madill33dc8432013-07-26 11:55:05 -0400802void Context::deleteFenceNV(GLuint fence)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000803{
Jamie Madill96a483b2017-06-27 16:49:21 -0400804 FenceNV *fenceObject = nullptr;
805 if (mFenceNVMap.erase(fence, &fenceObject))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000806 {
Jamie Madill96a483b2017-06-27 16:49:21 -0400807 mFenceNVHandleAllocator.release(fence);
808 delete fenceObject;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000809 }
810}
811
Geoff Lang70d0f492015-12-10 17:45:46 -0500812Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000813{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500814 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000815}
816
Jamie Madill570f7c82014-07-03 10:38:54 -0400817Texture *Context::getTexture(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000818{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500819 return mState.mTextures->getTexture(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000820}
821
Geoff Lang70d0f492015-12-10 17:45:46 -0500822Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000823{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500824 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000825}
826
Jamie Madill70b5bb02017-08-28 13:32:37 -0400827Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400828{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400829 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400830}
831
Jamie Madill57a89722013-07-02 11:57:03 -0400832VertexArray *Context::getVertexArray(GLuint handle) const
833{
Jamie Madill96a483b2017-06-27 16:49:21 -0400834 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400835}
836
Jamie Madilldc356042013-07-19 16:36:57 -0400837Sampler *Context::getSampler(GLuint handle) const
838{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500839 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -0400840}
841
Geoff Langc8058452014-02-03 12:04:11 -0500842TransformFeedback *Context::getTransformFeedback(GLuint handle) const
843{
Jamie Madill96a483b2017-06-27 16:49:21 -0400844 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -0500845}
846
Yunchao Hea336b902017-08-02 16:05:21 +0800847ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
848{
849 return mState.mPipelines->getProgramPipeline(handle);
850}
851
Geoff Lang70d0f492015-12-10 17:45:46 -0500852LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
853{
854 switch (identifier)
855 {
856 case GL_BUFFER:
857 return getBuffer(name);
858 case GL_SHADER:
859 return getShader(name);
860 case GL_PROGRAM:
861 return getProgram(name);
862 case GL_VERTEX_ARRAY:
863 return getVertexArray(name);
864 case GL_QUERY:
865 return getQuery(name);
866 case GL_TRANSFORM_FEEDBACK:
867 return getTransformFeedback(name);
868 case GL_SAMPLER:
869 return getSampler(name);
870 case GL_TEXTURE:
871 return getTexture(name);
872 case GL_RENDERBUFFER:
873 return getRenderbuffer(name);
874 case GL_FRAMEBUFFER:
875 return getFramebuffer(name);
876 default:
877 UNREACHABLE();
878 return nullptr;
879 }
880}
881
882LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
883{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400884 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -0500885}
886
Martin Radev9d901792016-07-15 15:58:58 +0300887void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
888{
889 LabeledObject *object = getLabeledObject(identifier, name);
890 ASSERT(object != nullptr);
891
892 std::string labelName = GetObjectLabelFromPointer(length, label);
893 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -0400894
895 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
896 // specified object is active until we do this.
897 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +0300898}
899
900void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
901{
902 LabeledObject *object = getLabeledObjectFromPtr(ptr);
903 ASSERT(object != nullptr);
904
905 std::string labelName = GetObjectLabelFromPointer(length, label);
906 object->setLabel(labelName);
907}
908
909void Context::getObjectLabel(GLenum identifier,
910 GLuint name,
911 GLsizei bufSize,
912 GLsizei *length,
913 GLchar *label) const
914{
915 LabeledObject *object = getLabeledObject(identifier, name);
916 ASSERT(object != nullptr);
917
918 const std::string &objectLabel = object->getLabel();
919 GetObjectLabelBase(objectLabel, bufSize, length, label);
920}
921
922void Context::getObjectPtrLabel(const void *ptr,
923 GLsizei bufSize,
924 GLsizei *length,
925 GLchar *label) const
926{
927 LabeledObject *object = getLabeledObjectFromPtr(ptr);
928 ASSERT(object != nullptr);
929
930 const std::string &objectLabel = object->getLabel();
931 GetObjectLabelBase(objectLabel, bufSize, length, label);
932}
933
Jamie Madilldc356042013-07-19 16:36:57 -0400934bool Context::isSampler(GLuint samplerName) const
935{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500936 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -0400937}
938
Jamie Madilldedd7b92014-11-05 16:30:36 -0500939void Context::bindTexture(GLenum target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000940{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500941 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000942
Jamie Madilldedd7b92014-11-05 16:30:36 -0500943 if (handle == 0)
944 {
945 texture = mZeroTextures[target].get();
946 }
947 else
948 {
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500949 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500950 }
951
952 ASSERT(texture);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400953 mGLState.setSamplerTexture(this, target, texture);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000954}
955
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500956void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000957{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500958 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
959 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700960 mGLState.setReadFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000961}
962
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500963void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000964{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500965 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
966 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700967 mGLState.setDrawFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000968}
969
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500970void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -0400971{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500972 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700973 mGLState.setVertexArrayBinding(vertexArray);
Jamie Madill57a89722013-07-02 11:57:03 -0400974}
975
Shao80957d92017-02-20 21:25:59 +0800976void Context::bindVertexBuffer(GLuint bindingIndex,
977 GLuint bufferHandle,
978 GLintptr offset,
979 GLsizei stride)
980{
981 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400982 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Shao80957d92017-02-20 21:25:59 +0800983}
984
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500985void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -0400986{
Geoff Lang76b10c92014-09-05 16:28:14 -0400987 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -0400988 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500989 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400990 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -0400991}
992
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800993void Context::bindImageTexture(GLuint unit,
994 GLuint texture,
995 GLint level,
996 GLboolean layered,
997 GLint layer,
998 GLenum access,
999 GLenum format)
1000{
1001 Texture *tex = mState.mTextures->getTexture(texture);
1002 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1003}
1004
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001005void Context::useProgram(GLuint program)
1006{
Jamie Madill6c1f6712017-02-14 19:08:04 -05001007 mGLState.setProgram(this, getProgram(program));
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001008}
1009
Jiajia Qin5451d532017-11-16 17:16:34 +08001010void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1011{
1012 UNIMPLEMENTED();
1013}
1014
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001015void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001016{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001017 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001018 TransformFeedback *transformFeedback =
1019 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001020 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -05001021}
1022
Yunchao Hea336b902017-08-02 16:05:21 +08001023void Context::bindProgramPipeline(GLuint pipelineHandle)
1024{
1025 ProgramPipeline *pipeline =
1026 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1027 mGLState.setProgramPipelineBinding(this, pipeline);
1028}
1029
Jamie Madillf0e04492017-08-26 15:28:42 -04001030void Context::beginQuery(GLenum target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001031{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001032 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001033 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001034
Geoff Lang5aad9672014-09-08 11:10:42 -04001035 // begin query
Jamie Madillf0e04492017-08-26 15:28:42 -04001036 ANGLE_CONTEXT_TRY(queryObject->begin());
Geoff Lang5aad9672014-09-08 11:10:42 -04001037
1038 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001039 mGLState.setActiveQuery(this, target, queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001040}
1041
Jamie Madillf0e04492017-08-26 15:28:42 -04001042void Context::endQuery(GLenum target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001043{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001044 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001045 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001046
Jamie Madillf0e04492017-08-26 15:28:42 -04001047 handleError(queryObject->end());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001048
Geoff Lang5aad9672014-09-08 11:10:42 -04001049 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001050 mGLState.setActiveQuery(this, target, nullptr);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001051}
1052
Jamie Madillf0e04492017-08-26 15:28:42 -04001053void Context::queryCounter(GLuint id, GLenum target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001054{
1055 ASSERT(target == GL_TIMESTAMP_EXT);
1056
1057 Query *queryObject = getQuery(id, true, target);
1058 ASSERT(queryObject);
1059
Jamie Madillf0e04492017-08-26 15:28:42 -04001060 handleError(queryObject->queryCounter());
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001061}
1062
1063void Context::getQueryiv(GLenum target, GLenum pname, GLint *params)
1064{
1065 switch (pname)
1066 {
1067 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001068 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001069 break;
1070 case GL_QUERY_COUNTER_BITS_EXT:
1071 switch (target)
1072 {
1073 case GL_TIME_ELAPSED_EXT:
1074 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1075 break;
1076 case GL_TIMESTAMP_EXT:
1077 params[0] = getExtensions().queryCounterBitsTimestamp;
1078 break;
1079 default:
1080 UNREACHABLE();
1081 params[0] = 0;
1082 break;
1083 }
1084 break;
1085 default:
1086 UNREACHABLE();
1087 return;
1088 }
1089}
1090
Geoff Lang2186c382016-10-14 10:54:54 -04001091void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001092{
Geoff Lang2186c382016-10-14 10:54:54 -04001093 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001094}
1095
Geoff Lang2186c382016-10-14 10:54:54 -04001096void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001097{
Geoff Lang2186c382016-10-14 10:54:54 -04001098 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001099}
1100
Geoff Lang2186c382016-10-14 10:54:54 -04001101void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001102{
Geoff Lang2186c382016-10-14 10:54:54 -04001103 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001104}
1105
Geoff Lang2186c382016-10-14 10:54:54 -04001106void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001107{
Geoff Lang2186c382016-10-14 10:54:54 -04001108 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001109}
1110
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001111Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001112{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001113 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001114}
1115
Jamie Madill2f348d22017-06-05 10:50:59 -04001116FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001117{
Jamie Madill96a483b2017-06-27 16:49:21 -04001118 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001119}
1120
Jamie Madill2f348d22017-06-05 10:50:59 -04001121Query *Context::getQuery(GLuint handle, bool create, GLenum type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001122{
Jamie Madill96a483b2017-06-27 16:49:21 -04001123 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001124 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001125 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001126 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001127
1128 Query *query = mQueryMap.query(handle);
1129 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001130 {
Jamie Madill96a483b2017-06-27 16:49:21 -04001131 query = new Query(mImplementation->createQuery(type), handle);
1132 query->addRef();
1133 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001134 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001135 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001136}
1137
Geoff Lang70d0f492015-12-10 17:45:46 -05001138Query *Context::getQuery(GLuint handle) const
1139{
Jamie Madill96a483b2017-06-27 16:49:21 -04001140 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001141}
1142
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001143Texture *Context::getTargetTexture(GLenum target) const
1144{
Ian Ewellbda75592016-04-18 17:25:54 -04001145 ASSERT(ValidTextureTarget(this, target) || ValidTextureExternalTarget(this, target));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001146 return mGLState.getTargetTexture(target);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001147}
1148
Geoff Lang76b10c92014-09-05 16:28:14 -04001149Texture *Context::getSamplerTexture(unsigned int sampler, GLenum type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001150{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001151 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001152}
1153
Geoff Lang492a7e42014-11-05 13:27:06 -05001154Compiler *Context::getCompiler() const
1155{
Jamie Madill2f348d22017-06-05 10:50:59 -04001156 if (mCompiler.get() == nullptr)
1157 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001158 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001159 }
1160 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001161}
1162
Jamie Madillc1d770e2017-04-13 17:31:24 -04001163void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001164{
1165 switch (pname)
1166 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001167 case GL_SHADER_COMPILER:
1168 *params = GL_TRUE;
1169 break;
1170 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1171 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1172 break;
1173 default:
1174 mGLState.getBooleanv(pname, params);
1175 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001176 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001177}
1178
Jamie Madillc1d770e2017-04-13 17:31:24 -04001179void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001180{
Shannon Woods53a94a82014-06-24 15:20:36 -04001181 // Queries about context capabilities and maximums are answered by Context.
1182 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001183 switch (pname)
1184 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001185 case GL_ALIASED_LINE_WIDTH_RANGE:
1186 params[0] = mCaps.minAliasedLineWidth;
1187 params[1] = mCaps.maxAliasedLineWidth;
1188 break;
1189 case GL_ALIASED_POINT_SIZE_RANGE:
1190 params[0] = mCaps.minAliasedPointSize;
1191 params[1] = mCaps.maxAliasedPointSize;
1192 break;
1193 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1194 ASSERT(mExtensions.textureFilterAnisotropic);
1195 *params = mExtensions.maxTextureAnisotropy;
1196 break;
1197 case GL_MAX_TEXTURE_LOD_BIAS:
1198 *params = mCaps.maxLODBias;
1199 break;
1200
1201 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1202 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1203 {
1204 ASSERT(mExtensions.pathRendering);
1205 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1206 memcpy(params, m, 16 * sizeof(GLfloat));
1207 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001208 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001209
Jamie Madill231c7f52017-04-26 13:45:37 -04001210 default:
1211 mGLState.getFloatv(pname, params);
1212 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001213 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001214}
1215
Jamie Madillc1d770e2017-04-13 17:31:24 -04001216void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001217{
Shannon Woods53a94a82014-06-24 15:20:36 -04001218 // Queries about context capabilities and maximums are answered by Context.
1219 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001220
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001221 switch (pname)
1222 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001223 case GL_MAX_VERTEX_ATTRIBS:
1224 *params = mCaps.maxVertexAttributes;
1225 break;
1226 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1227 *params = mCaps.maxVertexUniformVectors;
1228 break;
1229 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
1230 *params = mCaps.maxVertexUniformComponents;
1231 break;
1232 case GL_MAX_VARYING_VECTORS:
1233 *params = mCaps.maxVaryingVectors;
1234 break;
1235 case GL_MAX_VARYING_COMPONENTS:
1236 *params = mCaps.maxVertexOutputComponents;
1237 break;
1238 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1239 *params = mCaps.maxCombinedTextureImageUnits;
1240 break;
1241 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
1242 *params = mCaps.maxVertexTextureImageUnits;
1243 break;
1244 case GL_MAX_TEXTURE_IMAGE_UNITS:
1245 *params = mCaps.maxTextureImageUnits;
1246 break;
1247 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1248 *params = mCaps.maxFragmentUniformVectors;
1249 break;
1250 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
1251 *params = mCaps.maxFragmentUniformComponents;
1252 break;
1253 case GL_MAX_RENDERBUFFER_SIZE:
1254 *params = mCaps.maxRenderbufferSize;
1255 break;
1256 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1257 *params = mCaps.maxColorAttachments;
1258 break;
1259 case GL_MAX_DRAW_BUFFERS_EXT:
1260 *params = mCaps.maxDrawBuffers;
1261 break;
1262 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1263 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1264 case GL_SUBPIXEL_BITS:
1265 *params = 4;
1266 break;
1267 case GL_MAX_TEXTURE_SIZE:
1268 *params = mCaps.max2DTextureSize;
1269 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001270 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1271 *params = mCaps.maxRectangleTextureSize;
1272 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001273 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1274 *params = mCaps.maxCubeMapTextureSize;
1275 break;
1276 case GL_MAX_3D_TEXTURE_SIZE:
1277 *params = mCaps.max3DTextureSize;
1278 break;
1279 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1280 *params = mCaps.maxArrayTextureLayers;
1281 break;
1282 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1283 *params = mCaps.uniformBufferOffsetAlignment;
1284 break;
1285 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1286 *params = mCaps.maxUniformBufferBindings;
1287 break;
1288 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
1289 *params = mCaps.maxVertexUniformBlocks;
1290 break;
1291 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
1292 *params = mCaps.maxFragmentUniformBlocks;
1293 break;
1294 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1295 *params = mCaps.maxCombinedTextureImageUnits;
1296 break;
1297 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1298 *params = mCaps.maxVertexOutputComponents;
1299 break;
1300 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1301 *params = mCaps.maxFragmentInputComponents;
1302 break;
1303 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1304 *params = mCaps.minProgramTexelOffset;
1305 break;
1306 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1307 *params = mCaps.maxProgramTexelOffset;
1308 break;
1309 case GL_MAJOR_VERSION:
1310 *params = getClientVersion().major;
1311 break;
1312 case GL_MINOR_VERSION:
1313 *params = getClientVersion().minor;
1314 break;
1315 case GL_MAX_ELEMENTS_INDICES:
1316 *params = mCaps.maxElementsIndices;
1317 break;
1318 case GL_MAX_ELEMENTS_VERTICES:
1319 *params = mCaps.maxElementsVertices;
1320 break;
1321 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1322 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1323 break;
1324 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1325 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1326 break;
1327 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1328 *params = mCaps.maxTransformFeedbackSeparateComponents;
1329 break;
1330 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1331 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1332 break;
1333 case GL_MAX_SAMPLES_ANGLE:
1334 *params = mCaps.maxSamples;
1335 break;
1336 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001337 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001338 params[0] = mCaps.maxViewportWidth;
1339 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001340 }
1341 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001342 case GL_COMPRESSED_TEXTURE_FORMATS:
1343 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1344 params);
1345 break;
1346 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1347 *params = mResetStrategy;
1348 break;
1349 case GL_NUM_SHADER_BINARY_FORMATS:
1350 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1351 break;
1352 case GL_SHADER_BINARY_FORMATS:
1353 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1354 break;
1355 case GL_NUM_PROGRAM_BINARY_FORMATS:
1356 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1357 break;
1358 case GL_PROGRAM_BINARY_FORMATS:
1359 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1360 break;
1361 case GL_NUM_EXTENSIONS:
1362 *params = static_cast<GLint>(mExtensionStrings.size());
1363 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001364
Jamie Madill231c7f52017-04-26 13:45:37 -04001365 // GL_KHR_debug
1366 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1367 *params = mExtensions.maxDebugMessageLength;
1368 break;
1369 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1370 *params = mExtensions.maxDebugLoggedMessages;
1371 break;
1372 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1373 *params = mExtensions.maxDebugGroupStackDepth;
1374 break;
1375 case GL_MAX_LABEL_LENGTH:
1376 *params = mExtensions.maxLabelLength;
1377 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001378
Martin Radeve5285d22017-07-14 16:23:53 +03001379 // GL_ANGLE_multiview
1380 case GL_MAX_VIEWS_ANGLE:
1381 *params = mExtensions.maxViews;
1382 break;
1383
Jamie Madill231c7f52017-04-26 13:45:37 -04001384 // GL_EXT_disjoint_timer_query
1385 case GL_GPU_DISJOINT_EXT:
1386 *params = mImplementation->getGPUDisjoint();
1387 break;
1388 case GL_MAX_FRAMEBUFFER_WIDTH:
1389 *params = mCaps.maxFramebufferWidth;
1390 break;
1391 case GL_MAX_FRAMEBUFFER_HEIGHT:
1392 *params = mCaps.maxFramebufferHeight;
1393 break;
1394 case GL_MAX_FRAMEBUFFER_SAMPLES:
1395 *params = mCaps.maxFramebufferSamples;
1396 break;
1397 case GL_MAX_SAMPLE_MASK_WORDS:
1398 *params = mCaps.maxSampleMaskWords;
1399 break;
1400 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1401 *params = mCaps.maxColorTextureSamples;
1402 break;
1403 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1404 *params = mCaps.maxDepthTextureSamples;
1405 break;
1406 case GL_MAX_INTEGER_SAMPLES:
1407 *params = mCaps.maxIntegerSamples;
1408 break;
1409 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1410 *params = mCaps.maxVertexAttribRelativeOffset;
1411 break;
1412 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1413 *params = mCaps.maxVertexAttribBindings;
1414 break;
1415 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1416 *params = mCaps.maxVertexAttribStride;
1417 break;
1418 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
1419 *params = mCaps.maxVertexAtomicCounterBuffers;
1420 break;
1421 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
1422 *params = mCaps.maxVertexAtomicCounters;
1423 break;
1424 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
1425 *params = mCaps.maxVertexImageUniforms;
1426 break;
1427 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
1428 *params = mCaps.maxVertexShaderStorageBlocks;
1429 break;
1430 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
1431 *params = mCaps.maxFragmentAtomicCounterBuffers;
1432 break;
1433 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
1434 *params = mCaps.maxFragmentAtomicCounters;
1435 break;
1436 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
1437 *params = mCaps.maxFragmentImageUniforms;
1438 break;
1439 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
1440 *params = mCaps.maxFragmentShaderStorageBlocks;
1441 break;
1442 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1443 *params = mCaps.minProgramTextureGatherOffset;
1444 break;
1445 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1446 *params = mCaps.maxProgramTextureGatherOffset;
1447 break;
1448 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1449 *params = mCaps.maxComputeWorkGroupInvocations;
1450 break;
1451 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
1452 *params = mCaps.maxComputeUniformBlocks;
1453 break;
1454 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
1455 *params = mCaps.maxComputeTextureImageUnits;
1456 break;
1457 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1458 *params = mCaps.maxComputeSharedMemorySize;
1459 break;
1460 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
1461 *params = mCaps.maxComputeUniformComponents;
1462 break;
1463 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
1464 *params = mCaps.maxComputeAtomicCounterBuffers;
1465 break;
1466 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
1467 *params = mCaps.maxComputeAtomicCounters;
1468 break;
1469 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
1470 *params = mCaps.maxComputeImageUniforms;
1471 break;
1472 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
1473 *params = mCaps.maxCombinedComputeUniformComponents;
1474 break;
1475 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
1476 *params = mCaps.maxComputeShaderStorageBlocks;
1477 break;
1478 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1479 *params = mCaps.maxCombinedShaderOutputResources;
1480 break;
1481 case GL_MAX_UNIFORM_LOCATIONS:
1482 *params = mCaps.maxUniformLocations;
1483 break;
1484 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1485 *params = mCaps.maxAtomicCounterBufferBindings;
1486 break;
1487 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1488 *params = mCaps.maxAtomicCounterBufferSize;
1489 break;
1490 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1491 *params = mCaps.maxCombinedAtomicCounterBuffers;
1492 break;
1493 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1494 *params = mCaps.maxCombinedAtomicCounters;
1495 break;
1496 case GL_MAX_IMAGE_UNITS:
1497 *params = mCaps.maxImageUnits;
1498 break;
1499 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1500 *params = mCaps.maxCombinedImageUniforms;
1501 break;
1502 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1503 *params = mCaps.maxShaderStorageBufferBindings;
1504 break;
1505 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1506 *params = mCaps.maxCombinedShaderStorageBlocks;
1507 break;
1508 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1509 *params = mCaps.shaderStorageBufferOffsetAlignment;
1510 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001511
1512 // GL_EXT_geometry_shader
1513 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1514 *params = mCaps.maxFramebufferLayers;
1515 break;
1516 case GL_LAYER_PROVOKING_VERTEX_EXT:
1517 *params = mCaps.layerProvokingVertex;
1518 break;
1519 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
1520 *params = mCaps.maxGeometryUniformComponents;
1521 break;
1522 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
1523 *params = mCaps.maxGeometryUniformBlocks;
1524 break;
1525 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
1526 *params = mCaps.maxCombinedGeometryUniformComponents;
1527 break;
1528 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1529 *params = mCaps.maxGeometryInputComponents;
1530 break;
1531 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1532 *params = mCaps.maxGeometryOutputComponents;
1533 break;
1534 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1535 *params = mCaps.maxGeometryOutputVertices;
1536 break;
1537 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1538 *params = mCaps.maxGeometryTotalOutputComponents;
1539 break;
1540 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1541 *params = mCaps.maxGeometryShaderInvocations;
1542 break;
1543 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
1544 *params = mCaps.maxGeometryTextureImageUnits;
1545 break;
1546 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
1547 *params = mCaps.maxGeometryAtomicCounterBuffers;
1548 break;
1549 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
1550 *params = mCaps.maxGeometryAtomicCounters;
1551 break;
1552 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
1553 *params = mCaps.maxGeometryImageUniforms;
1554 break;
1555 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
1556 *params = mCaps.maxGeometryShaderStorageBlocks;
1557 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001558 default:
1559 mGLState.getIntegerv(this, pname, params);
1560 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001561 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001562}
1563
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001564void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001565{
Shannon Woods53a94a82014-06-24 15:20:36 -04001566 // Queries about context capabilities and maximums are answered by Context.
1567 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001568 switch (pname)
1569 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001570 case GL_MAX_ELEMENT_INDEX:
1571 *params = mCaps.maxElementIndex;
1572 break;
1573 case GL_MAX_UNIFORM_BLOCK_SIZE:
1574 *params = mCaps.maxUniformBlockSize;
1575 break;
1576 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
1577 *params = mCaps.maxCombinedVertexUniformComponents;
1578 break;
1579 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
1580 *params = mCaps.maxCombinedFragmentUniformComponents;
1581 break;
1582 case GL_MAX_SERVER_WAIT_TIMEOUT:
1583 *params = mCaps.maxServerWaitTimeout;
1584 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001585
Jamie Madill231c7f52017-04-26 13:45:37 -04001586 // GL_EXT_disjoint_timer_query
1587 case GL_TIMESTAMP_EXT:
1588 *params = mImplementation->getTimestamp();
1589 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001590
Jamie Madill231c7f52017-04-26 13:45:37 -04001591 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1592 *params = mCaps.maxShaderStorageBlockSize;
1593 break;
1594 default:
1595 UNREACHABLE();
1596 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001597 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001598}
1599
Geoff Lang70d0f492015-12-10 17:45:46 -05001600void Context::getPointerv(GLenum pname, void **params) const
1601{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001602 mGLState.getPointerv(pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001603}
1604
Martin Radev66fb8202016-07-28 11:45:20 +03001605void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001606{
Shannon Woods53a94a82014-06-24 15:20:36 -04001607 // Queries about context capabilities and maximums are answered by Context.
1608 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001609
1610 GLenum nativeType;
1611 unsigned int numParams;
1612 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1613 ASSERT(queryStatus);
1614
1615 if (nativeType == GL_INT)
1616 {
1617 switch (target)
1618 {
1619 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1620 ASSERT(index < 3u);
1621 *data = mCaps.maxComputeWorkGroupCount[index];
1622 break;
1623 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1624 ASSERT(index < 3u);
1625 *data = mCaps.maxComputeWorkGroupSize[index];
1626 break;
1627 default:
1628 mGLState.getIntegeri_v(target, index, data);
1629 }
1630 }
1631 else
1632 {
1633 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1634 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001635}
1636
Martin Radev66fb8202016-07-28 11:45:20 +03001637void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001638{
Shannon Woods53a94a82014-06-24 15:20:36 -04001639 // Queries about context capabilities and maximums are answered by Context.
1640 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001641
1642 GLenum nativeType;
1643 unsigned int numParams;
1644 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1645 ASSERT(queryStatus);
1646
1647 if (nativeType == GL_INT_64_ANGLEX)
1648 {
1649 mGLState.getInteger64i_v(target, index, data);
1650 }
1651 else
1652 {
1653 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1654 }
1655}
1656
1657void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1658{
1659 // Queries about context capabilities and maximums are answered by Context.
1660 // Queries about current GL state values are answered by State.
1661
1662 GLenum nativeType;
1663 unsigned int numParams;
1664 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1665 ASSERT(queryStatus);
1666
1667 if (nativeType == GL_BOOL)
1668 {
1669 mGLState.getBooleani_v(target, index, data);
1670 }
1671 else
1672 {
1673 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1674 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001675}
1676
Corentin Wallez336129f2017-10-17 15:55:40 -04001677void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001678{
1679 Buffer *buffer = mGLState.getTargetBuffer(target);
1680 QueryBufferParameteriv(buffer, pname, params);
1681}
1682
1683void Context::getFramebufferAttachmentParameteriv(GLenum target,
1684 GLenum attachment,
1685 GLenum pname,
1686 GLint *params)
1687{
1688 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
1689 QueryFramebufferAttachmentParameteriv(framebuffer, attachment, pname, params);
1690}
1691
1692void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
1693{
1694 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
1695 QueryRenderbufferiv(this, renderbuffer, pname, params);
1696}
1697
1698void Context::getTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
1699{
1700 Texture *texture = getTargetTexture(target);
1701 QueryTexParameterfv(texture, pname, params);
1702}
1703
1704void Context::getTexParameteriv(GLenum target, GLenum pname, GLint *params)
1705{
1706 Texture *texture = getTargetTexture(target);
1707 QueryTexParameteriv(texture, pname, params);
1708}
Jiajia Qin5451d532017-11-16 17:16:34 +08001709
1710void Context::getTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
1711{
1712 Texture *texture =
1713 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
1714 QueryTexLevelParameteriv(texture, target, level, pname, params);
1715}
1716
1717void Context::getTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
1718{
1719 Texture *texture =
1720 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
1721 QueryTexLevelParameterfv(texture, target, level, pname, params);
1722}
1723
He Yunchao010e4db2017-03-03 14:22:06 +08001724void Context::texParameterf(GLenum target, GLenum pname, GLfloat param)
1725{
1726 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001727 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04001728 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001729}
1730
1731void Context::texParameterfv(GLenum target, GLenum pname, const GLfloat *params)
1732{
1733 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001734 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04001735 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001736}
1737
1738void Context::texParameteri(GLenum target, GLenum pname, GLint param)
1739{
1740 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001741 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04001742 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001743}
1744
1745void Context::texParameteriv(GLenum target, GLenum pname, const GLint *params)
1746{
1747 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001748 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04001749 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001750}
1751
Jamie Madill675fe712016-12-19 13:07:54 -05001752void Context::drawArrays(GLenum mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001753{
Jamie Madill05b35b22017-10-03 09:01:44 -04001754 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001755 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
1756 MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001757}
1758
Jamie Madill675fe712016-12-19 13:07:54 -05001759void Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04001760{
Jamie Madill05b35b22017-10-03 09:01:44 -04001761 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001762 ANGLE_CONTEXT_TRY(
1763 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
1764 MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
Geoff Langf6db0982015-08-25 13:04:00 -04001765}
1766
Jamie Madill876429b2017-04-20 15:46:24 -04001767void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001768{
Jamie Madill05b35b22017-10-03 09:01:44 -04001769 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001770 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04001771}
1772
Jamie Madill675fe712016-12-19 13:07:54 -05001773void Context::drawElementsInstanced(GLenum mode,
1774 GLsizei count,
1775 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04001776 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04001777 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04001778{
Jamie Madill05b35b22017-10-03 09:01:44 -04001779 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001780 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08001781 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04001782}
1783
Jamie Madill675fe712016-12-19 13:07:54 -05001784void Context::drawRangeElements(GLenum mode,
1785 GLuint start,
1786 GLuint end,
1787 GLsizei count,
1788 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04001789 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04001790{
Jamie Madill05b35b22017-10-03 09:01:44 -04001791 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001792 ANGLE_CONTEXT_TRY(
1793 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001794}
1795
Jamie Madill876429b2017-04-20 15:46:24 -04001796void Context::drawArraysIndirect(GLenum mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08001797{
Jamie Madill05b35b22017-10-03 09:01:44 -04001798 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001799 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08001800}
1801
Jamie Madill876429b2017-04-20 15:46:24 -04001802void Context::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08001803{
Jamie Madill05b35b22017-10-03 09:01:44 -04001804 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001805 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08001806}
1807
Jamie Madill675fe712016-12-19 13:07:54 -05001808void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001809{
Jamie Madillafa02a22017-11-23 12:57:38 -05001810 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05001811}
1812
Jamie Madill675fe712016-12-19 13:07:54 -05001813void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05001814{
Jamie Madillafa02a22017-11-23 12:57:38 -05001815 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001816}
1817
Austin Kinross6ee1e782015-05-29 17:05:37 -07001818void Context::insertEventMarker(GLsizei length, const char *marker)
1819{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001820 ASSERT(mImplementation);
1821 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07001822}
1823
1824void Context::pushGroupMarker(GLsizei length, const char *marker)
1825{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001826 ASSERT(mImplementation);
1827 mImplementation->pushGroupMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07001828}
1829
1830void Context::popGroupMarker()
1831{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001832 ASSERT(mImplementation);
1833 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07001834}
1835
Geoff Langd8605522016-04-13 10:19:12 -04001836void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
1837{
1838 Program *programObject = getProgram(program);
1839 ASSERT(programObject);
1840
1841 programObject->bindUniformLocation(location, name);
1842}
1843
Sami Väisänena797e062016-05-12 15:23:40 +03001844void Context::setCoverageModulation(GLenum components)
1845{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001846 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03001847}
1848
Sami Väisänene45e53b2016-05-25 10:36:04 +03001849void Context::loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix)
1850{
1851 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
1852}
1853
1854void Context::loadPathRenderingIdentityMatrix(GLenum matrixMode)
1855{
1856 GLfloat I[16];
1857 angle::Matrix<GLfloat>::setToIdentity(I);
1858
1859 mGLState.loadPathRenderingMatrix(matrixMode, I);
1860}
1861
1862void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
1863{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001864 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001865 if (!pathObj)
1866 return;
1867
1868 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1869 syncRendererState();
1870
1871 mImplementation->stencilFillPath(pathObj, fillMode, mask);
1872}
1873
1874void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
1875{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001876 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001877 if (!pathObj)
1878 return;
1879
1880 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1881 syncRendererState();
1882
1883 mImplementation->stencilStrokePath(pathObj, reference, mask);
1884}
1885
1886void Context::coverFillPath(GLuint path, GLenum coverMode)
1887{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001888 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001889 if (!pathObj)
1890 return;
1891
1892 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1893 syncRendererState();
1894
1895 mImplementation->coverFillPath(pathObj, coverMode);
1896}
1897
1898void Context::coverStrokePath(GLuint path, GLenum coverMode)
1899{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001900 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001901 if (!pathObj)
1902 return;
1903
1904 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1905 syncRendererState();
1906
1907 mImplementation->coverStrokePath(pathObj, coverMode);
1908}
1909
1910void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
1911{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001912 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001913 if (!pathObj)
1914 return;
1915
1916 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1917 syncRendererState();
1918
1919 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
1920}
1921
1922void Context::stencilThenCoverStrokePath(GLuint path,
1923 GLint reference,
1924 GLuint mask,
1925 GLenum coverMode)
1926{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001927 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001928 if (!pathObj)
1929 return;
1930
1931 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1932 syncRendererState();
1933
1934 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
1935}
1936
Sami Väisänend59ca052016-06-21 16:10:00 +03001937void Context::coverFillPathInstanced(GLsizei numPaths,
1938 GLenum pathNameType,
1939 const void *paths,
1940 GLuint pathBase,
1941 GLenum coverMode,
1942 GLenum transformType,
1943 const GLfloat *transformValues)
1944{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001945 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03001946
1947 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1948 syncRendererState();
1949
1950 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
1951}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001952
Sami Väisänend59ca052016-06-21 16:10:00 +03001953void Context::coverStrokePathInstanced(GLsizei numPaths,
1954 GLenum pathNameType,
1955 const void *paths,
1956 GLuint pathBase,
1957 GLenum coverMode,
1958 GLenum transformType,
1959 const GLfloat *transformValues)
1960{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001961 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03001962
1963 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1964 syncRendererState();
1965
1966 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
1967 transformValues);
1968}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001969
Sami Väisänend59ca052016-06-21 16:10:00 +03001970void Context::stencilFillPathInstanced(GLsizei numPaths,
1971 GLenum pathNameType,
1972 const void *paths,
1973 GLuint pathBase,
1974 GLenum fillMode,
1975 GLuint mask,
1976 GLenum transformType,
1977 const GLfloat *transformValues)
1978{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001979 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03001980
1981 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1982 syncRendererState();
1983
1984 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
1985 transformValues);
1986}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001987
Sami Väisänend59ca052016-06-21 16:10:00 +03001988void Context::stencilStrokePathInstanced(GLsizei numPaths,
1989 GLenum pathNameType,
1990 const void *paths,
1991 GLuint pathBase,
1992 GLint reference,
1993 GLuint mask,
1994 GLenum transformType,
1995 const GLfloat *transformValues)
1996{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001997 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03001998
1999 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
2000 syncRendererState();
2001
2002 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2003 transformValues);
2004}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002005
Sami Väisänend59ca052016-06-21 16:10:00 +03002006void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2007 GLenum pathNameType,
2008 const void *paths,
2009 GLuint pathBase,
2010 GLenum fillMode,
2011 GLuint mask,
2012 GLenum coverMode,
2013 GLenum transformType,
2014 const GLfloat *transformValues)
2015{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002016 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002017
2018 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
2019 syncRendererState();
2020
2021 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2022 transformType, transformValues);
2023}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002024
Sami Väisänend59ca052016-06-21 16:10:00 +03002025void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2026 GLenum pathNameType,
2027 const void *paths,
2028 GLuint pathBase,
2029 GLint reference,
2030 GLuint mask,
2031 GLenum coverMode,
2032 GLenum transformType,
2033 const GLfloat *transformValues)
2034{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002035 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002036
2037 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
2038 syncRendererState();
2039
2040 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2041 transformType, transformValues);
2042}
2043
Sami Väisänen46eaa942016-06-29 10:26:37 +03002044void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2045{
2046 auto *programObject = getProgram(program);
2047
2048 programObject->bindFragmentInputLocation(location, name);
2049}
2050
2051void Context::programPathFragmentInputGen(GLuint program,
2052 GLint location,
2053 GLenum genMode,
2054 GLint components,
2055 const GLfloat *coeffs)
2056{
2057 auto *programObject = getProgram(program);
2058
Jamie Madillbd044ed2017-06-05 12:59:21 -04002059 programObject->pathFragmentInputGen(this, location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002060}
2061
jchen1015015f72017-03-16 13:54:21 +08002062GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2063{
jchen10fd7c3b52017-03-21 15:36:03 +08002064 const auto *programObject = getProgram(program);
jchen1015015f72017-03-16 13:54:21 +08002065 return QueryProgramResourceIndex(programObject, programInterface, name);
2066}
2067
jchen10fd7c3b52017-03-21 15:36:03 +08002068void Context::getProgramResourceName(GLuint program,
2069 GLenum programInterface,
2070 GLuint index,
2071 GLsizei bufSize,
2072 GLsizei *length,
2073 GLchar *name)
2074{
2075 const auto *programObject = getProgram(program);
2076 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2077}
2078
jchen10191381f2017-04-11 13:59:04 +08002079GLint Context::getProgramResourceLocation(GLuint program,
2080 GLenum programInterface,
2081 const GLchar *name)
2082{
2083 const auto *programObject = getProgram(program);
2084 return QueryProgramResourceLocation(programObject, programInterface, name);
2085}
2086
jchen10880683b2017-04-12 16:21:55 +08002087void Context::getProgramResourceiv(GLuint program,
2088 GLenum programInterface,
2089 GLuint index,
2090 GLsizei propCount,
2091 const GLenum *props,
2092 GLsizei bufSize,
2093 GLsizei *length,
2094 GLint *params)
2095{
2096 const auto *programObject = getProgram(program);
2097 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2098 length, params);
2099}
2100
jchen10d9cd7b72017-08-30 15:04:25 +08002101void Context::getProgramInterfaceiv(GLuint program,
2102 GLenum programInterface,
2103 GLenum pname,
2104 GLint *params)
2105{
2106 const auto *programObject = getProgram(program);
2107 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2108}
2109
Jamie Madill71c88b32017-09-14 22:20:29 -04002110void Context::handleError(const Error &error)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002111{
Geoff Langda5777c2014-07-11 09:52:58 -04002112 if (error.isError())
2113 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002114 GLenum code = error.getCode();
2115 mErrors.insert(code);
2116 if (code == GL_OUT_OF_MEMORY && getWorkarounds().loseContextOnOutOfMemory)
2117 {
2118 markContextLost();
2119 }
Geoff Lang70d0f492015-12-10 17:45:46 -05002120
Geoff Langee6884e2017-11-09 16:51:11 -05002121 ASSERT(!error.getMessage().empty());
2122 mGLState.getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, error.getID(),
2123 GL_DEBUG_SEVERITY_HIGH, error.getMessage());
Geoff Langda5777c2014-07-11 09:52:58 -04002124 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002125}
2126
2127// Get one of the recorded errors and clear its flag, if any.
2128// [OpenGL ES 2.0.24] section 2.5 page 13.
2129GLenum Context::getError()
2130{
Geoff Langda5777c2014-07-11 09:52:58 -04002131 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002132 {
Geoff Langda5777c2014-07-11 09:52:58 -04002133 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002134 }
Geoff Langda5777c2014-07-11 09:52:58 -04002135 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002136 {
Geoff Langda5777c2014-07-11 09:52:58 -04002137 GLenum error = *mErrors.begin();
2138 mErrors.erase(mErrors.begin());
2139 return error;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002140 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002141}
2142
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002143// NOTE: this function should not assume that this context is current!
2144void Context::markContextLost()
2145{
2146 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002147 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002148 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002149 mContextLostForced = true;
2150 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002151 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002152}
2153
2154bool Context::isContextLost()
2155{
2156 return mContextLost;
2157}
2158
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002159GLenum Context::getResetStatus()
2160{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002161 // Even if the application doesn't want to know about resets, we want to know
2162 // as it will allow us to skip all the calls.
2163 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002164 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002165 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002166 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002167 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002168 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002169
2170 // EXT_robustness, section 2.6: If the reset notification behavior is
2171 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2172 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2173 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002174 }
2175
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002176 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2177 // status should be returned at least once, and GL_NO_ERROR should be returned
2178 // once the device has finished resetting.
2179 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002180 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002181 ASSERT(mResetStatus == GL_NO_ERROR);
2182 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002183
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002184 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002185 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002186 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002187 }
2188 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002189 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002190 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002191 // If markContextLost was used to mark the context lost then
2192 // assume that is not recoverable, and continue to report the
2193 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002194 mResetStatus = mImplementation->getResetStatus();
2195 }
Jamie Madill893ab082014-05-16 16:56:10 -04002196
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002197 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002198}
2199
2200bool Context::isResetNotificationEnabled()
2201{
2202 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2203}
2204
Corentin Walleze3b10e82015-05-20 11:06:25 -04002205const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002206{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002207 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002208}
2209
2210EGLenum Context::getClientType() const
2211{
2212 return mClientType;
2213}
2214
2215EGLenum Context::getRenderBuffer() const
2216{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002217 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2218 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002219 {
2220 return EGL_NONE;
2221 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002222
2223 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(GL_BACK);
2224 ASSERT(backAttachment != nullptr);
2225 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002226}
2227
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002228VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002229{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002230 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002231 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2232 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002233 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002234 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2235 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002236
Jamie Madill96a483b2017-06-27 16:49:21 -04002237 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002238 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002239
2240 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002241}
2242
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002243TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002244{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002245 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002246 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2247 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002248 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002249 transformFeedback =
2250 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002251 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002252 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002253 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002254
2255 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002256}
2257
2258bool Context::isVertexArrayGenerated(GLuint vertexArray)
2259{
Jamie Madill96a483b2017-06-27 16:49:21 -04002260 ASSERT(mVertexArrayMap.contains(0));
2261 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002262}
2263
2264bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2265{
Jamie Madill96a483b2017-06-27 16:49:21 -04002266 ASSERT(mTransformFeedbackMap.contains(0));
2267 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002268}
2269
Shannon Woods53a94a82014-06-24 15:20:36 -04002270void Context::detachTexture(GLuint texture)
2271{
2272 // Simple pass-through to State's detachTexture method, as textures do not require
2273 // allocation map management either here or in the resource manager at detach time.
2274 // Zero textures are held by the Context, and we don't attempt to request them from
2275 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002276 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002277}
2278
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002279void Context::detachBuffer(GLuint buffer)
2280{
Yuly Novikov5807a532015-12-03 13:01:22 -05002281 // Simple pass-through to State's detachBuffer method, since
2282 // only buffer attachments to container objects that are bound to the current context
2283 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002284
Yuly Novikov5807a532015-12-03 13:01:22 -05002285 // [OpenGL ES 3.2] section 5.1.2 page 45:
2286 // Attachments to unbound container objects, such as
2287 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2288 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002289 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002290}
2291
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002292void Context::detachFramebuffer(GLuint framebuffer)
2293{
Shannon Woods53a94a82014-06-24 15:20:36 -04002294 // Framebuffer detachment is handled by Context, because 0 is a valid
2295 // Framebuffer object, and a pointer to it must be passed from Context
2296 // to State at binding time.
2297
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002298 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002299 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2300 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2301 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002302
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002303 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002304 {
2305 bindReadFramebuffer(0);
2306 }
2307
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002308 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002309 {
2310 bindDrawFramebuffer(0);
2311 }
2312}
2313
2314void Context::detachRenderbuffer(GLuint renderbuffer)
2315{
Jamie Madilla02315b2017-02-23 14:14:47 -05002316 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002317}
2318
Jamie Madill57a89722013-07-02 11:57:03 -04002319void Context::detachVertexArray(GLuint vertexArray)
2320{
Jamie Madill77a72f62015-04-14 11:18:32 -04002321 // Vertex array detachment is handled by Context, because 0 is a valid
2322 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002323 // binding time.
2324
Jamie Madill57a89722013-07-02 11:57:03 -04002325 // [OpenGL ES 3.0.2] section 2.10 page 43:
2326 // If a vertex array object that is currently bound is deleted, the binding
2327 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002328 if (mGLState.removeVertexArrayBinding(vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002329 {
2330 bindVertexArray(0);
2331 }
2332}
2333
Geoff Langc8058452014-02-03 12:04:11 -05002334void Context::detachTransformFeedback(GLuint transformFeedback)
2335{
Corentin Walleza2257da2016-04-19 16:43:12 -04002336 // Transform feedback detachment is handled by Context, because 0 is a valid
2337 // transform feedback, and a pointer to it must be passed from Context to State at
2338 // binding time.
2339
2340 // The OpenGL specification doesn't mention what should happen when the currently bound
2341 // transform feedback object is deleted. Since it is a container object, we treat it like
2342 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002343 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002344 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002345 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002346 }
Geoff Langc8058452014-02-03 12:04:11 -05002347}
2348
Jamie Madilldc356042013-07-19 16:36:57 -04002349void Context::detachSampler(GLuint sampler)
2350{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002351 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002352}
2353
Yunchao Hea336b902017-08-02 16:05:21 +08002354void Context::detachProgramPipeline(GLuint pipeline)
2355{
2356 mGLState.detachProgramPipeline(this, pipeline);
2357}
2358
Jamie Madill3ef140a2017-08-26 23:11:21 -04002359void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002360{
Shaodde78e82017-05-22 14:13:27 +08002361 mGLState.setVertexAttribDivisor(this, index, divisor);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002362}
2363
Jamie Madille29d1672013-07-19 16:36:57 -04002364void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2365{
Geoff Langc1984ed2016-10-07 12:41:00 -04002366 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002367 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002368 SetSamplerParameteri(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002369 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002370}
Jamie Madille29d1672013-07-19 16:36:57 -04002371
Geoff Langc1984ed2016-10-07 12:41:00 -04002372void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2373{
2374 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002375 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002376 SetSamplerParameteriv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002377 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002378}
2379
2380void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2381{
Geoff Langc1984ed2016-10-07 12:41:00 -04002382 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002383 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002384 SetSamplerParameterf(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002385 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002386}
2387
Geoff Langc1984ed2016-10-07 12:41:00 -04002388void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002389{
Geoff Langc1984ed2016-10-07 12:41:00 -04002390 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002391 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002392 SetSamplerParameterfv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002393 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002394}
2395
Geoff Langc1984ed2016-10-07 12:41:00 -04002396void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002397{
Geoff Langc1984ed2016-10-07 12:41:00 -04002398 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002399 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002400 QuerySamplerParameteriv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002401 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002402}
Jamie Madill9675b802013-07-19 16:36:59 -04002403
Geoff Langc1984ed2016-10-07 12:41:00 -04002404void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2405{
2406 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002407 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002408 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002409 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002410}
2411
Olli Etuahof0fee072016-03-30 15:11:58 +03002412void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2413{
2414 gl::Program *programObject = getProgram(program);
Yunchao He61afff12017-03-14 15:34:03 +08002415 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002416}
2417
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002418void Context::initRendererString()
2419{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002420 std::ostringstream rendererString;
2421 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002422 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002423 rendererString << ")";
2424
Geoff Langcec35902014-04-16 10:52:36 -04002425 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002426}
2427
Geoff Langc339c4e2016-11-29 10:37:36 -05002428void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002429{
Geoff Langc339c4e2016-11-29 10:37:36 -05002430 const Version &clientVersion = getClientVersion();
2431
2432 std::ostringstream versionString;
2433 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2434 << ANGLE_VERSION_STRING << ")";
2435 mVersionString = MakeStaticString(versionString.str());
2436
2437 std::ostringstream shadingLanguageVersionString;
2438 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2439 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2440 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
2441 << ")";
2442 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002443}
2444
Geoff Langcec35902014-04-16 10:52:36 -04002445void Context::initExtensionStrings()
2446{
Geoff Langc339c4e2016-11-29 10:37:36 -05002447 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
2448 std::ostringstream combinedStringStream;
2449 std::copy(strings.begin(), strings.end(),
2450 std::ostream_iterator<const char *>(combinedStringStream, " "));
2451 return MakeStaticString(combinedStringStream.str());
2452 };
2453
2454 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002455 for (const auto &extensionString : mExtensions.getStrings())
2456 {
2457 mExtensionStrings.push_back(MakeStaticString(extensionString));
2458 }
Geoff Langc339c4e2016-11-29 10:37:36 -05002459 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002460
Bryan Bernhart58806562017-01-05 13:09:31 -08002461 const gl::Extensions &nativeExtensions = mImplementation->getNativeExtensions();
2462
Geoff Langc339c4e2016-11-29 10:37:36 -05002463 mRequestableExtensionStrings.clear();
2464 for (const auto &extensionInfo : GetExtensionInfoMap())
2465 {
2466 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08002467 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
2468 nativeExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05002469 {
2470 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
2471 }
2472 }
2473 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002474}
2475
Geoff Langc339c4e2016-11-29 10:37:36 -05002476const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04002477{
Geoff Langc339c4e2016-11-29 10:37:36 -05002478 switch (name)
2479 {
2480 case GL_VENDOR:
2481 return reinterpret_cast<const GLubyte *>("Google Inc.");
2482
2483 case GL_RENDERER:
2484 return reinterpret_cast<const GLubyte *>(mRendererString);
2485
2486 case GL_VERSION:
2487 return reinterpret_cast<const GLubyte *>(mVersionString);
2488
2489 case GL_SHADING_LANGUAGE_VERSION:
2490 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
2491
2492 case GL_EXTENSIONS:
2493 return reinterpret_cast<const GLubyte *>(mExtensionString);
2494
2495 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
2496 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
2497
2498 default:
2499 UNREACHABLE();
2500 return nullptr;
2501 }
Geoff Langcec35902014-04-16 10:52:36 -04002502}
2503
Geoff Langc339c4e2016-11-29 10:37:36 -05002504const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04002505{
Geoff Langc339c4e2016-11-29 10:37:36 -05002506 switch (name)
2507 {
2508 case GL_EXTENSIONS:
2509 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
2510
2511 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
2512 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
2513
2514 default:
2515 UNREACHABLE();
2516 return nullptr;
2517 }
Geoff Langcec35902014-04-16 10:52:36 -04002518}
2519
2520size_t Context::getExtensionStringCount() const
2521{
2522 return mExtensionStrings.size();
2523}
2524
Geoff Lang111a99e2017-10-17 10:58:41 -04002525bool Context::isExtensionRequestable(const char *name)
2526{
2527 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
2528 auto extension = extensionInfos.find(name);
2529
2530 const Extensions &nativeExtensions = mImplementation->getNativeExtensions();
2531 return extension != extensionInfos.end() && extension->second.Requestable &&
2532 nativeExtensions.*(extension->second.ExtensionsMember);
2533}
2534
Geoff Langc339c4e2016-11-29 10:37:36 -05002535void Context::requestExtension(const char *name)
2536{
2537 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
2538 ASSERT(extensionInfos.find(name) != extensionInfos.end());
2539 const auto &extension = extensionInfos.at(name);
2540 ASSERT(extension.Requestable);
Geoff Lang111a99e2017-10-17 10:58:41 -04002541 ASSERT(mImplementation->getNativeExtensions().*(extension.ExtensionsMember));
Geoff Langc339c4e2016-11-29 10:37:36 -05002542
2543 if (mExtensions.*(extension.ExtensionsMember))
2544 {
2545 // Extension already enabled
2546 return;
2547 }
2548
2549 mExtensions.*(extension.ExtensionsMember) = true;
2550 updateCaps();
2551 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08002552
Jamie Madill2f348d22017-06-05 10:50:59 -04002553 // Release the shader compiler so it will be re-created with the requested extensions enabled.
2554 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04002555
Jamie Madill81c2e252017-09-09 23:32:46 -04002556 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
2557 // sampleable.
2558 mState.mTextures->signalAllTexturesDirty();
Geoff Lang9aded172017-04-05 11:07:56 -04002559 for (auto &zeroTexture : mZeroTextures)
2560 {
Jamie Madill05b35b22017-10-03 09:01:44 -04002561 zeroTexture.second->signalDirty(InitState::Initialized);
Geoff Lang9aded172017-04-05 11:07:56 -04002562 }
2563
2564 mState.mFramebuffers->invalidateFramebufferComplenessCache();
Geoff Langc339c4e2016-11-29 10:37:36 -05002565}
2566
2567size_t Context::getRequestableExtensionStringCount() const
2568{
2569 return mRequestableExtensionStrings.size();
2570}
2571
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002572void Context::beginTransformFeedback(GLenum primitiveMode)
2573{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002574 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002575 ASSERT(transformFeedback != nullptr);
2576 ASSERT(!transformFeedback->isPaused());
2577
Jamie Madill6c1f6712017-02-14 19:08:04 -05002578 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002579}
2580
2581bool Context::hasActiveTransformFeedback(GLuint program) const
2582{
2583 for (auto pair : mTransformFeedbackMap)
2584 {
2585 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
2586 {
2587 return true;
2588 }
2589 }
2590 return false;
2591}
2592
Geoff Langb433e872017-10-05 14:01:47 -04002593void Context::initCaps(const egl::DisplayExtensions &displayExtensions, bool robustResourceInit)
Geoff Lang493daf52014-07-03 13:38:44 -04002594{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002595 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04002596
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002597 mExtensions = mImplementation->getNativeExtensions();
Geoff Lang493daf52014-07-03 13:38:44 -04002598
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002599 mLimitations = mImplementation->getNativeLimitations();
Austin Kinross02df7962015-07-01 10:03:42 -07002600
Geoff Langeb66a6e2016-10-31 13:06:12 -04002601 if (getClientVersion() < Version(3, 0))
Geoff Lang493daf52014-07-03 13:38:44 -04002602 {
2603 // Disable ES3+ extensions
Jamie Madill231c7f52017-04-26 13:45:37 -04002604 mExtensions.colorBufferFloat = false;
Geoff Langb66a9092016-05-16 15:59:14 -04002605 mExtensions.eglImageExternalEssl3 = false;
Vincent Lang25ab4512016-05-13 18:13:59 +02002606 mExtensions.textureNorm16 = false;
Martin Radev137032d2017-07-13 10:11:12 +03002607 mExtensions.multiview = false;
2608 mExtensions.maxViews = 1u;
Geoff Lang493daf52014-07-03 13:38:44 -04002609 }
2610
Jiawei Shao89be29a2017-11-06 14:36:45 +08002611 if (getClientVersion() < ES_3_1)
2612 {
2613 // Disable ES3.1+ extensions
2614 mExtensions.geometryShader = false;
2615 }
2616
Geoff Langeb66a6e2016-10-31 13:06:12 -04002617 if (getClientVersion() > Version(2, 0))
Geoff Lang493daf52014-07-03 13:38:44 -04002618 {
2619 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
Jamie Madill231c7f52017-04-26 13:45:37 -04002620 // mExtensions.sRGB = false;
Geoff Lang493daf52014-07-03 13:38:44 -04002621 }
2622
Jamie Madill00ed7a12016-05-19 13:13:38 -04002623 // Some extensions are always available because they are implemented in the GL layer.
Jamie Madill231c7f52017-04-26 13:45:37 -04002624 mExtensions.bindUniformLocation = true;
2625 mExtensions.vertexArrayObject = true;
Geoff Langf41a7152016-09-19 15:11:17 -04002626 mExtensions.bindGeneratesResource = true;
Geoff Langfeb8c682017-02-13 16:07:35 -05002627 mExtensions.clientArrays = true;
Geoff Langc339c4e2016-11-29 10:37:36 -05002628 mExtensions.requestExtension = true;
Jamie Madill00ed7a12016-05-19 13:13:38 -04002629
2630 // Enable the no error extension if the context was created with the flag.
2631 mExtensions.noError = mSkipValidation;
2632
Corentin Wallezccab69d2017-01-27 16:57:15 -05002633 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Corentin Wallezc295e512017-01-27 17:47:50 -05002634 mExtensions.surfacelessContext = displayExtensions.surfacelessContext;
Corentin Wallezccab69d2017-01-27 16:57:15 -05002635
Geoff Lang70d0f492015-12-10 17:45:46 -05002636 // Explicitly enable GL_KHR_debug
2637 mExtensions.debug = true;
2638 mExtensions.maxDebugMessageLength = 1024;
2639 mExtensions.maxDebugLoggedMessages = 1024;
2640 mExtensions.maxDebugGroupStackDepth = 1024;
2641 mExtensions.maxLabelLength = 1024;
2642
Geoff Langff5b2d52016-09-07 11:32:23 -04002643 // Explicitly enable GL_ANGLE_robust_client_memory
2644 mExtensions.robustClientMemory = true;
2645
Jamie Madille08a1d32017-03-07 17:24:06 -05002646 // Determine robust resource init availability from EGL.
Geoff Langb433e872017-10-05 14:01:47 -04002647 mExtensions.robustResourceInitialization = robustResourceInit;
Jamie Madille08a1d32017-03-07 17:24:06 -05002648
Jiajia Qin8a7b3a02017-08-25 16:05:48 +08002649 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
2650 // supports it.
2651 mExtensions.robustBufferAccessBehavior =
2652 mRobustAccess && mExtensions.robustBufferAccessBehavior;
2653
Jamie Madillc43be722017-07-13 16:22:14 -04002654 // Enable the cache control query unconditionally.
2655 mExtensions.programCacheControl = true;
2656
Geoff Lang301d1612014-07-09 10:34:37 -04002657 // Apply implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04002658 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002659
Jamie Madill0f80ed82017-09-19 00:24:56 -04002660 if (getClientVersion() < ES_3_1)
2661 {
2662 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
2663 }
2664 else
2665 {
2666 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
2667 }
Geoff Lang301d1612014-07-09 10:34:37 -04002668
Jamie Madill0f80ed82017-09-19 00:24:56 -04002669 LimitCap(&mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
2670 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
2671 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
2672
2673 // Limit textures as well, so we can use fast bitsets with texture bindings.
2674 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
2675 LimitCap(&mCaps.maxVertexTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
2676 LimitCap(&mCaps.maxTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04002677
Jiawei Shaodb342272017-09-27 10:21:45 +08002678 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
2679
Geoff Langc287ea62016-09-16 14:46:51 -04002680 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05002681 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04002682 for (const auto &extensionInfo : GetExtensionInfoMap())
2683 {
2684 // If this context is for WebGL, disable all enableable extensions
Jamie Madill4e0e6f82017-02-17 11:06:03 -05002685 if (mWebGLContext && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04002686 {
2687 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
2688 }
2689 }
2690
2691 // Generate texture caps
2692 updateCaps();
2693}
2694
2695void Context::updateCaps()
2696{
Geoff Lang900013c2014-07-07 11:32:19 -04002697 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002698 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04002699
Jamie Madill7b62cf92017-11-02 15:20:49 -04002700 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04002701 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04002702 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04002703 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04002704
Geoff Lang0d8b7242015-09-09 14:56:53 -04002705 // Update the format caps based on the client version and extensions.
2706 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
2707 // ES3.
2708 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002709 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04002710 formatCaps.renderable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002711 formatCaps.renderable && formatInfo.renderSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04002712 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002713 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04002714
He Yunchaoccd8c9b2017-01-18 17:36:14 +08002715 // OpenGL ES does not support multisampling with non-rendererable formats
2716 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Olli Etuaho50c562d2017-06-06 14:43:30 +03002717 if (!formatCaps.renderable ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08002718 (getClientVersion() < ES_3_1 &&
2719 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04002720 {
Geoff Langd87878e2014-09-19 15:42:59 -04002721 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04002722 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03002723 else
2724 {
2725 // We may have limited the max samples for some required renderbuffer formats due to
2726 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
2727 GLuint formatMaxSamples = formatCaps.getMaxSamples();
2728
2729 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
2730 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
2731 // exception of signed and unsigned integer formats."
2732 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
2733 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
2734 {
2735 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
2736 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
2737 }
2738
2739 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
2740 if (getClientVersion() >= ES_3_1)
2741 {
2742 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
2743 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
2744 // the exception that the signed and unsigned integer formats are required only to
2745 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
2746 // multisamples, which must be at least one."
2747 if (formatInfo.componentType == GL_INT ||
2748 formatInfo.componentType == GL_UNSIGNED_INT)
2749 {
2750 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
2751 }
2752
2753 // GLES 3.1 section 19.3.1.
2754 if (formatCaps.texturable)
2755 {
2756 if (formatInfo.depthBits > 0)
2757 {
2758 mCaps.maxDepthTextureSamples =
2759 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
2760 }
2761 else if (formatInfo.redBits > 0)
2762 {
2763 mCaps.maxColorTextureSamples =
2764 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
2765 }
2766 }
2767 }
2768 }
Geoff Langd87878e2014-09-19 15:42:59 -04002769
2770 if (formatCaps.texturable && formatInfo.compressed)
2771 {
Geoff Langca271392017-04-05 12:30:00 -04002772 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04002773 }
2774
Geoff Langca271392017-04-05 12:30:00 -04002775 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04002776 }
Jamie Madill32447362017-06-28 14:53:52 -04002777
2778 // If program binary is disabled, blank out the memory cache pointer.
2779 if (!mImplementation->getNativeExtensions().getProgramBinary)
2780 {
2781 mMemoryProgramCache = nullptr;
2782 }
Geoff Lang493daf52014-07-03 13:38:44 -04002783}
2784
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002785void Context::initWorkarounds()
2786{
Jamie Madill761b02c2017-06-23 16:27:06 -04002787 // Apply back-end workarounds.
2788 mImplementation->applyNativeWorkarounds(&mWorkarounds);
2789
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002790 // Lose the context upon out of memory error if the application is
2791 // expecting to watch for those events.
2792 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2793}
2794
Jamie Madill05b35b22017-10-03 09:01:44 -04002795Error Context::prepareForDraw()
2796{
2797 syncRendererState();
Jamie Madilla59fc192017-11-02 12:57:58 -04002798
2799 if (isRobustResourceInitEnabled())
2800 {
2801 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
2802 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
2803 }
2804
Jamie Madill05b35b22017-10-03 09:01:44 -04002805 return NoError();
2806}
2807
Jamie Madill1b94d432015-08-07 13:23:23 -04002808void Context::syncRendererState()
2809{
Jamie Madill7d1f5c62017-09-02 15:32:15 -04002810 mGLState.syncDirtyObjects(this);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002811 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madillfe548342017-06-19 11:13:24 -04002812 mImplementation->syncState(this, dirtyBits);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002813 mGLState.clearDirtyBits();
Jamie Madill1b94d432015-08-07 13:23:23 -04002814}
2815
Jamie Madillad9f24e2016-02-12 09:27:24 -05002816void Context::syncRendererState(const State::DirtyBits &bitMask,
2817 const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04002818{
Jamie Madill7d1f5c62017-09-02 15:32:15 -04002819 mGLState.syncDirtyObjects(this, objectMask);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002820 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madillfe548342017-06-19 11:13:24 -04002821 mImplementation->syncState(this, dirtyBits);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002822 mGLState.clearDirtyBits(dirtyBits);
Jamie Madill1b94d432015-08-07 13:23:23 -04002823}
Jamie Madillc29968b2016-01-20 11:17:23 -05002824
2825void Context::blitFramebuffer(GLint srcX0,
2826 GLint srcY0,
2827 GLint srcX1,
2828 GLint srcY1,
2829 GLint dstX0,
2830 GLint dstY0,
2831 GLint dstX1,
2832 GLint dstY1,
2833 GLbitfield mask,
2834 GLenum filter)
2835{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002836 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002837 ASSERT(drawFramebuffer);
2838
2839 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
2840 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
2841
Jamie Madillad9f24e2016-02-12 09:27:24 -05002842 syncStateForBlit();
Jamie Madillc29968b2016-01-20 11:17:23 -05002843
Jamie Madillc564c072017-06-01 12:45:42 -04002844 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002845}
Jamie Madillc29968b2016-01-20 11:17:23 -05002846
2847void Context::clear(GLbitfield mask)
2848{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002849 syncStateForClear();
Jamie Madillc564c072017-06-01 12:45:42 -04002850 handleError(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05002851}
2852
2853void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
2854{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002855 syncStateForClear();
Jamie Madillc564c072017-06-01 12:45:42 -04002856 handleError(mGLState.getDrawFramebuffer()->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002857}
2858
2859void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
2860{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002861 syncStateForClear();
Jamie Madillc564c072017-06-01 12:45:42 -04002862 handleError(mGLState.getDrawFramebuffer()->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002863}
2864
2865void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
2866{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002867 syncStateForClear();
Jamie Madillc564c072017-06-01 12:45:42 -04002868 handleError(mGLState.getDrawFramebuffer()->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002869}
2870
2871void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
2872{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002873 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002874 ASSERT(framebufferObject);
2875
2876 // If a buffer is not present, the clear has no effect
2877 if (framebufferObject->getDepthbuffer() == nullptr &&
2878 framebufferObject->getStencilbuffer() == nullptr)
2879 {
2880 return;
2881 }
2882
Jamie Madillad9f24e2016-02-12 09:27:24 -05002883 syncStateForClear();
Jamie Madillc564c072017-06-01 12:45:42 -04002884 handleError(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05002885}
2886
2887void Context::readPixels(GLint x,
2888 GLint y,
2889 GLsizei width,
2890 GLsizei height,
2891 GLenum format,
2892 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002893 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05002894{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04002895 if (width == 0 || height == 0)
2896 {
2897 return;
2898 }
2899
Jamie Madillad9f24e2016-02-12 09:27:24 -05002900 syncStateForReadPixels();
Jamie Madillc29968b2016-01-20 11:17:23 -05002901
Jamie Madillb6664922017-07-25 12:55:04 -04002902 Framebuffer *readFBO = mGLState.getReadFramebuffer();
2903 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05002904
2905 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04002906 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05002907}
2908
2909void Context::copyTexImage2D(GLenum target,
2910 GLint level,
2911 GLenum internalformat,
2912 GLint x,
2913 GLint y,
2914 GLsizei width,
2915 GLsizei height,
2916 GLint border)
2917{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002918 // Only sync the read FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002919 mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002920
Jamie Madillc29968b2016-01-20 11:17:23 -05002921 Rectangle sourceArea(x, y, width, height);
2922
Jamie Madill05b35b22017-10-03 09:01:44 -04002923 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002924 Texture *texture =
2925 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05002926 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05002927}
2928
2929void Context::copyTexSubImage2D(GLenum target,
2930 GLint level,
2931 GLint xoffset,
2932 GLint yoffset,
2933 GLint x,
2934 GLint y,
2935 GLsizei width,
2936 GLsizei height)
2937{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04002938 if (width == 0 || height == 0)
2939 {
2940 return;
2941 }
2942
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002943 // Only sync the read FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002944 mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002945
Jamie Madillc29968b2016-01-20 11:17:23 -05002946 Offset destOffset(xoffset, yoffset, 0);
2947 Rectangle sourceArea(x, y, width, height);
2948
Jamie Madill05b35b22017-10-03 09:01:44 -04002949 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002950 Texture *texture =
2951 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05002952 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05002953}
2954
2955void Context::copyTexSubImage3D(GLenum target,
2956 GLint level,
2957 GLint xoffset,
2958 GLint yoffset,
2959 GLint zoffset,
2960 GLint x,
2961 GLint y,
2962 GLsizei width,
2963 GLsizei height)
2964{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04002965 if (width == 0 || height == 0)
2966 {
2967 return;
2968 }
2969
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002970 // Only sync the read FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002971 mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002972
Jamie Madillc29968b2016-01-20 11:17:23 -05002973 Offset destOffset(xoffset, yoffset, zoffset);
2974 Rectangle sourceArea(x, y, width, height);
2975
Jamie Madill05b35b22017-10-03 09:01:44 -04002976 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
2977 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05002978 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05002979}
2980
2981void Context::framebufferTexture2D(GLenum target,
2982 GLenum attachment,
2983 GLenum textarget,
2984 GLuint texture,
2985 GLint level)
2986{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002987 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002988 ASSERT(framebuffer);
2989
2990 if (texture != 0)
2991 {
2992 Texture *textureObj = getTexture(texture);
2993
2994 ImageIndex index = ImageIndex::MakeInvalid();
2995
2996 if (textarget == GL_TEXTURE_2D)
2997 {
2998 index = ImageIndex::Make2D(level);
2999 }
Corentin Wallez13c0dd42017-07-04 18:27:01 -04003000 else if (textarget == GL_TEXTURE_RECTANGLE_ANGLE)
3001 {
3002 index = ImageIndex::MakeRectangle(level);
3003 }
JiangYizhoubddc46b2016-12-09 09:50:51 +08003004 else if (textarget == GL_TEXTURE_2D_MULTISAMPLE)
3005 {
3006 ASSERT(level == 0);
3007 index = ImageIndex::Make2DMultisample();
3008 }
Jamie Madillc29968b2016-01-20 11:17:23 -05003009 else
3010 {
3011 ASSERT(IsCubeMapTextureTarget(textarget));
3012 index = ImageIndex::MakeCube(textarget, level);
3013 }
3014
Jamie Madilla02315b2017-02-23 14:14:47 -05003015 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003016 }
3017 else
3018 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003019 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003020 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003021
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003022 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003023}
3024
3025void Context::framebufferRenderbuffer(GLenum target,
3026 GLenum attachment,
3027 GLenum renderbuffertarget,
3028 GLuint renderbuffer)
3029{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003030 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003031 ASSERT(framebuffer);
3032
3033 if (renderbuffer != 0)
3034 {
3035 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003036
3037 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex::MakeInvalid(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003038 renderbufferObject);
3039 }
3040 else
3041 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003042 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003043 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003044
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003045 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003046}
3047
3048void Context::framebufferTextureLayer(GLenum target,
3049 GLenum attachment,
3050 GLuint texture,
3051 GLint level,
3052 GLint layer)
3053{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003054 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003055 ASSERT(framebuffer);
3056
3057 if (texture != 0)
3058 {
3059 Texture *textureObject = getTexture(texture);
3060
3061 ImageIndex index = ImageIndex::MakeInvalid();
3062
3063 if (textureObject->getTarget() == GL_TEXTURE_3D)
3064 {
3065 index = ImageIndex::Make3D(level, layer);
3066 }
3067 else
3068 {
3069 ASSERT(textureObject->getTarget() == GL_TEXTURE_2D_ARRAY);
3070 index = ImageIndex::Make2DArray(level, layer);
3071 }
3072
Jamie Madilla02315b2017-02-23 14:14:47 -05003073 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003074 }
3075 else
3076 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003077 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003078 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003079
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003080 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003081}
3082
Martin Radev137032d2017-07-13 10:11:12 +03003083void Context::framebufferTextureMultiviewLayeredANGLE(GLenum target,
3084 GLenum attachment,
3085 GLuint texture,
3086 GLint level,
3087 GLint baseViewIndex,
3088 GLsizei numViews)
3089{
Martin Radev82ef7742017-08-08 17:44:58 +03003090 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3091 ASSERT(framebuffer);
3092
3093 if (texture != 0)
3094 {
3095 Texture *textureObj = getTexture(texture);
3096
Martin Radev18b75ba2017-08-15 15:50:40 +03003097 ImageIndex index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
Martin Radev82ef7742017-08-08 17:44:58 +03003098 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3099 numViews, baseViewIndex);
3100 }
3101 else
3102 {
3103 framebuffer->resetAttachment(this, attachment);
3104 }
3105
3106 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003107}
3108
3109void Context::framebufferTextureMultiviewSideBySideANGLE(GLenum target,
3110 GLenum attachment,
3111 GLuint texture,
3112 GLint level,
3113 GLsizei numViews,
3114 const GLint *viewportOffsets)
3115{
Martin Radev5dae57b2017-07-14 16:15:55 +03003116 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3117 ASSERT(framebuffer);
3118
3119 if (texture != 0)
3120 {
3121 Texture *textureObj = getTexture(texture);
3122
3123 ImageIndex index = ImageIndex::Make2D(level);
3124 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3125 textureObj, numViews, viewportOffsets);
3126 }
3127 else
3128 {
3129 framebuffer->resetAttachment(this, attachment);
3130 }
3131
3132 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003133}
3134
Jamie Madillc29968b2016-01-20 11:17:23 -05003135void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3136{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003137 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003138 ASSERT(framebuffer);
3139 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003140 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003141}
3142
3143void Context::readBuffer(GLenum mode)
3144{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003145 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003146 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003147 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003148}
3149
3150void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3151{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003152 // Only sync the FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04003153 mGLState.syncDirtyObject(this, target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003154
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003155 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003156 ASSERT(framebuffer);
3157
3158 // The specification isn't clear what should be done when the framebuffer isn't complete.
3159 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003160 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003161}
3162
3163void Context::invalidateFramebuffer(GLenum target,
3164 GLsizei numAttachments,
3165 const GLenum *attachments)
3166{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003167 // Only sync the FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04003168 mGLState.syncDirtyObject(this, target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003169
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003170 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003171 ASSERT(framebuffer);
3172
Jamie Madilldd43e6c2017-03-24 14:18:49 -04003173 if (framebuffer->checkStatus(this) != GL_FRAMEBUFFER_COMPLETE)
Jamie Madillc29968b2016-01-20 11:17:23 -05003174 {
Jamie Madill437fa652016-05-03 15:13:24 -04003175 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003176 }
Jamie Madill437fa652016-05-03 15:13:24 -04003177
Jamie Madill4928b7c2017-06-20 12:57:39 -04003178 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003179}
3180
3181void Context::invalidateSubFramebuffer(GLenum target,
3182 GLsizei numAttachments,
3183 const GLenum *attachments,
3184 GLint x,
3185 GLint y,
3186 GLsizei width,
3187 GLsizei height)
3188{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003189 // Only sync the FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04003190 mGLState.syncDirtyObject(this, target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003191
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003192 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003193 ASSERT(framebuffer);
3194
Jamie Madilldd43e6c2017-03-24 14:18:49 -04003195 if (framebuffer->checkStatus(this) != GL_FRAMEBUFFER_COMPLETE)
Jamie Madillc29968b2016-01-20 11:17:23 -05003196 {
Jamie Madill437fa652016-05-03 15:13:24 -04003197 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003198 }
Jamie Madill437fa652016-05-03 15:13:24 -04003199
3200 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003201 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003202}
3203
Jamie Madill73a84962016-02-12 09:27:23 -05003204void Context::texImage2D(GLenum target,
3205 GLint level,
3206 GLint internalformat,
3207 GLsizei width,
3208 GLsizei height,
3209 GLint border,
3210 GLenum format,
3211 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003212 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003213{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003214 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003215
3216 Extents size(width, height, 1);
3217 Texture *texture =
3218 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003219 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
3220 size, format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003221}
3222
3223void Context::texImage3D(GLenum target,
3224 GLint level,
3225 GLint internalformat,
3226 GLsizei width,
3227 GLsizei height,
3228 GLsizei depth,
3229 GLint border,
3230 GLenum format,
3231 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003232 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003233{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003234 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003235
3236 Extents size(width, height, depth);
3237 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003238 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
3239 size, format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003240}
3241
3242void Context::texSubImage2D(GLenum target,
3243 GLint level,
3244 GLint xoffset,
3245 GLint yoffset,
3246 GLsizei width,
3247 GLsizei height,
3248 GLenum format,
3249 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003250 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003251{
3252 // Zero sized uploads are valid but no-ops
3253 if (width == 0 || height == 0)
3254 {
3255 return;
3256 }
3257
Jamie Madillad9f24e2016-02-12 09:27:24 -05003258 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003259
3260 Box area(xoffset, yoffset, 0, width, height, 1);
3261 Texture *texture =
3262 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003263 handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
3264 type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003265}
3266
3267void Context::texSubImage3D(GLenum target,
3268 GLint level,
3269 GLint xoffset,
3270 GLint yoffset,
3271 GLint zoffset,
3272 GLsizei width,
3273 GLsizei height,
3274 GLsizei depth,
3275 GLenum format,
3276 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003277 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003278{
3279 // Zero sized uploads are valid but no-ops
3280 if (width == 0 || height == 0 || depth == 0)
3281 {
3282 return;
3283 }
3284
Jamie Madillad9f24e2016-02-12 09:27:24 -05003285 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003286
3287 Box area(xoffset, yoffset, zoffset, width, height, depth);
3288 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003289 handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
3290 type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003291}
3292
3293void Context::compressedTexImage2D(GLenum target,
3294 GLint level,
3295 GLenum internalformat,
3296 GLsizei width,
3297 GLsizei height,
3298 GLint border,
3299 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003300 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003301{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003302 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003303
3304 Extents size(width, height, 1);
3305 Texture *texture =
3306 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003307 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003308 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04003309 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003310}
3311
3312void Context::compressedTexImage3D(GLenum target,
3313 GLint level,
3314 GLenum internalformat,
3315 GLsizei width,
3316 GLsizei height,
3317 GLsizei depth,
3318 GLint border,
3319 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003320 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003321{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003322 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003323
3324 Extents size(width, height, depth);
3325 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003326 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003327 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04003328 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003329}
3330
3331void Context::compressedTexSubImage2D(GLenum target,
3332 GLint level,
3333 GLint xoffset,
3334 GLint yoffset,
3335 GLsizei width,
3336 GLsizei height,
3337 GLenum format,
3338 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003339 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003340{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003341 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003342
3343 Box area(xoffset, yoffset, 0, width, height, 1);
3344 Texture *texture =
3345 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003346 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003347 format, imageSize,
3348 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003349}
3350
3351void Context::compressedTexSubImage3D(GLenum target,
3352 GLint level,
3353 GLint xoffset,
3354 GLint yoffset,
3355 GLint zoffset,
3356 GLsizei width,
3357 GLsizei height,
3358 GLsizei depth,
3359 GLenum format,
3360 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003361 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003362{
3363 // Zero sized uploads are valid but no-ops
3364 if (width == 0 || height == 0)
3365 {
3366 return;
3367 }
3368
Jamie Madillad9f24e2016-02-12 09:27:24 -05003369 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003370
3371 Box area(xoffset, yoffset, zoffset, width, height, depth);
3372 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003373 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003374 format, imageSize,
3375 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003376}
3377
Olli Etuaho0f2b1562016-05-13 16:15:35 +03003378void Context::generateMipmap(GLenum target)
3379{
3380 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003381 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03003382}
3383
Geoff Lang97073d12016-04-20 10:42:34 -07003384void Context::copyTextureCHROMIUM(GLuint sourceId,
Geoff Langfc72a072017-03-24 14:52:39 -04003385 GLint sourceLevel,
3386 GLenum destTarget,
Geoff Lang97073d12016-04-20 10:42:34 -07003387 GLuint destId,
Geoff Langfc72a072017-03-24 14:52:39 -04003388 GLint destLevel,
Geoff Lang97073d12016-04-20 10:42:34 -07003389 GLint internalFormat,
3390 GLenum destType,
3391 GLboolean unpackFlipY,
3392 GLboolean unpackPremultiplyAlpha,
3393 GLboolean unpackUnmultiplyAlpha)
3394{
3395 syncStateForTexImage();
3396
3397 gl::Texture *sourceTexture = getTexture(sourceId);
3398 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05003399 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
3400 sourceLevel, ConvertToBool(unpackFlipY),
3401 ConvertToBool(unpackPremultiplyAlpha),
3402 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07003403}
3404
3405void Context::copySubTextureCHROMIUM(GLuint sourceId,
Geoff Langfc72a072017-03-24 14:52:39 -04003406 GLint sourceLevel,
3407 GLenum destTarget,
Geoff Lang97073d12016-04-20 10:42:34 -07003408 GLuint destId,
Geoff Langfc72a072017-03-24 14:52:39 -04003409 GLint destLevel,
Geoff Lang97073d12016-04-20 10:42:34 -07003410 GLint xoffset,
3411 GLint yoffset,
3412 GLint x,
3413 GLint y,
3414 GLsizei width,
3415 GLsizei height,
3416 GLboolean unpackFlipY,
3417 GLboolean unpackPremultiplyAlpha,
3418 GLboolean unpackUnmultiplyAlpha)
3419{
3420 // Zero sized copies are valid but no-ops
3421 if (width == 0 || height == 0)
3422 {
3423 return;
3424 }
3425
3426 syncStateForTexImage();
3427
3428 gl::Texture *sourceTexture = getTexture(sourceId);
3429 gl::Texture *destTexture = getTexture(destId);
3430 Offset offset(xoffset, yoffset, 0);
3431 Rectangle area(x, y, width, height);
Geoff Lang92019432017-11-20 13:09:34 -05003432 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, area,
3433 ConvertToBool(unpackFlipY),
3434 ConvertToBool(unpackPremultiplyAlpha),
3435 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07003436}
3437
Geoff Lang47110bf2016-04-20 11:13:22 -07003438void Context::compressedCopyTextureCHROMIUM(GLuint sourceId, GLuint destId)
3439{
3440 syncStateForTexImage();
3441
3442 gl::Texture *sourceTexture = getTexture(sourceId);
3443 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05003444 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07003445}
3446
Corentin Wallez336129f2017-10-17 15:55:40 -04003447void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03003448{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003449 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003450 ASSERT(buffer);
3451
Geoff Lang496c02d2016-10-20 11:38:11 -07003452 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03003453}
3454
Corentin Wallez336129f2017-10-17 15:55:40 -04003455void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03003456{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003457 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003458 ASSERT(buffer);
3459
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003460 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03003461 if (error.isError())
3462 {
Jamie Madill437fa652016-05-03 15:13:24 -04003463 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003464 return nullptr;
3465 }
3466
3467 return buffer->getMapPointer();
3468}
3469
Corentin Wallez336129f2017-10-17 15:55:40 -04003470GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03003471{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003472 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003473 ASSERT(buffer);
3474
3475 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003476 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03003477 if (error.isError())
3478 {
Jamie Madill437fa652016-05-03 15:13:24 -04003479 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003480 return GL_FALSE;
3481 }
3482
3483 return result;
3484}
3485
Corentin Wallez336129f2017-10-17 15:55:40 -04003486void *Context::mapBufferRange(BufferBinding target,
3487 GLintptr offset,
3488 GLsizeiptr length,
3489 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03003490{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003491 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003492 ASSERT(buffer);
3493
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003494 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03003495 if (error.isError())
3496 {
Jamie Madill437fa652016-05-03 15:13:24 -04003497 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003498 return nullptr;
3499 }
3500
3501 return buffer->getMapPointer();
3502}
3503
Corentin Wallez336129f2017-10-17 15:55:40 -04003504void Context::flushMappedBufferRange(BufferBinding /*target*/,
3505 GLintptr /*offset*/,
3506 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03003507{
3508 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
3509}
3510
Jamie Madillad9f24e2016-02-12 09:27:24 -05003511void Context::syncStateForReadPixels()
3512{
3513 syncRendererState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
3514}
3515
3516void Context::syncStateForTexImage()
3517{
3518 syncRendererState(mTexImageDirtyBits, mTexImageDirtyObjects);
3519}
3520
3521void Context::syncStateForClear()
3522{
3523 syncRendererState(mClearDirtyBits, mClearDirtyObjects);
3524}
3525
3526void Context::syncStateForBlit()
3527{
3528 syncRendererState(mBlitDirtyBits, mBlitDirtyObjects);
3529}
3530
Jiajia Qin5451d532017-11-16 17:16:34 +08003531void Context::activeShaderProgram(GLuint pipeline, GLuint program)
3532{
3533 UNIMPLEMENTED();
3534}
3535
Jamie Madillc20ab272016-06-09 07:20:46 -07003536void Context::activeTexture(GLenum texture)
3537{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003538 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07003539}
3540
Jamie Madill876429b2017-04-20 15:46:24 -04003541void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07003542{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003543 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07003544}
3545
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05003546void Context::blendEquation(GLenum mode)
3547{
3548 mGLState.setBlendEquation(mode, mode);
3549}
3550
Jamie Madillc20ab272016-06-09 07:20:46 -07003551void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
3552{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003553 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003554}
3555
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05003556void Context::blendFunc(GLenum sfactor, GLenum dfactor)
3557{
3558 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
3559}
3560
Jamie Madillc20ab272016-06-09 07:20:46 -07003561void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
3562{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003563 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003564}
3565
Jamie Madill876429b2017-04-20 15:46:24 -04003566void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07003567{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003568 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003569}
3570
Jamie Madill876429b2017-04-20 15:46:24 -04003571void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07003572{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003573 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07003574}
3575
3576void Context::clearStencil(GLint s)
3577{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003578 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07003579}
3580
3581void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
3582{
Geoff Lang92019432017-11-20 13:09:34 -05003583 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
3584 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07003585}
3586
Corentin Wallez2e568cf2017-09-18 17:05:22 -04003587void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07003588{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003589 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003590}
3591
3592void Context::depthFunc(GLenum func)
3593{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003594 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07003595}
3596
3597void Context::depthMask(GLboolean flag)
3598{
Geoff Lang92019432017-11-20 13:09:34 -05003599 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07003600}
3601
Jamie Madill876429b2017-04-20 15:46:24 -04003602void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07003603{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003604 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07003605}
3606
3607void Context::disable(GLenum cap)
3608{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003609 mGLState.setEnableFeature(cap, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07003610}
3611
3612void Context::disableVertexAttribArray(GLuint index)
3613{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003614 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07003615}
3616
3617void Context::enable(GLenum cap)
3618{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003619 mGLState.setEnableFeature(cap, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07003620}
3621
3622void Context::enableVertexAttribArray(GLuint index)
3623{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003624 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07003625}
3626
3627void Context::frontFace(GLenum mode)
3628{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003629 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003630}
3631
3632void Context::hint(GLenum target, GLenum mode)
3633{
3634 switch (target)
3635 {
3636 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003637 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003638 break;
3639
3640 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003641 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003642 break;
3643
3644 default:
3645 UNREACHABLE();
3646 return;
3647 }
3648}
3649
3650void Context::lineWidth(GLfloat width)
3651{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003652 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07003653}
3654
3655void Context::pixelStorei(GLenum pname, GLint param)
3656{
3657 switch (pname)
3658 {
3659 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003660 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003661 break;
3662
3663 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003664 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003665 break;
3666
3667 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003668 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07003669 break;
3670
3671 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03003672 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003673 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003674 break;
3675
3676 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03003677 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003678 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003679 break;
3680
3681 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03003682 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003683 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003684 break;
3685
3686 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03003687 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003688 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003689 break;
3690
3691 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03003692 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003693 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003694 break;
3695
3696 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03003697 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003698 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003699 break;
3700
3701 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03003702 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003703 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003704 break;
3705
3706 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03003707 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003708 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003709 break;
3710
3711 default:
3712 UNREACHABLE();
3713 return;
3714 }
3715}
3716
3717void Context::polygonOffset(GLfloat factor, GLfloat units)
3718{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003719 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07003720}
3721
Jamie Madill876429b2017-04-20 15:46:24 -04003722void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07003723{
Geoff Lang92019432017-11-20 13:09:34 -05003724 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07003725}
3726
Jiawei Shaodb342272017-09-27 10:21:45 +08003727void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
3728{
3729 mGLState.setSampleMaskParams(maskNumber, mask);
3730}
3731
Jamie Madillc20ab272016-06-09 07:20:46 -07003732void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
3733{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003734 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07003735}
3736
3737void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
3738{
3739 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3740 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003741 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003742 }
3743
3744 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3745 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003746 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003747 }
3748}
3749
3750void Context::stencilMaskSeparate(GLenum face, GLuint mask)
3751{
3752 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3753 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003754 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003755 }
3756
3757 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3758 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003759 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003760 }
3761}
3762
3763void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
3764{
3765 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3766 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003767 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07003768 }
3769
3770 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3771 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003772 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07003773 }
3774}
3775
3776void Context::vertexAttrib1f(GLuint index, GLfloat x)
3777{
3778 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003779 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003780}
3781
3782void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
3783{
3784 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003785 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003786}
3787
3788void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
3789{
3790 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003791 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003792}
3793
3794void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
3795{
3796 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003797 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003798}
3799
3800void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
3801{
3802 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003803 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003804}
3805
3806void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
3807{
3808 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003809 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003810}
3811
3812void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
3813{
3814 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003815 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003816}
3817
3818void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
3819{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003820 mGLState.setVertexAttribf(index, values);
Jamie Madillc20ab272016-06-09 07:20:46 -07003821}
3822
3823void Context::vertexAttribPointer(GLuint index,
3824 GLint size,
3825 GLenum type,
3826 GLboolean normalized,
3827 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04003828 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07003829{
Corentin Wallez336129f2017-10-17 15:55:40 -04003830 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05003831 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc20ab272016-06-09 07:20:46 -07003832}
3833
Shao80957d92017-02-20 21:25:59 +08003834void Context::vertexAttribFormat(GLuint attribIndex,
3835 GLint size,
3836 GLenum type,
3837 GLboolean normalized,
3838 GLuint relativeOffset)
3839{
Geoff Lang92019432017-11-20 13:09:34 -05003840 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08003841 relativeOffset);
3842}
3843
3844void Context::vertexAttribIFormat(GLuint attribIndex,
3845 GLint size,
3846 GLenum type,
3847 GLuint relativeOffset)
3848{
3849 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
3850}
3851
3852void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
3853{
Shaodde78e82017-05-22 14:13:27 +08003854 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Shao80957d92017-02-20 21:25:59 +08003855}
3856
Jiajia Qin5451d532017-11-16 17:16:34 +08003857void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08003858{
3859 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
3860}
3861
Jamie Madillc20ab272016-06-09 07:20:46 -07003862void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
3863{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003864 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07003865}
3866
3867void Context::vertexAttribIPointer(GLuint index,
3868 GLint size,
3869 GLenum type,
3870 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04003871 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07003872{
Corentin Wallez336129f2017-10-17 15:55:40 -04003873 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
3874 size, type, false, true, stride, pointer);
Jamie Madillc20ab272016-06-09 07:20:46 -07003875}
3876
3877void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
3878{
3879 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003880 mGLState.setVertexAttribi(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003881}
3882
3883void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
3884{
3885 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003886 mGLState.setVertexAttribu(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003887}
3888
3889void Context::vertexAttribI4iv(GLuint index, const GLint *v)
3890{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003891 mGLState.setVertexAttribi(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07003892}
3893
3894void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
3895{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003896 mGLState.setVertexAttribu(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07003897}
3898
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003899void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
3900{
3901 const VertexAttribCurrentValueData &currentValues =
3902 getGLState().getVertexAttribCurrentValue(index);
3903 const VertexArray *vao = getGLState().getVertexArray();
3904 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
3905 currentValues, pname, params);
3906}
3907
3908void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
3909{
3910 const VertexAttribCurrentValueData &currentValues =
3911 getGLState().getVertexAttribCurrentValue(index);
3912 const VertexArray *vao = getGLState().getVertexArray();
3913 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
3914 currentValues, pname, params);
3915}
3916
3917void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
3918{
3919 const VertexAttribCurrentValueData &currentValues =
3920 getGLState().getVertexAttribCurrentValue(index);
3921 const VertexArray *vao = getGLState().getVertexArray();
3922 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
3923 currentValues, pname, params);
3924}
3925
3926void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
3927{
3928 const VertexAttribCurrentValueData &currentValues =
3929 getGLState().getVertexAttribCurrentValue(index);
3930 const VertexArray *vao = getGLState().getVertexArray();
3931 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
3932 currentValues, pname, params);
3933}
3934
Jamie Madill876429b2017-04-20 15:46:24 -04003935void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003936{
3937 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
3938 QueryVertexAttribPointerv(attrib, pname, pointer);
3939}
3940
Jamie Madillc20ab272016-06-09 07:20:46 -07003941void Context::debugMessageControl(GLenum source,
3942 GLenum type,
3943 GLenum severity,
3944 GLsizei count,
3945 const GLuint *ids,
3946 GLboolean enabled)
3947{
3948 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003949 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05003950 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07003951}
3952
3953void Context::debugMessageInsert(GLenum source,
3954 GLenum type,
3955 GLuint id,
3956 GLenum severity,
3957 GLsizei length,
3958 const GLchar *buf)
3959{
3960 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003961 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07003962}
3963
3964void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
3965{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003966 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07003967}
3968
3969GLuint Context::getDebugMessageLog(GLuint count,
3970 GLsizei bufSize,
3971 GLenum *sources,
3972 GLenum *types,
3973 GLuint *ids,
3974 GLenum *severities,
3975 GLsizei *lengths,
3976 GLchar *messageLog)
3977{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003978 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
3979 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07003980}
3981
3982void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
3983{
3984 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003985 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05003986 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07003987}
3988
3989void Context::popDebugGroup()
3990{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003991 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05003992 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07003993}
3994
Corentin Wallez336129f2017-10-17 15:55:40 -04003995void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04003996{
3997 Buffer *buffer = mGLState.getTargetBuffer(target);
3998 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08003999 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04004000}
4001
Corentin Wallez336129f2017-10-17 15:55:40 -04004002void Context::bufferSubData(BufferBinding target,
4003 GLintptr offset,
4004 GLsizeiptr size,
4005 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04004006{
4007 if (data == nullptr)
4008 {
4009 return;
4010 }
4011
4012 Buffer *buffer = mGLState.getTargetBuffer(target);
4013 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004014 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04004015}
4016
Jamie Madillef300b12016-10-07 15:12:09 -04004017void Context::attachShader(GLuint program, GLuint shader)
4018{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05004019 Program *programObject = mState.mShaderPrograms->getProgram(program);
4020 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04004021 ASSERT(programObject && shaderObject);
4022 programObject->attachShader(shaderObject);
4023}
4024
Kenneth Russellf2f6f652016-10-05 19:53:23 -07004025const Workarounds &Context::getWorkarounds() const
4026{
4027 return mWorkarounds;
4028}
4029
Corentin Wallez336129f2017-10-17 15:55:40 -04004030void Context::copyBufferSubData(BufferBinding readTarget,
4031 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04004032 GLintptr readOffset,
4033 GLintptr writeOffset,
4034 GLsizeiptr size)
4035{
4036 // if size is zero, the copy is a successful no-op
4037 if (size == 0)
4038 {
4039 return;
4040 }
4041
4042 // TODO(jmadill): cache these.
4043 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
4044 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
4045
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004046 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04004047}
4048
Jamie Madill01a80ee2016-11-07 12:06:18 -05004049void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
4050{
4051 Program *programObject = getProgram(program);
4052 // TODO(jmadill): Re-use this from the validation if possible.
4053 ASSERT(programObject);
4054 programObject->bindAttributeLocation(index, name);
4055}
4056
Corentin Wallez336129f2017-10-17 15:55:40 -04004057void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004058{
Corentin Wallez336129f2017-10-17 15:55:40 -04004059 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4060 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004061}
4062
Corentin Wallez336129f2017-10-17 15:55:40 -04004063void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08004064{
4065 bindBufferRange(target, index, buffer, 0, 0);
4066}
4067
Corentin Wallez336129f2017-10-17 15:55:40 -04004068void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08004069 GLuint index,
4070 GLuint buffer,
4071 GLintptr offset,
4072 GLsizeiptr size)
4073{
Corentin Wallez336129f2017-10-17 15:55:40 -04004074 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4075 mGLState.setIndexedBufferBinding(this, target, index, bufferObject, offset, size);
Jiajia Qin6eafb042016-12-27 17:04:07 +08004076}
4077
Jamie Madill01a80ee2016-11-07 12:06:18 -05004078void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
4079{
4080 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4081 {
4082 bindReadFramebuffer(framebuffer);
4083 }
4084
4085 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4086 {
4087 bindDrawFramebuffer(framebuffer);
4088 }
4089}
4090
4091void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
4092{
4093 ASSERT(target == GL_RENDERBUFFER);
4094 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05004095 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004096 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004097}
4098
JiangYizhoubddc46b2016-12-09 09:50:51 +08004099void Context::texStorage2DMultisample(GLenum target,
4100 GLsizei samples,
4101 GLenum internalformat,
4102 GLsizei width,
4103 GLsizei height,
4104 GLboolean fixedsamplelocations)
4105{
4106 Extents size(width, height, 1);
4107 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004108 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
Geoff Lang92019432017-11-20 13:09:34 -05004109 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08004110}
4111
4112void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
4113{
JiangYizhou5b03f472017-01-09 10:22:53 +08004114 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
4115 // the sample position should be queried by DRAW_FRAMEBUFFER.
4116 mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER);
4117 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08004118
4119 switch (pname)
4120 {
4121 case GL_SAMPLE_POSITION:
4122 handleError(framebuffer->getSamplePosition(index, val));
4123 break;
4124 default:
4125 UNREACHABLE();
4126 }
4127}
4128
Jamie Madille8fb6402017-02-14 17:56:40 -05004129void Context::renderbufferStorage(GLenum target,
4130 GLenum internalformat,
4131 GLsizei width,
4132 GLsizei height)
4133{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004134 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4135 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
4136
Jamie Madille8fb6402017-02-14 17:56:40 -05004137 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04004138 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004139}
4140
4141void Context::renderbufferStorageMultisample(GLenum target,
4142 GLsizei samples,
4143 GLenum internalformat,
4144 GLsizei width,
4145 GLsizei height)
4146{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004147 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4148 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05004149
4150 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004151 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04004152 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004153}
4154
Geoff Lang38f2cfb2017-04-11 15:23:08 -04004155void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
4156{
Jamie Madill70b5bb02017-08-28 13:32:37 -04004157 const Sync *syncObject = getSync(sync);
Geoff Lang82483b92017-04-11 15:33:00 -04004158 handleError(QuerySynciv(syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04004159}
4160
JiangYizhoue18e6392017-02-20 10:32:23 +08004161void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
4162{
4163 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4164 QueryFramebufferParameteriv(framebuffer, pname, params);
4165}
4166
Jiajia Qin5451d532017-11-16 17:16:34 +08004167void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08004168{
4169 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4170 SetFramebufferParameteri(framebuffer, pname, param);
4171}
4172
Jamie Madillb3f26b92017-07-19 15:07:41 -04004173Error Context::getScratchBuffer(size_t requstedSizeBytes,
4174 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05004175{
Jamie Madillb3f26b92017-07-19 15:07:41 -04004176 if (!mScratchBuffer.get(requstedSizeBytes, scratchBufferOut))
4177 {
4178 return OutOfMemory() << "Failed to allocate internal buffer.";
4179 }
4180 return NoError();
4181}
4182
4183Error Context::getZeroFilledBuffer(size_t requstedSizeBytes,
4184 angle::MemoryBuffer **zeroBufferOut) const
4185{
4186 if (!mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0))
Jamie Madille14951e2017-03-09 18:55:16 -05004187 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05004188 return OutOfMemory() << "Failed to allocate internal buffer.";
Jamie Madille14951e2017-03-09 18:55:16 -05004189 }
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05004190 return NoError();
Jamie Madille14951e2017-03-09 18:55:16 -05004191}
4192
Xinghua Cao2b396592017-03-29 15:36:04 +08004193void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
4194{
4195 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
4196 {
4197 return;
4198 }
4199
Jamie Madill05b35b22017-10-03 09:01:44 -04004200 // TODO(jmadill): Dirty bits for compute.
Jamie Madilla59fc192017-11-02 12:57:58 -04004201 if (isRobustResourceInitEnabled())
4202 {
4203 ANGLE_CONTEXT_TRY(mGLState.clearUnclearedActiveTextures(this));
4204 }
Jamie Madill05b35b22017-10-03 09:01:44 -04004205
Jamie Madill71c88b32017-09-14 22:20:29 -04004206 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08004207}
4208
Jiajia Qin5451d532017-11-16 17:16:34 +08004209void Context::dispatchComputeIndirect(GLintptr indirect)
4210{
4211 UNIMPLEMENTED();
4212}
4213
JiangYizhou165361c2017-06-07 14:56:57 +08004214void Context::texStorage2D(GLenum target,
4215 GLsizei levels,
4216 GLenum internalFormat,
4217 GLsizei width,
4218 GLsizei height)
4219{
4220 Extents size(width, height, 1);
4221 Texture *texture = getTargetTexture(target);
4222 handleError(texture->setStorage(this, target, levels, internalFormat, size));
4223}
4224
4225void Context::texStorage3D(GLenum target,
4226 GLsizei levels,
4227 GLenum internalFormat,
4228 GLsizei width,
4229 GLsizei height,
4230 GLsizei depth)
4231{
4232 Extents size(width, height, depth);
4233 Texture *texture = getTargetTexture(target);
4234 handleError(texture->setStorage(this, target, levels, internalFormat, size));
4235}
4236
Jiajia Qin5451d532017-11-16 17:16:34 +08004237void Context::memoryBarrier(GLbitfield barriers)
4238{
4239 UNIMPLEMENTED();
4240}
4241
4242void Context::memoryBarrierByRegion(GLbitfield barriers)
4243{
4244 UNIMPLEMENTED();
4245}
4246
Jamie Madillc1d770e2017-04-13 17:31:24 -04004247GLenum Context::checkFramebufferStatus(GLenum target)
4248{
4249 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4250 ASSERT(framebuffer);
4251
4252 return framebuffer->checkStatus(this);
4253}
4254
4255void Context::compileShader(GLuint shader)
4256{
4257 Shader *shaderObject = GetValidShader(this, shader);
4258 if (!shaderObject)
4259 {
4260 return;
4261 }
4262 shaderObject->compile(this);
4263}
4264
4265void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
4266{
4267 for (int i = 0; i < n; i++)
4268 {
4269 deleteBuffer(buffers[i]);
4270 }
4271}
4272
4273void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
4274{
4275 for (int i = 0; i < n; i++)
4276 {
4277 if (framebuffers[i] != 0)
4278 {
4279 deleteFramebuffer(framebuffers[i]);
4280 }
4281 }
4282}
4283
4284void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
4285{
4286 for (int i = 0; i < n; i++)
4287 {
4288 deleteRenderbuffer(renderbuffers[i]);
4289 }
4290}
4291
4292void Context::deleteTextures(GLsizei n, const GLuint *textures)
4293{
4294 for (int i = 0; i < n; i++)
4295 {
4296 if (textures[i] != 0)
4297 {
4298 deleteTexture(textures[i]);
4299 }
4300 }
4301}
4302
4303void Context::detachShader(GLuint program, GLuint shader)
4304{
4305 Program *programObject = getProgram(program);
4306 ASSERT(programObject);
4307
4308 Shader *shaderObject = getShader(shader);
4309 ASSERT(shaderObject);
4310
4311 programObject->detachShader(this, shaderObject);
4312}
4313
4314void Context::genBuffers(GLsizei n, GLuint *buffers)
4315{
4316 for (int i = 0; i < n; i++)
4317 {
4318 buffers[i] = createBuffer();
4319 }
4320}
4321
4322void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
4323{
4324 for (int i = 0; i < n; i++)
4325 {
4326 framebuffers[i] = createFramebuffer();
4327 }
4328}
4329
4330void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
4331{
4332 for (int i = 0; i < n; i++)
4333 {
4334 renderbuffers[i] = createRenderbuffer();
4335 }
4336}
4337
4338void Context::genTextures(GLsizei n, GLuint *textures)
4339{
4340 for (int i = 0; i < n; i++)
4341 {
4342 textures[i] = createTexture();
4343 }
4344}
4345
4346void Context::getActiveAttrib(GLuint program,
4347 GLuint index,
4348 GLsizei bufsize,
4349 GLsizei *length,
4350 GLint *size,
4351 GLenum *type,
4352 GLchar *name)
4353{
4354 Program *programObject = getProgram(program);
4355 ASSERT(programObject);
4356 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
4357}
4358
4359void Context::getActiveUniform(GLuint program,
4360 GLuint index,
4361 GLsizei bufsize,
4362 GLsizei *length,
4363 GLint *size,
4364 GLenum *type,
4365 GLchar *name)
4366{
4367 Program *programObject = getProgram(program);
4368 ASSERT(programObject);
4369 programObject->getActiveUniform(index, bufsize, length, size, type, name);
4370}
4371
4372void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
4373{
4374 Program *programObject = getProgram(program);
4375 ASSERT(programObject);
4376 programObject->getAttachedShaders(maxcount, count, shaders);
4377}
4378
4379GLint Context::getAttribLocation(GLuint program, const GLchar *name)
4380{
4381 Program *programObject = getProgram(program);
4382 ASSERT(programObject);
4383 return programObject->getAttributeLocation(name);
4384}
4385
4386void Context::getBooleanv(GLenum pname, GLboolean *params)
4387{
4388 GLenum nativeType;
4389 unsigned int numParams = 0;
4390 getQueryParameterInfo(pname, &nativeType, &numParams);
4391
4392 if (nativeType == GL_BOOL)
4393 {
4394 getBooleanvImpl(pname, params);
4395 }
4396 else
4397 {
4398 CastStateValues(this, nativeType, pname, numParams, params);
4399 }
4400}
4401
4402void Context::getFloatv(GLenum pname, GLfloat *params)
4403{
4404 GLenum nativeType;
4405 unsigned int numParams = 0;
4406 getQueryParameterInfo(pname, &nativeType, &numParams);
4407
4408 if (nativeType == GL_FLOAT)
4409 {
4410 getFloatvImpl(pname, params);
4411 }
4412 else
4413 {
4414 CastStateValues(this, nativeType, pname, numParams, params);
4415 }
4416}
4417
4418void Context::getIntegerv(GLenum pname, GLint *params)
4419{
4420 GLenum nativeType;
4421 unsigned int numParams = 0;
4422 getQueryParameterInfo(pname, &nativeType, &numParams);
4423
4424 if (nativeType == GL_INT)
4425 {
4426 getIntegervImpl(pname, params);
4427 }
4428 else
4429 {
4430 CastStateValues(this, nativeType, pname, numParams, params);
4431 }
4432}
4433
4434void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
4435{
4436 Program *programObject = getProgram(program);
4437 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04004438 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004439}
4440
Jiajia Qin5451d532017-11-16 17:16:34 +08004441void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
4442{
4443 UNIMPLEMENTED();
4444}
4445
Jamie Madillbe849e42017-05-02 15:49:00 -04004446void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04004447{
4448 Program *programObject = getProgram(program);
4449 ASSERT(programObject);
4450 programObject->getInfoLog(bufsize, length, infolog);
4451}
4452
Jiajia Qin5451d532017-11-16 17:16:34 +08004453void Context::getProgramPipelineInfoLog(GLuint pipeline,
4454 GLsizei bufSize,
4455 GLsizei *length,
4456 GLchar *infoLog)
4457{
4458 UNIMPLEMENTED();
4459}
4460
Jamie Madillc1d770e2017-04-13 17:31:24 -04004461void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
4462{
4463 Shader *shaderObject = getShader(shader);
4464 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04004465 QueryShaderiv(this, shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004466}
4467
4468void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
4469{
4470 Shader *shaderObject = getShader(shader);
4471 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04004472 shaderObject->getInfoLog(this, bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004473}
4474
4475void Context::getShaderPrecisionFormat(GLenum shadertype,
4476 GLenum precisiontype,
4477 GLint *range,
4478 GLint *precision)
4479{
4480 // TODO(jmadill): Compute shaders.
4481
4482 switch (shadertype)
4483 {
4484 case GL_VERTEX_SHADER:
4485 switch (precisiontype)
4486 {
4487 case GL_LOW_FLOAT:
4488 mCaps.vertexLowpFloat.get(range, precision);
4489 break;
4490 case GL_MEDIUM_FLOAT:
4491 mCaps.vertexMediumpFloat.get(range, precision);
4492 break;
4493 case GL_HIGH_FLOAT:
4494 mCaps.vertexHighpFloat.get(range, precision);
4495 break;
4496
4497 case GL_LOW_INT:
4498 mCaps.vertexLowpInt.get(range, precision);
4499 break;
4500 case GL_MEDIUM_INT:
4501 mCaps.vertexMediumpInt.get(range, precision);
4502 break;
4503 case GL_HIGH_INT:
4504 mCaps.vertexHighpInt.get(range, precision);
4505 break;
4506
4507 default:
4508 UNREACHABLE();
4509 return;
4510 }
4511 break;
4512
4513 case GL_FRAGMENT_SHADER:
4514 switch (precisiontype)
4515 {
4516 case GL_LOW_FLOAT:
4517 mCaps.fragmentLowpFloat.get(range, precision);
4518 break;
4519 case GL_MEDIUM_FLOAT:
4520 mCaps.fragmentMediumpFloat.get(range, precision);
4521 break;
4522 case GL_HIGH_FLOAT:
4523 mCaps.fragmentHighpFloat.get(range, precision);
4524 break;
4525
4526 case GL_LOW_INT:
4527 mCaps.fragmentLowpInt.get(range, precision);
4528 break;
4529 case GL_MEDIUM_INT:
4530 mCaps.fragmentMediumpInt.get(range, precision);
4531 break;
4532 case GL_HIGH_INT:
4533 mCaps.fragmentHighpInt.get(range, precision);
4534 break;
4535
4536 default:
4537 UNREACHABLE();
4538 return;
4539 }
4540 break;
4541
4542 default:
4543 UNREACHABLE();
4544 return;
4545 }
4546}
4547
4548void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
4549{
4550 Shader *shaderObject = getShader(shader);
4551 ASSERT(shaderObject);
4552 shaderObject->getSource(bufsize, length, source);
4553}
4554
4555void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
4556{
4557 Program *programObject = getProgram(program);
4558 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04004559 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004560}
4561
4562void Context::getUniformiv(GLuint program, GLint location, GLint *params)
4563{
4564 Program *programObject = getProgram(program);
4565 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04004566 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004567}
4568
4569GLint Context::getUniformLocation(GLuint program, const GLchar *name)
4570{
4571 Program *programObject = getProgram(program);
4572 ASSERT(programObject);
4573 return programObject->getUniformLocation(name);
4574}
4575
4576GLboolean Context::isBuffer(GLuint buffer)
4577{
4578 if (buffer == 0)
4579 {
4580 return GL_FALSE;
4581 }
4582
4583 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
4584}
4585
4586GLboolean Context::isEnabled(GLenum cap)
4587{
4588 return mGLState.getEnableFeature(cap);
4589}
4590
4591GLboolean Context::isFramebuffer(GLuint framebuffer)
4592{
4593 if (framebuffer == 0)
4594 {
4595 return GL_FALSE;
4596 }
4597
4598 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
4599}
4600
4601GLboolean Context::isProgram(GLuint program)
4602{
4603 if (program == 0)
4604 {
4605 return GL_FALSE;
4606 }
4607
4608 return (getProgram(program) ? GL_TRUE : GL_FALSE);
4609}
4610
4611GLboolean Context::isRenderbuffer(GLuint renderbuffer)
4612{
4613 if (renderbuffer == 0)
4614 {
4615 return GL_FALSE;
4616 }
4617
4618 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
4619}
4620
4621GLboolean Context::isShader(GLuint shader)
4622{
4623 if (shader == 0)
4624 {
4625 return GL_FALSE;
4626 }
4627
4628 return (getShader(shader) ? GL_TRUE : GL_FALSE);
4629}
4630
4631GLboolean Context::isTexture(GLuint texture)
4632{
4633 if (texture == 0)
4634 {
4635 return GL_FALSE;
4636 }
4637
4638 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
4639}
4640
4641void Context::linkProgram(GLuint program)
4642{
4643 Program *programObject = getProgram(program);
4644 ASSERT(programObject);
4645 handleError(programObject->link(this));
Martin Radev0abb7a22017-08-28 15:34:45 +03004646 mGLState.onProgramExecutableChange(programObject);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004647}
4648
4649void Context::releaseShaderCompiler()
4650{
Jamie Madill4928b7c2017-06-20 12:57:39 -04004651 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004652}
4653
4654void Context::shaderBinary(GLsizei n,
4655 const GLuint *shaders,
4656 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04004657 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04004658 GLsizei length)
4659{
4660 // No binary shader formats are supported.
4661 UNIMPLEMENTED();
4662}
4663
4664void Context::shaderSource(GLuint shader,
4665 GLsizei count,
4666 const GLchar *const *string,
4667 const GLint *length)
4668{
4669 Shader *shaderObject = getShader(shader);
4670 ASSERT(shaderObject);
4671 shaderObject->setSource(count, string, length);
4672}
4673
4674void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
4675{
4676 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
4677}
4678
4679void Context::stencilMask(GLuint mask)
4680{
4681 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4682}
4683
4684void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4685{
4686 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4687}
4688
4689void Context::uniform1f(GLint location, GLfloat x)
4690{
4691 Program *program = mGLState.getProgram();
4692 program->setUniform1fv(location, 1, &x);
4693}
4694
4695void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
4696{
4697 Program *program = mGLState.getProgram();
4698 program->setUniform1fv(location, count, v);
4699}
4700
4701void Context::uniform1i(GLint location, GLint x)
4702{
4703 Program *program = mGLState.getProgram();
Jamie Madill81c2e252017-09-09 23:32:46 -04004704 if (program->setUniform1iv(location, 1, &x) == Program::SetUniformResult::SamplerChanged)
4705 {
4706 mGLState.setObjectDirty(GL_PROGRAM);
4707 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04004708}
4709
4710void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
4711{
4712 Program *program = mGLState.getProgram();
Jamie Madill81c2e252017-09-09 23:32:46 -04004713 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
4714 {
4715 mGLState.setObjectDirty(GL_PROGRAM);
4716 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04004717}
4718
4719void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
4720{
4721 GLfloat xy[2] = {x, y};
4722 Program *program = mGLState.getProgram();
4723 program->setUniform2fv(location, 1, xy);
4724}
4725
4726void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
4727{
4728 Program *program = mGLState.getProgram();
4729 program->setUniform2fv(location, count, v);
4730}
4731
4732void Context::uniform2i(GLint location, GLint x, GLint y)
4733{
4734 GLint xy[2] = {x, y};
4735 Program *program = mGLState.getProgram();
4736 program->setUniform2iv(location, 1, xy);
4737}
4738
4739void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
4740{
4741 Program *program = mGLState.getProgram();
4742 program->setUniform2iv(location, count, v);
4743}
4744
4745void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
4746{
4747 GLfloat xyz[3] = {x, y, z};
4748 Program *program = mGLState.getProgram();
4749 program->setUniform3fv(location, 1, xyz);
4750}
4751
4752void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
4753{
4754 Program *program = mGLState.getProgram();
4755 program->setUniform3fv(location, count, v);
4756}
4757
4758void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
4759{
4760 GLint xyz[3] = {x, y, z};
4761 Program *program = mGLState.getProgram();
4762 program->setUniform3iv(location, 1, xyz);
4763}
4764
4765void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
4766{
4767 Program *program = mGLState.getProgram();
4768 program->setUniform3iv(location, count, v);
4769}
4770
4771void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4772{
4773 GLfloat xyzw[4] = {x, y, z, w};
4774 Program *program = mGLState.getProgram();
4775 program->setUniform4fv(location, 1, xyzw);
4776}
4777
4778void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
4779{
4780 Program *program = mGLState.getProgram();
4781 program->setUniform4fv(location, count, v);
4782}
4783
4784void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
4785{
4786 GLint xyzw[4] = {x, y, z, w};
4787 Program *program = mGLState.getProgram();
4788 program->setUniform4iv(location, 1, xyzw);
4789}
4790
4791void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
4792{
4793 Program *program = mGLState.getProgram();
4794 program->setUniform4iv(location, count, v);
4795}
4796
4797void Context::uniformMatrix2fv(GLint location,
4798 GLsizei count,
4799 GLboolean transpose,
4800 const GLfloat *value)
4801{
4802 Program *program = mGLState.getProgram();
4803 program->setUniformMatrix2fv(location, count, transpose, value);
4804}
4805
4806void Context::uniformMatrix3fv(GLint location,
4807 GLsizei count,
4808 GLboolean transpose,
4809 const GLfloat *value)
4810{
4811 Program *program = mGLState.getProgram();
4812 program->setUniformMatrix3fv(location, count, transpose, value);
4813}
4814
4815void Context::uniformMatrix4fv(GLint location,
4816 GLsizei count,
4817 GLboolean transpose,
4818 const GLfloat *value)
4819{
4820 Program *program = mGLState.getProgram();
4821 program->setUniformMatrix4fv(location, count, transpose, value);
4822}
4823
4824void Context::validateProgram(GLuint program)
4825{
4826 Program *programObject = getProgram(program);
4827 ASSERT(programObject);
4828 programObject->validate(mCaps);
4829}
4830
Jiajia Qin5451d532017-11-16 17:16:34 +08004831void Context::validateProgramPipeline(GLuint pipeline)
4832{
4833 UNIMPLEMENTED();
4834}
4835
Jamie Madilld04908b2017-06-09 14:15:35 -04004836void Context::getProgramBinary(GLuint program,
4837 GLsizei bufSize,
4838 GLsizei *length,
4839 GLenum *binaryFormat,
4840 void *binary)
4841{
4842 Program *programObject = getProgram(program);
4843 ASSERT(programObject != nullptr);
4844
4845 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
4846}
4847
4848void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
4849{
4850 Program *programObject = getProgram(program);
4851 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04004852
Jamie Madilld04908b2017-06-09 14:15:35 -04004853 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
4854}
4855
Jamie Madillff325f12017-08-26 15:06:05 -04004856void Context::uniform1ui(GLint location, GLuint v0)
4857{
4858 Program *program = mGLState.getProgram();
4859 program->setUniform1uiv(location, 1, &v0);
4860}
4861
4862void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
4863{
4864 Program *program = mGLState.getProgram();
4865 const GLuint xy[] = {v0, v1};
4866 program->setUniform2uiv(location, 1, xy);
4867}
4868
4869void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
4870{
4871 Program *program = mGLState.getProgram();
4872 const GLuint xyz[] = {v0, v1, v2};
4873 program->setUniform3uiv(location, 1, xyz);
4874}
4875
4876void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
4877{
4878 Program *program = mGLState.getProgram();
4879 const GLuint xyzw[] = {v0, v1, v2, v3};
4880 program->setUniform4uiv(location, 1, xyzw);
4881}
4882
4883void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
4884{
4885 Program *program = mGLState.getProgram();
4886 program->setUniform1uiv(location, count, value);
4887}
4888void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
4889{
4890 Program *program = mGLState.getProgram();
4891 program->setUniform2uiv(location, count, value);
4892}
4893
4894void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
4895{
4896 Program *program = mGLState.getProgram();
4897 program->setUniform3uiv(location, count, value);
4898}
4899
4900void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
4901{
4902 Program *program = mGLState.getProgram();
4903 program->setUniform4uiv(location, count, value);
4904}
4905
Jamie Madillf0e04492017-08-26 15:28:42 -04004906void Context::genQueries(GLsizei n, GLuint *ids)
4907{
4908 for (GLsizei i = 0; i < n; i++)
4909 {
4910 GLuint handle = mQueryHandleAllocator.allocate();
4911 mQueryMap.assign(handle, nullptr);
4912 ids[i] = handle;
4913 }
4914}
4915
4916void Context::deleteQueries(GLsizei n, const GLuint *ids)
4917{
4918 for (int i = 0; i < n; i++)
4919 {
4920 GLuint query = ids[i];
4921
4922 Query *queryObject = nullptr;
4923 if (mQueryMap.erase(query, &queryObject))
4924 {
4925 mQueryHandleAllocator.release(query);
4926 if (queryObject)
4927 {
4928 queryObject->release(this);
4929 }
4930 }
4931 }
4932}
4933
4934GLboolean Context::isQuery(GLuint id)
4935{
4936 return (getQuery(id, false, GL_NONE) != nullptr) ? GL_TRUE : GL_FALSE;
4937}
4938
Jamie Madillc8c95812017-08-26 18:40:09 -04004939void Context::uniformMatrix2x3fv(GLint location,
4940 GLsizei count,
4941 GLboolean transpose,
4942 const GLfloat *value)
4943{
4944 Program *program = mGLState.getProgram();
4945 program->setUniformMatrix2x3fv(location, count, transpose, value);
4946}
4947
4948void Context::uniformMatrix3x2fv(GLint location,
4949 GLsizei count,
4950 GLboolean transpose,
4951 const GLfloat *value)
4952{
4953 Program *program = mGLState.getProgram();
4954 program->setUniformMatrix3x2fv(location, count, transpose, value);
4955}
4956
4957void Context::uniformMatrix2x4fv(GLint location,
4958 GLsizei count,
4959 GLboolean transpose,
4960 const GLfloat *value)
4961{
4962 Program *program = mGLState.getProgram();
4963 program->setUniformMatrix2x4fv(location, count, transpose, value);
4964}
4965
4966void Context::uniformMatrix4x2fv(GLint location,
4967 GLsizei count,
4968 GLboolean transpose,
4969 const GLfloat *value)
4970{
4971 Program *program = mGLState.getProgram();
4972 program->setUniformMatrix4x2fv(location, count, transpose, value);
4973}
4974
4975void Context::uniformMatrix3x4fv(GLint location,
4976 GLsizei count,
4977 GLboolean transpose,
4978 const GLfloat *value)
4979{
4980 Program *program = mGLState.getProgram();
4981 program->setUniformMatrix3x4fv(location, count, transpose, value);
4982}
4983
4984void Context::uniformMatrix4x3fv(GLint location,
4985 GLsizei count,
4986 GLboolean transpose,
4987 const GLfloat *value)
4988{
4989 Program *program = mGLState.getProgram();
4990 program->setUniformMatrix4x3fv(location, count, transpose, value);
4991}
4992
Jamie Madilld7576732017-08-26 18:49:50 -04004993void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
4994{
4995 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
4996 {
4997 GLuint vertexArray = arrays[arrayIndex];
4998
4999 if (arrays[arrayIndex] != 0)
5000 {
5001 VertexArray *vertexArrayObject = nullptr;
5002 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
5003 {
5004 if (vertexArrayObject != nullptr)
5005 {
5006 detachVertexArray(vertexArray);
5007 vertexArrayObject->onDestroy(this);
5008 }
5009
5010 mVertexArrayHandleAllocator.release(vertexArray);
5011 }
5012 }
5013 }
5014}
5015
5016void Context::genVertexArrays(GLsizei n, GLuint *arrays)
5017{
5018 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5019 {
5020 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
5021 mVertexArrayMap.assign(vertexArray, nullptr);
5022 arrays[arrayIndex] = vertexArray;
5023 }
5024}
5025
5026bool Context::isVertexArray(GLuint array)
5027{
5028 if (array == 0)
5029 {
5030 return GL_FALSE;
5031 }
5032
5033 VertexArray *vao = getVertexArray(array);
5034 return (vao != nullptr ? GL_TRUE : GL_FALSE);
5035}
5036
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04005037void Context::endTransformFeedback()
5038{
5039 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5040 transformFeedback->end(this);
5041}
5042
5043void Context::transformFeedbackVaryings(GLuint program,
5044 GLsizei count,
5045 const GLchar *const *varyings,
5046 GLenum bufferMode)
5047{
5048 Program *programObject = getProgram(program);
5049 ASSERT(programObject);
5050 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
5051}
5052
5053void Context::getTransformFeedbackVarying(GLuint program,
5054 GLuint index,
5055 GLsizei bufSize,
5056 GLsizei *length,
5057 GLsizei *size,
5058 GLenum *type,
5059 GLchar *name)
5060{
5061 Program *programObject = getProgram(program);
5062 ASSERT(programObject);
5063 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
5064}
5065
5066void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
5067{
5068 for (int i = 0; i < n; i++)
5069 {
5070 GLuint transformFeedback = ids[i];
5071 if (transformFeedback == 0)
5072 {
5073 continue;
5074 }
5075
5076 TransformFeedback *transformFeedbackObject = nullptr;
5077 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
5078 {
5079 if (transformFeedbackObject != nullptr)
5080 {
5081 detachTransformFeedback(transformFeedback);
5082 transformFeedbackObject->release(this);
5083 }
5084
5085 mTransformFeedbackHandleAllocator.release(transformFeedback);
5086 }
5087 }
5088}
5089
5090void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
5091{
5092 for (int i = 0; i < n; i++)
5093 {
5094 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
5095 mTransformFeedbackMap.assign(transformFeedback, nullptr);
5096 ids[i] = transformFeedback;
5097 }
5098}
5099
5100bool Context::isTransformFeedback(GLuint id)
5101{
5102 if (id == 0)
5103 {
5104 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
5105 // returns FALSE
5106 return GL_FALSE;
5107 }
5108
5109 const TransformFeedback *transformFeedback = getTransformFeedback(id);
5110 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
5111}
5112
5113void Context::pauseTransformFeedback()
5114{
5115 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5116 transformFeedback->pause();
5117}
5118
5119void Context::resumeTransformFeedback()
5120{
5121 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5122 transformFeedback->resume();
5123}
5124
Jamie Madill12e957f2017-08-26 21:42:26 -04005125void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
5126{
5127 const Program *programObject = getProgram(program);
Jamie Madill54164b02017-08-28 15:17:37 -04005128 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04005129}
5130
5131GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
5132{
5133 const Program *programObject = getProgram(program);
5134 return programObject->getFragDataLocation(name);
5135}
5136
5137void Context::getUniformIndices(GLuint program,
5138 GLsizei uniformCount,
5139 const GLchar *const *uniformNames,
5140 GLuint *uniformIndices)
5141{
5142 const Program *programObject = getProgram(program);
5143 if (!programObject->isLinked())
5144 {
5145 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5146 {
5147 uniformIndices[uniformId] = GL_INVALID_INDEX;
5148 }
5149 }
5150 else
5151 {
5152 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5153 {
5154 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
5155 }
5156 }
5157}
5158
5159void Context::getActiveUniformsiv(GLuint program,
5160 GLsizei uniformCount,
5161 const GLuint *uniformIndices,
5162 GLenum pname,
5163 GLint *params)
5164{
5165 const Program *programObject = getProgram(program);
5166 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5167 {
5168 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08005169 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04005170 }
5171}
5172
5173GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
5174{
5175 const Program *programObject = getProgram(program);
5176 return programObject->getUniformBlockIndex(uniformBlockName);
5177}
5178
5179void Context::getActiveUniformBlockiv(GLuint program,
5180 GLuint uniformBlockIndex,
5181 GLenum pname,
5182 GLint *params)
5183{
5184 const Program *programObject = getProgram(program);
5185 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
5186}
5187
5188void Context::getActiveUniformBlockName(GLuint program,
5189 GLuint uniformBlockIndex,
5190 GLsizei bufSize,
5191 GLsizei *length,
5192 GLchar *uniformBlockName)
5193{
5194 const Program *programObject = getProgram(program);
5195 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
5196}
5197
5198void Context::uniformBlockBinding(GLuint program,
5199 GLuint uniformBlockIndex,
5200 GLuint uniformBlockBinding)
5201{
5202 Program *programObject = getProgram(program);
5203 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
5204}
5205
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005206GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
5207{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005208 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
5209 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005210
Jamie Madill70b5bb02017-08-28 13:32:37 -04005211 Sync *syncObject = getSync(syncHandle);
5212 Error error = syncObject->set(condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005213 if (error.isError())
5214 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04005215 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005216 handleError(error);
5217 return nullptr;
5218 }
5219
Jamie Madill70b5bb02017-08-28 13:32:37 -04005220 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005221}
5222
5223GLboolean Context::isSync(GLsync sync)
5224{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005225 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005226}
5227
5228GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
5229{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005230 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005231
5232 GLenum result = GL_WAIT_FAILED;
5233 handleError(syncObject->clientWait(flags, timeout, &result));
5234 return result;
5235}
5236
5237void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
5238{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005239 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005240 handleError(syncObject->serverWait(flags, timeout));
5241}
5242
5243void Context::getInteger64v(GLenum pname, GLint64 *params)
5244{
5245 GLenum nativeType = GL_NONE;
5246 unsigned int numParams = 0;
5247 getQueryParameterInfo(pname, &nativeType, &numParams);
5248
5249 if (nativeType == GL_INT_64_ANGLEX)
5250 {
5251 getInteger64vImpl(pname, params);
5252 }
5253 else
5254 {
5255 CastStateValues(this, nativeType, pname, numParams, params);
5256 }
5257}
5258
Corentin Wallez336129f2017-10-17 15:55:40 -04005259void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04005260{
5261 Buffer *buffer = mGLState.getTargetBuffer(target);
5262 QueryBufferParameteri64v(buffer, pname, params);
5263}
5264
5265void Context::genSamplers(GLsizei count, GLuint *samplers)
5266{
5267 for (int i = 0; i < count; i++)
5268 {
5269 samplers[i] = mState.mSamplers->createSampler();
5270 }
5271}
5272
5273void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
5274{
5275 for (int i = 0; i < count; i++)
5276 {
5277 GLuint sampler = samplers[i];
5278
5279 if (mState.mSamplers->getSampler(sampler))
5280 {
5281 detachSampler(sampler);
5282 }
5283
5284 mState.mSamplers->deleteObject(this, sampler);
5285 }
5286}
5287
5288void Context::getInternalformativ(GLenum target,
5289 GLenum internalformat,
5290 GLenum pname,
5291 GLsizei bufSize,
5292 GLint *params)
5293{
5294 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
5295 QueryInternalFormativ(formatCaps, pname, bufSize, params);
5296}
5297
Jiajia Qin5451d532017-11-16 17:16:34 +08005298void Context::programUniform1i(GLuint program, GLint location, GLint v0)
5299{
5300 programUniform1iv(program, location, 1, &v0);
5301}
5302
5303void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
5304{
5305 GLint xy[2] = {v0, v1};
5306 programUniform2iv(program, location, 1, xy);
5307}
5308
5309void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
5310{
5311 GLint xyz[3] = {v0, v1, v2};
5312 programUniform3iv(program, location, 1, xyz);
5313}
5314
5315void Context::programUniform4i(GLuint program,
5316 GLint location,
5317 GLint v0,
5318 GLint v1,
5319 GLint v2,
5320 GLint v3)
5321{
5322 GLint xyzw[4] = {v0, v1, v2, v3};
5323 programUniform4iv(program, location, 1, xyzw);
5324}
5325
5326void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
5327{
5328 programUniform1uiv(program, location, 1, &v0);
5329}
5330
5331void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
5332{
5333 GLuint xy[2] = {v0, v1};
5334 programUniform2uiv(program, location, 1, xy);
5335}
5336
5337void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
5338{
5339 GLuint xyz[3] = {v0, v1, v2};
5340 programUniform3uiv(program, location, 1, xyz);
5341}
5342
5343void Context::programUniform4ui(GLuint program,
5344 GLint location,
5345 GLuint v0,
5346 GLuint v1,
5347 GLuint v2,
5348 GLuint v3)
5349{
5350 GLuint xyzw[4] = {v0, v1, v2, v3};
5351 programUniform4uiv(program, location, 1, xyzw);
5352}
5353
5354void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
5355{
5356 programUniform1fv(program, location, 1, &v0);
5357}
5358
5359void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
5360{
5361 GLfloat xy[2] = {v0, v1};
5362 programUniform2fv(program, location, 1, xy);
5363}
5364
5365void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
5366{
5367 GLfloat xyz[3] = {v0, v1, v2};
5368 programUniform3fv(program, location, 1, xyz);
5369}
5370
5371void Context::programUniform4f(GLuint program,
5372 GLint location,
5373 GLfloat v0,
5374 GLfloat v1,
5375 GLfloat v2,
5376 GLfloat v3)
5377{
5378 GLfloat xyzw[4] = {v0, v1, v2, v3};
5379 programUniform4fv(program, location, 1, xyzw);
5380}
5381
Jamie Madill81c2e252017-09-09 23:32:46 -04005382void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
5383{
5384 Program *programObject = getProgram(program);
5385 ASSERT(programObject);
5386 if (programObject->setUniform1iv(location, count, value) ==
5387 Program::SetUniformResult::SamplerChanged)
5388 {
5389 mGLState.setObjectDirty(GL_PROGRAM);
5390 }
5391}
5392
Jiajia Qin5451d532017-11-16 17:16:34 +08005393void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
5394{
5395 Program *programObject = getProgram(program);
5396 ASSERT(programObject);
5397 programObject->setUniform2iv(location, count, value);
5398}
5399
5400void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
5401{
5402 Program *programObject = getProgram(program);
5403 ASSERT(programObject);
5404 programObject->setUniform3iv(location, count, value);
5405}
5406
5407void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
5408{
5409 Program *programObject = getProgram(program);
5410 ASSERT(programObject);
5411 programObject->setUniform4iv(location, count, value);
5412}
5413
5414void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
5415{
5416 Program *programObject = getProgram(program);
5417 ASSERT(programObject);
5418 programObject->setUniform1uiv(location, count, value);
5419}
5420
5421void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
5422{
5423 Program *programObject = getProgram(program);
5424 ASSERT(programObject);
5425 programObject->setUniform2uiv(location, count, value);
5426}
5427
5428void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
5429{
5430 Program *programObject = getProgram(program);
5431 ASSERT(programObject);
5432 programObject->setUniform3uiv(location, count, value);
5433}
5434
5435void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
5436{
5437 Program *programObject = getProgram(program);
5438 ASSERT(programObject);
5439 programObject->setUniform4uiv(location, count, value);
5440}
5441
5442void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
5443{
5444 Program *programObject = getProgram(program);
5445 ASSERT(programObject);
5446 programObject->setUniform1fv(location, count, value);
5447}
5448
5449void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
5450{
5451 Program *programObject = getProgram(program);
5452 ASSERT(programObject);
5453 programObject->setUniform2fv(location, count, value);
5454}
5455
5456void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
5457{
5458 Program *programObject = getProgram(program);
5459 ASSERT(programObject);
5460 programObject->setUniform3fv(location, count, value);
5461}
5462
5463void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
5464{
5465 Program *programObject = getProgram(program);
5466 ASSERT(programObject);
5467 programObject->setUniform4fv(location, count, value);
5468}
5469
5470void Context::programUniformMatrix2fv(GLuint program,
5471 GLint location,
5472 GLsizei count,
5473 GLboolean transpose,
5474 const GLfloat *value)
5475{
5476 Program *programObject = getProgram(program);
5477 ASSERT(programObject);
5478 programObject->setUniformMatrix2fv(location, count, transpose, value);
5479}
5480
5481void Context::programUniformMatrix3fv(GLuint program,
5482 GLint location,
5483 GLsizei count,
5484 GLboolean transpose,
5485 const GLfloat *value)
5486{
5487 Program *programObject = getProgram(program);
5488 ASSERT(programObject);
5489 programObject->setUniformMatrix3fv(location, count, transpose, value);
5490}
5491
5492void Context::programUniformMatrix4fv(GLuint program,
5493 GLint location,
5494 GLsizei count,
5495 GLboolean transpose,
5496 const GLfloat *value)
5497{
5498 Program *programObject = getProgram(program);
5499 ASSERT(programObject);
5500 programObject->setUniformMatrix4fv(location, count, transpose, value);
5501}
5502
5503void Context::programUniformMatrix2x3fv(GLuint program,
5504 GLint location,
5505 GLsizei count,
5506 GLboolean transpose,
5507 const GLfloat *value)
5508{
5509 Program *programObject = getProgram(program);
5510 ASSERT(programObject);
5511 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
5512}
5513
5514void Context::programUniformMatrix3x2fv(GLuint program,
5515 GLint location,
5516 GLsizei count,
5517 GLboolean transpose,
5518 const GLfloat *value)
5519{
5520 Program *programObject = getProgram(program);
5521 ASSERT(programObject);
5522 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
5523}
5524
5525void Context::programUniformMatrix2x4fv(GLuint program,
5526 GLint location,
5527 GLsizei count,
5528 GLboolean transpose,
5529 const GLfloat *value)
5530{
5531 Program *programObject = getProgram(program);
5532 ASSERT(programObject);
5533 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
5534}
5535
5536void Context::programUniformMatrix4x2fv(GLuint program,
5537 GLint location,
5538 GLsizei count,
5539 GLboolean transpose,
5540 const GLfloat *value)
5541{
5542 Program *programObject = getProgram(program);
5543 ASSERT(programObject);
5544 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
5545}
5546
5547void Context::programUniformMatrix3x4fv(GLuint program,
5548 GLint location,
5549 GLsizei count,
5550 GLboolean transpose,
5551 const GLfloat *value)
5552{
5553 Program *programObject = getProgram(program);
5554 ASSERT(programObject);
5555 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
5556}
5557
5558void Context::programUniformMatrix4x3fv(GLuint program,
5559 GLint location,
5560 GLsizei count,
5561 GLboolean transpose,
5562 const GLfloat *value)
5563{
5564 Program *programObject = getProgram(program);
5565 ASSERT(programObject);
5566 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
5567}
5568
Jamie Madill81c2e252017-09-09 23:32:46 -04005569void Context::onTextureChange(const Texture *texture)
5570{
5571 // Conservatively assume all textures are dirty.
5572 // TODO(jmadill): More fine-grained update.
5573 mGLState.setObjectDirty(GL_TEXTURE);
5574}
5575
Yunchao Hea336b902017-08-02 16:05:21 +08005576void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
5577{
5578 for (int i = 0; i < count; i++)
5579 {
5580 pipelines[i] = createProgramPipeline();
5581 }
5582}
5583
5584void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
5585{
5586 for (int i = 0; i < count; i++)
5587 {
5588 if (pipelines[i] != 0)
5589 {
5590 deleteProgramPipeline(pipelines[i]);
5591 }
5592 }
5593}
5594
5595GLboolean Context::isProgramPipeline(GLuint pipeline)
5596{
5597 if (pipeline == 0)
5598 {
5599 return GL_FALSE;
5600 }
5601
5602 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
5603}
5604
Jamie Madillc29968b2016-01-20 11:17:23 -05005605} // namespace gl