blob: 331e40fff03a9524bc546845a0187d1ac58774b2 [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"
Geoff Lang2b5420c2014-11-19 14:20:15 -050029#include "libANGLE/Query.h"
Jamie Madillb9293972015-02-19 11:07:54 -050030#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050031#include "libANGLE/ResourceManager.h"
32#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050033#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050034#include "libANGLE/Texture.h"
35#include "libANGLE/TransformFeedback.h"
36#include "libANGLE/VertexArray.h"
Kenneth Russellf2f6f652016-10-05 19:53:23 -070037#include "libANGLE/Workarounds.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040038#include "libANGLE/formatutils.h"
Martin Radev66fb8202016-07-28 11:45:20 +030039#include "libANGLE/queryconversions.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040040#include "libANGLE/queryutils.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040041#include "libANGLE/renderer/ContextImpl.h"
42#include "libANGLE/renderer/EGLImplFactory.h"
43#include "libANGLE/validationES.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000044
Geoff Langf6db0982015-08-25 13:04:00 -040045namespace
46{
47
Jamie Madillb6664922017-07-25 12:55:04 -040048#define ANGLE_HANDLE_ERR(X) \
49 handleError(X); \
50 return;
51#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
52
Ian Ewell3ffd78b2016-01-22 16:09:42 -050053template <typename T>
Geoff Lang4ddf5af2016-12-01 14:30:44 -050054std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030055 GLsizei numPaths,
56 const void *paths,
57 GLuint pathBase)
58{
59 std::vector<gl::Path *> ret;
60 ret.reserve(numPaths);
61
62 const auto *nameArray = static_cast<const T *>(paths);
63
64 for (GLsizei i = 0; i < numPaths; ++i)
65 {
66 const GLuint pathName = nameArray[i] + pathBase;
67
68 ret.push_back(resourceManager.getPath(pathName));
69 }
70
71 return ret;
72}
73
Geoff Lang4ddf5af2016-12-01 14:30:44 -050074std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030075 GLsizei numPaths,
76 GLenum pathNameType,
77 const void *paths,
78 GLuint pathBase)
79{
80 switch (pathNameType)
81 {
82 case GL_UNSIGNED_BYTE:
83 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
84
85 case GL_BYTE:
86 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
87
88 case GL_UNSIGNED_SHORT:
89 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
90
91 case GL_SHORT:
92 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
93
94 case GL_UNSIGNED_INT:
95 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
96
97 case GL_INT:
98 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
99 }
100
101 UNREACHABLE();
102 return std::vector<gl::Path *>();
103}
104
105template <typename T>
Geoff Lang2186c382016-10-14 10:54:54 -0400106gl::Error GetQueryObjectParameter(gl::Query *query, GLenum pname, T *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500107{
Geoff Lang2186c382016-10-14 10:54:54 -0400108 ASSERT(query != nullptr);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500109
110 switch (pname)
111 {
112 case GL_QUERY_RESULT_EXT:
Geoff Lang2186c382016-10-14 10:54:54 -0400113 return query->getResult(params);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500114 case GL_QUERY_RESULT_AVAILABLE_EXT:
115 {
116 bool available;
Geoff Lang2186c382016-10-14 10:54:54 -0400117 gl::Error error = query->isResultAvailable(&available);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500118 if (!error.isError())
119 {
Geoff Lang2186c382016-10-14 10:54:54 -0400120 *params = gl::ConvertFromGLboolean<T>(available);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500121 }
122 return error;
123 }
124 default:
125 UNREACHABLE();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500126 return gl::InternalError() << "Unreachable Error";
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500127 }
128}
129
Geoff Langf6db0982015-08-25 13:04:00 -0400130void MarkTransformFeedbackBufferUsage(gl::TransformFeedback *transformFeedback)
131{
Geoff Lang1a683462015-09-29 15:09:59 -0400132 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400133 {
134 for (size_t tfBufferIndex = 0; tfBufferIndex < transformFeedback->getIndexedBufferCount();
135 tfBufferIndex++)
136 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400137 const gl::OffsetBindingPointer<gl::Buffer> &buffer =
Geoff Langf6db0982015-08-25 13:04:00 -0400138 transformFeedback->getIndexedBuffer(tfBufferIndex);
139 if (buffer.get() != nullptr)
140 {
141 buffer->onTransformFeedback();
142 }
143 }
144 }
145}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500146
147// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300148EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500149{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400150 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500151}
152
Martin Radev1be913c2016-07-11 17:59:16 +0300153EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
154{
155 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
156}
157
Geoff Langeb66a6e2016-10-31 13:06:12 -0400158gl::Version GetClientVersion(const egl::AttributeMap &attribs)
159{
160 return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
161}
162
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500163GLenum GetResetStrategy(const egl::AttributeMap &attribs)
164{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400165 EGLAttrib attrib = attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT,
166 EGL_NO_RESET_NOTIFICATION_EXT);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500167 switch (attrib)
168 {
169 case EGL_NO_RESET_NOTIFICATION:
170 return GL_NO_RESET_NOTIFICATION_EXT;
171 case EGL_LOSE_CONTEXT_ON_RESET:
172 return GL_LOSE_CONTEXT_ON_RESET_EXT;
173 default:
174 UNREACHABLE();
175 return GL_NONE;
176 }
177}
178
179bool GetRobustAccess(const egl::AttributeMap &attribs)
180{
Geoff Lang077f20a2016-11-01 10:08:02 -0400181 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
182 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
183 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500184}
185
186bool GetDebug(const egl::AttributeMap &attribs)
187{
Geoff Lang077f20a2016-11-01 10:08:02 -0400188 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
189 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500190}
191
192bool GetNoError(const egl::AttributeMap &attribs)
193{
194 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
195}
196
Geoff Langc287ea62016-09-16 14:46:51 -0400197bool GetWebGLContext(const egl::AttributeMap &attribs)
198{
199 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
200}
201
Geoff Langf41a7152016-09-19 15:11:17 -0400202bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
203{
204 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
205}
206
Geoff Langfeb8c682017-02-13 16:07:35 -0500207bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
208{
209 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
210}
211
Martin Radev9d901792016-07-15 15:58:58 +0300212std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
213{
214 std::string labelName;
215 if (label != nullptr)
216 {
217 size_t labelLength = length < 0 ? strlen(label) : length;
218 labelName = std::string(label, labelLength);
219 }
220 return labelName;
221}
222
223void GetObjectLabelBase(const std::string &objectLabel,
224 GLsizei bufSize,
225 GLsizei *length,
226 GLchar *label)
227{
228 size_t writeLength = objectLabel.length();
229 if (label != nullptr && bufSize > 0)
230 {
231 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
232 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
233 label[writeLength] = '\0';
234 }
235
236 if (length != nullptr)
237 {
238 *length = static_cast<GLsizei>(writeLength);
239 }
240}
241
Geoff Langf6db0982015-08-25 13:04:00 -0400242} // anonymous namespace
243
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000244namespace gl
245{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000246
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400247Context::Context(rx::EGLImplFactory *implFactory,
248 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400249 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500250 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400251 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500252 const egl::AttributeMap &attribs,
Jamie Madill948bbe52017-06-01 13:10:42 -0400253 const egl::DisplayExtensions &displayExtensions,
254 bool robustResourceInit)
Martin Radev1be913c2016-07-11 17:59:16 +0300255
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500256 : ValidationContext(shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500257 shareTextures,
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500258 GetClientVersion(attribs),
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700259 &mGLState,
Jamie Madillf25855c2015-11-03 11:06:18 -0500260 mCaps,
261 mTextureCaps,
262 mExtensions,
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500263 mLimitations,
264 GetNoError(attribs)),
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700265 mImplementation(implFactory->createContext(mState)),
Jamie Madill2f348d22017-06-05 10:50:59 -0400266 mCompiler(),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400267 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500268 mClientType(EGL_OPENGL_ES_API),
269 mHasBeenCurrent(false),
270 mContextLost(false),
271 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700272 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500273 mResetStrategy(GetResetStrategy(attribs)),
274 mRobustAccess(GetRobustAccess(attribs)),
Jamie Madill61e16b42017-06-19 11:13:23 -0400275 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
276 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500277 mSurfacelessFramebuffer(nullptr),
Jamie Madille14951e2017-03-09 18:55:16 -0500278 mWebGLContext(GetWebGLContext(attribs)),
Jamie Madill32447362017-06-28 14:53:52 -0400279 mMemoryProgramCache(memoryProgramCache),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400280 mScratchBuffer(1000u),
281 mZeroFilledBuffer(1000u)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000282{
Geoff Lang077f20a2016-11-01 10:08:02 -0400283 if (mRobustAccess)
284 {
285 UNIMPLEMENTED();
286 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000287
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500288 initCaps(displayExtensions);
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700289 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400290
Jamie Madill4928b7c2017-06-20 12:57:39 -0400291 mGLState.initialize(this, GetDebug(attribs), GetBindGeneratesResource(attribs),
Jamie Madillc43be722017-07-13 16:22:14 -0400292 GetClientArraysEnabled(attribs), robustResourceInit,
293 mMemoryProgramCache != nullptr);
Régis Fénéon83107972015-02-05 12:57:44 +0100294
Shannon Woods53a94a82014-06-24 15:20:36 -0400295 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400296
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000297 // [OpenGL ES 2.0.24] section 3.7 page 83:
298 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have twodimensional
299 // and cube map texture state vectors respectively associated with them.
300 // In order that access to these initial textures not be lost, they are treated as texture
301 // objects all of whose names are 0.
302
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400303 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, GL_TEXTURE_2D);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400304 mZeroTextures[GL_TEXTURE_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500305
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400306 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, GL_TEXTURE_CUBE_MAP);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400307 mZeroTextures[GL_TEXTURE_CUBE_MAP].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400308
Geoff Langeb66a6e2016-10-31 13:06:12 -0400309 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400310 {
311 // TODO: These could also be enabled via extension
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400312 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, GL_TEXTURE_3D);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400313 mZeroTextures[GL_TEXTURE_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400314
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400315 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, GL_TEXTURE_2D_ARRAY);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400316 mZeroTextures[GL_TEXTURE_2D_ARRAY].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400317 }
Geoff Lang3b573612016-10-31 14:08:10 -0400318 if (getClientVersion() >= Version(3, 1))
319 {
320 Texture *zeroTexture2DMultisample =
321 new Texture(mImplementation.get(), 0, GL_TEXTURE_2D_MULTISAMPLE);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400322 mZeroTextures[GL_TEXTURE_2D_MULTISAMPLE].set(this, zeroTexture2DMultisample);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800323
324 bindGenericAtomicCounterBuffer(0);
325 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
326 {
327 bindIndexedAtomicCounterBuffer(0, i, 0, 0);
328 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800329
330 bindGenericShaderStorageBuffer(0);
331 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
332 {
333 bindIndexedShaderStorageBuffer(0, i, 0, 0);
334 }
Geoff Lang3b573612016-10-31 14:08:10 -0400335 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000336
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400337 if (mExtensions.textureRectangle)
338 {
339 Texture *zeroTextureRectangle =
340 new Texture(mImplementation.get(), 0, GL_TEXTURE_RECTANGLE_ANGLE);
341 mZeroTextures[GL_TEXTURE_RECTANGLE_ANGLE].set(this, zeroTextureRectangle);
342 }
343
Ian Ewellbda75592016-04-18 17:25:54 -0400344 if (mExtensions.eglImageExternal || mExtensions.eglStreamConsumerExternal)
345 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400346 Texture *zeroTextureExternal =
347 new Texture(mImplementation.get(), 0, GL_TEXTURE_EXTERNAL_OES);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400348 mZeroTextures[GL_TEXTURE_EXTERNAL_OES].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400349 }
350
Jamie Madill4928b7c2017-06-20 12:57:39 -0400351 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500352
Jamie Madill57a89722013-07-02 11:57:03 -0400353 bindVertexArray(0);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000354 bindArrayBuffer(0);
Jiajia Qin9d7d0b12016-11-29 16:30:31 +0800355 bindDrawIndirectBuffer(0);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000356 bindElementArrayBuffer(0);
Geoff Lang76b10c92014-09-05 16:28:14 -0400357
Jamie Madill01a80ee2016-11-07 12:06:18 -0500358 bindRenderbuffer(GL_RENDERBUFFER, 0);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000359
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000360 bindGenericUniformBuffer(0);
Geoff Lang4dc3af02016-11-18 14:09:27 -0500361 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000362 {
363 bindIndexedUniformBuffer(0, i, 0, -1);
364 }
365
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000366 bindCopyReadBuffer(0);
367 bindCopyWriteBuffer(0);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000368 bindPixelPackBuffer(0);
369 bindPixelUnpackBuffer(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000370
Geoff Langeb66a6e2016-10-31 13:06:12 -0400371 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400372 {
373 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
374 // In the initial state, a default transform feedback object is bound and treated as
375 // a transform feedback object with a name of zero. That object is bound any time
376 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400377 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400378 }
Geoff Langc8058452014-02-03 12:04:11 -0500379
Jamie Madillad9f24e2016-02-12 09:27:24 -0500380 // Initialize dirty bit masks
381 // TODO(jmadill): additional ES3 state
382 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_ALIGNMENT);
383 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_ROW_LENGTH);
384 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_IMAGE_HEIGHT);
385 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_IMAGES);
386 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_ROWS);
387 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_PIXELS);
Corentin Wallezbbd663a2016-04-20 17:49:17 -0400388 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500389 // No dirty objects.
390
391 // Readpixels uses the pack state and read FBO
392 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_ALIGNMENT);
393 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_REVERSE_ROW_ORDER);
394 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_ROW_LENGTH);
395 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_SKIP_ROWS);
396 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_SKIP_PIXELS);
Corentin Wallezbbd663a2016-04-20 17:49:17 -0400397 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500398 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
399
400 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
401 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
402 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
403 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
404 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
405 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
406 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
407 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
408 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
409 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
410 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
411 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
412
413 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
414 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700415 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500416 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
417 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400418
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400419 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000420}
421
Jamie Madill4928b7c2017-06-20 12:57:39 -0400422egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000423{
Corentin Wallez80b24112015-08-25 16:41:57 -0400424 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000425 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400426 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000427 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400428 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000429
Corentin Wallez80b24112015-08-25 16:41:57 -0400430 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000431 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400432 if (query.second != nullptr)
433 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400434 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400435 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000436 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400437 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000438
Corentin Wallez80b24112015-08-25 16:41:57 -0400439 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400440 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400441 if (vertexArray.second)
442 {
443 vertexArray.second->onDestroy(this);
444 }
Jamie Madill57a89722013-07-02 11:57:03 -0400445 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400446 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400447
Corentin Wallez80b24112015-08-25 16:41:57 -0400448 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500449 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500450 if (transformFeedback.second != nullptr)
451 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500452 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500453 }
Geoff Langc8058452014-02-03 12:04:11 -0500454 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400455 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500456
Jamie Madilldedd7b92014-11-05 16:30:36 -0500457 for (auto &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400458 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400459 zeroTexture.second->onDestroy(this);
460 zeroTexture.second.set(this, nullptr);
Geoff Lang76b10c92014-09-05 16:28:14 -0400461 }
462 mZeroTextures.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000463
Corentin Wallezccab69d2017-01-27 16:57:15 -0500464 SafeDelete(mSurfacelessFramebuffer);
465
Jamie Madill4928b7c2017-06-20 12:57:39 -0400466 ANGLE_TRY(releaseSurface(display));
Jamie Madill2f348d22017-06-05 10:50:59 -0400467 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500468
Jamie Madill4928b7c2017-06-20 12:57:39 -0400469 mGLState.reset(this);
470
Jamie Madill6c1f6712017-02-14 19:08:04 -0500471 mState.mBuffers->release(this);
472 mState.mShaderPrograms->release(this);
473 mState.mTextures->release(this);
474 mState.mRenderbuffers->release(this);
475 mState.mSamplers->release(this);
476 mState.mFenceSyncs->release(this);
477 mState.mPaths->release(this);
478 mState.mFramebuffers->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400479
480 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000481}
482
Jamie Madill70ee0f62017-02-06 16:04:20 -0500483Context::~Context()
484{
485}
486
Jamie Madill4928b7c2017-06-20 12:57:39 -0400487egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000488{
Jamie Madill61e16b42017-06-19 11:13:23 -0400489 mCurrentDisplay = display;
490
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000491 if (!mHasBeenCurrent)
492 {
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000493 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500494 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400495 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000496
Corentin Wallezc295e512017-01-27 17:47:50 -0500497 int width = 0;
498 int height = 0;
499 if (surface != nullptr)
500 {
501 width = surface->getWidth();
502 height = surface->getHeight();
503 }
504
505 mGLState.setViewportParams(0, 0, width, height);
506 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000507
508 mHasBeenCurrent = true;
509 }
510
Jamie Madill1b94d432015-08-07 13:23:23 -0400511 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700512 mGLState.setAllDirtyBits();
Jamie Madill1b94d432015-08-07 13:23:23 -0400513
Jamie Madill4928b7c2017-06-20 12:57:39 -0400514 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500515
516 Framebuffer *newDefault = nullptr;
517 if (surface != nullptr)
518 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400519 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500520 mCurrentSurface = surface;
521 newDefault = surface->getDefaultFramebuffer();
522 }
523 else
524 {
525 if (mSurfacelessFramebuffer == nullptr)
526 {
527 mSurfacelessFramebuffer = new Framebuffer(mImplementation.get());
528 }
529
530 newDefault = mSurfacelessFramebuffer;
531 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000532
Corentin Wallez37c39792015-08-20 14:19:46 -0400533 // Update default framebuffer, the binding of the previous default
534 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400535 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700536 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400537 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700538 mGLState.setReadFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400539 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700540 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400541 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700542 mGLState.setDrawFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400543 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500544 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400545 }
Ian Ewell292f0052016-02-04 10:37:32 -0500546
547 // Notify the renderer of a context switch
Jamie Madill4928b7c2017-06-20 12:57:39 -0400548 mImplementation->onMakeCurrent(this);
549 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000550}
551
Jamie Madill4928b7c2017-06-20 12:57:39 -0400552egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400553{
Corentin Wallez37c39792015-08-20 14:19:46 -0400554 // Remove the default framebuffer
Corentin Wallezc295e512017-01-27 17:47:50 -0500555 Framebuffer *currentDefault = nullptr;
556 if (mCurrentSurface != nullptr)
Corentin Wallez51706ea2015-08-07 14:39:22 -0400557 {
Corentin Wallezc295e512017-01-27 17:47:50 -0500558 currentDefault = mCurrentSurface->getDefaultFramebuffer();
559 }
560 else if (mSurfacelessFramebuffer != nullptr)
561 {
562 currentDefault = mSurfacelessFramebuffer;
Corentin Wallez51706ea2015-08-07 14:39:22 -0400563 }
564
Corentin Wallezc295e512017-01-27 17:47:50 -0500565 if (mGLState.getReadFramebuffer() == currentDefault)
566 {
567 mGLState.setReadFramebufferBinding(nullptr);
568 }
569 if (mGLState.getDrawFramebuffer() == currentDefault)
570 {
571 mGLState.setDrawFramebufferBinding(nullptr);
572 }
573 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
574
575 if (mCurrentSurface)
576 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400577 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500578 mCurrentSurface = nullptr;
579 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400580
581 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400582}
583
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000584GLuint Context::createBuffer()
585{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500586 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000587}
588
589GLuint Context::createProgram()
590{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500591 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000592}
593
594GLuint Context::createShader(GLenum type)
595{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500596 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000597}
598
599GLuint Context::createTexture()
600{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500601 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000602}
603
604GLuint Context::createRenderbuffer()
605{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500606 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000607}
608
Geoff Lang882033e2014-09-30 11:26:07 -0400609GLsync Context::createFenceSync()
Jamie Madillcd055f82013-07-26 11:55:15 -0400610{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500611 GLuint handle = mState.mFenceSyncs->createFenceSync(mImplementation.get());
Jamie Madillcd055f82013-07-26 11:55:15 -0400612
Cooper Partind8e62a32015-01-29 15:21:25 -0800613 return reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madillcd055f82013-07-26 11:55:15 -0400614}
615
Sami Väisänene45e53b2016-05-25 10:36:04 +0300616GLuint Context::createPaths(GLsizei range)
617{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500618 auto resultOrError = mState.mPaths->createPaths(mImplementation.get(), range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300619 if (resultOrError.isError())
620 {
621 handleError(resultOrError.getError());
622 return 0;
623 }
624 return resultOrError.getResult();
625}
626
Jamie Madilldc356042013-07-19 16:36:57 -0400627GLuint Context::createSampler()
628{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500629 return mState.mSamplers->createSampler();
Jamie Madilldc356042013-07-19 16:36:57 -0400630}
631
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000632// Returns an unused framebuffer name
633GLuint Context::createFramebuffer()
634{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500635 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000636}
637
Jamie Madill33dc8432013-07-26 11:55:05 -0400638GLuint Context::createFenceNV()
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000639{
Jamie Madill33dc8432013-07-26 11:55:05 -0400640 GLuint handle = mFenceNVHandleAllocator.allocate();
Jamie Madill96a483b2017-06-27 16:49:21 -0400641 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000642 return handle;
643}
644
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000645void Context::deleteBuffer(GLuint buffer)
646{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500647 if (mState.mBuffers->getBuffer(buffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000648 {
649 detachBuffer(buffer);
650 }
Jamie Madill893ab082014-05-16 16:56:10 -0400651
Jamie Madill6c1f6712017-02-14 19:08:04 -0500652 mState.mBuffers->deleteObject(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000653}
654
655void Context::deleteShader(GLuint shader)
656{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500657 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000658}
659
660void Context::deleteProgram(GLuint program)
661{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500662 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000663}
664
665void Context::deleteTexture(GLuint texture)
666{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500667 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000668 {
669 detachTexture(texture);
670 }
671
Jamie Madill6c1f6712017-02-14 19:08:04 -0500672 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000673}
674
675void Context::deleteRenderbuffer(GLuint renderbuffer)
676{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500677 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000678 {
679 detachRenderbuffer(renderbuffer);
680 }
Jamie Madill893ab082014-05-16 16:56:10 -0400681
Jamie Madill6c1f6712017-02-14 19:08:04 -0500682 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000683}
684
Jamie Madillcd055f82013-07-26 11:55:15 -0400685void Context::deleteFenceSync(GLsync fenceSync)
686{
687 // The spec specifies the underlying Fence object is not deleted until all current
688 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
689 // and since our API is currently designed for being called from a single thread, we can delete
690 // the fence immediately.
Jamie Madill6c1f6712017-02-14 19:08:04 -0500691 mState.mFenceSyncs->deleteObject(this,
692 static_cast<GLuint>(reinterpret_cast<uintptr_t>(fenceSync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400693}
694
Sami Väisänene45e53b2016-05-25 10:36:04 +0300695void Context::deletePaths(GLuint first, GLsizei range)
696{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500697 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300698}
699
700bool Context::hasPathData(GLuint path) const
701{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500702 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300703 if (pathObj == nullptr)
704 return false;
705
706 return pathObj->hasPathData();
707}
708
709bool Context::hasPath(GLuint path) const
710{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500711 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300712}
713
714void Context::setPathCommands(GLuint path,
715 GLsizei numCommands,
716 const GLubyte *commands,
717 GLsizei numCoords,
718 GLenum coordType,
719 const void *coords)
720{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500721 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300722
723 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
724}
725
726void Context::setPathParameterf(GLuint path, GLenum pname, GLfloat value)
727{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500728 auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300729
730 switch (pname)
731 {
732 case GL_PATH_STROKE_WIDTH_CHROMIUM:
733 pathObj->setStrokeWidth(value);
734 break;
735 case GL_PATH_END_CAPS_CHROMIUM:
736 pathObj->setEndCaps(static_cast<GLenum>(value));
737 break;
738 case GL_PATH_JOIN_STYLE_CHROMIUM:
739 pathObj->setJoinStyle(static_cast<GLenum>(value));
740 break;
741 case GL_PATH_MITER_LIMIT_CHROMIUM:
742 pathObj->setMiterLimit(value);
743 break;
744 case GL_PATH_STROKE_BOUND_CHROMIUM:
745 pathObj->setStrokeBound(value);
746 break;
747 default:
748 UNREACHABLE();
749 break;
750 }
751}
752
753void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value) const
754{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500755 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300756
757 switch (pname)
758 {
759 case GL_PATH_STROKE_WIDTH_CHROMIUM:
760 *value = pathObj->getStrokeWidth();
761 break;
762 case GL_PATH_END_CAPS_CHROMIUM:
763 *value = static_cast<GLfloat>(pathObj->getEndCaps());
764 break;
765 case GL_PATH_JOIN_STYLE_CHROMIUM:
766 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
767 break;
768 case GL_PATH_MITER_LIMIT_CHROMIUM:
769 *value = pathObj->getMiterLimit();
770 break;
771 case GL_PATH_STROKE_BOUND_CHROMIUM:
772 *value = pathObj->getStrokeBound();
773 break;
774 default:
775 UNREACHABLE();
776 break;
777 }
778}
779
780void Context::setPathStencilFunc(GLenum func, GLint ref, GLuint mask)
781{
782 mGLState.setPathStencilFunc(func, ref, mask);
783}
784
Jamie Madilldc356042013-07-19 16:36:57 -0400785void Context::deleteSampler(GLuint sampler)
786{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500787 if (mState.mSamplers->getSampler(sampler))
Jamie Madilldc356042013-07-19 16:36:57 -0400788 {
789 detachSampler(sampler);
790 }
791
Jamie Madill6c1f6712017-02-14 19:08:04 -0500792 mState.mSamplers->deleteObject(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -0400793}
794
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000795void Context::deleteFramebuffer(GLuint framebuffer)
796{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500797 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000798 {
799 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000800 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500801
Jamie Madill6c1f6712017-02-14 19:08:04 -0500802 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000803}
804
Jamie Madill33dc8432013-07-26 11:55:05 -0400805void Context::deleteFenceNV(GLuint fence)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000806{
Jamie Madill96a483b2017-06-27 16:49:21 -0400807 FenceNV *fenceObject = nullptr;
808 if (mFenceNVMap.erase(fence, &fenceObject))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000809 {
Jamie Madill96a483b2017-06-27 16:49:21 -0400810 mFenceNVHandleAllocator.release(fence);
811 delete fenceObject;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000812 }
813}
814
Geoff Lang70d0f492015-12-10 17:45:46 -0500815Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000816{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500817 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000818}
819
Jamie Madill570f7c82014-07-03 10:38:54 -0400820Texture *Context::getTexture(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000821{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500822 return mState.mTextures->getTexture(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000823}
824
Geoff Lang70d0f492015-12-10 17:45:46 -0500825Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000826{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500827 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000828}
829
Jamie Madillcd055f82013-07-26 11:55:15 -0400830FenceSync *Context::getFenceSync(GLsync handle) const
831{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500832 return mState.mFenceSyncs->getFenceSync(
833 static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400834}
835
Jamie Madill57a89722013-07-02 11:57:03 -0400836VertexArray *Context::getVertexArray(GLuint handle) const
837{
Jamie Madill96a483b2017-06-27 16:49:21 -0400838 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400839}
840
Jamie Madilldc356042013-07-19 16:36:57 -0400841Sampler *Context::getSampler(GLuint handle) const
842{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500843 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -0400844}
845
Geoff Langc8058452014-02-03 12:04:11 -0500846TransformFeedback *Context::getTransformFeedback(GLuint handle) const
847{
Jamie Madill96a483b2017-06-27 16:49:21 -0400848 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -0500849}
850
Geoff Lang70d0f492015-12-10 17:45:46 -0500851LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
852{
853 switch (identifier)
854 {
855 case GL_BUFFER:
856 return getBuffer(name);
857 case GL_SHADER:
858 return getShader(name);
859 case GL_PROGRAM:
860 return getProgram(name);
861 case GL_VERTEX_ARRAY:
862 return getVertexArray(name);
863 case GL_QUERY:
864 return getQuery(name);
865 case GL_TRANSFORM_FEEDBACK:
866 return getTransformFeedback(name);
867 case GL_SAMPLER:
868 return getSampler(name);
869 case GL_TEXTURE:
870 return getTexture(name);
871 case GL_RENDERBUFFER:
872 return getRenderbuffer(name);
873 case GL_FRAMEBUFFER:
874 return getFramebuffer(name);
875 default:
876 UNREACHABLE();
877 return nullptr;
878 }
879}
880
881LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
882{
883 return getFenceSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
884}
885
Martin Radev9d901792016-07-15 15:58:58 +0300886void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
887{
888 LabeledObject *object = getLabeledObject(identifier, name);
889 ASSERT(object != nullptr);
890
891 std::string labelName = GetObjectLabelFromPointer(length, label);
892 object->setLabel(labelName);
893}
894
895void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
896{
897 LabeledObject *object = getLabeledObjectFromPtr(ptr);
898 ASSERT(object != nullptr);
899
900 std::string labelName = GetObjectLabelFromPointer(length, label);
901 object->setLabel(labelName);
902}
903
904void Context::getObjectLabel(GLenum identifier,
905 GLuint name,
906 GLsizei bufSize,
907 GLsizei *length,
908 GLchar *label) const
909{
910 LabeledObject *object = getLabeledObject(identifier, name);
911 ASSERT(object != nullptr);
912
913 const std::string &objectLabel = object->getLabel();
914 GetObjectLabelBase(objectLabel, bufSize, length, label);
915}
916
917void Context::getObjectPtrLabel(const void *ptr,
918 GLsizei bufSize,
919 GLsizei *length,
920 GLchar *label) const
921{
922 LabeledObject *object = getLabeledObjectFromPtr(ptr);
923 ASSERT(object != nullptr);
924
925 const std::string &objectLabel = object->getLabel();
926 GetObjectLabelBase(objectLabel, bufSize, length, label);
927}
928
Jamie Madilldc356042013-07-19 16:36:57 -0400929bool Context::isSampler(GLuint samplerName) const
930{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500931 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -0400932}
933
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500934void Context::bindArrayBuffer(GLuint bufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000935{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500936 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400937 mGLState.setArrayBufferBinding(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000938}
939
Jiajia Qin9d7d0b12016-11-29 16:30:31 +0800940void Context::bindDrawIndirectBuffer(GLuint bufferHandle)
941{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500942 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400943 mGLState.setDrawIndirectBufferBinding(this, buffer);
Jiajia Qin9d7d0b12016-11-29 16:30:31 +0800944}
945
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500946void Context::bindElementArrayBuffer(GLuint bufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000947{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500948 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400949 mGLState.setElementArrayBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000950}
951
Jamie Madilldedd7b92014-11-05 16:30:36 -0500952void Context::bindTexture(GLenum target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000953{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500954 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000955
Jamie Madilldedd7b92014-11-05 16:30:36 -0500956 if (handle == 0)
957 {
958 texture = mZeroTextures[target].get();
959 }
960 else
961 {
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500962 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500963 }
964
965 ASSERT(texture);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400966 mGLState.setSamplerTexture(this, target, texture);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000967}
968
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500969void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000970{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500971 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
972 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700973 mGLState.setReadFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000974}
975
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500976void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000977{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500978 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
979 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700980 mGLState.setDrawFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000981}
982
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500983void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -0400984{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500985 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700986 mGLState.setVertexArrayBinding(vertexArray);
Jamie Madill57a89722013-07-02 11:57:03 -0400987}
988
Shao80957d92017-02-20 21:25:59 +0800989void Context::bindVertexBuffer(GLuint bindingIndex,
990 GLuint bufferHandle,
991 GLintptr offset,
992 GLsizei stride)
993{
994 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400995 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Shao80957d92017-02-20 21:25:59 +0800996}
997
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500998void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -0400999{
Geoff Lang76b10c92014-09-05 16:28:14 -04001000 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001001 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001002 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001003 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001004}
1005
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001006void Context::bindImageTexture(GLuint unit,
1007 GLuint texture,
1008 GLint level,
1009 GLboolean layered,
1010 GLint layer,
1011 GLenum access,
1012 GLenum format)
1013{
1014 Texture *tex = mState.mTextures->getTexture(texture);
1015 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1016}
1017
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001018void Context::bindGenericUniformBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001019{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001020 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001021 mGLState.setGenericUniformBufferBinding(this, buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001022}
1023
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001024void Context::bindIndexedUniformBuffer(GLuint bufferHandle,
1025 GLuint index,
1026 GLintptr offset,
1027 GLsizeiptr size)
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +00001028{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001029 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001030 mGLState.setIndexedUniformBufferBinding(this, index, buffer, offset, size);
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +00001031}
1032
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001033void Context::bindGenericTransformFeedbackBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001034{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001035 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001036 mGLState.getCurrentTransformFeedback()->bindGenericBuffer(this, buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001037}
1038
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001039void Context::bindIndexedTransformFeedbackBuffer(GLuint bufferHandle,
1040 GLuint index,
1041 GLintptr offset,
1042 GLsizeiptr size)
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +00001043{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001044 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001045 mGLState.getCurrentTransformFeedback()->bindIndexedBuffer(this, index, buffer, offset, size);
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +00001046}
1047
Jiajia Qin6eafb042016-12-27 17:04:07 +08001048void Context::bindGenericAtomicCounterBuffer(GLuint bufferHandle)
1049{
1050 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001051 mGLState.setGenericAtomicCounterBufferBinding(this, buffer);
Jiajia Qin6eafb042016-12-27 17:04:07 +08001052}
1053
1054void Context::bindIndexedAtomicCounterBuffer(GLuint bufferHandle,
1055 GLuint index,
1056 GLintptr offset,
1057 GLsizeiptr size)
1058{
1059 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001060 mGLState.setIndexedAtomicCounterBufferBinding(this, index, buffer, offset, size);
Jiajia Qin6eafb042016-12-27 17:04:07 +08001061}
1062
Jiajia Qinf546e7d2017-03-27 14:12:59 +08001063void Context::bindGenericShaderStorageBuffer(GLuint bufferHandle)
1064{
1065 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001066 mGLState.setGenericShaderStorageBufferBinding(this, buffer);
Jiajia Qinf546e7d2017-03-27 14:12:59 +08001067}
1068
1069void Context::bindIndexedShaderStorageBuffer(GLuint bufferHandle,
1070 GLuint index,
1071 GLintptr offset,
1072 GLsizeiptr size)
1073{
1074 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001075 mGLState.setIndexedShaderStorageBufferBinding(this, index, buffer, offset, size);
Jiajia Qinf546e7d2017-03-27 14:12:59 +08001076}
1077
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001078void Context::bindCopyReadBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001079{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001080 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001081 mGLState.setCopyReadBufferBinding(this, buffer);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001082}
1083
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001084void Context::bindCopyWriteBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001085{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001086 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001087 mGLState.setCopyWriteBufferBinding(this, buffer);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001088}
1089
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001090void Context::bindPixelPackBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001091{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001092 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001093 mGLState.setPixelPackBufferBinding(this, buffer);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001094}
1095
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001096void Context::bindPixelUnpackBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001097{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001098 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001099 mGLState.setPixelUnpackBufferBinding(this, buffer);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001100}
1101
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001102void Context::useProgram(GLuint program)
1103{
Jamie Madill6c1f6712017-02-14 19:08:04 -05001104 mGLState.setProgram(this, getProgram(program));
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001105}
1106
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001107void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001108{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001109 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001110 TransformFeedback *transformFeedback =
1111 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001112 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -05001113}
1114
Jamie Madillf0e04492017-08-26 15:28:42 -04001115void Context::beginQuery(GLenum target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001116{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001117 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001118 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001119
Geoff Lang5aad9672014-09-08 11:10:42 -04001120 // begin query
Jamie Madillf0e04492017-08-26 15:28:42 -04001121 ANGLE_CONTEXT_TRY(queryObject->begin());
Geoff Lang5aad9672014-09-08 11:10:42 -04001122
1123 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001124 mGLState.setActiveQuery(this, target, queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001125}
1126
Jamie Madillf0e04492017-08-26 15:28:42 -04001127void Context::endQuery(GLenum target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001128{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001129 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001130 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001131
Jamie Madillf0e04492017-08-26 15:28:42 -04001132 handleError(queryObject->end());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001133
Geoff Lang5aad9672014-09-08 11:10:42 -04001134 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001135 mGLState.setActiveQuery(this, target, nullptr);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001136}
1137
Jamie Madillf0e04492017-08-26 15:28:42 -04001138void Context::queryCounter(GLuint id, GLenum target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001139{
1140 ASSERT(target == GL_TIMESTAMP_EXT);
1141
1142 Query *queryObject = getQuery(id, true, target);
1143 ASSERT(queryObject);
1144
Jamie Madillf0e04492017-08-26 15:28:42 -04001145 handleError(queryObject->queryCounter());
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001146}
1147
1148void Context::getQueryiv(GLenum target, GLenum pname, GLint *params)
1149{
1150 switch (pname)
1151 {
1152 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001153 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001154 break;
1155 case GL_QUERY_COUNTER_BITS_EXT:
1156 switch (target)
1157 {
1158 case GL_TIME_ELAPSED_EXT:
1159 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1160 break;
1161 case GL_TIMESTAMP_EXT:
1162 params[0] = getExtensions().queryCounterBitsTimestamp;
1163 break;
1164 default:
1165 UNREACHABLE();
1166 params[0] = 0;
1167 break;
1168 }
1169 break;
1170 default:
1171 UNREACHABLE();
1172 return;
1173 }
1174}
1175
Geoff Lang2186c382016-10-14 10:54:54 -04001176void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001177{
Geoff Lang2186c382016-10-14 10:54:54 -04001178 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001179}
1180
Geoff Lang2186c382016-10-14 10:54:54 -04001181void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001182{
Geoff Lang2186c382016-10-14 10:54:54 -04001183 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001184}
1185
Geoff Lang2186c382016-10-14 10:54:54 -04001186void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001187{
Geoff Lang2186c382016-10-14 10:54:54 -04001188 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001189}
1190
Geoff Lang2186c382016-10-14 10:54:54 -04001191void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001192{
Geoff Lang2186c382016-10-14 10:54:54 -04001193 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001194}
1195
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001196Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001197{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001198 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001199}
1200
Jamie Madill2f348d22017-06-05 10:50:59 -04001201FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001202{
Jamie Madill96a483b2017-06-27 16:49:21 -04001203 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001204}
1205
Jamie Madill2f348d22017-06-05 10:50:59 -04001206Query *Context::getQuery(GLuint handle, bool create, GLenum type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001207{
Jamie Madill96a483b2017-06-27 16:49:21 -04001208 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001209 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001210 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001211 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001212
1213 Query *query = mQueryMap.query(handle);
1214 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001215 {
Jamie Madill96a483b2017-06-27 16:49:21 -04001216 query = new Query(mImplementation->createQuery(type), handle);
1217 query->addRef();
1218 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001219 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001220 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001221}
1222
Geoff Lang70d0f492015-12-10 17:45:46 -05001223Query *Context::getQuery(GLuint handle) const
1224{
Jamie Madill96a483b2017-06-27 16:49:21 -04001225 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001226}
1227
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001228Texture *Context::getTargetTexture(GLenum target) const
1229{
Ian Ewellbda75592016-04-18 17:25:54 -04001230 ASSERT(ValidTextureTarget(this, target) || ValidTextureExternalTarget(this, target));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001231 return mGLState.getTargetTexture(target);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001232}
1233
Geoff Lang76b10c92014-09-05 16:28:14 -04001234Texture *Context::getSamplerTexture(unsigned int sampler, GLenum type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001235{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001236 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001237}
1238
Geoff Lang492a7e42014-11-05 13:27:06 -05001239Compiler *Context::getCompiler() const
1240{
Jamie Madill2f348d22017-06-05 10:50:59 -04001241 if (mCompiler.get() == nullptr)
1242 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001243 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001244 }
1245 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001246}
1247
Jamie Madillc1d770e2017-04-13 17:31:24 -04001248void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001249{
1250 switch (pname)
1251 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001252 case GL_SHADER_COMPILER:
1253 *params = GL_TRUE;
1254 break;
1255 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1256 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1257 break;
1258 default:
1259 mGLState.getBooleanv(pname, params);
1260 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001261 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001262}
1263
Jamie Madillc1d770e2017-04-13 17:31:24 -04001264void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001265{
Shannon Woods53a94a82014-06-24 15:20:36 -04001266 // Queries about context capabilities and maximums are answered by Context.
1267 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001268 switch (pname)
1269 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001270 case GL_ALIASED_LINE_WIDTH_RANGE:
1271 params[0] = mCaps.minAliasedLineWidth;
1272 params[1] = mCaps.maxAliasedLineWidth;
1273 break;
1274 case GL_ALIASED_POINT_SIZE_RANGE:
1275 params[0] = mCaps.minAliasedPointSize;
1276 params[1] = mCaps.maxAliasedPointSize;
1277 break;
1278 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1279 ASSERT(mExtensions.textureFilterAnisotropic);
1280 *params = mExtensions.maxTextureAnisotropy;
1281 break;
1282 case GL_MAX_TEXTURE_LOD_BIAS:
1283 *params = mCaps.maxLODBias;
1284 break;
1285
1286 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1287 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1288 {
1289 ASSERT(mExtensions.pathRendering);
1290 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1291 memcpy(params, m, 16 * sizeof(GLfloat));
1292 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001293 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001294
Jamie Madill231c7f52017-04-26 13:45:37 -04001295 default:
1296 mGLState.getFloatv(pname, params);
1297 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001298 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001299}
1300
Jamie Madillc1d770e2017-04-13 17:31:24 -04001301void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001302{
Shannon Woods53a94a82014-06-24 15:20:36 -04001303 // Queries about context capabilities and maximums are answered by Context.
1304 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001305
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001306 switch (pname)
1307 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001308 case GL_MAX_VERTEX_ATTRIBS:
1309 *params = mCaps.maxVertexAttributes;
1310 break;
1311 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1312 *params = mCaps.maxVertexUniformVectors;
1313 break;
1314 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
1315 *params = mCaps.maxVertexUniformComponents;
1316 break;
1317 case GL_MAX_VARYING_VECTORS:
1318 *params = mCaps.maxVaryingVectors;
1319 break;
1320 case GL_MAX_VARYING_COMPONENTS:
1321 *params = mCaps.maxVertexOutputComponents;
1322 break;
1323 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1324 *params = mCaps.maxCombinedTextureImageUnits;
1325 break;
1326 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
1327 *params = mCaps.maxVertexTextureImageUnits;
1328 break;
1329 case GL_MAX_TEXTURE_IMAGE_UNITS:
1330 *params = mCaps.maxTextureImageUnits;
1331 break;
1332 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1333 *params = mCaps.maxFragmentUniformVectors;
1334 break;
1335 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
1336 *params = mCaps.maxFragmentUniformComponents;
1337 break;
1338 case GL_MAX_RENDERBUFFER_SIZE:
1339 *params = mCaps.maxRenderbufferSize;
1340 break;
1341 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1342 *params = mCaps.maxColorAttachments;
1343 break;
1344 case GL_MAX_DRAW_BUFFERS_EXT:
1345 *params = mCaps.maxDrawBuffers;
1346 break;
1347 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1348 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1349 case GL_SUBPIXEL_BITS:
1350 *params = 4;
1351 break;
1352 case GL_MAX_TEXTURE_SIZE:
1353 *params = mCaps.max2DTextureSize;
1354 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001355 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1356 *params = mCaps.maxRectangleTextureSize;
1357 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001358 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1359 *params = mCaps.maxCubeMapTextureSize;
1360 break;
1361 case GL_MAX_3D_TEXTURE_SIZE:
1362 *params = mCaps.max3DTextureSize;
1363 break;
1364 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1365 *params = mCaps.maxArrayTextureLayers;
1366 break;
1367 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1368 *params = mCaps.uniformBufferOffsetAlignment;
1369 break;
1370 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1371 *params = mCaps.maxUniformBufferBindings;
1372 break;
1373 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
1374 *params = mCaps.maxVertexUniformBlocks;
1375 break;
1376 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
1377 *params = mCaps.maxFragmentUniformBlocks;
1378 break;
1379 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1380 *params = mCaps.maxCombinedTextureImageUnits;
1381 break;
1382 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1383 *params = mCaps.maxVertexOutputComponents;
1384 break;
1385 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1386 *params = mCaps.maxFragmentInputComponents;
1387 break;
1388 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1389 *params = mCaps.minProgramTexelOffset;
1390 break;
1391 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1392 *params = mCaps.maxProgramTexelOffset;
1393 break;
1394 case GL_MAJOR_VERSION:
1395 *params = getClientVersion().major;
1396 break;
1397 case GL_MINOR_VERSION:
1398 *params = getClientVersion().minor;
1399 break;
1400 case GL_MAX_ELEMENTS_INDICES:
1401 *params = mCaps.maxElementsIndices;
1402 break;
1403 case GL_MAX_ELEMENTS_VERTICES:
1404 *params = mCaps.maxElementsVertices;
1405 break;
1406 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1407 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1408 break;
1409 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1410 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1411 break;
1412 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1413 *params = mCaps.maxTransformFeedbackSeparateComponents;
1414 break;
1415 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1416 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1417 break;
1418 case GL_MAX_SAMPLES_ANGLE:
1419 *params = mCaps.maxSamples;
1420 break;
1421 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001422 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001423 params[0] = mCaps.maxViewportWidth;
1424 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001425 }
1426 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001427 case GL_COMPRESSED_TEXTURE_FORMATS:
1428 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1429 params);
1430 break;
1431 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1432 *params = mResetStrategy;
1433 break;
1434 case GL_NUM_SHADER_BINARY_FORMATS:
1435 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1436 break;
1437 case GL_SHADER_BINARY_FORMATS:
1438 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1439 break;
1440 case GL_NUM_PROGRAM_BINARY_FORMATS:
1441 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1442 break;
1443 case GL_PROGRAM_BINARY_FORMATS:
1444 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1445 break;
1446 case GL_NUM_EXTENSIONS:
1447 *params = static_cast<GLint>(mExtensionStrings.size());
1448 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001449
Jamie Madill231c7f52017-04-26 13:45:37 -04001450 // GL_KHR_debug
1451 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1452 *params = mExtensions.maxDebugMessageLength;
1453 break;
1454 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1455 *params = mExtensions.maxDebugLoggedMessages;
1456 break;
1457 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1458 *params = mExtensions.maxDebugGroupStackDepth;
1459 break;
1460 case GL_MAX_LABEL_LENGTH:
1461 *params = mExtensions.maxLabelLength;
1462 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001463
Martin Radeve5285d22017-07-14 16:23:53 +03001464 // GL_ANGLE_multiview
1465 case GL_MAX_VIEWS_ANGLE:
1466 *params = mExtensions.maxViews;
1467 break;
1468
Jamie Madill231c7f52017-04-26 13:45:37 -04001469 // GL_EXT_disjoint_timer_query
1470 case GL_GPU_DISJOINT_EXT:
1471 *params = mImplementation->getGPUDisjoint();
1472 break;
1473 case GL_MAX_FRAMEBUFFER_WIDTH:
1474 *params = mCaps.maxFramebufferWidth;
1475 break;
1476 case GL_MAX_FRAMEBUFFER_HEIGHT:
1477 *params = mCaps.maxFramebufferHeight;
1478 break;
1479 case GL_MAX_FRAMEBUFFER_SAMPLES:
1480 *params = mCaps.maxFramebufferSamples;
1481 break;
1482 case GL_MAX_SAMPLE_MASK_WORDS:
1483 *params = mCaps.maxSampleMaskWords;
1484 break;
1485 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1486 *params = mCaps.maxColorTextureSamples;
1487 break;
1488 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1489 *params = mCaps.maxDepthTextureSamples;
1490 break;
1491 case GL_MAX_INTEGER_SAMPLES:
1492 *params = mCaps.maxIntegerSamples;
1493 break;
1494 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1495 *params = mCaps.maxVertexAttribRelativeOffset;
1496 break;
1497 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1498 *params = mCaps.maxVertexAttribBindings;
1499 break;
1500 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1501 *params = mCaps.maxVertexAttribStride;
1502 break;
1503 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
1504 *params = mCaps.maxVertexAtomicCounterBuffers;
1505 break;
1506 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
1507 *params = mCaps.maxVertexAtomicCounters;
1508 break;
1509 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
1510 *params = mCaps.maxVertexImageUniforms;
1511 break;
1512 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
1513 *params = mCaps.maxVertexShaderStorageBlocks;
1514 break;
1515 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
1516 *params = mCaps.maxFragmentAtomicCounterBuffers;
1517 break;
1518 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
1519 *params = mCaps.maxFragmentAtomicCounters;
1520 break;
1521 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
1522 *params = mCaps.maxFragmentImageUniforms;
1523 break;
1524 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
1525 *params = mCaps.maxFragmentShaderStorageBlocks;
1526 break;
1527 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1528 *params = mCaps.minProgramTextureGatherOffset;
1529 break;
1530 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1531 *params = mCaps.maxProgramTextureGatherOffset;
1532 break;
1533 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1534 *params = mCaps.maxComputeWorkGroupInvocations;
1535 break;
1536 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
1537 *params = mCaps.maxComputeUniformBlocks;
1538 break;
1539 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
1540 *params = mCaps.maxComputeTextureImageUnits;
1541 break;
1542 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1543 *params = mCaps.maxComputeSharedMemorySize;
1544 break;
1545 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
1546 *params = mCaps.maxComputeUniformComponents;
1547 break;
1548 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
1549 *params = mCaps.maxComputeAtomicCounterBuffers;
1550 break;
1551 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
1552 *params = mCaps.maxComputeAtomicCounters;
1553 break;
1554 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
1555 *params = mCaps.maxComputeImageUniforms;
1556 break;
1557 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
1558 *params = mCaps.maxCombinedComputeUniformComponents;
1559 break;
1560 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
1561 *params = mCaps.maxComputeShaderStorageBlocks;
1562 break;
1563 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1564 *params = mCaps.maxCombinedShaderOutputResources;
1565 break;
1566 case GL_MAX_UNIFORM_LOCATIONS:
1567 *params = mCaps.maxUniformLocations;
1568 break;
1569 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1570 *params = mCaps.maxAtomicCounterBufferBindings;
1571 break;
1572 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1573 *params = mCaps.maxAtomicCounterBufferSize;
1574 break;
1575 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1576 *params = mCaps.maxCombinedAtomicCounterBuffers;
1577 break;
1578 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1579 *params = mCaps.maxCombinedAtomicCounters;
1580 break;
1581 case GL_MAX_IMAGE_UNITS:
1582 *params = mCaps.maxImageUnits;
1583 break;
1584 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1585 *params = mCaps.maxCombinedImageUniforms;
1586 break;
1587 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1588 *params = mCaps.maxShaderStorageBufferBindings;
1589 break;
1590 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1591 *params = mCaps.maxCombinedShaderStorageBlocks;
1592 break;
1593 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1594 *params = mCaps.shaderStorageBufferOffsetAlignment;
1595 break;
1596 default:
1597 mGLState.getIntegerv(this, pname, params);
1598 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001599 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001600}
1601
Jamie Madill893ab082014-05-16 16:56:10 -04001602void Context::getInteger64v(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001603{
Shannon Woods53a94a82014-06-24 15:20:36 -04001604 // Queries about context capabilities and maximums are answered by Context.
1605 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001606 switch (pname)
1607 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001608 case GL_MAX_ELEMENT_INDEX:
1609 *params = mCaps.maxElementIndex;
1610 break;
1611 case GL_MAX_UNIFORM_BLOCK_SIZE:
1612 *params = mCaps.maxUniformBlockSize;
1613 break;
1614 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
1615 *params = mCaps.maxCombinedVertexUniformComponents;
1616 break;
1617 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
1618 *params = mCaps.maxCombinedFragmentUniformComponents;
1619 break;
1620 case GL_MAX_SERVER_WAIT_TIMEOUT:
1621 *params = mCaps.maxServerWaitTimeout;
1622 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001623
Jamie Madill231c7f52017-04-26 13:45:37 -04001624 // GL_EXT_disjoint_timer_query
1625 case GL_TIMESTAMP_EXT:
1626 *params = mImplementation->getTimestamp();
1627 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001628
Jamie Madill231c7f52017-04-26 13:45:37 -04001629 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1630 *params = mCaps.maxShaderStorageBlockSize;
1631 break;
1632 default:
1633 UNREACHABLE();
1634 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001635 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001636}
1637
Geoff Lang70d0f492015-12-10 17:45:46 -05001638void Context::getPointerv(GLenum pname, void **params) const
1639{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001640 mGLState.getPointerv(pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001641}
1642
Martin Radev66fb8202016-07-28 11:45:20 +03001643void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001644{
Shannon Woods53a94a82014-06-24 15:20:36 -04001645 // Queries about context capabilities and maximums are answered by Context.
1646 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001647
1648 GLenum nativeType;
1649 unsigned int numParams;
1650 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1651 ASSERT(queryStatus);
1652
1653 if (nativeType == GL_INT)
1654 {
1655 switch (target)
1656 {
1657 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1658 ASSERT(index < 3u);
1659 *data = mCaps.maxComputeWorkGroupCount[index];
1660 break;
1661 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1662 ASSERT(index < 3u);
1663 *data = mCaps.maxComputeWorkGroupSize[index];
1664 break;
1665 default:
1666 mGLState.getIntegeri_v(target, index, data);
1667 }
1668 }
1669 else
1670 {
1671 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1672 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001673}
1674
Martin Radev66fb8202016-07-28 11:45:20 +03001675void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001676{
Shannon Woods53a94a82014-06-24 15:20:36 -04001677 // Queries about context capabilities and maximums are answered by Context.
1678 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001679
1680 GLenum nativeType;
1681 unsigned int numParams;
1682 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1683 ASSERT(queryStatus);
1684
1685 if (nativeType == GL_INT_64_ANGLEX)
1686 {
1687 mGLState.getInteger64i_v(target, index, data);
1688 }
1689 else
1690 {
1691 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1692 }
1693}
1694
1695void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1696{
1697 // Queries about context capabilities and maximums are answered by Context.
1698 // Queries about current GL state values are answered by State.
1699
1700 GLenum nativeType;
1701 unsigned int numParams;
1702 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1703 ASSERT(queryStatus);
1704
1705 if (nativeType == GL_BOOL)
1706 {
1707 mGLState.getBooleani_v(target, index, data);
1708 }
1709 else
1710 {
1711 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1712 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001713}
1714
He Yunchao010e4db2017-03-03 14:22:06 +08001715void Context::getBufferParameteriv(GLenum target, GLenum pname, GLint *params)
1716{
1717 Buffer *buffer = mGLState.getTargetBuffer(target);
1718 QueryBufferParameteriv(buffer, pname, params);
1719}
1720
1721void Context::getFramebufferAttachmentParameteriv(GLenum target,
1722 GLenum attachment,
1723 GLenum pname,
1724 GLint *params)
1725{
1726 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
1727 QueryFramebufferAttachmentParameteriv(framebuffer, attachment, pname, params);
1728}
1729
1730void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
1731{
1732 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
1733 QueryRenderbufferiv(this, renderbuffer, pname, params);
1734}
1735
1736void Context::getTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
1737{
1738 Texture *texture = getTargetTexture(target);
1739 QueryTexParameterfv(texture, pname, params);
1740}
1741
1742void Context::getTexParameteriv(GLenum target, GLenum pname, GLint *params)
1743{
1744 Texture *texture = getTargetTexture(target);
1745 QueryTexParameteriv(texture, pname, params);
1746}
1747void Context::texParameterf(GLenum target, GLenum pname, GLfloat param)
1748{
1749 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001750 SetTexParameterf(this, texture, pname, param);
He Yunchao010e4db2017-03-03 14:22:06 +08001751}
1752
1753void Context::texParameterfv(GLenum target, GLenum pname, const GLfloat *params)
1754{
1755 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001756 SetTexParameterfv(this, texture, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08001757}
1758
1759void Context::texParameteri(GLenum target, GLenum pname, GLint param)
1760{
1761 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001762 SetTexParameteri(this, texture, pname, param);
He Yunchao010e4db2017-03-03 14:22:06 +08001763}
1764
1765void Context::texParameteriv(GLenum target, GLenum pname, const GLint *params)
1766{
1767 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001768 SetTexParameteriv(this, texture, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08001769}
1770
Jamie Madill675fe712016-12-19 13:07:54 -05001771void Context::drawArrays(GLenum mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001772{
Jamie Madill4c19a8a2017-07-24 11:46:06 -04001773 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04001774 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
1775 MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001776}
1777
Jamie Madill675fe712016-12-19 13:07:54 -05001778void Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04001779{
Jamie Madill4c19a8a2017-07-24 11:46:06 -04001780 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04001781 ANGLE_CONTEXT_TRY(
1782 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
1783 MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
Geoff Langf6db0982015-08-25 13:04:00 -04001784}
1785
Jamie Madill876429b2017-04-20 15:46:24 -04001786void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001787{
Jamie Madill4c19a8a2017-07-24 11:46:06 -04001788 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04001789 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04001790}
1791
Jamie Madill675fe712016-12-19 13:07:54 -05001792void Context::drawElementsInstanced(GLenum mode,
1793 GLsizei count,
1794 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04001795 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04001796 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04001797{
Jamie Madill4c19a8a2017-07-24 11:46:06 -04001798 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04001799 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08001800 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04001801}
1802
Jamie Madill675fe712016-12-19 13:07:54 -05001803void Context::drawRangeElements(GLenum mode,
1804 GLuint start,
1805 GLuint end,
1806 GLsizei count,
1807 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04001808 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04001809{
Jamie Madill4c19a8a2017-07-24 11:46:06 -04001810 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04001811 ANGLE_CONTEXT_TRY(
1812 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001813}
1814
Jamie Madill876429b2017-04-20 15:46:24 -04001815void Context::drawArraysIndirect(GLenum mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08001816{
Jamie Madill4c19a8a2017-07-24 11:46:06 -04001817 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04001818 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08001819}
1820
Jamie Madill876429b2017-04-20 15:46:24 -04001821void Context::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08001822{
Jamie Madill4c19a8a2017-07-24 11:46:06 -04001823 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04001824 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08001825}
1826
Jamie Madill675fe712016-12-19 13:07:54 -05001827void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001828{
Jamie Madill675fe712016-12-19 13:07:54 -05001829 handleError(mImplementation->flush());
Geoff Lang129753a2015-01-09 16:52:09 -05001830}
1831
Jamie Madill675fe712016-12-19 13:07:54 -05001832void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05001833{
Jamie Madill675fe712016-12-19 13:07:54 -05001834 handleError(mImplementation->finish());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001835}
1836
Austin Kinross6ee1e782015-05-29 17:05:37 -07001837void Context::insertEventMarker(GLsizei length, const char *marker)
1838{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001839 ASSERT(mImplementation);
1840 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07001841}
1842
1843void Context::pushGroupMarker(GLsizei length, const char *marker)
1844{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001845 ASSERT(mImplementation);
1846 mImplementation->pushGroupMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07001847}
1848
1849void Context::popGroupMarker()
1850{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001851 ASSERT(mImplementation);
1852 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07001853}
1854
Geoff Langd8605522016-04-13 10:19:12 -04001855void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
1856{
1857 Program *programObject = getProgram(program);
1858 ASSERT(programObject);
1859
1860 programObject->bindUniformLocation(location, name);
1861}
1862
Sami Väisänena797e062016-05-12 15:23:40 +03001863void Context::setCoverageModulation(GLenum components)
1864{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001865 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03001866}
1867
Sami Väisänene45e53b2016-05-25 10:36:04 +03001868void Context::loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix)
1869{
1870 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
1871}
1872
1873void Context::loadPathRenderingIdentityMatrix(GLenum matrixMode)
1874{
1875 GLfloat I[16];
1876 angle::Matrix<GLfloat>::setToIdentity(I);
1877
1878 mGLState.loadPathRenderingMatrix(matrixMode, I);
1879}
1880
1881void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
1882{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001883 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001884 if (!pathObj)
1885 return;
1886
1887 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1888 syncRendererState();
1889
1890 mImplementation->stencilFillPath(pathObj, fillMode, mask);
1891}
1892
1893void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
1894{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001895 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001896 if (!pathObj)
1897 return;
1898
1899 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1900 syncRendererState();
1901
1902 mImplementation->stencilStrokePath(pathObj, reference, mask);
1903}
1904
1905void Context::coverFillPath(GLuint path, GLenum coverMode)
1906{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001907 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001908 if (!pathObj)
1909 return;
1910
1911 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1912 syncRendererState();
1913
1914 mImplementation->coverFillPath(pathObj, coverMode);
1915}
1916
1917void Context::coverStrokePath(GLuint path, GLenum coverMode)
1918{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001919 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001920 if (!pathObj)
1921 return;
1922
1923 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1924 syncRendererState();
1925
1926 mImplementation->coverStrokePath(pathObj, coverMode);
1927}
1928
1929void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
1930{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001931 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001932 if (!pathObj)
1933 return;
1934
1935 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1936 syncRendererState();
1937
1938 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
1939}
1940
1941void Context::stencilThenCoverStrokePath(GLuint path,
1942 GLint reference,
1943 GLuint mask,
1944 GLenum coverMode)
1945{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001946 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001947 if (!pathObj)
1948 return;
1949
1950 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1951 syncRendererState();
1952
1953 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
1954}
1955
Sami Väisänend59ca052016-06-21 16:10:00 +03001956void Context::coverFillPathInstanced(GLsizei numPaths,
1957 GLenum pathNameType,
1958 const void *paths,
1959 GLuint pathBase,
1960 GLenum coverMode,
1961 GLenum transformType,
1962 const GLfloat *transformValues)
1963{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001964 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03001965
1966 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1967 syncRendererState();
1968
1969 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
1970}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001971
Sami Väisänend59ca052016-06-21 16:10:00 +03001972void Context::coverStrokePathInstanced(GLsizei numPaths,
1973 GLenum pathNameType,
1974 const void *paths,
1975 GLuint pathBase,
1976 GLenum coverMode,
1977 GLenum transformType,
1978 const GLfloat *transformValues)
1979{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001980 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03001981
1982 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1983 syncRendererState();
1984
1985 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
1986 transformValues);
1987}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001988
Sami Väisänend59ca052016-06-21 16:10:00 +03001989void Context::stencilFillPathInstanced(GLsizei numPaths,
1990 GLenum pathNameType,
1991 const void *paths,
1992 GLuint pathBase,
1993 GLenum fillMode,
1994 GLuint mask,
1995 GLenum transformType,
1996 const GLfloat *transformValues)
1997{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001998 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03001999
2000 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
2001 syncRendererState();
2002
2003 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2004 transformValues);
2005}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002006
Sami Väisänend59ca052016-06-21 16:10:00 +03002007void Context::stencilStrokePathInstanced(GLsizei numPaths,
2008 GLenum pathNameType,
2009 const void *paths,
2010 GLuint pathBase,
2011 GLint reference,
2012 GLuint mask,
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->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2022 transformValues);
2023}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002024
Sami Väisänend59ca052016-06-21 16:10:00 +03002025void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2026 GLenum pathNameType,
2027 const void *paths,
2028 GLuint pathBase,
2029 GLenum fillMode,
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->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2041 transformType, transformValues);
2042}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002043
Sami Väisänend59ca052016-06-21 16:10:00 +03002044void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2045 GLenum pathNameType,
2046 const void *paths,
2047 GLuint pathBase,
2048 GLint reference,
2049 GLuint mask,
2050 GLenum coverMode,
2051 GLenum transformType,
2052 const GLfloat *transformValues)
2053{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002054 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002055
2056 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
2057 syncRendererState();
2058
2059 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2060 transformType, transformValues);
2061}
2062
Sami Väisänen46eaa942016-06-29 10:26:37 +03002063void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2064{
2065 auto *programObject = getProgram(program);
2066
2067 programObject->bindFragmentInputLocation(location, name);
2068}
2069
2070void Context::programPathFragmentInputGen(GLuint program,
2071 GLint location,
2072 GLenum genMode,
2073 GLint components,
2074 const GLfloat *coeffs)
2075{
2076 auto *programObject = getProgram(program);
2077
Jamie Madillbd044ed2017-06-05 12:59:21 -04002078 programObject->pathFragmentInputGen(this, location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002079}
2080
jchen1015015f72017-03-16 13:54:21 +08002081GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2082{
jchen10fd7c3b52017-03-21 15:36:03 +08002083 const auto *programObject = getProgram(program);
jchen1015015f72017-03-16 13:54:21 +08002084 return QueryProgramResourceIndex(programObject, programInterface, name);
2085}
2086
jchen10fd7c3b52017-03-21 15:36:03 +08002087void Context::getProgramResourceName(GLuint program,
2088 GLenum programInterface,
2089 GLuint index,
2090 GLsizei bufSize,
2091 GLsizei *length,
2092 GLchar *name)
2093{
2094 const auto *programObject = getProgram(program);
2095 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2096}
2097
jchen10191381f2017-04-11 13:59:04 +08002098GLint Context::getProgramResourceLocation(GLuint program,
2099 GLenum programInterface,
2100 const GLchar *name)
2101{
2102 const auto *programObject = getProgram(program);
2103 return QueryProgramResourceLocation(programObject, programInterface, name);
2104}
2105
jchen10880683b2017-04-12 16:21:55 +08002106void Context::getProgramResourceiv(GLuint program,
2107 GLenum programInterface,
2108 GLuint index,
2109 GLsizei propCount,
2110 const GLenum *props,
2111 GLsizei bufSize,
2112 GLsizei *length,
2113 GLint *params)
2114{
2115 const auto *programObject = getProgram(program);
2116 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2117 length, params);
2118}
2119
Jamie Madill4c19a8a2017-07-24 11:46:06 -04002120Error Context::handleError(const Error &error)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002121{
Geoff Langda5777c2014-07-11 09:52:58 -04002122 if (error.isError())
2123 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002124 GLenum code = error.getCode();
2125 mErrors.insert(code);
2126 if (code == GL_OUT_OF_MEMORY && getWorkarounds().loseContextOnOutOfMemory)
2127 {
2128 markContextLost();
2129 }
Geoff Lang70d0f492015-12-10 17:45:46 -05002130
2131 if (!error.getMessage().empty())
2132 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002133 auto *debug = &mGLState.getDebug();
2134 debug->insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, error.getID(),
2135 GL_DEBUG_SEVERITY_HIGH, error.getMessage());
Geoff Lang70d0f492015-12-10 17:45:46 -05002136 }
Geoff Langda5777c2014-07-11 09:52:58 -04002137 }
Jamie Madill4c19a8a2017-07-24 11:46:06 -04002138
2139 return error;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002140}
2141
2142// Get one of the recorded errors and clear its flag, if any.
2143// [OpenGL ES 2.0.24] section 2.5 page 13.
2144GLenum Context::getError()
2145{
Geoff Langda5777c2014-07-11 09:52:58 -04002146 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002147 {
Geoff Langda5777c2014-07-11 09:52:58 -04002148 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002149 }
Geoff Langda5777c2014-07-11 09:52:58 -04002150 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002151 {
Geoff Langda5777c2014-07-11 09:52:58 -04002152 GLenum error = *mErrors.begin();
2153 mErrors.erase(mErrors.begin());
2154 return error;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002155 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002156}
2157
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002158// NOTE: this function should not assume that this context is current!
2159void Context::markContextLost()
2160{
2161 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002162 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002163 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002164 mContextLostForced = true;
2165 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002166 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002167}
2168
2169bool Context::isContextLost()
2170{
2171 return mContextLost;
2172}
2173
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002174GLenum Context::getResetStatus()
2175{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002176 // Even if the application doesn't want to know about resets, we want to know
2177 // as it will allow us to skip all the calls.
2178 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002179 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002180 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002181 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002182 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002183 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002184
2185 // EXT_robustness, section 2.6: If the reset notification behavior is
2186 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2187 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2188 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002189 }
2190
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002191 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2192 // status should be returned at least once, and GL_NO_ERROR should be returned
2193 // once the device has finished resetting.
2194 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002195 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002196 ASSERT(mResetStatus == GL_NO_ERROR);
2197 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002198
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002199 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002200 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002201 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002202 }
2203 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002204 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002205 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002206 // If markContextLost was used to mark the context lost then
2207 // assume that is not recoverable, and continue to report the
2208 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002209 mResetStatus = mImplementation->getResetStatus();
2210 }
Jamie Madill893ab082014-05-16 16:56:10 -04002211
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002212 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002213}
2214
2215bool Context::isResetNotificationEnabled()
2216{
2217 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2218}
2219
Corentin Walleze3b10e82015-05-20 11:06:25 -04002220const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002221{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002222 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002223}
2224
2225EGLenum Context::getClientType() const
2226{
2227 return mClientType;
2228}
2229
2230EGLenum Context::getRenderBuffer() const
2231{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002232 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2233 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002234 {
2235 return EGL_NONE;
2236 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002237
2238 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(GL_BACK);
2239 ASSERT(backAttachment != nullptr);
2240 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002241}
2242
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002243VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
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 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2247 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002248 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002249 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2250 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002251
Jamie Madill96a483b2017-06-27 16:49:21 -04002252 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002253 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002254
2255 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002256}
2257
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002258TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002259{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002260 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002261 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2262 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002263 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002264 transformFeedback =
2265 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002266 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002267 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002268 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002269
2270 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002271}
2272
2273bool Context::isVertexArrayGenerated(GLuint vertexArray)
2274{
Jamie Madill96a483b2017-06-27 16:49:21 -04002275 ASSERT(mVertexArrayMap.contains(0));
2276 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002277}
2278
2279bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2280{
Jamie Madill96a483b2017-06-27 16:49:21 -04002281 ASSERT(mTransformFeedbackMap.contains(0));
2282 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002283}
2284
Shannon Woods53a94a82014-06-24 15:20:36 -04002285void Context::detachTexture(GLuint texture)
2286{
2287 // Simple pass-through to State's detachTexture method, as textures do not require
2288 // allocation map management either here or in the resource manager at detach time.
2289 // Zero textures are held by the Context, and we don't attempt to request them from
2290 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002291 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002292}
2293
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002294void Context::detachBuffer(GLuint buffer)
2295{
Yuly Novikov5807a532015-12-03 13:01:22 -05002296 // Simple pass-through to State's detachBuffer method, since
2297 // only buffer attachments to container objects that are bound to the current context
2298 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002299
Yuly Novikov5807a532015-12-03 13:01:22 -05002300 // [OpenGL ES 3.2] section 5.1.2 page 45:
2301 // Attachments to unbound container objects, such as
2302 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2303 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002304 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002305}
2306
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002307void Context::detachFramebuffer(GLuint framebuffer)
2308{
Shannon Woods53a94a82014-06-24 15:20:36 -04002309 // Framebuffer detachment is handled by Context, because 0 is a valid
2310 // Framebuffer object, and a pointer to it must be passed from Context
2311 // to State at binding time.
2312
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002313 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002314 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2315 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2316 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002317
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002318 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002319 {
2320 bindReadFramebuffer(0);
2321 }
2322
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002323 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002324 {
2325 bindDrawFramebuffer(0);
2326 }
2327}
2328
2329void Context::detachRenderbuffer(GLuint renderbuffer)
2330{
Jamie Madilla02315b2017-02-23 14:14:47 -05002331 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002332}
2333
Jamie Madill57a89722013-07-02 11:57:03 -04002334void Context::detachVertexArray(GLuint vertexArray)
2335{
Jamie Madill77a72f62015-04-14 11:18:32 -04002336 // Vertex array detachment is handled by Context, because 0 is a valid
2337 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002338 // binding time.
2339
Jamie Madill57a89722013-07-02 11:57:03 -04002340 // [OpenGL ES 3.0.2] section 2.10 page 43:
2341 // If a vertex array object that is currently bound is deleted, the binding
2342 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002343 if (mGLState.removeVertexArrayBinding(vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002344 {
2345 bindVertexArray(0);
2346 }
2347}
2348
Geoff Langc8058452014-02-03 12:04:11 -05002349void Context::detachTransformFeedback(GLuint transformFeedback)
2350{
Corentin Walleza2257da2016-04-19 16:43:12 -04002351 // Transform feedback detachment is handled by Context, because 0 is a valid
2352 // transform feedback, and a pointer to it must be passed from Context to State at
2353 // binding time.
2354
2355 // The OpenGL specification doesn't mention what should happen when the currently bound
2356 // transform feedback object is deleted. Since it is a container object, we treat it like
2357 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002358 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002359 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002360 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002361 }
Geoff Langc8058452014-02-03 12:04:11 -05002362}
2363
Jamie Madilldc356042013-07-19 16:36:57 -04002364void Context::detachSampler(GLuint sampler)
2365{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002366 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002367}
2368
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002369void Context::setVertexAttribDivisor(GLuint index, GLuint divisor)
2370{
Shaodde78e82017-05-22 14:13:27 +08002371 mGLState.setVertexAttribDivisor(this, index, divisor);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002372}
2373
Jamie Madille29d1672013-07-19 16:36:57 -04002374void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2375{
Geoff Langc1984ed2016-10-07 12:41:00 -04002376 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002377 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002378 SetSamplerParameteri(samplerObject, pname, param);
2379}
Jamie Madille29d1672013-07-19 16:36:57 -04002380
Geoff Langc1984ed2016-10-07 12:41:00 -04002381void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2382{
2383 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002384 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002385 SetSamplerParameteriv(samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002386}
2387
2388void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2389{
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 SetSamplerParameterf(samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002393}
2394
Geoff Langc1984ed2016-10-07 12:41:00 -04002395void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002396{
Geoff Langc1984ed2016-10-07 12:41:00 -04002397 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002398 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002399 SetSamplerParameterfv(samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002400}
2401
Geoff Langc1984ed2016-10-07 12:41:00 -04002402void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002403{
Geoff Langc1984ed2016-10-07 12:41:00 -04002404 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002405 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002406 QuerySamplerParameteriv(samplerObject, pname, params);
2407}
Jamie Madill9675b802013-07-19 16:36:59 -04002408
Geoff Langc1984ed2016-10-07 12:41:00 -04002409void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2410{
2411 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002412 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002413 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04002414}
2415
Olli Etuahof0fee072016-03-30 15:11:58 +03002416void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2417{
2418 gl::Program *programObject = getProgram(program);
Yunchao He61afff12017-03-14 15:34:03 +08002419 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002420}
2421
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002422void Context::initRendererString()
2423{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002424 std::ostringstream rendererString;
2425 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002426 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002427 rendererString << ")";
2428
Geoff Langcec35902014-04-16 10:52:36 -04002429 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002430}
2431
Geoff Langc339c4e2016-11-29 10:37:36 -05002432void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002433{
Geoff Langc339c4e2016-11-29 10:37:36 -05002434 const Version &clientVersion = getClientVersion();
2435
2436 std::ostringstream versionString;
2437 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2438 << ANGLE_VERSION_STRING << ")";
2439 mVersionString = MakeStaticString(versionString.str());
2440
2441 std::ostringstream shadingLanguageVersionString;
2442 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2443 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2444 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
2445 << ")";
2446 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002447}
2448
Geoff Langcec35902014-04-16 10:52:36 -04002449void Context::initExtensionStrings()
2450{
Geoff Langc339c4e2016-11-29 10:37:36 -05002451 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
2452 std::ostringstream combinedStringStream;
2453 std::copy(strings.begin(), strings.end(),
2454 std::ostream_iterator<const char *>(combinedStringStream, " "));
2455 return MakeStaticString(combinedStringStream.str());
2456 };
2457
2458 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002459 for (const auto &extensionString : mExtensions.getStrings())
2460 {
2461 mExtensionStrings.push_back(MakeStaticString(extensionString));
2462 }
Geoff Langc339c4e2016-11-29 10:37:36 -05002463 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002464
Bryan Bernhart58806562017-01-05 13:09:31 -08002465 const gl::Extensions &nativeExtensions = mImplementation->getNativeExtensions();
2466
Geoff Langc339c4e2016-11-29 10:37:36 -05002467 mRequestableExtensionStrings.clear();
2468 for (const auto &extensionInfo : GetExtensionInfoMap())
2469 {
2470 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08002471 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
2472 nativeExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05002473 {
2474 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
2475 }
2476 }
2477 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002478}
2479
Geoff Langc339c4e2016-11-29 10:37:36 -05002480const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04002481{
Geoff Langc339c4e2016-11-29 10:37:36 -05002482 switch (name)
2483 {
2484 case GL_VENDOR:
2485 return reinterpret_cast<const GLubyte *>("Google Inc.");
2486
2487 case GL_RENDERER:
2488 return reinterpret_cast<const GLubyte *>(mRendererString);
2489
2490 case GL_VERSION:
2491 return reinterpret_cast<const GLubyte *>(mVersionString);
2492
2493 case GL_SHADING_LANGUAGE_VERSION:
2494 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
2495
2496 case GL_EXTENSIONS:
2497 return reinterpret_cast<const GLubyte *>(mExtensionString);
2498
2499 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
2500 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
2501
2502 default:
2503 UNREACHABLE();
2504 return nullptr;
2505 }
Geoff Langcec35902014-04-16 10:52:36 -04002506}
2507
Geoff Langc339c4e2016-11-29 10:37:36 -05002508const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04002509{
Geoff Langc339c4e2016-11-29 10:37:36 -05002510 switch (name)
2511 {
2512 case GL_EXTENSIONS:
2513 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
2514
2515 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
2516 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
2517
2518 default:
2519 UNREACHABLE();
2520 return nullptr;
2521 }
Geoff Langcec35902014-04-16 10:52:36 -04002522}
2523
2524size_t Context::getExtensionStringCount() const
2525{
2526 return mExtensionStrings.size();
2527}
2528
Geoff Langc339c4e2016-11-29 10:37:36 -05002529void Context::requestExtension(const char *name)
2530{
2531 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
2532 ASSERT(extensionInfos.find(name) != extensionInfos.end());
2533 const auto &extension = extensionInfos.at(name);
2534 ASSERT(extension.Requestable);
2535
2536 if (mExtensions.*(extension.ExtensionsMember))
2537 {
2538 // Extension already enabled
2539 return;
2540 }
2541
2542 mExtensions.*(extension.ExtensionsMember) = true;
2543 updateCaps();
2544 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08002545
Jamie Madill2f348d22017-06-05 10:50:59 -04002546 // Release the shader compiler so it will be re-created with the requested extensions enabled.
2547 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04002548
2549 // Invalidate all cached completenesses for textures and framebuffer. Some extensions make new
2550 // formats renderable or sampleable.
2551 mState.mTextures->invalidateTextureComplenessCache();
2552 for (auto &zeroTexture : mZeroTextures)
2553 {
2554 zeroTexture.second->invalidateCompletenessCache();
2555 }
2556
2557 mState.mFramebuffers->invalidateFramebufferComplenessCache();
Geoff Langc339c4e2016-11-29 10:37:36 -05002558}
2559
2560size_t Context::getRequestableExtensionStringCount() const
2561{
2562 return mRequestableExtensionStrings.size();
2563}
2564
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002565void Context::beginTransformFeedback(GLenum primitiveMode)
2566{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002567 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002568 ASSERT(transformFeedback != nullptr);
2569 ASSERT(!transformFeedback->isPaused());
2570
Jamie Madill6c1f6712017-02-14 19:08:04 -05002571 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002572}
2573
2574bool Context::hasActiveTransformFeedback(GLuint program) const
2575{
2576 for (auto pair : mTransformFeedbackMap)
2577 {
2578 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
2579 {
2580 return true;
2581 }
2582 }
2583 return false;
2584}
2585
Jamie Madill4e0e6f82017-02-17 11:06:03 -05002586void Context::initCaps(const egl::DisplayExtensions &displayExtensions)
Geoff Lang493daf52014-07-03 13:38:44 -04002587{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002588 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04002589
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002590 mExtensions = mImplementation->getNativeExtensions();
Geoff Lang493daf52014-07-03 13:38:44 -04002591
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002592 mLimitations = mImplementation->getNativeLimitations();
Austin Kinross02df7962015-07-01 10:03:42 -07002593
Geoff Langeb66a6e2016-10-31 13:06:12 -04002594 if (getClientVersion() < Version(3, 0))
Geoff Lang493daf52014-07-03 13:38:44 -04002595 {
2596 // Disable ES3+ extensions
Jamie Madill231c7f52017-04-26 13:45:37 -04002597 mExtensions.colorBufferFloat = false;
Geoff Langb66a9092016-05-16 15:59:14 -04002598 mExtensions.eglImageExternalEssl3 = false;
Vincent Lang25ab4512016-05-13 18:13:59 +02002599 mExtensions.textureNorm16 = false;
Martin Radev137032d2017-07-13 10:11:12 +03002600 mExtensions.multiview = false;
2601 mExtensions.maxViews = 1u;
Geoff Lang493daf52014-07-03 13:38:44 -04002602 }
2603
Geoff Langeb66a6e2016-10-31 13:06:12 -04002604 if (getClientVersion() > Version(2, 0))
Geoff Lang493daf52014-07-03 13:38:44 -04002605 {
2606 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
Jamie Madill231c7f52017-04-26 13:45:37 -04002607 // mExtensions.sRGB = false;
Geoff Lang493daf52014-07-03 13:38:44 -04002608 }
2609
Jamie Madill00ed7a12016-05-19 13:13:38 -04002610 // Some extensions are always available because they are implemented in the GL layer.
Jamie Madill231c7f52017-04-26 13:45:37 -04002611 mExtensions.bindUniformLocation = true;
2612 mExtensions.vertexArrayObject = true;
Geoff Langf41a7152016-09-19 15:11:17 -04002613 mExtensions.bindGeneratesResource = true;
Geoff Langfeb8c682017-02-13 16:07:35 -05002614 mExtensions.clientArrays = true;
Geoff Langc339c4e2016-11-29 10:37:36 -05002615 mExtensions.requestExtension = true;
Jamie Madill00ed7a12016-05-19 13:13:38 -04002616
2617 // Enable the no error extension if the context was created with the flag.
2618 mExtensions.noError = mSkipValidation;
2619
Corentin Wallezccab69d2017-01-27 16:57:15 -05002620 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Corentin Wallezc295e512017-01-27 17:47:50 -05002621 mExtensions.surfacelessContext = displayExtensions.surfacelessContext;
Corentin Wallezccab69d2017-01-27 16:57:15 -05002622
Geoff Lang70d0f492015-12-10 17:45:46 -05002623 // Explicitly enable GL_KHR_debug
2624 mExtensions.debug = true;
2625 mExtensions.maxDebugMessageLength = 1024;
2626 mExtensions.maxDebugLoggedMessages = 1024;
2627 mExtensions.maxDebugGroupStackDepth = 1024;
2628 mExtensions.maxLabelLength = 1024;
2629
Geoff Langff5b2d52016-09-07 11:32:23 -04002630 // Explicitly enable GL_ANGLE_robust_client_memory
2631 mExtensions.robustClientMemory = true;
2632
Jamie Madille08a1d32017-03-07 17:24:06 -05002633 // Determine robust resource init availability from EGL.
2634 mExtensions.robustResourceInitialization =
Jamie Madill948bbe52017-06-01 13:10:42 -04002635 egl::Display::GetClientExtensions().displayRobustResourceInitialization;
Jamie Madille08a1d32017-03-07 17:24:06 -05002636
Jamie Madillc43be722017-07-13 16:22:14 -04002637 // Enable the cache control query unconditionally.
2638 mExtensions.programCacheControl = true;
2639
Geoff Lang301d1612014-07-09 10:34:37 -04002640 // Apply implementation limits
2641 mCaps.maxVertexAttributes = std::min<GLuint>(mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002642 mCaps.maxVertexAttribBindings =
2643 getClientVersion() < ES_3_1
2644 ? mCaps.maxVertexAttributes
2645 : std::min<GLuint>(mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
2646
Jamie Madill231c7f52017-04-26 13:45:37 -04002647 mCaps.maxVertexUniformBlocks = std::min<GLuint>(
2648 mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
2649 mCaps.maxVertexOutputComponents =
2650 std::min<GLuint>(mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
Geoff Lang301d1612014-07-09 10:34:37 -04002651
Jamie Madill231c7f52017-04-26 13:45:37 -04002652 mCaps.maxFragmentInputComponents =
2653 std::min<GLuint>(mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
Geoff Lang3a61c322014-07-10 13:01:54 -04002654
Geoff Langc287ea62016-09-16 14:46:51 -04002655 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05002656 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04002657 for (const auto &extensionInfo : GetExtensionInfoMap())
2658 {
2659 // If this context is for WebGL, disable all enableable extensions
Jamie Madill4e0e6f82017-02-17 11:06:03 -05002660 if (mWebGLContext && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04002661 {
2662 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
2663 }
2664 }
2665
2666 // Generate texture caps
2667 updateCaps();
2668}
2669
2670void Context::updateCaps()
2671{
Geoff Lang900013c2014-07-07 11:32:19 -04002672 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002673 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04002674
Jamie Madill4e0e6f82017-02-17 11:06:03 -05002675 for (auto capsIt : mImplementation->getNativeTextureCaps())
Geoff Lang493daf52014-07-03 13:38:44 -04002676 {
Geoff Langca271392017-04-05 12:30:00 -04002677 GLenum sizedInternalFormat = capsIt.first;
Jamie Madill231c7f52017-04-26 13:45:37 -04002678 TextureCaps formatCaps = capsIt.second;
Geoff Lang493daf52014-07-03 13:38:44 -04002679
Geoff Langca271392017-04-05 12:30:00 -04002680 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04002681
Geoff Lang0d8b7242015-09-09 14:56:53 -04002682 // Update the format caps based on the client version and extensions.
2683 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
2684 // ES3.
2685 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002686 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04002687 formatCaps.renderable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002688 formatCaps.renderable && formatInfo.renderSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04002689 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002690 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04002691
He Yunchaoccd8c9b2017-01-18 17:36:14 +08002692 // OpenGL ES does not support multisampling with non-rendererable formats
2693 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Olli Etuaho50c562d2017-06-06 14:43:30 +03002694 if (!formatCaps.renderable ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08002695 (getClientVersion() < ES_3_1 &&
2696 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04002697 {
Geoff Langd87878e2014-09-19 15:42:59 -04002698 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04002699 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03002700 else
2701 {
2702 // We may have limited the max samples for some required renderbuffer formats due to
2703 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
2704 GLuint formatMaxSamples = formatCaps.getMaxSamples();
2705
2706 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
2707 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
2708 // exception of signed and unsigned integer formats."
2709 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
2710 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
2711 {
2712 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
2713 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
2714 }
2715
2716 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
2717 if (getClientVersion() >= ES_3_1)
2718 {
2719 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
2720 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
2721 // the exception that the signed and unsigned integer formats are required only to
2722 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
2723 // multisamples, which must be at least one."
2724 if (formatInfo.componentType == GL_INT ||
2725 formatInfo.componentType == GL_UNSIGNED_INT)
2726 {
2727 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
2728 }
2729
2730 // GLES 3.1 section 19.3.1.
2731 if (formatCaps.texturable)
2732 {
2733 if (formatInfo.depthBits > 0)
2734 {
2735 mCaps.maxDepthTextureSamples =
2736 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
2737 }
2738 else if (formatInfo.redBits > 0)
2739 {
2740 mCaps.maxColorTextureSamples =
2741 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
2742 }
2743 }
2744 }
2745 }
Geoff Langd87878e2014-09-19 15:42:59 -04002746
2747 if (formatCaps.texturable && formatInfo.compressed)
2748 {
Geoff Langca271392017-04-05 12:30:00 -04002749 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04002750 }
2751
Geoff Langca271392017-04-05 12:30:00 -04002752 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04002753 }
Jamie Madill32447362017-06-28 14:53:52 -04002754
2755 // If program binary is disabled, blank out the memory cache pointer.
2756 if (!mImplementation->getNativeExtensions().getProgramBinary)
2757 {
2758 mMemoryProgramCache = nullptr;
2759 }
Geoff Lang493daf52014-07-03 13:38:44 -04002760}
2761
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002762void Context::initWorkarounds()
2763{
Jamie Madill761b02c2017-06-23 16:27:06 -04002764 // Apply back-end workarounds.
2765 mImplementation->applyNativeWorkarounds(&mWorkarounds);
2766
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002767 // Lose the context upon out of memory error if the application is
2768 // expecting to watch for those events.
2769 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2770}
2771
Jamie Madill4c19a8a2017-07-24 11:46:06 -04002772Error Context::prepareForDraw(GLenum drawMode)
Jamie Madillb6664922017-07-25 12:55:04 -04002773{
2774 syncRendererState();
Jamie Madill4c19a8a2017-07-24 11:46:06 -04002775
2776 InfoLog infoLog;
2777 Error err = mImplementation->triggerDrawCallProgramRecompilation(this, &infoLog,
2778 mMemoryProgramCache, drawMode);
Jamie Madilla836b462017-08-16 14:58:35 -04002779 if (err.isError() || infoLog.getLength() > 0)
Jamie Madill4c19a8a2017-07-24 11:46:06 -04002780 {
2781 WARN() << "Dynamic recompilation error log: " << infoLog.str();
2782 }
2783 return err;
Jamie Madillb6664922017-07-25 12:55:04 -04002784}
2785
Jamie Madill1b94d432015-08-07 13:23:23 -04002786void Context::syncRendererState()
2787{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002788 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madillfe548342017-06-19 11:13:24 -04002789 mImplementation->syncState(this, dirtyBits);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002790 mGLState.clearDirtyBits();
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002791 mGLState.syncDirtyObjects(this);
Jamie Madill1b94d432015-08-07 13:23:23 -04002792}
2793
Jamie Madillad9f24e2016-02-12 09:27:24 -05002794void Context::syncRendererState(const State::DirtyBits &bitMask,
2795 const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04002796{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002797 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madillfe548342017-06-19 11:13:24 -04002798 mImplementation->syncState(this, dirtyBits);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002799 mGLState.clearDirtyBits(dirtyBits);
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002800 mGLState.syncDirtyObjects(this, objectMask);
Jamie Madill1b94d432015-08-07 13:23:23 -04002801}
Jamie Madillc29968b2016-01-20 11:17:23 -05002802
2803void Context::blitFramebuffer(GLint srcX0,
2804 GLint srcY0,
2805 GLint srcX1,
2806 GLint srcY1,
2807 GLint dstX0,
2808 GLint dstY0,
2809 GLint dstX1,
2810 GLint dstY1,
2811 GLbitfield mask,
2812 GLenum filter)
2813{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002814 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002815 ASSERT(drawFramebuffer);
2816
2817 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
2818 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
2819
Jamie Madillad9f24e2016-02-12 09:27:24 -05002820 syncStateForBlit();
Jamie Madillc29968b2016-01-20 11:17:23 -05002821
Jamie Madillc564c072017-06-01 12:45:42 -04002822 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002823}
Jamie Madillc29968b2016-01-20 11:17:23 -05002824
2825void Context::clear(GLbitfield mask)
2826{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002827 syncStateForClear();
Jamie Madillc564c072017-06-01 12:45:42 -04002828 handleError(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05002829}
2830
2831void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
2832{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002833 syncStateForClear();
Jamie Madillc564c072017-06-01 12:45:42 -04002834 handleError(mGLState.getDrawFramebuffer()->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002835}
2836
2837void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
2838{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002839 syncStateForClear();
Jamie Madillc564c072017-06-01 12:45:42 -04002840 handleError(mGLState.getDrawFramebuffer()->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002841}
2842
2843void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
2844{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002845 syncStateForClear();
Jamie Madillc564c072017-06-01 12:45:42 -04002846 handleError(mGLState.getDrawFramebuffer()->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002847}
2848
2849void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
2850{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002851 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002852 ASSERT(framebufferObject);
2853
2854 // If a buffer is not present, the clear has no effect
2855 if (framebufferObject->getDepthbuffer() == nullptr &&
2856 framebufferObject->getStencilbuffer() == nullptr)
2857 {
2858 return;
2859 }
2860
Jamie Madillad9f24e2016-02-12 09:27:24 -05002861 syncStateForClear();
Jamie Madillc564c072017-06-01 12:45:42 -04002862 handleError(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05002863}
2864
2865void Context::readPixels(GLint x,
2866 GLint y,
2867 GLsizei width,
2868 GLsizei height,
2869 GLenum format,
2870 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002871 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05002872{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04002873 if (width == 0 || height == 0)
2874 {
2875 return;
2876 }
2877
Jamie Madillad9f24e2016-02-12 09:27:24 -05002878 syncStateForReadPixels();
Jamie Madillc29968b2016-01-20 11:17:23 -05002879
Jamie Madillb6664922017-07-25 12:55:04 -04002880 Framebuffer *readFBO = mGLState.getReadFramebuffer();
2881 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05002882
2883 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04002884 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05002885}
2886
2887void Context::copyTexImage2D(GLenum target,
2888 GLint level,
2889 GLenum internalformat,
2890 GLint x,
2891 GLint y,
2892 GLsizei width,
2893 GLsizei height,
2894 GLint border)
2895{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002896 // Only sync the read FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002897 mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002898
Jamie Madillc29968b2016-01-20 11:17:23 -05002899 Rectangle sourceArea(x, y, width, height);
2900
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002901 const Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002902 Texture *texture =
2903 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05002904 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05002905}
2906
2907void Context::copyTexSubImage2D(GLenum target,
2908 GLint level,
2909 GLint xoffset,
2910 GLint yoffset,
2911 GLint x,
2912 GLint y,
2913 GLsizei width,
2914 GLsizei height)
2915{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04002916 if (width == 0 || height == 0)
2917 {
2918 return;
2919 }
2920
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002921 // Only sync the read FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002922 mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002923
Jamie Madillc29968b2016-01-20 11:17:23 -05002924 Offset destOffset(xoffset, yoffset, 0);
2925 Rectangle sourceArea(x, y, width, height);
2926
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002927 const Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002928 Texture *texture =
2929 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05002930 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05002931}
2932
2933void Context::copyTexSubImage3D(GLenum target,
2934 GLint level,
2935 GLint xoffset,
2936 GLint yoffset,
2937 GLint zoffset,
2938 GLint x,
2939 GLint y,
2940 GLsizei width,
2941 GLsizei height)
2942{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04002943 if (width == 0 || height == 0)
2944 {
2945 return;
2946 }
2947
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002948 // Only sync the read FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002949 mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002950
Jamie Madillc29968b2016-01-20 11:17:23 -05002951 Offset destOffset(xoffset, yoffset, zoffset);
2952 Rectangle sourceArea(x, y, width, height);
2953
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002954 const Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002955 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05002956 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05002957}
2958
2959void Context::framebufferTexture2D(GLenum target,
2960 GLenum attachment,
2961 GLenum textarget,
2962 GLuint texture,
2963 GLint level)
2964{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002965 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002966 ASSERT(framebuffer);
2967
2968 if (texture != 0)
2969 {
2970 Texture *textureObj = getTexture(texture);
2971
2972 ImageIndex index = ImageIndex::MakeInvalid();
2973
2974 if (textarget == GL_TEXTURE_2D)
2975 {
2976 index = ImageIndex::Make2D(level);
2977 }
Corentin Wallez13c0dd42017-07-04 18:27:01 -04002978 else if (textarget == GL_TEXTURE_RECTANGLE_ANGLE)
2979 {
2980 index = ImageIndex::MakeRectangle(level);
2981 }
JiangYizhoubddc46b2016-12-09 09:50:51 +08002982 else if (textarget == GL_TEXTURE_2D_MULTISAMPLE)
2983 {
2984 ASSERT(level == 0);
2985 index = ImageIndex::Make2DMultisample();
2986 }
Jamie Madillc29968b2016-01-20 11:17:23 -05002987 else
2988 {
2989 ASSERT(IsCubeMapTextureTarget(textarget));
2990 index = ImageIndex::MakeCube(textarget, level);
2991 }
2992
Jamie Madilla02315b2017-02-23 14:14:47 -05002993 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05002994 }
2995 else
2996 {
Jamie Madilla02315b2017-02-23 14:14:47 -05002997 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05002998 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002999
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003000 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003001}
3002
3003void Context::framebufferRenderbuffer(GLenum target,
3004 GLenum attachment,
3005 GLenum renderbuffertarget,
3006 GLuint renderbuffer)
3007{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003008 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003009 ASSERT(framebuffer);
3010
3011 if (renderbuffer != 0)
3012 {
3013 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003014
3015 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex::MakeInvalid(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003016 renderbufferObject);
3017 }
3018 else
3019 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003020 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003021 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003022
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003023 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003024}
3025
3026void Context::framebufferTextureLayer(GLenum target,
3027 GLenum attachment,
3028 GLuint texture,
3029 GLint level,
3030 GLint layer)
3031{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003032 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003033 ASSERT(framebuffer);
3034
3035 if (texture != 0)
3036 {
3037 Texture *textureObject = getTexture(texture);
3038
3039 ImageIndex index = ImageIndex::MakeInvalid();
3040
3041 if (textureObject->getTarget() == GL_TEXTURE_3D)
3042 {
3043 index = ImageIndex::Make3D(level, layer);
3044 }
3045 else
3046 {
3047 ASSERT(textureObject->getTarget() == GL_TEXTURE_2D_ARRAY);
3048 index = ImageIndex::Make2DArray(level, layer);
3049 }
3050
Jamie Madilla02315b2017-02-23 14:14:47 -05003051 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003052 }
3053 else
3054 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003055 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003056 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003057
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003058 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003059}
3060
Martin Radev137032d2017-07-13 10:11:12 +03003061void Context::framebufferTextureMultiviewLayeredANGLE(GLenum target,
3062 GLenum attachment,
3063 GLuint texture,
3064 GLint level,
3065 GLint baseViewIndex,
3066 GLsizei numViews)
3067{
Martin Radev82ef7742017-08-08 17:44:58 +03003068 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3069 ASSERT(framebuffer);
3070
3071 if (texture != 0)
3072 {
3073 Texture *textureObj = getTexture(texture);
3074
3075 ImageIndex index = ImageIndex::Make2DArray(level, baseViewIndex);
3076 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3077 numViews, baseViewIndex);
3078 }
3079 else
3080 {
3081 framebuffer->resetAttachment(this, attachment);
3082 }
3083
3084 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003085}
3086
3087void Context::framebufferTextureMultiviewSideBySideANGLE(GLenum target,
3088 GLenum attachment,
3089 GLuint texture,
3090 GLint level,
3091 GLsizei numViews,
3092 const GLint *viewportOffsets)
3093{
Martin Radev5dae57b2017-07-14 16:15:55 +03003094 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3095 ASSERT(framebuffer);
3096
3097 if (texture != 0)
3098 {
3099 Texture *textureObj = getTexture(texture);
3100
3101 ImageIndex index = ImageIndex::Make2D(level);
3102 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3103 textureObj, numViews, viewportOffsets);
3104 }
3105 else
3106 {
3107 framebuffer->resetAttachment(this, attachment);
3108 }
3109
3110 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003111}
3112
Jamie Madillc29968b2016-01-20 11:17:23 -05003113void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3114{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003115 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003116 ASSERT(framebuffer);
3117 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003118 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003119}
3120
3121void Context::readBuffer(GLenum mode)
3122{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003123 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003124 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003125 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003126}
3127
3128void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3129{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003130 // Only sync the FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04003131 mGLState.syncDirtyObject(this, target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003132
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003133 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003134 ASSERT(framebuffer);
3135
3136 // The specification isn't clear what should be done when the framebuffer isn't complete.
3137 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003138 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003139}
3140
3141void Context::invalidateFramebuffer(GLenum target,
3142 GLsizei numAttachments,
3143 const GLenum *attachments)
3144{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003145 // Only sync the FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04003146 mGLState.syncDirtyObject(this, target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003147
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003148 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003149 ASSERT(framebuffer);
3150
Jamie Madilldd43e6c2017-03-24 14:18:49 -04003151 if (framebuffer->checkStatus(this) != GL_FRAMEBUFFER_COMPLETE)
Jamie Madillc29968b2016-01-20 11:17:23 -05003152 {
Jamie Madill437fa652016-05-03 15:13:24 -04003153 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003154 }
Jamie Madill437fa652016-05-03 15:13:24 -04003155
Jamie Madill4928b7c2017-06-20 12:57:39 -04003156 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003157}
3158
3159void Context::invalidateSubFramebuffer(GLenum target,
3160 GLsizei numAttachments,
3161 const GLenum *attachments,
3162 GLint x,
3163 GLint y,
3164 GLsizei width,
3165 GLsizei height)
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
3178 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003179 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003180}
3181
Jamie Madill73a84962016-02-12 09:27:23 -05003182void Context::texImage2D(GLenum target,
3183 GLint level,
3184 GLint internalformat,
3185 GLsizei width,
3186 GLsizei height,
3187 GLint border,
3188 GLenum format,
3189 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003190 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003191{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003192 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003193
3194 Extents size(width, height, 1);
3195 Texture *texture =
3196 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003197 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
3198 size, format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003199}
3200
3201void Context::texImage3D(GLenum target,
3202 GLint level,
3203 GLint internalformat,
3204 GLsizei width,
3205 GLsizei height,
3206 GLsizei depth,
3207 GLint border,
3208 GLenum format,
3209 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003210 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003211{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003212 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003213
3214 Extents size(width, height, depth);
3215 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003216 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
3217 size, format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003218}
3219
3220void Context::texSubImage2D(GLenum target,
3221 GLint level,
3222 GLint xoffset,
3223 GLint yoffset,
3224 GLsizei width,
3225 GLsizei height,
3226 GLenum format,
3227 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003228 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003229{
3230 // Zero sized uploads are valid but no-ops
3231 if (width == 0 || height == 0)
3232 {
3233 return;
3234 }
3235
Jamie Madillad9f24e2016-02-12 09:27:24 -05003236 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003237
3238 Box area(xoffset, yoffset, 0, width, height, 1);
3239 Texture *texture =
3240 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003241 handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
3242 type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003243}
3244
3245void Context::texSubImage3D(GLenum target,
3246 GLint level,
3247 GLint xoffset,
3248 GLint yoffset,
3249 GLint zoffset,
3250 GLsizei width,
3251 GLsizei height,
3252 GLsizei depth,
3253 GLenum format,
3254 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003255 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003256{
3257 // Zero sized uploads are valid but no-ops
3258 if (width == 0 || height == 0 || depth == 0)
3259 {
3260 return;
3261 }
3262
Jamie Madillad9f24e2016-02-12 09:27:24 -05003263 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003264
3265 Box area(xoffset, yoffset, zoffset, width, height, depth);
3266 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003267 handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
3268 type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003269}
3270
3271void Context::compressedTexImage2D(GLenum target,
3272 GLint level,
3273 GLenum internalformat,
3274 GLsizei width,
3275 GLsizei height,
3276 GLint border,
3277 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003278 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003279{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003280 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003281
3282 Extents size(width, height, 1);
3283 Texture *texture =
3284 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003285 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003286 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04003287 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003288}
3289
3290void Context::compressedTexImage3D(GLenum target,
3291 GLint level,
3292 GLenum internalformat,
3293 GLsizei width,
3294 GLsizei height,
3295 GLsizei depth,
3296 GLint border,
3297 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003298 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003299{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003300 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003301
3302 Extents size(width, height, depth);
3303 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003304 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003305 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04003306 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003307}
3308
3309void Context::compressedTexSubImage2D(GLenum target,
3310 GLint level,
3311 GLint xoffset,
3312 GLint yoffset,
3313 GLsizei width,
3314 GLsizei height,
3315 GLenum format,
3316 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003317 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003318{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003319 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003320
3321 Box area(xoffset, yoffset, 0, width, height, 1);
3322 Texture *texture =
3323 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003324 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003325 format, imageSize,
3326 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003327}
3328
3329void Context::compressedTexSubImage3D(GLenum target,
3330 GLint level,
3331 GLint xoffset,
3332 GLint yoffset,
3333 GLint zoffset,
3334 GLsizei width,
3335 GLsizei height,
3336 GLsizei depth,
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{
3341 // Zero sized uploads are valid but no-ops
3342 if (width == 0 || height == 0)
3343 {
3344 return;
3345 }
3346
Jamie Madillad9f24e2016-02-12 09:27:24 -05003347 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003348
3349 Box area(xoffset, yoffset, zoffset, width, height, depth);
3350 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003351 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003352 format, imageSize,
3353 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003354}
3355
Olli Etuaho0f2b1562016-05-13 16:15:35 +03003356void Context::generateMipmap(GLenum target)
3357{
3358 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003359 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03003360}
3361
Geoff Lang97073d12016-04-20 10:42:34 -07003362void Context::copyTextureCHROMIUM(GLuint sourceId,
Geoff Langfc72a072017-03-24 14:52:39 -04003363 GLint sourceLevel,
3364 GLenum destTarget,
Geoff Lang97073d12016-04-20 10:42:34 -07003365 GLuint destId,
Geoff Langfc72a072017-03-24 14:52:39 -04003366 GLint destLevel,
Geoff Lang97073d12016-04-20 10:42:34 -07003367 GLint internalFormat,
3368 GLenum destType,
3369 GLboolean unpackFlipY,
3370 GLboolean unpackPremultiplyAlpha,
3371 GLboolean unpackUnmultiplyAlpha)
3372{
3373 syncStateForTexImage();
3374
3375 gl::Texture *sourceTexture = getTexture(sourceId);
3376 gl::Texture *destTexture = getTexture(destId);
Geoff Langfc72a072017-03-24 14:52:39 -04003377 handleError(destTexture->copyTexture(
3378 this, destTarget, destLevel, internalFormat, destType, sourceLevel, unpackFlipY == GL_TRUE,
3379 unpackPremultiplyAlpha == GL_TRUE, unpackUnmultiplyAlpha == GL_TRUE, sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07003380}
3381
3382void Context::copySubTextureCHROMIUM(GLuint sourceId,
Geoff Langfc72a072017-03-24 14:52:39 -04003383 GLint sourceLevel,
3384 GLenum destTarget,
Geoff Lang97073d12016-04-20 10:42:34 -07003385 GLuint destId,
Geoff Langfc72a072017-03-24 14:52:39 -04003386 GLint destLevel,
Geoff Lang97073d12016-04-20 10:42:34 -07003387 GLint xoffset,
3388 GLint yoffset,
3389 GLint x,
3390 GLint y,
3391 GLsizei width,
3392 GLsizei height,
3393 GLboolean unpackFlipY,
3394 GLboolean unpackPremultiplyAlpha,
3395 GLboolean unpackUnmultiplyAlpha)
3396{
3397 // Zero sized copies are valid but no-ops
3398 if (width == 0 || height == 0)
3399 {
3400 return;
3401 }
3402
3403 syncStateForTexImage();
3404
3405 gl::Texture *sourceTexture = getTexture(sourceId);
3406 gl::Texture *destTexture = getTexture(destId);
3407 Offset offset(xoffset, yoffset, 0);
3408 Rectangle area(x, y, width, height);
Geoff Langfc72a072017-03-24 14:52:39 -04003409 handleError(destTexture->copySubTexture(
3410 this, destTarget, destLevel, offset, sourceLevel, area, unpackFlipY == GL_TRUE,
3411 unpackPremultiplyAlpha == GL_TRUE, unpackUnmultiplyAlpha == GL_TRUE, sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07003412}
3413
Geoff Lang47110bf2016-04-20 11:13:22 -07003414void Context::compressedCopyTextureCHROMIUM(GLuint sourceId, GLuint destId)
3415{
3416 syncStateForTexImage();
3417
3418 gl::Texture *sourceTexture = getTexture(sourceId);
3419 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05003420 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07003421}
3422
Geoff Lang496c02d2016-10-20 11:38:11 -07003423void Context::getBufferPointerv(GLenum target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03003424{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003425 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003426 ASSERT(buffer);
3427
Geoff Lang496c02d2016-10-20 11:38:11 -07003428 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03003429}
3430
Jamie Madill876429b2017-04-20 15:46:24 -04003431void *Context::mapBuffer(GLenum target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03003432{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003433 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003434 ASSERT(buffer);
3435
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003436 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03003437 if (error.isError())
3438 {
Jamie Madill437fa652016-05-03 15:13:24 -04003439 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003440 return nullptr;
3441 }
3442
3443 return buffer->getMapPointer();
3444}
3445
3446GLboolean Context::unmapBuffer(GLenum target)
3447{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003448 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003449 ASSERT(buffer);
3450
3451 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003452 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03003453 if (error.isError())
3454 {
Jamie Madill437fa652016-05-03 15:13:24 -04003455 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003456 return GL_FALSE;
3457 }
3458
3459 return result;
3460}
3461
Jamie Madill876429b2017-04-20 15:46:24 -04003462void *Context::mapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03003463{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003464 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003465 ASSERT(buffer);
3466
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003467 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03003468 if (error.isError())
3469 {
Jamie Madill437fa652016-05-03 15:13:24 -04003470 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003471 return nullptr;
3472 }
3473
3474 return buffer->getMapPointer();
3475}
3476
3477void Context::flushMappedBufferRange(GLenum /*target*/, GLintptr /*offset*/, GLsizeiptr /*length*/)
3478{
3479 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
3480}
3481
Jamie Madillad9f24e2016-02-12 09:27:24 -05003482void Context::syncStateForReadPixels()
3483{
3484 syncRendererState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
3485}
3486
3487void Context::syncStateForTexImage()
3488{
3489 syncRendererState(mTexImageDirtyBits, mTexImageDirtyObjects);
3490}
3491
3492void Context::syncStateForClear()
3493{
3494 syncRendererState(mClearDirtyBits, mClearDirtyObjects);
3495}
3496
3497void Context::syncStateForBlit()
3498{
3499 syncRendererState(mBlitDirtyBits, mBlitDirtyObjects);
3500}
3501
Jamie Madillc20ab272016-06-09 07:20:46 -07003502void Context::activeTexture(GLenum texture)
3503{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003504 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07003505}
3506
Jamie Madill876429b2017-04-20 15:46:24 -04003507void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07003508{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003509 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07003510}
3511
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05003512void Context::blendEquation(GLenum mode)
3513{
3514 mGLState.setBlendEquation(mode, mode);
3515}
3516
Jamie Madillc20ab272016-06-09 07:20:46 -07003517void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
3518{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003519 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003520}
3521
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05003522void Context::blendFunc(GLenum sfactor, GLenum dfactor)
3523{
3524 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
3525}
3526
Jamie Madillc20ab272016-06-09 07:20:46 -07003527void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
3528{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003529 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003530}
3531
Jamie Madill876429b2017-04-20 15:46:24 -04003532void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07003533{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003534 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003535}
3536
Jamie Madill876429b2017-04-20 15:46:24 -04003537void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07003538{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003539 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07003540}
3541
3542void Context::clearStencil(GLint s)
3543{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003544 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07003545}
3546
3547void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
3548{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003549 mGLState.setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
Jamie Madillc20ab272016-06-09 07:20:46 -07003550}
3551
3552void Context::cullFace(GLenum mode)
3553{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003554 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003555}
3556
3557void Context::depthFunc(GLenum func)
3558{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003559 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07003560}
3561
3562void Context::depthMask(GLboolean flag)
3563{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003564 mGLState.setDepthMask(flag != GL_FALSE);
Jamie Madillc20ab272016-06-09 07:20:46 -07003565}
3566
Jamie Madill876429b2017-04-20 15:46:24 -04003567void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07003568{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003569 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07003570}
3571
3572void Context::disable(GLenum cap)
3573{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003574 mGLState.setEnableFeature(cap, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07003575}
3576
3577void Context::disableVertexAttribArray(GLuint index)
3578{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003579 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07003580}
3581
3582void Context::enable(GLenum cap)
3583{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003584 mGLState.setEnableFeature(cap, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07003585}
3586
3587void Context::enableVertexAttribArray(GLuint index)
3588{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003589 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07003590}
3591
3592void Context::frontFace(GLenum mode)
3593{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003594 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003595}
3596
3597void Context::hint(GLenum target, GLenum mode)
3598{
3599 switch (target)
3600 {
3601 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003602 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003603 break;
3604
3605 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003606 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003607 break;
3608
3609 default:
3610 UNREACHABLE();
3611 return;
3612 }
3613}
3614
3615void Context::lineWidth(GLfloat width)
3616{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003617 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07003618}
3619
3620void Context::pixelStorei(GLenum pname, GLint param)
3621{
3622 switch (pname)
3623 {
3624 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003625 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003626 break;
3627
3628 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003629 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003630 break;
3631
3632 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003633 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07003634 break;
3635
3636 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03003637 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003638 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003639 break;
3640
3641 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03003642 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003643 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003644 break;
3645
3646 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03003647 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003648 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003649 break;
3650
3651 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03003652 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003653 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003654 break;
3655
3656 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03003657 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003658 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003659 break;
3660
3661 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03003662 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003663 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003664 break;
3665
3666 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03003667 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003668 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003669 break;
3670
3671 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03003672 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003673 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003674 break;
3675
3676 default:
3677 UNREACHABLE();
3678 return;
3679 }
3680}
3681
3682void Context::polygonOffset(GLfloat factor, GLfloat units)
3683{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003684 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07003685}
3686
Jamie Madill876429b2017-04-20 15:46:24 -04003687void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07003688{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003689 mGLState.setSampleCoverageParams(clamp01(value), invert == GL_TRUE);
Jamie Madillc20ab272016-06-09 07:20:46 -07003690}
3691
3692void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
3693{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003694 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07003695}
3696
3697void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
3698{
3699 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3700 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003701 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003702 }
3703
3704 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3705 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003706 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003707 }
3708}
3709
3710void Context::stencilMaskSeparate(GLenum face, GLuint mask)
3711{
3712 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3713 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003714 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003715 }
3716
3717 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3718 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003719 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003720 }
3721}
3722
3723void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
3724{
3725 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3726 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003727 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07003728 }
3729
3730 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3731 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003732 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07003733 }
3734}
3735
3736void Context::vertexAttrib1f(GLuint index, GLfloat x)
3737{
3738 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003739 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003740}
3741
3742void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
3743{
3744 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003745 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003746}
3747
3748void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
3749{
3750 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003751 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003752}
3753
3754void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
3755{
3756 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003757 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003758}
3759
3760void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
3761{
3762 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003763 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003764}
3765
3766void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
3767{
3768 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003769 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003770}
3771
3772void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
3773{
3774 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003775 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003776}
3777
3778void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
3779{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003780 mGLState.setVertexAttribf(index, values);
Jamie Madillc20ab272016-06-09 07:20:46 -07003781}
3782
3783void Context::vertexAttribPointer(GLuint index,
3784 GLint size,
3785 GLenum type,
3786 GLboolean normalized,
3787 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04003788 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07003789{
Shaodde78e82017-05-22 14:13:27 +08003790 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(GL_ARRAY_BUFFER), size,
3791 type, normalized == GL_TRUE, false, stride, ptr);
Jamie Madillc20ab272016-06-09 07:20:46 -07003792}
3793
Shao80957d92017-02-20 21:25:59 +08003794void Context::vertexAttribFormat(GLuint attribIndex,
3795 GLint size,
3796 GLenum type,
3797 GLboolean normalized,
3798 GLuint relativeOffset)
3799{
3800 mGLState.setVertexAttribFormat(attribIndex, size, type, normalized == GL_TRUE, false,
3801 relativeOffset);
3802}
3803
3804void Context::vertexAttribIFormat(GLuint attribIndex,
3805 GLint size,
3806 GLenum type,
3807 GLuint relativeOffset)
3808{
3809 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
3810}
3811
3812void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
3813{
Shaodde78e82017-05-22 14:13:27 +08003814 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Shao80957d92017-02-20 21:25:59 +08003815}
3816
3817void Context::setVertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
3818{
3819 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
3820}
3821
Jamie Madillc20ab272016-06-09 07:20:46 -07003822void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
3823{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003824 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07003825}
3826
3827void Context::vertexAttribIPointer(GLuint index,
3828 GLint size,
3829 GLenum type,
3830 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04003831 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07003832{
Shaodde78e82017-05-22 14:13:27 +08003833 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(GL_ARRAY_BUFFER), size,
3834 type, false, true, stride, pointer);
Jamie Madillc20ab272016-06-09 07:20:46 -07003835}
3836
3837void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
3838{
3839 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003840 mGLState.setVertexAttribi(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003841}
3842
3843void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
3844{
3845 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003846 mGLState.setVertexAttribu(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003847}
3848
3849void Context::vertexAttribI4iv(GLuint index, const GLint *v)
3850{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003851 mGLState.setVertexAttribi(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07003852}
3853
3854void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
3855{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003856 mGLState.setVertexAttribu(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07003857}
3858
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003859void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
3860{
3861 const VertexAttribCurrentValueData &currentValues =
3862 getGLState().getVertexAttribCurrentValue(index);
3863 const VertexArray *vao = getGLState().getVertexArray();
3864 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
3865 currentValues, pname, params);
3866}
3867
3868void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
3869{
3870 const VertexAttribCurrentValueData &currentValues =
3871 getGLState().getVertexAttribCurrentValue(index);
3872 const VertexArray *vao = getGLState().getVertexArray();
3873 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
3874 currentValues, pname, params);
3875}
3876
3877void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
3878{
3879 const VertexAttribCurrentValueData &currentValues =
3880 getGLState().getVertexAttribCurrentValue(index);
3881 const VertexArray *vao = getGLState().getVertexArray();
3882 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
3883 currentValues, pname, params);
3884}
3885
3886void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
3887{
3888 const VertexAttribCurrentValueData &currentValues =
3889 getGLState().getVertexAttribCurrentValue(index);
3890 const VertexArray *vao = getGLState().getVertexArray();
3891 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
3892 currentValues, pname, params);
3893}
3894
Jamie Madill876429b2017-04-20 15:46:24 -04003895void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003896{
3897 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
3898 QueryVertexAttribPointerv(attrib, pname, pointer);
3899}
3900
Jamie Madillc20ab272016-06-09 07:20:46 -07003901void Context::debugMessageControl(GLenum source,
3902 GLenum type,
3903 GLenum severity,
3904 GLsizei count,
3905 const GLuint *ids,
3906 GLboolean enabled)
3907{
3908 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003909 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
3910 (enabled != GL_FALSE));
Jamie Madillc20ab272016-06-09 07:20:46 -07003911}
3912
3913void Context::debugMessageInsert(GLenum source,
3914 GLenum type,
3915 GLuint id,
3916 GLenum severity,
3917 GLsizei length,
3918 const GLchar *buf)
3919{
3920 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003921 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07003922}
3923
3924void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
3925{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003926 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07003927}
3928
3929GLuint Context::getDebugMessageLog(GLuint count,
3930 GLsizei bufSize,
3931 GLenum *sources,
3932 GLenum *types,
3933 GLuint *ids,
3934 GLenum *severities,
3935 GLsizei *lengths,
3936 GLchar *messageLog)
3937{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003938 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
3939 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07003940}
3941
3942void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
3943{
3944 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003945 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07003946}
3947
3948void Context::popDebugGroup()
3949{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003950 mGLState.getDebug().popGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07003951}
3952
Jamie Madill876429b2017-04-20 15:46:24 -04003953void Context::bufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage)
Jamie Madill29639852016-09-02 15:00:09 -04003954{
3955 Buffer *buffer = mGLState.getTargetBuffer(target);
3956 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08003957 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04003958}
3959
Jamie Madill876429b2017-04-20 15:46:24 -04003960void Context::bufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04003961{
3962 if (data == nullptr)
3963 {
3964 return;
3965 }
3966
3967 Buffer *buffer = mGLState.getTargetBuffer(target);
3968 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08003969 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04003970}
3971
Jamie Madillef300b12016-10-07 15:12:09 -04003972void Context::attachShader(GLuint program, GLuint shader)
3973{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05003974 auto programObject = mState.mShaderPrograms->getProgram(program);
3975 auto shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04003976 ASSERT(programObject && shaderObject);
3977 programObject->attachShader(shaderObject);
3978}
3979
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003980const Workarounds &Context::getWorkarounds() const
3981{
3982 return mWorkarounds;
3983}
3984
Jamie Madillb0817d12016-11-01 15:48:31 -04003985void Context::copyBufferSubData(GLenum readTarget,
3986 GLenum writeTarget,
3987 GLintptr readOffset,
3988 GLintptr writeOffset,
3989 GLsizeiptr size)
3990{
3991 // if size is zero, the copy is a successful no-op
3992 if (size == 0)
3993 {
3994 return;
3995 }
3996
3997 // TODO(jmadill): cache these.
3998 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
3999 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
4000
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004001 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04004002}
4003
Jamie Madill01a80ee2016-11-07 12:06:18 -05004004void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
4005{
4006 Program *programObject = getProgram(program);
4007 // TODO(jmadill): Re-use this from the validation if possible.
4008 ASSERT(programObject);
4009 programObject->bindAttributeLocation(index, name);
4010}
4011
4012void Context::bindBuffer(GLenum target, GLuint buffer)
4013{
4014 switch (target)
4015 {
4016 case GL_ARRAY_BUFFER:
4017 bindArrayBuffer(buffer);
4018 break;
4019 case GL_ELEMENT_ARRAY_BUFFER:
4020 bindElementArrayBuffer(buffer);
4021 break;
4022 case GL_COPY_READ_BUFFER:
4023 bindCopyReadBuffer(buffer);
4024 break;
4025 case GL_COPY_WRITE_BUFFER:
4026 bindCopyWriteBuffer(buffer);
4027 break;
4028 case GL_PIXEL_PACK_BUFFER:
4029 bindPixelPackBuffer(buffer);
4030 break;
4031 case GL_PIXEL_UNPACK_BUFFER:
4032 bindPixelUnpackBuffer(buffer);
4033 break;
4034 case GL_UNIFORM_BUFFER:
4035 bindGenericUniformBuffer(buffer);
4036 break;
4037 case GL_TRANSFORM_FEEDBACK_BUFFER:
4038 bindGenericTransformFeedbackBuffer(buffer);
4039 break;
Geoff Lang3b573612016-10-31 14:08:10 -04004040 case GL_ATOMIC_COUNTER_BUFFER:
Jiajia Qin6eafb042016-12-27 17:04:07 +08004041 bindGenericAtomicCounterBuffer(buffer);
Geoff Lang3b573612016-10-31 14:08:10 -04004042 break;
4043 case GL_SHADER_STORAGE_BUFFER:
Jiajia Qinf546e7d2017-03-27 14:12:59 +08004044 bindGenericShaderStorageBuffer(buffer);
Geoff Lang3b573612016-10-31 14:08:10 -04004045 break;
4046 case GL_DRAW_INDIRECT_BUFFER:
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08004047 bindDrawIndirectBuffer(buffer);
Geoff Lang3b573612016-10-31 14:08:10 -04004048 break;
4049 case GL_DISPATCH_INDIRECT_BUFFER:
Geoff Lang9f090372016-12-02 10:20:43 -05004050 if (buffer != 0)
4051 {
4052 // Binding buffers to this binding point is not implemented yet.
4053 UNIMPLEMENTED();
4054 }
Geoff Lang3b573612016-10-31 14:08:10 -04004055 break;
Jamie Madill01a80ee2016-11-07 12:06:18 -05004056
4057 default:
4058 UNREACHABLE();
4059 break;
4060 }
4061}
4062
Jiajia Qin6eafb042016-12-27 17:04:07 +08004063void Context::bindBufferBase(GLenum target, GLuint index, GLuint buffer)
4064{
4065 bindBufferRange(target, index, buffer, 0, 0);
4066}
4067
4068void Context::bindBufferRange(GLenum target,
4069 GLuint index,
4070 GLuint buffer,
4071 GLintptr offset,
4072 GLsizeiptr size)
4073{
4074 switch (target)
4075 {
4076 case GL_TRANSFORM_FEEDBACK_BUFFER:
4077 bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
4078 bindGenericTransformFeedbackBuffer(buffer);
4079 break;
4080 case GL_UNIFORM_BUFFER:
4081 bindIndexedUniformBuffer(buffer, index, offset, size);
4082 bindGenericUniformBuffer(buffer);
4083 break;
4084 case GL_ATOMIC_COUNTER_BUFFER:
4085 bindIndexedAtomicCounterBuffer(buffer, index, offset, size);
4086 bindGenericAtomicCounterBuffer(buffer);
4087 break;
4088 case GL_SHADER_STORAGE_BUFFER:
Jiajia Qinf546e7d2017-03-27 14:12:59 +08004089 bindIndexedShaderStorageBuffer(buffer, index, offset, size);
4090 bindGenericShaderStorageBuffer(buffer);
Jiajia Qin6eafb042016-12-27 17:04:07 +08004091 break;
4092 default:
4093 UNREACHABLE();
4094 break;
4095 }
4096}
4097
Jamie Madill01a80ee2016-11-07 12:06:18 -05004098void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
4099{
4100 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4101 {
4102 bindReadFramebuffer(framebuffer);
4103 }
4104
4105 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4106 {
4107 bindDrawFramebuffer(framebuffer);
4108 }
4109}
4110
4111void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
4112{
4113 ASSERT(target == GL_RENDERBUFFER);
4114 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05004115 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004116 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004117}
4118
JiangYizhoubddc46b2016-12-09 09:50:51 +08004119void Context::texStorage2DMultisample(GLenum target,
4120 GLsizei samples,
4121 GLenum internalformat,
4122 GLsizei width,
4123 GLsizei height,
4124 GLboolean fixedsamplelocations)
4125{
4126 Extents size(width, height, 1);
4127 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004128 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
JiangYizhoubddc46b2016-12-09 09:50:51 +08004129 fixedsamplelocations));
4130}
4131
4132void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
4133{
Jamie Madilldd43e6c2017-03-24 14:18:49 -04004134 mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER);
JiangYizhoubddc46b2016-12-09 09:50:51 +08004135 const Framebuffer *framebuffer = mGLState.getReadFramebuffer();
4136
4137 switch (pname)
4138 {
4139 case GL_SAMPLE_POSITION:
4140 handleError(framebuffer->getSamplePosition(index, val));
4141 break;
4142 default:
4143 UNREACHABLE();
4144 }
4145}
4146
Jamie Madille8fb6402017-02-14 17:56:40 -05004147void Context::renderbufferStorage(GLenum target,
4148 GLenum internalformat,
4149 GLsizei width,
4150 GLsizei height)
4151{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004152 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4153 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
4154
Jamie Madille8fb6402017-02-14 17:56:40 -05004155 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04004156 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004157}
4158
4159void Context::renderbufferStorageMultisample(GLenum target,
4160 GLsizei samples,
4161 GLenum internalformat,
4162 GLsizei width,
4163 GLsizei height)
4164{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004165 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4166 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05004167
4168 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004169 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04004170 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004171}
4172
Geoff Lang38f2cfb2017-04-11 15:23:08 -04004173void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
4174{
4175 const FenceSync *syncObject = getFenceSync(sync);
Geoff Lang82483b92017-04-11 15:33:00 -04004176 handleError(QuerySynciv(syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04004177}
4178
JiangYizhoue18e6392017-02-20 10:32:23 +08004179void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
4180{
4181 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4182 QueryFramebufferParameteriv(framebuffer, pname, params);
4183}
4184
4185void Context::setFramebufferParameteri(GLenum target, GLenum pname, GLint param)
4186{
4187 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4188 SetFramebufferParameteri(framebuffer, pname, param);
4189}
4190
Jamie Madillb3f26b92017-07-19 15:07:41 -04004191Error Context::getScratchBuffer(size_t requstedSizeBytes,
4192 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05004193{
Jamie Madillb3f26b92017-07-19 15:07:41 -04004194 if (!mScratchBuffer.get(requstedSizeBytes, scratchBufferOut))
4195 {
4196 return OutOfMemory() << "Failed to allocate internal buffer.";
4197 }
4198 return NoError();
4199}
4200
4201Error Context::getZeroFilledBuffer(size_t requstedSizeBytes,
4202 angle::MemoryBuffer **zeroBufferOut) const
4203{
4204 if (!mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0))
Jamie Madille14951e2017-03-09 18:55:16 -05004205 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05004206 return OutOfMemory() << "Failed to allocate internal buffer.";
Jamie Madille14951e2017-03-09 18:55:16 -05004207 }
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05004208 return NoError();
Jamie Madille14951e2017-03-09 18:55:16 -05004209}
4210
Xinghua Cao2b396592017-03-29 15:36:04 +08004211void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
4212{
4213 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
4214 {
4215 return;
4216 }
4217
Jamie Madillfe548342017-06-19 11:13:24 -04004218 mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ);
Xinghua Cao2b396592017-03-29 15:36:04 +08004219}
4220
JiangYizhou165361c2017-06-07 14:56:57 +08004221void Context::texStorage2D(GLenum target,
4222 GLsizei levels,
4223 GLenum internalFormat,
4224 GLsizei width,
4225 GLsizei height)
4226{
4227 Extents size(width, height, 1);
4228 Texture *texture = getTargetTexture(target);
4229 handleError(texture->setStorage(this, target, levels, internalFormat, size));
4230}
4231
4232void Context::texStorage3D(GLenum target,
4233 GLsizei levels,
4234 GLenum internalFormat,
4235 GLsizei width,
4236 GLsizei height,
4237 GLsizei depth)
4238{
4239 Extents size(width, height, depth);
4240 Texture *texture = getTargetTexture(target);
4241 handleError(texture->setStorage(this, target, levels, internalFormat, size));
4242}
4243
Jamie Madillc1d770e2017-04-13 17:31:24 -04004244GLenum Context::checkFramebufferStatus(GLenum target)
4245{
4246 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4247 ASSERT(framebuffer);
4248
4249 return framebuffer->checkStatus(this);
4250}
4251
4252void Context::compileShader(GLuint shader)
4253{
4254 Shader *shaderObject = GetValidShader(this, shader);
4255 if (!shaderObject)
4256 {
4257 return;
4258 }
4259 shaderObject->compile(this);
4260}
4261
4262void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
4263{
4264 for (int i = 0; i < n; i++)
4265 {
4266 deleteBuffer(buffers[i]);
4267 }
4268}
4269
4270void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
4271{
4272 for (int i = 0; i < n; i++)
4273 {
4274 if (framebuffers[i] != 0)
4275 {
4276 deleteFramebuffer(framebuffers[i]);
4277 }
4278 }
4279}
4280
4281void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
4282{
4283 for (int i = 0; i < n; i++)
4284 {
4285 deleteRenderbuffer(renderbuffers[i]);
4286 }
4287}
4288
4289void Context::deleteTextures(GLsizei n, const GLuint *textures)
4290{
4291 for (int i = 0; i < n; i++)
4292 {
4293 if (textures[i] != 0)
4294 {
4295 deleteTexture(textures[i]);
4296 }
4297 }
4298}
4299
4300void Context::detachShader(GLuint program, GLuint shader)
4301{
4302 Program *programObject = getProgram(program);
4303 ASSERT(programObject);
4304
4305 Shader *shaderObject = getShader(shader);
4306 ASSERT(shaderObject);
4307
4308 programObject->detachShader(this, shaderObject);
4309}
4310
4311void Context::genBuffers(GLsizei n, GLuint *buffers)
4312{
4313 for (int i = 0; i < n; i++)
4314 {
4315 buffers[i] = createBuffer();
4316 }
4317}
4318
4319void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
4320{
4321 for (int i = 0; i < n; i++)
4322 {
4323 framebuffers[i] = createFramebuffer();
4324 }
4325}
4326
4327void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
4328{
4329 for (int i = 0; i < n; i++)
4330 {
4331 renderbuffers[i] = createRenderbuffer();
4332 }
4333}
4334
4335void Context::genTextures(GLsizei n, GLuint *textures)
4336{
4337 for (int i = 0; i < n; i++)
4338 {
4339 textures[i] = createTexture();
4340 }
4341}
4342
4343void Context::getActiveAttrib(GLuint program,
4344 GLuint index,
4345 GLsizei bufsize,
4346 GLsizei *length,
4347 GLint *size,
4348 GLenum *type,
4349 GLchar *name)
4350{
4351 Program *programObject = getProgram(program);
4352 ASSERT(programObject);
4353 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
4354}
4355
4356void Context::getActiveUniform(GLuint program,
4357 GLuint index,
4358 GLsizei bufsize,
4359 GLsizei *length,
4360 GLint *size,
4361 GLenum *type,
4362 GLchar *name)
4363{
4364 Program *programObject = getProgram(program);
4365 ASSERT(programObject);
4366 programObject->getActiveUniform(index, bufsize, length, size, type, name);
4367}
4368
4369void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
4370{
4371 Program *programObject = getProgram(program);
4372 ASSERT(programObject);
4373 programObject->getAttachedShaders(maxcount, count, shaders);
4374}
4375
4376GLint Context::getAttribLocation(GLuint program, const GLchar *name)
4377{
4378 Program *programObject = getProgram(program);
4379 ASSERT(programObject);
4380 return programObject->getAttributeLocation(name);
4381}
4382
4383void Context::getBooleanv(GLenum pname, GLboolean *params)
4384{
4385 GLenum nativeType;
4386 unsigned int numParams = 0;
4387 getQueryParameterInfo(pname, &nativeType, &numParams);
4388
4389 if (nativeType == GL_BOOL)
4390 {
4391 getBooleanvImpl(pname, params);
4392 }
4393 else
4394 {
4395 CastStateValues(this, nativeType, pname, numParams, params);
4396 }
4397}
4398
4399void Context::getFloatv(GLenum pname, GLfloat *params)
4400{
4401 GLenum nativeType;
4402 unsigned int numParams = 0;
4403 getQueryParameterInfo(pname, &nativeType, &numParams);
4404
4405 if (nativeType == GL_FLOAT)
4406 {
4407 getFloatvImpl(pname, params);
4408 }
4409 else
4410 {
4411 CastStateValues(this, nativeType, pname, numParams, params);
4412 }
4413}
4414
4415void Context::getIntegerv(GLenum pname, GLint *params)
4416{
4417 GLenum nativeType;
4418 unsigned int numParams = 0;
4419 getQueryParameterInfo(pname, &nativeType, &numParams);
4420
4421 if (nativeType == GL_INT)
4422 {
4423 getIntegervImpl(pname, params);
4424 }
4425 else
4426 {
4427 CastStateValues(this, nativeType, pname, numParams, params);
4428 }
4429}
4430
4431void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
4432{
4433 Program *programObject = getProgram(program);
4434 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04004435 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004436}
4437
Jamie Madillbe849e42017-05-02 15:49:00 -04004438void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04004439{
4440 Program *programObject = getProgram(program);
4441 ASSERT(programObject);
4442 programObject->getInfoLog(bufsize, length, infolog);
4443}
4444
4445void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
4446{
4447 Shader *shaderObject = getShader(shader);
4448 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04004449 QueryShaderiv(this, shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004450}
4451
4452void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
4453{
4454 Shader *shaderObject = getShader(shader);
4455 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04004456 shaderObject->getInfoLog(this, bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004457}
4458
4459void Context::getShaderPrecisionFormat(GLenum shadertype,
4460 GLenum precisiontype,
4461 GLint *range,
4462 GLint *precision)
4463{
4464 // TODO(jmadill): Compute shaders.
4465
4466 switch (shadertype)
4467 {
4468 case GL_VERTEX_SHADER:
4469 switch (precisiontype)
4470 {
4471 case GL_LOW_FLOAT:
4472 mCaps.vertexLowpFloat.get(range, precision);
4473 break;
4474 case GL_MEDIUM_FLOAT:
4475 mCaps.vertexMediumpFloat.get(range, precision);
4476 break;
4477 case GL_HIGH_FLOAT:
4478 mCaps.vertexHighpFloat.get(range, precision);
4479 break;
4480
4481 case GL_LOW_INT:
4482 mCaps.vertexLowpInt.get(range, precision);
4483 break;
4484 case GL_MEDIUM_INT:
4485 mCaps.vertexMediumpInt.get(range, precision);
4486 break;
4487 case GL_HIGH_INT:
4488 mCaps.vertexHighpInt.get(range, precision);
4489 break;
4490
4491 default:
4492 UNREACHABLE();
4493 return;
4494 }
4495 break;
4496
4497 case GL_FRAGMENT_SHADER:
4498 switch (precisiontype)
4499 {
4500 case GL_LOW_FLOAT:
4501 mCaps.fragmentLowpFloat.get(range, precision);
4502 break;
4503 case GL_MEDIUM_FLOAT:
4504 mCaps.fragmentMediumpFloat.get(range, precision);
4505 break;
4506 case GL_HIGH_FLOAT:
4507 mCaps.fragmentHighpFloat.get(range, precision);
4508 break;
4509
4510 case GL_LOW_INT:
4511 mCaps.fragmentLowpInt.get(range, precision);
4512 break;
4513 case GL_MEDIUM_INT:
4514 mCaps.fragmentMediumpInt.get(range, precision);
4515 break;
4516 case GL_HIGH_INT:
4517 mCaps.fragmentHighpInt.get(range, precision);
4518 break;
4519
4520 default:
4521 UNREACHABLE();
4522 return;
4523 }
4524 break;
4525
4526 default:
4527 UNREACHABLE();
4528 return;
4529 }
4530}
4531
4532void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
4533{
4534 Shader *shaderObject = getShader(shader);
4535 ASSERT(shaderObject);
4536 shaderObject->getSource(bufsize, length, source);
4537}
4538
4539void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
4540{
4541 Program *programObject = getProgram(program);
4542 ASSERT(programObject);
4543 programObject->getUniformfv(location, params);
4544}
4545
4546void Context::getUniformiv(GLuint program, GLint location, GLint *params)
4547{
4548 Program *programObject = getProgram(program);
4549 ASSERT(programObject);
4550 programObject->getUniformiv(location, params);
4551}
4552
4553GLint Context::getUniformLocation(GLuint program, const GLchar *name)
4554{
4555 Program *programObject = getProgram(program);
4556 ASSERT(programObject);
4557 return programObject->getUniformLocation(name);
4558}
4559
4560GLboolean Context::isBuffer(GLuint buffer)
4561{
4562 if (buffer == 0)
4563 {
4564 return GL_FALSE;
4565 }
4566
4567 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
4568}
4569
4570GLboolean Context::isEnabled(GLenum cap)
4571{
4572 return mGLState.getEnableFeature(cap);
4573}
4574
4575GLboolean Context::isFramebuffer(GLuint framebuffer)
4576{
4577 if (framebuffer == 0)
4578 {
4579 return GL_FALSE;
4580 }
4581
4582 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
4583}
4584
4585GLboolean Context::isProgram(GLuint program)
4586{
4587 if (program == 0)
4588 {
4589 return GL_FALSE;
4590 }
4591
4592 return (getProgram(program) ? GL_TRUE : GL_FALSE);
4593}
4594
4595GLboolean Context::isRenderbuffer(GLuint renderbuffer)
4596{
4597 if (renderbuffer == 0)
4598 {
4599 return GL_FALSE;
4600 }
4601
4602 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
4603}
4604
4605GLboolean Context::isShader(GLuint shader)
4606{
4607 if (shader == 0)
4608 {
4609 return GL_FALSE;
4610 }
4611
4612 return (getShader(shader) ? GL_TRUE : GL_FALSE);
4613}
4614
4615GLboolean Context::isTexture(GLuint texture)
4616{
4617 if (texture == 0)
4618 {
4619 return GL_FALSE;
4620 }
4621
4622 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
4623}
4624
4625void Context::linkProgram(GLuint program)
4626{
4627 Program *programObject = getProgram(program);
4628 ASSERT(programObject);
4629 handleError(programObject->link(this));
4630}
4631
4632void Context::releaseShaderCompiler()
4633{
Jamie Madill4928b7c2017-06-20 12:57:39 -04004634 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004635}
4636
4637void Context::shaderBinary(GLsizei n,
4638 const GLuint *shaders,
4639 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04004640 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04004641 GLsizei length)
4642{
4643 // No binary shader formats are supported.
4644 UNIMPLEMENTED();
4645}
4646
4647void Context::shaderSource(GLuint shader,
4648 GLsizei count,
4649 const GLchar *const *string,
4650 const GLint *length)
4651{
4652 Shader *shaderObject = getShader(shader);
4653 ASSERT(shaderObject);
4654 shaderObject->setSource(count, string, length);
4655}
4656
4657void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
4658{
4659 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
4660}
4661
4662void Context::stencilMask(GLuint mask)
4663{
4664 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4665}
4666
4667void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4668{
4669 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4670}
4671
4672void Context::uniform1f(GLint location, GLfloat x)
4673{
4674 Program *program = mGLState.getProgram();
4675 program->setUniform1fv(location, 1, &x);
4676}
4677
4678void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
4679{
4680 Program *program = mGLState.getProgram();
4681 program->setUniform1fv(location, count, v);
4682}
4683
4684void Context::uniform1i(GLint location, GLint x)
4685{
4686 Program *program = mGLState.getProgram();
4687 program->setUniform1iv(location, 1, &x);
4688}
4689
4690void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
4691{
4692 Program *program = mGLState.getProgram();
4693 program->setUniform1iv(location, count, v);
4694}
4695
4696void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
4697{
4698 GLfloat xy[2] = {x, y};
4699 Program *program = mGLState.getProgram();
4700 program->setUniform2fv(location, 1, xy);
4701}
4702
4703void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
4704{
4705 Program *program = mGLState.getProgram();
4706 program->setUniform2fv(location, count, v);
4707}
4708
4709void Context::uniform2i(GLint location, GLint x, GLint y)
4710{
4711 GLint xy[2] = {x, y};
4712 Program *program = mGLState.getProgram();
4713 program->setUniform2iv(location, 1, xy);
4714}
4715
4716void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
4717{
4718 Program *program = mGLState.getProgram();
4719 program->setUniform2iv(location, count, v);
4720}
4721
4722void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
4723{
4724 GLfloat xyz[3] = {x, y, z};
4725 Program *program = mGLState.getProgram();
4726 program->setUniform3fv(location, 1, xyz);
4727}
4728
4729void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
4730{
4731 Program *program = mGLState.getProgram();
4732 program->setUniform3fv(location, count, v);
4733}
4734
4735void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
4736{
4737 GLint xyz[3] = {x, y, z};
4738 Program *program = mGLState.getProgram();
4739 program->setUniform3iv(location, 1, xyz);
4740}
4741
4742void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
4743{
4744 Program *program = mGLState.getProgram();
4745 program->setUniform3iv(location, count, v);
4746}
4747
4748void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4749{
4750 GLfloat xyzw[4] = {x, y, z, w};
4751 Program *program = mGLState.getProgram();
4752 program->setUniform4fv(location, 1, xyzw);
4753}
4754
4755void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
4756{
4757 Program *program = mGLState.getProgram();
4758 program->setUniform4fv(location, count, v);
4759}
4760
4761void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
4762{
4763 GLint xyzw[4] = {x, y, z, w};
4764 Program *program = mGLState.getProgram();
4765 program->setUniform4iv(location, 1, xyzw);
4766}
4767
4768void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
4769{
4770 Program *program = mGLState.getProgram();
4771 program->setUniform4iv(location, count, v);
4772}
4773
4774void Context::uniformMatrix2fv(GLint location,
4775 GLsizei count,
4776 GLboolean transpose,
4777 const GLfloat *value)
4778{
4779 Program *program = mGLState.getProgram();
4780 program->setUniformMatrix2fv(location, count, transpose, value);
4781}
4782
4783void Context::uniformMatrix3fv(GLint location,
4784 GLsizei count,
4785 GLboolean transpose,
4786 const GLfloat *value)
4787{
4788 Program *program = mGLState.getProgram();
4789 program->setUniformMatrix3fv(location, count, transpose, value);
4790}
4791
4792void Context::uniformMatrix4fv(GLint location,
4793 GLsizei count,
4794 GLboolean transpose,
4795 const GLfloat *value)
4796{
4797 Program *program = mGLState.getProgram();
4798 program->setUniformMatrix4fv(location, count, transpose, value);
4799}
4800
4801void Context::validateProgram(GLuint program)
4802{
4803 Program *programObject = getProgram(program);
4804 ASSERT(programObject);
4805 programObject->validate(mCaps);
4806}
4807
Jamie Madilld04908b2017-06-09 14:15:35 -04004808void Context::getProgramBinary(GLuint program,
4809 GLsizei bufSize,
4810 GLsizei *length,
4811 GLenum *binaryFormat,
4812 void *binary)
4813{
4814 Program *programObject = getProgram(program);
4815 ASSERT(programObject != nullptr);
4816
4817 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
4818}
4819
4820void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
4821{
4822 Program *programObject = getProgram(program);
4823 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04004824
Jamie Madilld04908b2017-06-09 14:15:35 -04004825 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
4826}
4827
Jamie Madillff325f12017-08-26 15:06:05 -04004828void Context::uniform1ui(GLint location, GLuint v0)
4829{
4830 Program *program = mGLState.getProgram();
4831 program->setUniform1uiv(location, 1, &v0);
4832}
4833
4834void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
4835{
4836 Program *program = mGLState.getProgram();
4837 const GLuint xy[] = {v0, v1};
4838 program->setUniform2uiv(location, 1, xy);
4839}
4840
4841void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
4842{
4843 Program *program = mGLState.getProgram();
4844 const GLuint xyz[] = {v0, v1, v2};
4845 program->setUniform3uiv(location, 1, xyz);
4846}
4847
4848void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
4849{
4850 Program *program = mGLState.getProgram();
4851 const GLuint xyzw[] = {v0, v1, v2, v3};
4852 program->setUniform4uiv(location, 1, xyzw);
4853}
4854
4855void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
4856{
4857 Program *program = mGLState.getProgram();
4858 program->setUniform1uiv(location, count, value);
4859}
4860void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
4861{
4862 Program *program = mGLState.getProgram();
4863 program->setUniform2uiv(location, count, value);
4864}
4865
4866void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
4867{
4868 Program *program = mGLState.getProgram();
4869 program->setUniform3uiv(location, count, value);
4870}
4871
4872void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
4873{
4874 Program *program = mGLState.getProgram();
4875 program->setUniform4uiv(location, count, value);
4876}
4877
Jamie Madillf0e04492017-08-26 15:28:42 -04004878void Context::genQueries(GLsizei n, GLuint *ids)
4879{
4880 for (GLsizei i = 0; i < n; i++)
4881 {
4882 GLuint handle = mQueryHandleAllocator.allocate();
4883 mQueryMap.assign(handle, nullptr);
4884 ids[i] = handle;
4885 }
4886}
4887
4888void Context::deleteQueries(GLsizei n, const GLuint *ids)
4889{
4890 for (int i = 0; i < n; i++)
4891 {
4892 GLuint query = ids[i];
4893
4894 Query *queryObject = nullptr;
4895 if (mQueryMap.erase(query, &queryObject))
4896 {
4897 mQueryHandleAllocator.release(query);
4898 if (queryObject)
4899 {
4900 queryObject->release(this);
4901 }
4902 }
4903 }
4904}
4905
4906GLboolean Context::isQuery(GLuint id)
4907{
4908 return (getQuery(id, false, GL_NONE) != nullptr) ? GL_TRUE : GL_FALSE;
4909}
4910
Jamie Madillc8c95812017-08-26 18:40:09 -04004911void Context::uniformMatrix2x3fv(GLint location,
4912 GLsizei count,
4913 GLboolean transpose,
4914 const GLfloat *value)
4915{
4916 Program *program = mGLState.getProgram();
4917 program->setUniformMatrix2x3fv(location, count, transpose, value);
4918}
4919
4920void Context::uniformMatrix3x2fv(GLint location,
4921 GLsizei count,
4922 GLboolean transpose,
4923 const GLfloat *value)
4924{
4925 Program *program = mGLState.getProgram();
4926 program->setUniformMatrix3x2fv(location, count, transpose, value);
4927}
4928
4929void Context::uniformMatrix2x4fv(GLint location,
4930 GLsizei count,
4931 GLboolean transpose,
4932 const GLfloat *value)
4933{
4934 Program *program = mGLState.getProgram();
4935 program->setUniformMatrix2x4fv(location, count, transpose, value);
4936}
4937
4938void Context::uniformMatrix4x2fv(GLint location,
4939 GLsizei count,
4940 GLboolean transpose,
4941 const GLfloat *value)
4942{
4943 Program *program = mGLState.getProgram();
4944 program->setUniformMatrix4x2fv(location, count, transpose, value);
4945}
4946
4947void Context::uniformMatrix3x4fv(GLint location,
4948 GLsizei count,
4949 GLboolean transpose,
4950 const GLfloat *value)
4951{
4952 Program *program = mGLState.getProgram();
4953 program->setUniformMatrix3x4fv(location, count, transpose, value);
4954}
4955
4956void Context::uniformMatrix4x3fv(GLint location,
4957 GLsizei count,
4958 GLboolean transpose,
4959 const GLfloat *value)
4960{
4961 Program *program = mGLState.getProgram();
4962 program->setUniformMatrix4x3fv(location, count, transpose, value);
4963}
4964
Jamie Madilld7576732017-08-26 18:49:50 -04004965void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
4966{
4967 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
4968 {
4969 GLuint vertexArray = arrays[arrayIndex];
4970
4971 if (arrays[arrayIndex] != 0)
4972 {
4973 VertexArray *vertexArrayObject = nullptr;
4974 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
4975 {
4976 if (vertexArrayObject != nullptr)
4977 {
4978 detachVertexArray(vertexArray);
4979 vertexArrayObject->onDestroy(this);
4980 }
4981
4982 mVertexArrayHandleAllocator.release(vertexArray);
4983 }
4984 }
4985 }
4986}
4987
4988void Context::genVertexArrays(GLsizei n, GLuint *arrays)
4989{
4990 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
4991 {
4992 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
4993 mVertexArrayMap.assign(vertexArray, nullptr);
4994 arrays[arrayIndex] = vertexArray;
4995 }
4996}
4997
4998bool Context::isVertexArray(GLuint array)
4999{
5000 if (array == 0)
5001 {
5002 return GL_FALSE;
5003 }
5004
5005 VertexArray *vao = getVertexArray(array);
5006 return (vao != nullptr ? GL_TRUE : GL_FALSE);
5007}
5008
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04005009void Context::endTransformFeedback()
5010{
5011 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5012 transformFeedback->end(this);
5013}
5014
5015void Context::transformFeedbackVaryings(GLuint program,
5016 GLsizei count,
5017 const GLchar *const *varyings,
5018 GLenum bufferMode)
5019{
5020 Program *programObject = getProgram(program);
5021 ASSERT(programObject);
5022 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
5023}
5024
5025void Context::getTransformFeedbackVarying(GLuint program,
5026 GLuint index,
5027 GLsizei bufSize,
5028 GLsizei *length,
5029 GLsizei *size,
5030 GLenum *type,
5031 GLchar *name)
5032{
5033 Program *programObject = getProgram(program);
5034 ASSERT(programObject);
5035 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
5036}
5037
5038void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
5039{
5040 for (int i = 0; i < n; i++)
5041 {
5042 GLuint transformFeedback = ids[i];
5043 if (transformFeedback == 0)
5044 {
5045 continue;
5046 }
5047
5048 TransformFeedback *transformFeedbackObject = nullptr;
5049 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
5050 {
5051 if (transformFeedbackObject != nullptr)
5052 {
5053 detachTransformFeedback(transformFeedback);
5054 transformFeedbackObject->release(this);
5055 }
5056
5057 mTransformFeedbackHandleAllocator.release(transformFeedback);
5058 }
5059 }
5060}
5061
5062void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
5063{
5064 for (int i = 0; i < n; i++)
5065 {
5066 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
5067 mTransformFeedbackMap.assign(transformFeedback, nullptr);
5068 ids[i] = transformFeedback;
5069 }
5070}
5071
5072bool Context::isTransformFeedback(GLuint id)
5073{
5074 if (id == 0)
5075 {
5076 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
5077 // returns FALSE
5078 return GL_FALSE;
5079 }
5080
5081 const TransformFeedback *transformFeedback = getTransformFeedback(id);
5082 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
5083}
5084
5085void Context::pauseTransformFeedback()
5086{
5087 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5088 transformFeedback->pause();
5089}
5090
5091void Context::resumeTransformFeedback()
5092{
5093 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5094 transformFeedback->resume();
5095}
5096
Jamie Madill12e957f2017-08-26 21:42:26 -04005097void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
5098{
5099 const Program *programObject = getProgram(program);
5100 programObject->getUniformuiv(location, params);
5101}
5102
5103GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
5104{
5105 const Program *programObject = getProgram(program);
5106 return programObject->getFragDataLocation(name);
5107}
5108
5109void Context::getUniformIndices(GLuint program,
5110 GLsizei uniformCount,
5111 const GLchar *const *uniformNames,
5112 GLuint *uniformIndices)
5113{
5114 const Program *programObject = getProgram(program);
5115 if (!programObject->isLinked())
5116 {
5117 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5118 {
5119 uniformIndices[uniformId] = GL_INVALID_INDEX;
5120 }
5121 }
5122 else
5123 {
5124 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5125 {
5126 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
5127 }
5128 }
5129}
5130
5131void Context::getActiveUniformsiv(GLuint program,
5132 GLsizei uniformCount,
5133 const GLuint *uniformIndices,
5134 GLenum pname,
5135 GLint *params)
5136{
5137 const Program *programObject = getProgram(program);
5138 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5139 {
5140 const GLuint index = uniformIndices[uniformId];
5141 params[uniformId] = programObject->getActiveUniformi(index, pname);
5142 }
5143}
5144
5145GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
5146{
5147 const Program *programObject = getProgram(program);
5148 return programObject->getUniformBlockIndex(uniformBlockName);
5149}
5150
5151void Context::getActiveUniformBlockiv(GLuint program,
5152 GLuint uniformBlockIndex,
5153 GLenum pname,
5154 GLint *params)
5155{
5156 const Program *programObject = getProgram(program);
5157 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
5158}
5159
5160void Context::getActiveUniformBlockName(GLuint program,
5161 GLuint uniformBlockIndex,
5162 GLsizei bufSize,
5163 GLsizei *length,
5164 GLchar *uniformBlockName)
5165{
5166 const Program *programObject = getProgram(program);
5167 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
5168}
5169
5170void Context::uniformBlockBinding(GLuint program,
5171 GLuint uniformBlockIndex,
5172 GLuint uniformBlockBinding)
5173{
5174 Program *programObject = getProgram(program);
5175 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
5176}
5177
Jamie Madillc29968b2016-01-20 11:17:23 -05005178} // namespace gl