blob: 89c77a234b13116b82b1c6ff77cadb5f16e3c689 [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 Madillb9293972015-02-19 11:07:54 -050012#include <iterator>
13#include <sstream>
14
Geoff Lang0b7eef72014-06-12 14:10:47 -040015#include "common/platform.h"
Jamie Madillb9293972015-02-19 11:07:54 -050016#include "common/utilities.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050017#include "libANGLE/Buffer.h"
Jamie Madillb9293972015-02-19 11:07:54 -050018#include "libANGLE/Compiler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050019#include "libANGLE/Display.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050020#include "libANGLE/Fence.h"
21#include "libANGLE/Framebuffer.h"
22#include "libANGLE/FramebufferAttachment.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050023#include "libANGLE/Program.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050024#include "libANGLE/Query.h"
Jamie Madillb9293972015-02-19 11:07:54 -050025#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050026#include "libANGLE/ResourceManager.h"
27#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050028#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050029#include "libANGLE/Texture.h"
30#include "libANGLE/TransformFeedback.h"
31#include "libANGLE/VertexArray.h"
32#include "libANGLE/formatutils.h"
33#include "libANGLE/validationES.h"
34#include "libANGLE/renderer/Renderer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000035
Geoff Langf6db0982015-08-25 13:04:00 -040036namespace
37{
38
Ian Ewell3ffd78b2016-01-22 16:09:42 -050039template <typename T>
40gl::Error GetQueryObjectParameter(gl::Context *context, GLuint id, GLenum pname, T *params)
41{
42 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
43 ASSERT(queryObject != nullptr);
44
45 switch (pname)
46 {
47 case GL_QUERY_RESULT_EXT:
48 return queryObject->getResult(params);
49 case GL_QUERY_RESULT_AVAILABLE_EXT:
50 {
51 bool available;
52 gl::Error error = queryObject->isResultAvailable(&available);
53 if (!error.isError())
54 {
55 *params = static_cast<T>(available ? GL_TRUE : GL_FALSE);
56 }
57 return error;
58 }
59 default:
60 UNREACHABLE();
61 return gl::Error(GL_INVALID_OPERATION, "Unreachable Error");
62 }
63}
64
Geoff Langf6db0982015-08-25 13:04:00 -040065void MarkTransformFeedbackBufferUsage(gl::TransformFeedback *transformFeedback)
66{
Geoff Lang1a683462015-09-29 15:09:59 -040067 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -040068 {
69 for (size_t tfBufferIndex = 0; tfBufferIndex < transformFeedback->getIndexedBufferCount();
70 tfBufferIndex++)
71 {
72 const OffsetBindingPointer<gl::Buffer> &buffer =
73 transformFeedback->getIndexedBuffer(tfBufferIndex);
74 if (buffer.get() != nullptr)
75 {
76 buffer->onTransformFeedback();
77 }
78 }
79 }
80}
Jamie Madill46e6c7a2016-01-18 14:42:30 -050081
82// Attribute map queries.
83EGLint GetClientVersion(const egl::AttributeMap &attribs)
84{
85 return attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1);
86}
87
88GLenum GetResetStrategy(const egl::AttributeMap &attribs)
89{
90 EGLenum attrib = attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT,
91 EGL_NO_RESET_NOTIFICATION_EXT);
92 switch (attrib)
93 {
94 case EGL_NO_RESET_NOTIFICATION:
95 return GL_NO_RESET_NOTIFICATION_EXT;
96 case EGL_LOSE_CONTEXT_ON_RESET:
97 return GL_LOSE_CONTEXT_ON_RESET_EXT;
98 default:
99 UNREACHABLE();
100 return GL_NONE;
101 }
102}
103
104bool GetRobustAccess(const egl::AttributeMap &attribs)
105{
106 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE);
107}
108
109bool GetDebug(const egl::AttributeMap &attribs)
110{
111 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE);
112}
113
114bool GetNoError(const egl::AttributeMap &attribs)
115{
116 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
117}
118
Geoff Langf6db0982015-08-25 13:04:00 -0400119} // anonymous namespace
120
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000121namespace gl
122{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000123
Corentin Wallez51706ea2015-08-07 14:39:22 -0400124Context::Context(const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400125 const Context *shareContext,
126 rx::Renderer *renderer,
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500127 const egl::AttributeMap &attribs)
128 : ValidationContext(GetClientVersion(attribs),
Jamie Madillf25855c2015-11-03 11:06:18 -0500129 mState,
130 mCaps,
131 mTextureCaps,
132 mExtensions,
133 nullptr,
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500134 mLimitations,
135 GetNoError(attribs)),
136 mCompiler(nullptr),
Jamie Madillf25855c2015-11-03 11:06:18 -0500137 mRenderer(renderer),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500138 mClientVersion(GetClientVersion(attribs)),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400139 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500140 mClientType(EGL_OPENGL_ES_API),
141 mHasBeenCurrent(false),
142 mContextLost(false),
143 mResetStatus(GL_NO_ERROR),
144 mResetStrategy(GetResetStrategy(attribs)),
145 mRobustAccess(GetRobustAccess(attribs)),
146 mCurrentSurface(nullptr),
147 mResourceManager(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000148{
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500149 ASSERT(!mRobustAccess); // Unimplemented
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000150
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500151 initCaps(mClientVersion);
Geoff Langc0b9ef42014-07-02 10:02:37 -0400152
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500153 mState.initialize(mCaps, mExtensions, mClientVersion, GetDebug(attribs));
Régis Fénéon83107972015-02-05 12:57:44 +0100154
Shannon Woods53a94a82014-06-24 15:20:36 -0400155 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400156
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000157 if (shareContext != NULL)
158 {
159 mResourceManager = shareContext->mResourceManager;
160 mResourceManager->addRef();
161 }
162 else
163 {
daniel@transgaming.com370482e2012-11-28 19:32:13 +0000164 mResourceManager = new ResourceManager(mRenderer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000165 }
166
Jamie Madillc185cb82015-04-28 12:39:08 -0400167 mData.resourceManager = mResourceManager;
168
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000169 // [OpenGL ES 2.0.24] section 3.7 page 83:
170 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have twodimensional
171 // and cube map texture state vectors respectively associated with them.
172 // In order that access to these initial textures not be lost, they are treated as texture
173 // objects all of whose names are 0.
174
Geoff Lang691e58c2014-12-19 17:03:25 -0500175 Texture *zeroTexture2D = new Texture(mRenderer->createTexture(GL_TEXTURE_2D), 0, GL_TEXTURE_2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500176 mZeroTextures[GL_TEXTURE_2D].set(zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500177
Geoff Lang691e58c2014-12-19 17:03:25 -0500178 Texture *zeroTextureCube = new Texture(mRenderer->createTexture(GL_TEXTURE_CUBE_MAP), 0, GL_TEXTURE_CUBE_MAP);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500179 mZeroTextures[GL_TEXTURE_CUBE_MAP].set(zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400180
181 if (mClientVersion >= 3)
182 {
183 // TODO: These could also be enabled via extension
Geoff Lang691e58c2014-12-19 17:03:25 -0500184 Texture *zeroTexture3D = new Texture(mRenderer->createTexture(GL_TEXTURE_3D), 0, GL_TEXTURE_3D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500185 mZeroTextures[GL_TEXTURE_3D].set(zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400186
Geoff Lang691e58c2014-12-19 17:03:25 -0500187 Texture *zeroTexture2DArray = new Texture(mRenderer->createTexture(GL_TEXTURE_2D_ARRAY), 0, GL_TEXTURE_2D_ARRAY);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500188 mZeroTextures[GL_TEXTURE_2D_ARRAY].set(zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400189 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000190
Jamie Madille6382c32014-11-07 15:05:26 -0500191 mState.initializeZeroTextures(mZeroTextures);
192
Jamie Madill57a89722013-07-02 11:57:03 -0400193 bindVertexArray(0);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000194 bindArrayBuffer(0);
195 bindElementArrayBuffer(0);
Geoff Lang76b10c92014-09-05 16:28:14 -0400196
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000197 bindRenderbuffer(0);
198
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000199 bindGenericUniformBuffer(0);
Shannon Woodsf3acaf92014-09-23 18:07:11 -0400200 for (unsigned int i = 0; i < mCaps.maxCombinedUniformBlocks; i++)
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000201 {
202 bindIndexedUniformBuffer(0, i, 0, -1);
203 }
204
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000205 bindCopyReadBuffer(0);
206 bindCopyWriteBuffer(0);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000207 bindPixelPackBuffer(0);
208 bindPixelUnpackBuffer(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000209
Geoff Lang1a683462015-09-29 15:09:59 -0400210 if (mClientVersion >= 3)
211 {
212 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
213 // In the initial state, a default transform feedback object is bound and treated as
214 // a transform feedback object with a name of zero. That object is bound any time
215 // BindTransformFeedback is called with id of zero
Geoff Lang1a683462015-09-29 15:09:59 -0400216 bindTransformFeedback(0);
217 }
Geoff Langc8058452014-02-03 12:04:11 -0500218
Jamie Madill83f349e2015-09-23 09:50:36 -0400219 mCompiler = new Compiler(mRenderer, getData());
Jamie Madillad9f24e2016-02-12 09:27:24 -0500220
221 // Initialize dirty bit masks
222 // TODO(jmadill): additional ES3 state
223 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_ALIGNMENT);
224 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_ROW_LENGTH);
225 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_IMAGE_HEIGHT);
226 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_IMAGES);
227 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_ROWS);
228 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_PIXELS);
229 // No dirty objects.
230
231 // Readpixels uses the pack state and read FBO
232 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_ALIGNMENT);
233 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_REVERSE_ROW_ORDER);
234 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_ROW_LENGTH);
235 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_SKIP_ROWS);
236 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_SKIP_PIXELS);
237 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
238
239 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
240 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
241 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
242 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
243 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
244 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
245 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
246 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
247 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
248 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
249 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
250 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
251
252 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
253 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
254 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
255 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000256}
257
258Context::~Context()
259{
Geoff Lang7dd2e102014-11-10 15:19:26 -0500260 mState.reset();
Geoff Lang21329412014-12-02 20:50:30 +0000261
Corentin Wallez37c39792015-08-20 14:19:46 -0400262 for (auto framebuffer : mFramebufferMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000263 {
Corentin Wallez37c39792015-08-20 14:19:46 -0400264 // Default framebuffer are owned by their respective Surface
Geoff Langf6227922015-09-04 11:05:47 -0400265 if (framebuffer.second != nullptr && framebuffer.second->id() != 0)
Corentin Wallez37c39792015-08-20 14:19:46 -0400266 {
267 SafeDelete(framebuffer.second);
268 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000269 }
270
Corentin Wallez80b24112015-08-25 16:41:57 -0400271 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000272 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400273 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000274 }
275
Corentin Wallez80b24112015-08-25 16:41:57 -0400276 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000277 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400278 if (query.second != nullptr)
279 {
280 query.second->release();
281 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000282 }
283
Corentin Wallez80b24112015-08-25 16:41:57 -0400284 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400285 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400286 SafeDelete(vertexArray.second);
Jamie Madill57a89722013-07-02 11:57:03 -0400287 }
288
Corentin Wallez80b24112015-08-25 16:41:57 -0400289 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500290 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500291 if (transformFeedback.second != nullptr)
292 {
293 transformFeedback.second->release();
294 }
Geoff Langc8058452014-02-03 12:04:11 -0500295 }
296
Jamie Madilldedd7b92014-11-05 16:30:36 -0500297 for (auto &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400298 {
Jamie Madilldedd7b92014-11-05 16:30:36 -0500299 zeroTexture.second.set(NULL);
Geoff Lang76b10c92014-09-05 16:28:14 -0400300 }
301 mZeroTextures.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000302
Corentin Wallez51706ea2015-08-07 14:39:22 -0400303 if (mCurrentSurface != nullptr)
304 {
305 releaseSurface();
306 }
307
Jamie Madill1e9ae072014-11-06 15:27:21 -0500308 if (mResourceManager)
309 {
310 mResourceManager->release();
311 }
Geoff Lang492a7e42014-11-05 13:27:06 -0500312
313 SafeDelete(mCompiler);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000314}
315
daniel@transgaming.comad629872012-11-28 19:32:06 +0000316void Context::makeCurrent(egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000317{
Jamie Madill77a72f62015-04-14 11:18:32 -0400318 ASSERT(surface != nullptr);
319
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000320 if (!mHasBeenCurrent)
321 {
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000322 initRendererString();
Geoff Langcec35902014-04-16 10:52:36 -0400323 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000324
Shannon Woods53a94a82014-06-24 15:20:36 -0400325 mState.setViewportParams(0, 0, surface->getWidth(), surface->getHeight());
326 mState.setScissorParams(0, 0, surface->getWidth(), surface->getHeight());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000327
328 mHasBeenCurrent = true;
329 }
330
Jamie Madill1b94d432015-08-07 13:23:23 -0400331 // TODO(jmadill): Rework this when we support ContextImpl
332 mState.setAllDirtyBits();
333
Corentin Wallez51706ea2015-08-07 14:39:22 -0400334 if (mCurrentSurface)
335 {
336 releaseSurface();
337 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000338 surface->setIsCurrent(true);
Corentin Wallez37c39792015-08-20 14:19:46 -0400339 mCurrentSurface = surface;
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000340
Corentin Wallez37c39792015-08-20 14:19:46 -0400341 // Update default framebuffer, the binding of the previous default
342 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400343 {
Corentin Wallez37c39792015-08-20 14:19:46 -0400344 Framebuffer *newDefault = surface->getDefaultFramebuffer();
345 if (mState.getReadFramebuffer() == nullptr)
346 {
347 mState.setReadFramebufferBinding(newDefault);
348 }
349 if (mState.getDrawFramebuffer() == nullptr)
350 {
351 mState.setDrawFramebufferBinding(newDefault);
352 }
353 mFramebufferMap[0] = newDefault;
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400354 }
Ian Ewell292f0052016-02-04 10:37:32 -0500355
356 // Notify the renderer of a context switch
357 mRenderer->onMakeCurrent(getData());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000358}
359
Jamie Madill77a72f62015-04-14 11:18:32 -0400360void Context::releaseSurface()
361{
Corentin Wallez37c39792015-08-20 14:19:46 -0400362 ASSERT(mCurrentSurface != nullptr);
363
364 // Remove the default framebuffer
Corentin Wallez51706ea2015-08-07 14:39:22 -0400365 {
Corentin Wallez37c39792015-08-20 14:19:46 -0400366 Framebuffer *currentDefault = mCurrentSurface->getDefaultFramebuffer();
367 if (mState.getReadFramebuffer() == currentDefault)
368 {
369 mState.setReadFramebufferBinding(nullptr);
370 }
371 if (mState.getDrawFramebuffer() == currentDefault)
372 {
373 mState.setDrawFramebufferBinding(nullptr);
374 }
375 mFramebufferMap.erase(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400376 }
377
Corentin Wallez51706ea2015-08-07 14:39:22 -0400378 mCurrentSurface->setIsCurrent(false);
379 mCurrentSurface = nullptr;
Jamie Madill77a72f62015-04-14 11:18:32 -0400380}
381
daniel@transgaming.comf688c0d2012-10-31 17:52:57 +0000382// NOTE: this function should not assume that this context is current!
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000383void Context::markContextLost()
384{
385 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
386 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
387 mContextLost = true;
388}
389
390bool Context::isContextLost()
391{
392 return mContextLost;
393}
394
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000395GLuint Context::createBuffer()
396{
397 return mResourceManager->createBuffer();
398}
399
400GLuint Context::createProgram()
401{
402 return mResourceManager->createProgram();
403}
404
405GLuint Context::createShader(GLenum type)
406{
Jamie Madill006cbc52015-09-23 16:47:54 -0400407 return mResourceManager->createShader(mRenderer->getRendererLimitations(), type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000408}
409
410GLuint Context::createTexture()
411{
412 return mResourceManager->createTexture();
413}
414
415GLuint Context::createRenderbuffer()
416{
417 return mResourceManager->createRenderbuffer();
418}
419
Geoff Lang882033e2014-09-30 11:26:07 -0400420GLsync Context::createFenceSync()
Jamie Madillcd055f82013-07-26 11:55:15 -0400421{
422 GLuint handle = mResourceManager->createFenceSync();
423
Cooper Partind8e62a32015-01-29 15:21:25 -0800424 return reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madillcd055f82013-07-26 11:55:15 -0400425}
426
Jamie Madill57a89722013-07-02 11:57:03 -0400427GLuint Context::createVertexArray()
428{
Geoff Lang36167ab2015-12-07 10:27:14 -0500429 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
430 mVertexArrayMap[vertexArray] = nullptr;
431 return vertexArray;
Jamie Madill57a89722013-07-02 11:57:03 -0400432}
433
Jamie Madilldc356042013-07-19 16:36:57 -0400434GLuint Context::createSampler()
435{
436 return mResourceManager->createSampler();
437}
438
Geoff Langc8058452014-02-03 12:04:11 -0500439GLuint Context::createTransformFeedback()
440{
Geoff Lang36167ab2015-12-07 10:27:14 -0500441 GLuint transformFeedback = mTransformFeedbackAllocator.allocate();
442 mTransformFeedbackMap[transformFeedback] = nullptr;
443 return transformFeedback;
Geoff Langc8058452014-02-03 12:04:11 -0500444}
445
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000446// Returns an unused framebuffer name
447GLuint Context::createFramebuffer()
448{
449 GLuint handle = mFramebufferHandleAllocator.allocate();
450
451 mFramebufferMap[handle] = NULL;
452
453 return handle;
454}
455
Jamie Madill33dc8432013-07-26 11:55:05 -0400456GLuint Context::createFenceNV()
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000457{
Jamie Madill33dc8432013-07-26 11:55:05 -0400458 GLuint handle = mFenceNVHandleAllocator.allocate();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000459
Kenneth Russellcaa549c2014-10-10 17:52:59 -0700460 mFenceNVMap[handle] = new FenceNV(mRenderer->createFenceNV());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000461
462 return handle;
463}
464
465// Returns an unused query name
466GLuint Context::createQuery()
467{
468 GLuint handle = mQueryHandleAllocator.allocate();
469
470 mQueryMap[handle] = NULL;
471
472 return handle;
473}
474
475void Context::deleteBuffer(GLuint buffer)
476{
477 if (mResourceManager->getBuffer(buffer))
478 {
479 detachBuffer(buffer);
480 }
Jamie Madill893ab082014-05-16 16:56:10 -0400481
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000482 mResourceManager->deleteBuffer(buffer);
483}
484
485void Context::deleteShader(GLuint shader)
486{
487 mResourceManager->deleteShader(shader);
488}
489
490void Context::deleteProgram(GLuint program)
491{
492 mResourceManager->deleteProgram(program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000493}
494
495void Context::deleteTexture(GLuint texture)
496{
497 if (mResourceManager->getTexture(texture))
498 {
499 detachTexture(texture);
500 }
501
502 mResourceManager->deleteTexture(texture);
503}
504
505void Context::deleteRenderbuffer(GLuint renderbuffer)
506{
507 if (mResourceManager->getRenderbuffer(renderbuffer))
508 {
509 detachRenderbuffer(renderbuffer);
510 }
Jamie Madill893ab082014-05-16 16:56:10 -0400511
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000512 mResourceManager->deleteRenderbuffer(renderbuffer);
513}
514
Jamie Madillcd055f82013-07-26 11:55:15 -0400515void Context::deleteFenceSync(GLsync fenceSync)
516{
517 // The spec specifies the underlying Fence object is not deleted until all current
518 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
519 // and since our API is currently designed for being called from a single thread, we can delete
520 // the fence immediately.
Minmin Gong794e0002015-04-07 18:31:54 -0700521 mResourceManager->deleteFenceSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(fenceSync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400522}
523
Jamie Madill57a89722013-07-02 11:57:03 -0400524void Context::deleteVertexArray(GLuint vertexArray)
525{
Geoff Lang36167ab2015-12-07 10:27:14 -0500526 auto iter = mVertexArrayMap.find(vertexArray);
527 if (iter != mVertexArrayMap.end())
Geoff Lang50b3fe82015-12-08 14:49:12 +0000528 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500529 VertexArray *vertexArrayObject = iter->second;
530 if (vertexArrayObject != nullptr)
531 {
532 detachVertexArray(vertexArray);
533 delete vertexArrayObject;
534 }
Geoff Lang50b3fe82015-12-08 14:49:12 +0000535
Geoff Lang36167ab2015-12-07 10:27:14 -0500536 mVertexArrayMap.erase(iter);
537 mVertexArrayHandleAllocator.release(vertexArray);
Jamie Madill57a89722013-07-02 11:57:03 -0400538 }
539}
540
Jamie Madilldc356042013-07-19 16:36:57 -0400541void Context::deleteSampler(GLuint sampler)
542{
543 if (mResourceManager->getSampler(sampler))
544 {
545 detachSampler(sampler);
546 }
547
548 mResourceManager->deleteSampler(sampler);
549}
550
Geoff Langc8058452014-02-03 12:04:11 -0500551void Context::deleteTransformFeedback(GLuint transformFeedback)
552{
Jamie Madill5fd0b2d2015-01-05 13:38:44 -0500553 auto iter = mTransformFeedbackMap.find(transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -0500554 if (iter != mTransformFeedbackMap.end())
555 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500556 TransformFeedback *transformFeedbackObject = iter->second;
557 if (transformFeedbackObject != nullptr)
558 {
559 detachTransformFeedback(transformFeedback);
560 transformFeedbackObject->release();
561 }
562
Geoff Lang50b3fe82015-12-08 14:49:12 +0000563 mTransformFeedbackMap.erase(iter);
Geoff Lang36167ab2015-12-07 10:27:14 -0500564 mTransformFeedbackAllocator.release(transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -0500565 }
566}
567
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000568void Context::deleteFramebuffer(GLuint framebuffer)
569{
570 FramebufferMap::iterator framebufferObject = mFramebufferMap.find(framebuffer);
571
572 if (framebufferObject != mFramebufferMap.end())
573 {
574 detachFramebuffer(framebuffer);
575
576 mFramebufferHandleAllocator.release(framebufferObject->first);
577 delete framebufferObject->second;
578 mFramebufferMap.erase(framebufferObject);
579 }
580}
581
Jamie Madill33dc8432013-07-26 11:55:05 -0400582void Context::deleteFenceNV(GLuint fence)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000583{
Jamie Madill33dc8432013-07-26 11:55:05 -0400584 FenceNVMap::iterator fenceObject = mFenceNVMap.find(fence);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000585
Jamie Madill33dc8432013-07-26 11:55:05 -0400586 if (fenceObject != mFenceNVMap.end())
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000587 {
Jamie Madill33dc8432013-07-26 11:55:05 -0400588 mFenceNVHandleAllocator.release(fenceObject->first);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000589 delete fenceObject->second;
Jamie Madill33dc8432013-07-26 11:55:05 -0400590 mFenceNVMap.erase(fenceObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000591 }
592}
593
594void Context::deleteQuery(GLuint query)
595{
596 QueryMap::iterator queryObject = mQueryMap.find(query);
597 if (queryObject != mQueryMap.end())
598 {
599 mQueryHandleAllocator.release(queryObject->first);
600 if (queryObject->second)
601 {
602 queryObject->second->release();
603 }
604 mQueryMap.erase(queryObject);
605 }
606}
607
Geoff Lang70d0f492015-12-10 17:45:46 -0500608Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000609{
610 return mResourceManager->getBuffer(handle);
611}
612
Geoff Lang48dcae72014-02-05 16:28:24 -0500613Shader *Context::getShader(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000614{
615 return mResourceManager->getShader(handle);
616}
617
Geoff Lang48dcae72014-02-05 16:28:24 -0500618Program *Context::getProgram(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000619{
620 return mResourceManager->getProgram(handle);
621}
622
Jamie Madill570f7c82014-07-03 10:38:54 -0400623Texture *Context::getTexture(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000624{
625 return mResourceManager->getTexture(handle);
626}
627
Geoff Lang70d0f492015-12-10 17:45:46 -0500628Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000629{
630 return mResourceManager->getRenderbuffer(handle);
631}
632
Jamie Madillcd055f82013-07-26 11:55:15 -0400633FenceSync *Context::getFenceSync(GLsync handle) const
634{
Minmin Gong794e0002015-04-07 18:31:54 -0700635 return mResourceManager->getFenceSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400636}
637
Jamie Madill57a89722013-07-02 11:57:03 -0400638VertexArray *Context::getVertexArray(GLuint handle) const
639{
640 auto vertexArray = mVertexArrayMap.find(handle);
Geoff Lang36167ab2015-12-07 10:27:14 -0500641 return (vertexArray != mVertexArrayMap.end()) ? vertexArray->second : nullptr;
Jamie Madill57a89722013-07-02 11:57:03 -0400642}
643
Jamie Madilldc356042013-07-19 16:36:57 -0400644Sampler *Context::getSampler(GLuint handle) const
645{
646 return mResourceManager->getSampler(handle);
647}
648
Geoff Langc8058452014-02-03 12:04:11 -0500649TransformFeedback *Context::getTransformFeedback(GLuint handle) const
650{
Geoff Lang36167ab2015-12-07 10:27:14 -0500651 auto iter = mTransformFeedbackMap.find(handle);
652 return (iter != mTransformFeedbackMap.end()) ? iter->second : nullptr;
Geoff Langc8058452014-02-03 12:04:11 -0500653}
654
Geoff Lang70d0f492015-12-10 17:45:46 -0500655LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
656{
657 switch (identifier)
658 {
659 case GL_BUFFER:
660 return getBuffer(name);
661 case GL_SHADER:
662 return getShader(name);
663 case GL_PROGRAM:
664 return getProgram(name);
665 case GL_VERTEX_ARRAY:
666 return getVertexArray(name);
667 case GL_QUERY:
668 return getQuery(name);
669 case GL_TRANSFORM_FEEDBACK:
670 return getTransformFeedback(name);
671 case GL_SAMPLER:
672 return getSampler(name);
673 case GL_TEXTURE:
674 return getTexture(name);
675 case GL_RENDERBUFFER:
676 return getRenderbuffer(name);
677 case GL_FRAMEBUFFER:
678 return getFramebuffer(name);
679 default:
680 UNREACHABLE();
681 return nullptr;
682 }
683}
684
685LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
686{
687 return getFenceSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
688}
689
Jamie Madilldc356042013-07-19 16:36:57 -0400690bool Context::isSampler(GLuint samplerName) const
691{
692 return mResourceManager->isSampler(samplerName);
693}
694
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000695void Context::bindArrayBuffer(unsigned int buffer)
696{
697 mResourceManager->checkBufferAllocation(buffer);
698
Shannon Woods53a94a82014-06-24 15:20:36 -0400699 mState.setArrayBufferBinding(getBuffer(buffer));
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000700}
701
702void Context::bindElementArrayBuffer(unsigned int buffer)
703{
704 mResourceManager->checkBufferAllocation(buffer);
705
Shannon Woods53a94a82014-06-24 15:20:36 -0400706 mState.getVertexArray()->setElementArrayBuffer(getBuffer(buffer));
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000707}
708
Jamie Madilldedd7b92014-11-05 16:30:36 -0500709void Context::bindTexture(GLenum target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000710{
Jamie Madilldedd7b92014-11-05 16:30:36 -0500711 Texture *texture = NULL;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000712
Jamie Madilldedd7b92014-11-05 16:30:36 -0500713 if (handle == 0)
714 {
715 texture = mZeroTextures[target].get();
716 }
717 else
718 {
719 mResourceManager->checkTextureAllocation(handle, target);
720 texture = getTexture(handle);
721 }
722
723 ASSERT(texture);
724
725 mState.setSamplerTexture(target, texture);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000726}
727
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500728void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000729{
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500730 Framebuffer *framebuffer = checkFramebufferAllocation(framebufferHandle);
731 mState.setReadFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000732}
733
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500734void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000735{
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500736 Framebuffer *framebuffer = checkFramebufferAllocation(framebufferHandle);
737 mState.setDrawFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000738}
739
740void Context::bindRenderbuffer(GLuint renderbuffer)
741{
742 mResourceManager->checkRenderbufferAllocation(renderbuffer);
743
Shannon Woods53a94a82014-06-24 15:20:36 -0400744 mState.setRenderbufferBinding(getRenderbuffer(renderbuffer));
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000745}
746
Jamie Madill57a89722013-07-02 11:57:03 -0400747void Context::bindVertexArray(GLuint vertexArray)
748{
Geoff Lang36167ab2015-12-07 10:27:14 -0500749 checkVertexArrayAllocation(vertexArray);
Jamie Madill57a89722013-07-02 11:57:03 -0400750
Shannon Woods53a94a82014-06-24 15:20:36 -0400751 mState.setVertexArrayBinding(getVertexArray(vertexArray));
Jamie Madill57a89722013-07-02 11:57:03 -0400752}
753
Jamie Madilldc356042013-07-19 16:36:57 -0400754void Context::bindSampler(GLuint textureUnit, GLuint sampler)
755{
Geoff Lang76b10c92014-09-05 16:28:14 -0400756 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madilldc356042013-07-19 16:36:57 -0400757 mResourceManager->checkSamplerAllocation(sampler);
758
Shannon Woods53a94a82014-06-24 15:20:36 -0400759 mState.setSamplerBinding(textureUnit, getSampler(sampler));
Jamie Madilldc356042013-07-19 16:36:57 -0400760}
761
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000762void Context::bindGenericUniformBuffer(GLuint buffer)
763{
764 mResourceManager->checkBufferAllocation(buffer);
765
Shannon Woods53a94a82014-06-24 15:20:36 -0400766 mState.setGenericUniformBufferBinding(getBuffer(buffer));
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000767}
768
769void Context::bindIndexedUniformBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size)
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +0000770{
771 mResourceManager->checkBufferAllocation(buffer);
772
Shannon Woods53a94a82014-06-24 15:20:36 -0400773 mState.setIndexedUniformBufferBinding(index, getBuffer(buffer), offset, size);
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +0000774}
775
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000776void Context::bindGenericTransformFeedbackBuffer(GLuint buffer)
777{
778 mResourceManager->checkBufferAllocation(buffer);
779
Geoff Lang045536b2015-03-27 15:17:18 -0400780 mState.getCurrentTransformFeedback()->bindGenericBuffer(getBuffer(buffer));
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000781}
782
783void Context::bindIndexedTransformFeedbackBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size)
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +0000784{
785 mResourceManager->checkBufferAllocation(buffer);
786
Geoff Lang045536b2015-03-27 15:17:18 -0400787 mState.getCurrentTransformFeedback()->bindIndexedBuffer(index, getBuffer(buffer), offset, size);
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +0000788}
789
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000790void Context::bindCopyReadBuffer(GLuint buffer)
791{
792 mResourceManager->checkBufferAllocation(buffer);
793
Shannon Woods53a94a82014-06-24 15:20:36 -0400794 mState.setCopyReadBufferBinding(getBuffer(buffer));
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000795}
796
797void Context::bindCopyWriteBuffer(GLuint buffer)
798{
799 mResourceManager->checkBufferAllocation(buffer);
800
Shannon Woods53a94a82014-06-24 15:20:36 -0400801 mState.setCopyWriteBufferBinding(getBuffer(buffer));
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000802}
803
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000804void Context::bindPixelPackBuffer(GLuint buffer)
805{
806 mResourceManager->checkBufferAllocation(buffer);
807
Shannon Woods53a94a82014-06-24 15:20:36 -0400808 mState.setPixelPackBufferBinding(getBuffer(buffer));
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000809}
810
811void Context::bindPixelUnpackBuffer(GLuint buffer)
812{
813 mResourceManager->checkBufferAllocation(buffer);
814
Shannon Woods53a94a82014-06-24 15:20:36 -0400815 mState.setPixelUnpackBufferBinding(getBuffer(buffer));
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000816}
817
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000818void Context::useProgram(GLuint program)
819{
Geoff Lang7dd2e102014-11-10 15:19:26 -0500820 mState.setProgram(getProgram(program));
daniel@transgaming.com95d29422012-07-24 18:36:10 +0000821}
822
Geoff Langc8058452014-02-03 12:04:11 -0500823void Context::bindTransformFeedback(GLuint transformFeedback)
824{
Geoff Lang36167ab2015-12-07 10:27:14 -0500825 checkTransformFeedbackAllocation(transformFeedback);
826
Shannon Woods53a94a82014-06-24 15:20:36 -0400827 mState.setTransformFeedbackBinding(getTransformFeedback(transformFeedback));
Geoff Langc8058452014-02-03 12:04:11 -0500828}
829
Geoff Lang5aad9672014-09-08 11:10:42 -0400830Error Context::beginQuery(GLenum target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000831{
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000832 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -0400833 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000834
Geoff Lang5aad9672014-09-08 11:10:42 -0400835 // begin query
836 Error error = queryObject->begin();
837 if (error.isError())
838 {
839 return error;
840 }
841
842 // set query as active for specified target only if begin succeeded
Shannon Woods53a94a82014-06-24 15:20:36 -0400843 mState.setActiveQuery(target, queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000844
Geoff Lang5aad9672014-09-08 11:10:42 -0400845 return Error(GL_NO_ERROR);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000846}
847
Geoff Lang5aad9672014-09-08 11:10:42 -0400848Error Context::endQuery(GLenum target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000849{
Shannon Woods53a94a82014-06-24 15:20:36 -0400850 Query *queryObject = mState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -0400851 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000852
Geoff Lang5aad9672014-09-08 11:10:42 -0400853 gl::Error error = queryObject->end();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000854
Geoff Lang5aad9672014-09-08 11:10:42 -0400855 // Always unbind the query, even if there was an error. This may delete the query object.
Shannon Woods53a94a82014-06-24 15:20:36 -0400856 mState.setActiveQuery(target, NULL);
Geoff Lang5aad9672014-09-08 11:10:42 -0400857
858 return error;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000859}
860
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500861Error Context::queryCounter(GLuint id, GLenum target)
862{
863 ASSERT(target == GL_TIMESTAMP_EXT);
864
865 Query *queryObject = getQuery(id, true, target);
866 ASSERT(queryObject);
867
868 return queryObject->queryCounter();
869}
870
871void Context::getQueryiv(GLenum target, GLenum pname, GLint *params)
872{
873 switch (pname)
874 {
875 case GL_CURRENT_QUERY_EXT:
876 params[0] = getState().getActiveQueryId(target);
877 break;
878 case GL_QUERY_COUNTER_BITS_EXT:
879 switch (target)
880 {
881 case GL_TIME_ELAPSED_EXT:
882 params[0] = getExtensions().queryCounterBitsTimeElapsed;
883 break;
884 case GL_TIMESTAMP_EXT:
885 params[0] = getExtensions().queryCounterBitsTimestamp;
886 break;
887 default:
888 UNREACHABLE();
889 params[0] = 0;
890 break;
891 }
892 break;
893 default:
894 UNREACHABLE();
895 return;
896 }
897}
898
899Error Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
900{
901 return GetQueryObjectParameter(this, id, pname, params);
902}
903
904Error Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
905{
906 return GetQueryObjectParameter(this, id, pname, params);
907}
908
909Error Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
910{
911 return GetQueryObjectParameter(this, id, pname, params);
912}
913
914Error Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
915{
916 return GetQueryObjectParameter(this, id, pname, params);
917}
918
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500919Framebuffer *Context::getFramebuffer(unsigned int handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000920{
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500921 auto framebufferIt = mFramebufferMap.find(handle);
922 return ((framebufferIt == mFramebufferMap.end()) ? nullptr : framebufferIt->second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000923}
924
Jamie Madill33dc8432013-07-26 11:55:05 -0400925FenceNV *Context::getFenceNV(unsigned int handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000926{
Jamie Madill33dc8432013-07-26 11:55:05 -0400927 FenceNVMap::iterator fence = mFenceNVMap.find(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000928
Jamie Madill33dc8432013-07-26 11:55:05 -0400929 if (fence == mFenceNVMap.end())
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000930 {
931 return NULL;
932 }
933 else
934 {
935 return fence->second;
936 }
937}
938
939Query *Context::getQuery(unsigned int handle, bool create, GLenum type)
940{
941 QueryMap::iterator query = mQueryMap.find(handle);
942
943 if (query == mQueryMap.end())
944 {
945 return NULL;
946 }
947 else
948 {
949 if (!query->second && create)
950 {
Brandon Jones3b579e32014-08-08 10:54:25 -0700951 query->second = new Query(mRenderer->createQuery(type), handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000952 query->second->addRef();
953 }
954 return query->second;
955 }
956}
957
Geoff Lang70d0f492015-12-10 17:45:46 -0500958Query *Context::getQuery(GLuint handle) const
959{
960 auto iter = mQueryMap.find(handle);
961 return (iter != mQueryMap.end()) ? iter->second : nullptr;
962}
963
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500964Texture *Context::getTargetTexture(GLenum target) const
965{
Geoff Lang691e58c2014-12-19 17:03:25 -0500966 ASSERT(ValidTextureTarget(this, target));
Jamie Madillc29968b2016-01-20 11:17:23 -0500967 return mState.getTargetTexture(target);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000968}
969
Geoff Lang76b10c92014-09-05 16:28:14 -0400970Texture *Context::getSamplerTexture(unsigned int sampler, GLenum type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000971{
Jamie Madilldedd7b92014-11-05 16:30:36 -0500972 return mState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000973}
974
Geoff Lang492a7e42014-11-05 13:27:06 -0500975Compiler *Context::getCompiler() const
976{
977 return mCompiler;
978}
979
Jamie Madill893ab082014-05-16 16:56:10 -0400980void Context::getBooleanv(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000981{
982 switch (pname)
983 {
daniel@transgaming.comf39967e2012-11-28 19:35:56 +0000984 case GL_SHADER_COMPILER: *params = GL_TRUE; break;
daniel@transgaming.comf39967e2012-11-28 19:35:56 +0000985 case GL_CONTEXT_ROBUST_ACCESS_EXT: *params = mRobustAccess ? GL_TRUE : GL_FALSE; break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000986 default:
Shannon Woods53a94a82014-06-24 15:20:36 -0400987 mState.getBooleanv(pname, params);
Jamie Madill893ab082014-05-16 16:56:10 -0400988 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000989 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000990}
991
Jamie Madill893ab082014-05-16 16:56:10 -0400992void Context::getFloatv(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000993{
Shannon Woods53a94a82014-06-24 15:20:36 -0400994 // Queries about context capabilities and maximums are answered by Context.
995 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000996 switch (pname)
997 {
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000998 case GL_ALIASED_LINE_WIDTH_RANGE:
Geoff Langc0b9ef42014-07-02 10:02:37 -0400999 params[0] = mCaps.minAliasedLineWidth;
1000 params[1] = mCaps.maxAliasedLineWidth;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001001 break;
1002 case GL_ALIASED_POINT_SIZE_RANGE:
Geoff Langc0b9ef42014-07-02 10:02:37 -04001003 params[0] = mCaps.minAliasedPointSize;
1004 params[1] = mCaps.maxAliasedPointSize;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001005 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00001006 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langc0b9ef42014-07-02 10:02:37 -04001007 ASSERT(mExtensions.textureFilterAnisotropic);
1008 *params = mExtensions.maxTextureAnisotropy;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00001009 break;
Geoff Lange6d4e122015-06-29 13:33:55 -04001010 case GL_MAX_TEXTURE_LOD_BIAS:
1011 *params = mCaps.maxLODBias;
1012 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001013 default:
Shannon Woods53a94a82014-06-24 15:20:36 -04001014 mState.getFloatv(pname, params);
Jamie Madill893ab082014-05-16 16:56:10 -04001015 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001016 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001017}
1018
Jamie Madill893ab082014-05-16 16:56:10 -04001019void Context::getIntegerv(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001020{
Shannon Woods53a94a82014-06-24 15:20:36 -04001021 // Queries about context capabilities and maximums are answered by Context.
1022 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001023
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001024 switch (pname)
1025 {
Geoff Lang301d1612014-07-09 10:34:37 -04001026 case GL_MAX_VERTEX_ATTRIBS: *params = mCaps.maxVertexAttributes; break;
1027 case GL_MAX_VERTEX_UNIFORM_VECTORS: *params = mCaps.maxVertexUniformVectors; break;
1028 case GL_MAX_VERTEX_UNIFORM_COMPONENTS: *params = mCaps.maxVertexUniformComponents; break;
Geoff Lang3a61c322014-07-10 13:01:54 -04001029 case GL_MAX_VARYING_VECTORS: *params = mCaps.maxVaryingVectors; break;
1030 case GL_MAX_VARYING_COMPONENTS: *params = mCaps.maxVertexOutputComponents; break;
1031 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: *params = mCaps.maxCombinedTextureImageUnits; break;
Geoff Lang301d1612014-07-09 10:34:37 -04001032 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: *params = mCaps.maxVertexTextureImageUnits; break;
1033 case GL_MAX_TEXTURE_IMAGE_UNITS: *params = mCaps.maxTextureImageUnits; break;
1034 case GL_MAX_FRAGMENT_UNIFORM_VECTORS: *params = mCaps.maxFragmentUniformVectors; break;
Geoff Lange7468902015-10-02 10:46:24 -04001035 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: *params = mCaps.maxFragmentUniformComponents; break;
Geoff Langc0b9ef42014-07-02 10:02:37 -04001036 case GL_MAX_RENDERBUFFER_SIZE: *params = mCaps.maxRenderbufferSize; break;
1037 case GL_MAX_COLOR_ATTACHMENTS_EXT: *params = mCaps.maxColorAttachments; break;
1038 case GL_MAX_DRAW_BUFFERS_EXT: *params = mCaps.maxDrawBuffers; break;
Jamie Madill1caff072013-07-19 16:36:56 -04001039 //case GL_FRAMEBUFFER_BINDING: // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
Jamie Madill1caff072013-07-19 16:36:56 -04001040 case GL_SUBPIXEL_BITS: *params = 4; break;
Geoff Langc0b9ef42014-07-02 10:02:37 -04001041 case GL_MAX_TEXTURE_SIZE: *params = mCaps.max2DTextureSize; break;
1042 case GL_MAX_CUBE_MAP_TEXTURE_SIZE: *params = mCaps.maxCubeMapTextureSize; break;
1043 case GL_MAX_3D_TEXTURE_SIZE: *params = mCaps.max3DTextureSize; break;
1044 case GL_MAX_ARRAY_TEXTURE_LAYERS: *params = mCaps.maxArrayTextureLayers; break;
Geoff Lang3a61c322014-07-10 13:01:54 -04001045 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: *params = mCaps.uniformBufferOffsetAlignment; break;
1046 case GL_MAX_UNIFORM_BUFFER_BINDINGS: *params = mCaps.maxUniformBufferBindings; break;
Geoff Lang301d1612014-07-09 10:34:37 -04001047 case GL_MAX_VERTEX_UNIFORM_BLOCKS: *params = mCaps.maxVertexUniformBlocks; break;
1048 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS: *params = mCaps.maxFragmentUniformBlocks; break;
Geoff Lang3a61c322014-07-10 13:01:54 -04001049 case GL_MAX_COMBINED_UNIFORM_BLOCKS: *params = mCaps.maxCombinedTextureImageUnits; break;
Geoff Lange6d4e122015-06-29 13:33:55 -04001050 case GL_MAX_VERTEX_OUTPUT_COMPONENTS: *params = mCaps.maxVertexOutputComponents; break;
1051 case GL_MAX_FRAGMENT_INPUT_COMPONENTS: *params = mCaps.maxFragmentInputComponents; break;
1052 case GL_MIN_PROGRAM_TEXEL_OFFSET: *params = mCaps.minProgramTexelOffset; break;
1053 case GL_MAX_PROGRAM_TEXEL_OFFSET: *params = mCaps.maxProgramTexelOffset; break;
Jamie Madillee7010d2013-10-17 10:45:47 -04001054 case GL_MAJOR_VERSION: *params = mClientVersion; break;
1055 case GL_MINOR_VERSION: *params = 0; break;
Geoff Lang900013c2014-07-07 11:32:19 -04001056 case GL_MAX_ELEMENTS_INDICES: *params = mCaps.maxElementsIndices; break;
1057 case GL_MAX_ELEMENTS_VERTICES: *params = mCaps.maxElementsVertices; break;
Geoff Lang05881a02014-07-10 14:05:30 -04001058 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: *params = mCaps.maxTransformFeedbackInterleavedComponents; break;
1059 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: *params = mCaps.maxTransformFeedbackSeparateAttributes; break;
1060 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: *params = mCaps.maxTransformFeedbackSeparateComponents; break;
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001061 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1062 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1063 break;
Geoff Langdef624b2015-04-13 10:46:56 -04001064 case GL_MAX_SAMPLES_ANGLE: *params = mCaps.maxSamples; break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001065 case GL_MAX_VIEWPORT_DIMS:
1066 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001067 params[0] = mCaps.maxViewportWidth;
1068 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001069 }
1070 break;
1071 case GL_COMPRESSED_TEXTURE_FORMATS:
Geoff Lang900013c2014-07-07 11:32:19 -04001072 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(), params);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001073 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001074 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1075 *params = mResetStrategy;
1076 break;
Geoff Lang900013c2014-07-07 11:32:19 -04001077 case GL_NUM_SHADER_BINARY_FORMATS:
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001078 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001079 break;
Geoff Lang900013c2014-07-07 11:32:19 -04001080 case GL_SHADER_BINARY_FORMATS:
1081 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1082 break;
1083 case GL_NUM_PROGRAM_BINARY_FORMATS:
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001084 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
Geoff Lang900013c2014-07-07 11:32:19 -04001085 break;
1086 case GL_PROGRAM_BINARY_FORMATS:
1087 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001088 break;
Geoff Lang23c81692013-08-12 10:46:58 -04001089 case GL_NUM_EXTENSIONS:
Geoff Langcec35902014-04-16 10:52:36 -04001090 *params = static_cast<GLint>(mExtensionStrings.size());
Geoff Lang23c81692013-08-12 10:46:58 -04001091 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001092
1093 // GL_KHR_debug
1094 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1095 *params = mExtensions.maxDebugMessageLength;
1096 break;
1097 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1098 *params = mExtensions.maxDebugLoggedMessages;
1099 break;
1100 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1101 *params = mExtensions.maxDebugGroupStackDepth;
1102 break;
1103 case GL_MAX_LABEL_LENGTH:
1104 *params = mExtensions.maxLabelLength;
1105 break;
1106
Ian Ewell53f59f42016-01-28 17:36:55 -05001107 // GL_EXT_disjoint_timer_query
1108 case GL_GPU_DISJOINT_EXT:
1109 *params = mRenderer->getGPUDisjoint();
1110 break;
1111
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001112 default:
Jamie Madill48faf802014-11-06 15:27:22 -05001113 mState.getIntegerv(getData(), pname, params);
Jamie Madill893ab082014-05-16 16:56:10 -04001114 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001115 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001116}
1117
Jamie Madill893ab082014-05-16 16:56:10 -04001118void Context::getInteger64v(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001119{
Shannon Woods53a94a82014-06-24 15:20:36 -04001120 // Queries about context capabilities and maximums are answered by Context.
1121 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001122 switch (pname)
1123 {
1124 case GL_MAX_ELEMENT_INDEX:
Geoff Langc0b9ef42014-07-02 10:02:37 -04001125 *params = mCaps.maxElementIndex;
Jamie Madill0fda9862013-07-19 16:36:55 -04001126 break;
1127 case GL_MAX_UNIFORM_BLOCK_SIZE:
Geoff Lang3a61c322014-07-10 13:01:54 -04001128 *params = mCaps.maxUniformBlockSize;
Jamie Madill0fda9862013-07-19 16:36:55 -04001129 break;
1130 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Geoff Lang3a61c322014-07-10 13:01:54 -04001131 *params = mCaps.maxCombinedVertexUniformComponents;
Jamie Madill0fda9862013-07-19 16:36:55 -04001132 break;
1133 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Geoff Lang3a61c322014-07-10 13:01:54 -04001134 *params = mCaps.maxCombinedFragmentUniformComponents;
Jamie Madill0fda9862013-07-19 16:36:55 -04001135 break;
1136 case GL_MAX_SERVER_WAIT_TIMEOUT:
Geoff Lang900013c2014-07-07 11:32:19 -04001137 *params = mCaps.maxServerWaitTimeout;
Jamie Madill0fda9862013-07-19 16:36:55 -04001138 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001139
1140 // GL_EXT_disjoint_timer_query
1141 case GL_TIMESTAMP_EXT:
1142 *params = mRenderer->getTimestamp();
1143 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001144 default:
Jamie Madill893ab082014-05-16 16:56:10 -04001145 UNREACHABLE();
1146 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001147 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001148}
1149
Geoff Lang70d0f492015-12-10 17:45:46 -05001150void Context::getPointerv(GLenum pname, void **params) const
1151{
1152 mState.getPointerv(pname, params);
1153}
1154
Shannon Woods1b2fb852013-08-19 14:28:48 -04001155bool Context::getIndexedIntegerv(GLenum target, GLuint index, GLint *data)
1156{
Shannon Woods53a94a82014-06-24 15:20:36 -04001157 // Queries about context capabilities and maximums are answered by Context.
1158 // Queries about current GL state values are answered by State.
Jamie Madill77a72f62015-04-14 11:18:32 -04001159 // Indexed integer queries all refer to current state, so this function is a
Shannon Woods53a94a82014-06-24 15:20:36 -04001160 // mere passthrough.
1161 return mState.getIndexedIntegerv(target, index, data);
Shannon Woods1b2fb852013-08-19 14:28:48 -04001162}
1163
1164bool Context::getIndexedInteger64v(GLenum target, GLuint index, GLint64 *data)
1165{
Shannon Woods53a94a82014-06-24 15:20:36 -04001166 // Queries about context capabilities and maximums are answered by Context.
1167 // Queries about current GL state values are answered by State.
Jamie Madill77a72f62015-04-14 11:18:32 -04001168 // Indexed integer queries all refer to current state, so this function is a
Shannon Woods53a94a82014-06-24 15:20:36 -04001169 // mere passthrough.
1170 return mState.getIndexedInteger64v(target, index, data);
Shannon Woods1b2fb852013-08-19 14:28:48 -04001171}
1172
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001173bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
1174{
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001175 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
1176 {
1177 *type = GL_INT;
1178 *numParams = 1;
1179 return true;
1180 }
1181
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001182 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
1183 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
1184 // to the fact that it is stored internally as a float, and so would require conversion
Jamie Madill893ab082014-05-16 16:56:10 -04001185 // if returned from Context::getIntegerv. Since this conversion is already implemented
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001186 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
1187 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
1188 // application.
1189 switch (pname)
1190 {
1191 case GL_COMPRESSED_TEXTURE_FORMATS:
1192 {
1193 *type = GL_INT;
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001194 *numParams = static_cast<unsigned int>(mCaps.compressedTextureFormats.size());
Geoff Lang900013c2014-07-07 11:32:19 -04001195 }
1196 return true;
1197 case GL_PROGRAM_BINARY_FORMATS_OES:
1198 {
1199 *type = GL_INT;
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001200 *numParams = static_cast<unsigned int>(mCaps.programBinaryFormats.size());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001201 }
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001202 return true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001203 case GL_SHADER_BINARY_FORMATS:
1204 {
1205 *type = GL_INT;
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001206 *numParams = static_cast<unsigned int>(mCaps.shaderBinaryFormats.size());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001207 }
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001208 return true;
Jamie Madillb9293972015-02-19 11:07:54 -05001209
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001210 case GL_MAX_VERTEX_ATTRIBS:
1211 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1212 case GL_MAX_VARYING_VECTORS:
1213 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1214 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
1215 case GL_MAX_TEXTURE_IMAGE_UNITS:
1216 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1217 case GL_MAX_RENDERBUFFER_SIZE:
shannon.woods%transgaming.com@gtempaccount.com9790c472013-04-13 03:28:23 +00001218 case GL_MAX_COLOR_ATTACHMENTS_EXT:
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001219 case GL_MAX_DRAW_BUFFERS_EXT:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001220 case GL_NUM_SHADER_BINARY_FORMATS:
1221 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1222 case GL_ARRAY_BUFFER_BINDING:
Vladimir Vukicevic1e514352014-05-13 15:53:06 -07001223 //case GL_FRAMEBUFFER_BINDING: // equivalent to DRAW_FRAMEBUFFER_BINDING_ANGLE
1224 case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE:
1225 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001226 case GL_RENDERBUFFER_BINDING:
1227 case GL_CURRENT_PROGRAM:
1228 case GL_PACK_ALIGNMENT:
1229 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
1230 case GL_UNPACK_ALIGNMENT:
1231 case GL_GENERATE_MIPMAP_HINT:
1232 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
1233 case GL_RED_BITS:
1234 case GL_GREEN_BITS:
1235 case GL_BLUE_BITS:
1236 case GL_ALPHA_BITS:
1237 case GL_DEPTH_BITS:
1238 case GL_STENCIL_BITS:
1239 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
1240 case GL_CULL_FACE_MODE:
1241 case GL_FRONT_FACE:
1242 case GL_ACTIVE_TEXTURE:
1243 case GL_STENCIL_FUNC:
1244 case GL_STENCIL_VALUE_MASK:
1245 case GL_STENCIL_REF:
1246 case GL_STENCIL_FAIL:
1247 case GL_STENCIL_PASS_DEPTH_FAIL:
1248 case GL_STENCIL_PASS_DEPTH_PASS:
1249 case GL_STENCIL_BACK_FUNC:
1250 case GL_STENCIL_BACK_VALUE_MASK:
1251 case GL_STENCIL_BACK_REF:
1252 case GL_STENCIL_BACK_FAIL:
1253 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
1254 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
1255 case GL_DEPTH_FUNC:
1256 case GL_BLEND_SRC_RGB:
1257 case GL_BLEND_SRC_ALPHA:
1258 case GL_BLEND_DST_RGB:
1259 case GL_BLEND_DST_ALPHA:
1260 case GL_BLEND_EQUATION_RGB:
1261 case GL_BLEND_EQUATION_ALPHA:
1262 case GL_STENCIL_WRITEMASK:
1263 case GL_STENCIL_BACK_WRITEMASK:
1264 case GL_STENCIL_CLEAR_VALUE:
1265 case GL_SUBPIXEL_BITS:
1266 case GL_MAX_TEXTURE_SIZE:
1267 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1268 case GL_SAMPLE_BUFFERS:
1269 case GL_SAMPLES:
1270 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
1271 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
1272 case GL_TEXTURE_BINDING_2D:
1273 case GL_TEXTURE_BINDING_CUBE_MAP:
1274 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1275 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001276 {
1277 *type = GL_INT;
1278 *numParams = 1;
1279 }
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001280 return true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001281 case GL_MAX_SAMPLES_ANGLE:
1282 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001283 if (mExtensions.framebufferMultisample)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001284 {
1285 *type = GL_INT;
1286 *numParams = 1;
1287 }
1288 else
1289 {
1290 return false;
1291 }
1292 }
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001293 return true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001294 case GL_MAX_VIEWPORT_DIMS:
1295 {
1296 *type = GL_INT;
1297 *numParams = 2;
1298 }
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001299 return true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001300 case GL_VIEWPORT:
1301 case GL_SCISSOR_BOX:
1302 {
1303 *type = GL_INT;
1304 *numParams = 4;
1305 }
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001306 return true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001307 case GL_SHADER_COMPILER:
1308 case GL_SAMPLE_COVERAGE_INVERT:
1309 case GL_DEPTH_WRITEMASK:
1310 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
1311 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
1312 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as bool-natural
1313 case GL_SAMPLE_COVERAGE:
1314 case GL_SCISSOR_TEST:
1315 case GL_STENCIL_TEST:
1316 case GL_DEPTH_TEST:
1317 case GL_BLEND:
1318 case GL_DITHER:
1319 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1320 {
1321 *type = GL_BOOL;
1322 *numParams = 1;
1323 }
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001324 return true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001325 case GL_COLOR_WRITEMASK:
1326 {
1327 *type = GL_BOOL;
1328 *numParams = 4;
1329 }
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001330 return true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001331 case GL_POLYGON_OFFSET_FACTOR:
1332 case GL_POLYGON_OFFSET_UNITS:
1333 case GL_SAMPLE_COVERAGE_VALUE:
1334 case GL_DEPTH_CLEAR_VALUE:
1335 case GL_LINE_WIDTH:
1336 {
1337 *type = GL_FLOAT;
1338 *numParams = 1;
1339 }
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001340 return true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001341 case GL_ALIASED_LINE_WIDTH_RANGE:
1342 case GL_ALIASED_POINT_SIZE_RANGE:
1343 case GL_DEPTH_RANGE:
1344 {
1345 *type = GL_FLOAT;
1346 *numParams = 2;
1347 }
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001348 return true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001349 case GL_COLOR_CLEAR_VALUE:
1350 case GL_BLEND_COLOR:
1351 {
1352 *type = GL_FLOAT;
1353 *numParams = 4;
1354 }
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001355 return true;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00001356 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langc0b9ef42014-07-02 10:02:37 -04001357 if (!mExtensions.maxTextureAnisotropy)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00001358 {
1359 return false;
1360 }
1361 *type = GL_FLOAT;
1362 *numParams = 1;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001363 return true;
Ian Ewell53f59f42016-01-28 17:36:55 -05001364 case GL_TIMESTAMP_EXT:
1365 if (!mExtensions.disjointTimerQuery)
1366 {
1367 return false;
1368 }
1369 *type = GL_INT_64_ANGLEX;
1370 *numParams = 1;
1371 return true;
1372 case GL_GPU_DISJOINT_EXT:
1373 if (!mExtensions.disjointTimerQuery)
1374 {
1375 return false;
1376 }
1377 *type = GL_INT;
1378 *numParams = 1;
1379 return true;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001380 }
1381
Geoff Lang70d0f492015-12-10 17:45:46 -05001382 if (mExtensions.debug)
1383 {
1384 switch (pname)
1385 {
1386 case GL_DEBUG_LOGGED_MESSAGES:
1387 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
1388 case GL_DEBUG_GROUP_STACK_DEPTH:
1389 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1390 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1391 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1392 case GL_MAX_LABEL_LENGTH:
1393 *type = GL_INT;
1394 *numParams = 1;
1395 return true;
1396
1397 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
1398 case GL_DEBUG_OUTPUT:
1399 *type = GL_BOOL;
1400 *numParams = 1;
1401 return true;
1402 }
1403 }
1404
Austin Kinrossbc781f32015-10-26 09:27:38 -07001405 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
1406 switch (pname)
1407 {
1408 case GL_PACK_ROW_LENGTH:
1409 case GL_PACK_SKIP_ROWS:
1410 case GL_PACK_SKIP_PIXELS:
1411 if ((mClientVersion < 3) && !mExtensions.packSubimage)
1412 {
1413 return false;
1414 }
1415 *type = GL_INT;
1416 *numParams = 1;
1417 return true;
1418 case GL_UNPACK_ROW_LENGTH:
1419 case GL_UNPACK_SKIP_ROWS:
1420 case GL_UNPACK_SKIP_PIXELS:
1421 if ((mClientVersion < 3) && !mExtensions.unpackSubimage)
1422 {
1423 return false;
1424 }
1425 *type = GL_INT;
1426 *numParams = 1;
1427 return true;
1428 case GL_VERTEX_ARRAY_BINDING:
1429 if ((mClientVersion < 3) && !mExtensions.vertexArrayObject)
1430 {
1431 return false;
1432 }
1433 *type = GL_INT;
1434 *numParams = 1;
1435 return true;
Yuly Novikov5807a532015-12-03 13:01:22 -05001436 case GL_PIXEL_PACK_BUFFER_BINDING:
1437 case GL_PIXEL_UNPACK_BUFFER_BINDING:
1438 if ((mClientVersion < 3) && !mExtensions.pixelBufferObject)
1439 {
1440 return false;
1441 }
1442 *type = GL_INT;
1443 *numParams = 1;
1444 return true;
Austin Kinrossbc781f32015-10-26 09:27:38 -07001445 }
1446
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001447 if (mClientVersion < 3)
1448 {
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001449 return false;
1450 }
1451
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001452 // Check for ES3.0+ parameter names
1453 switch (pname)
1454 {
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00001455 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1456 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001457 case GL_UNIFORM_BUFFER_BINDING:
1458 case GL_TRANSFORM_FEEDBACK_BINDING:
Geoff Lang045536b2015-03-27 15:17:18 -04001459 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001460 case GL_COPY_READ_BUFFER_BINDING:
1461 case GL_COPY_WRITE_BUFFER_BINDING:
Olli Etuaho86821db2016-03-04 12:05:47 +02001462 case GL_SAMPLER_BINDING:
1463 case GL_READ_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00001464 case GL_TEXTURE_BINDING_3D:
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001465 case GL_TEXTURE_BINDING_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001466 case GL_MAX_3D_TEXTURE_SIZE:
shannon.woods%transgaming.com@gtempaccount.coma98a8112013-04-13 03:45:57 +00001467 case GL_MAX_ARRAY_TEXTURE_LAYERS:
shannonwoods@chromium.orgf2d76f82013-05-30 00:06:32 +00001468 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
1469 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
1470 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
Geoff Lange6d4e122015-06-29 13:33:55 -04001471 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1472 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
Geoff Langd3ff9002014-05-08 11:19:27 -04001473 case GL_MAX_VARYING_COMPONENTS:
Jamie Madill38850df2013-07-19 16:36:55 -04001474 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
1475 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Geoff Lange6d4e122015-06-29 13:33:55 -04001476 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1477 case GL_MAX_PROGRAM_TEXEL_OFFSET:
Geoff Lang23c81692013-08-12 10:46:58 -04001478 case GL_NUM_EXTENSIONS:
Jamie Madillee7010d2013-10-17 10:45:47 -04001479 case GL_MAJOR_VERSION:
1480 case GL_MINOR_VERSION:
Jamie Madill13a2f852013-12-11 16:35:08 -05001481 case GL_MAX_ELEMENTS_INDICES:
1482 case GL_MAX_ELEMENTS_VERTICES:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05001483 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
Jamie Madill2e503552013-12-19 13:48:34 -05001484 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05001485 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
Minmin Gongadff67b2015-10-14 10:34:45 -04001486 case GL_UNPACK_IMAGE_HEIGHT:
Jamie Madill023a2902015-10-23 16:43:24 +00001487 case GL_UNPACK_SKIP_IMAGES:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001488 {
1489 *type = GL_INT;
1490 *numParams = 1;
1491 }
1492 return true;
Jamie Madill0fda9862013-07-19 16:36:55 -04001493
1494 case GL_MAX_ELEMENT_INDEX:
1495 case GL_MAX_UNIFORM_BLOCK_SIZE:
1496 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
1497 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
1498 case GL_MAX_SERVER_WAIT_TIMEOUT:
1499 {
1500 *type = GL_INT_64_ANGLEX;
1501 *numParams = 1;
1502 }
1503 return true;
Jamie Madill2e503552013-12-19 13:48:34 -05001504
1505 case GL_TRANSFORM_FEEDBACK_ACTIVE:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05001506 case GL_TRANSFORM_FEEDBACK_PAUSED:
Jamie Madille2cd53d2015-10-27 11:15:46 -04001507 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
Geoff Langab831f02015-12-01 09:39:10 -05001508 case GL_RASTERIZER_DISCARD:
Jamie Madill2e503552013-12-19 13:48:34 -05001509 {
1510 *type = GL_BOOL;
1511 *numParams = 1;
1512 }
1513 return true;
Geoff Lange6d4e122015-06-29 13:33:55 -04001514
1515 case GL_MAX_TEXTURE_LOD_BIAS:
1516 {
1517 *type = GL_FLOAT;
1518 *numParams = 1;
1519 }
1520 return true;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001521 }
1522
1523 return false;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001524}
1525
Shannon Woods1b2fb852013-08-19 14:28:48 -04001526bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
1527{
1528 if (mClientVersion < 3)
1529 {
1530 return false;
1531 }
1532
1533 switch (target)
1534 {
1535 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
1536 case GL_UNIFORM_BUFFER_BINDING:
1537 {
1538 *type = GL_INT;
1539 *numParams = 1;
1540 }
1541 return true;
1542 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
1543 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
1544 case GL_UNIFORM_BUFFER_START:
1545 case GL_UNIFORM_BUFFER_SIZE:
1546 {
1547 *type = GL_INT_64_ANGLEX;
1548 *numParams = 1;
1549 }
1550 }
1551
1552 return false;
1553}
1554
Geoff Langf6db0982015-08-25 13:04:00 -04001555Error Context::drawArrays(GLenum mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001556{
Jamie Madill1b94d432015-08-07 13:23:23 -04001557 syncRendererState();
Geoff Langf6db0982015-08-25 13:04:00 -04001558 Error error = mRenderer->drawArrays(getData(), mode, first, count);
Geoff Lang520c4ae2015-05-05 13:12:36 -04001559 if (error.isError())
1560 {
1561 return error;
1562 }
1563
Geoff Langf6db0982015-08-25 13:04:00 -04001564 MarkTransformFeedbackBufferUsage(mState.getCurrentTransformFeedback());
Geoff Lang520c4ae2015-05-05 13:12:36 -04001565
1566 return Error(GL_NO_ERROR);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001567}
1568
Geoff Langf6db0982015-08-25 13:04:00 -04001569Error Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
1570{
1571 syncRendererState();
1572 Error error = mRenderer->drawArraysInstanced(getData(), mode, first, count, instanceCount);
1573 if (error.isError())
1574 {
1575 return error;
1576 }
1577
1578 MarkTransformFeedbackBufferUsage(mState.getCurrentTransformFeedback());
1579
1580 return Error(GL_NO_ERROR);
1581}
1582
1583Error Context::drawElements(GLenum mode,
1584 GLsizei count,
1585 GLenum type,
1586 const GLvoid *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -04001587 const IndexRange &indexRange)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001588{
Jamie Madill1b94d432015-08-07 13:23:23 -04001589 syncRendererState();
Geoff Langf6db0982015-08-25 13:04:00 -04001590 return mRenderer->drawElements(getData(), mode, count, type, indices, indexRange);
1591}
1592
1593Error Context::drawElementsInstanced(GLenum mode,
1594 GLsizei count,
1595 GLenum type,
1596 const GLvoid *indices,
1597 GLsizei instances,
Geoff Lang3edfe032015-09-04 16:38:24 -04001598 const IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -04001599{
1600 syncRendererState();
1601 return mRenderer->drawElementsInstanced(getData(), mode, count, type, indices, instances,
1602 indexRange);
1603}
1604
1605Error Context::drawRangeElements(GLenum mode,
1606 GLuint start,
1607 GLuint end,
1608 GLsizei count,
1609 GLenum type,
1610 const GLvoid *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -04001611 const IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -04001612{
1613 syncRendererState();
1614 return mRenderer->drawRangeElements(getData(), mode, start, end, count, type, indices,
1615 indexRange);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001616}
1617
Geoff Lang129753a2015-01-09 16:52:09 -05001618Error Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001619{
Geoff Lang129753a2015-01-09 16:52:09 -05001620 return mRenderer->flush();
1621}
1622
1623Error Context::finish()
1624{
1625 return mRenderer->finish();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001626}
1627
Austin Kinross6ee1e782015-05-29 17:05:37 -07001628void Context::insertEventMarker(GLsizei length, const char *marker)
1629{
1630 ASSERT(mRenderer);
1631 mRenderer->insertEventMarker(length, marker);
1632}
1633
1634void Context::pushGroupMarker(GLsizei length, const char *marker)
1635{
1636 ASSERT(mRenderer);
1637 mRenderer->pushGroupMarker(length, marker);
1638}
1639
1640void Context::popGroupMarker()
1641{
1642 ASSERT(mRenderer);
1643 mRenderer->popGroupMarker();
1644}
1645
Geoff Langda5777c2014-07-11 09:52:58 -04001646void Context::recordError(const Error &error)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001647{
Geoff Langda5777c2014-07-11 09:52:58 -04001648 if (error.isError())
1649 {
1650 mErrors.insert(error.getCode());
Geoff Lang70d0f492015-12-10 17:45:46 -05001651
1652 if (!error.getMessage().empty())
1653 {
1654 auto &debug = mState.getDebug();
1655 debug.insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, error.getID(),
1656 GL_DEBUG_SEVERITY_HIGH, error.getMessage());
1657 }
Geoff Langda5777c2014-07-11 09:52:58 -04001658 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001659}
1660
1661// Get one of the recorded errors and clear its flag, if any.
1662// [OpenGL ES 2.0.24] section 2.5 page 13.
1663GLenum Context::getError()
1664{
Geoff Langda5777c2014-07-11 09:52:58 -04001665 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001666 {
Geoff Langda5777c2014-07-11 09:52:58 -04001667 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001668 }
Geoff Langda5777c2014-07-11 09:52:58 -04001669 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001670 {
Geoff Langda5777c2014-07-11 09:52:58 -04001671 GLenum error = *mErrors.begin();
1672 mErrors.erase(mErrors.begin());
1673 return error;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001674 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001675}
1676
1677GLenum Context::getResetStatus()
1678{
Jamie Madill93e13fb2014-11-06 15:27:25 -05001679 //TODO(jmadill): needs MANGLE reworking
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00001680 if (mResetStatus == GL_NO_ERROR && !mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001681 {
daniel@transgaming.comf688c0d2012-10-31 17:52:57 +00001682 // mResetStatus will be set by the markContextLost callback
1683 // in the case a notification is sent
Jamie Madill4c76fea2014-11-24 11:38:52 -05001684 if (mRenderer->testDeviceLost())
Jamie Madill9dd0cf02014-11-24 11:38:51 -05001685 {
1686 mRenderer->notifyDeviceLost();
1687 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001688 }
1689
1690 GLenum status = mResetStatus;
1691
1692 if (mResetStatus != GL_NO_ERROR)
1693 {
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00001694 ASSERT(mContextLost);
1695
daniel@transgaming.com621ce052012-10-31 17:52:29 +00001696 if (mRenderer->testDeviceResettable())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001697 {
1698 mResetStatus = GL_NO_ERROR;
1699 }
1700 }
Jamie Madill893ab082014-05-16 16:56:10 -04001701
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001702 return status;
1703}
1704
1705bool Context::isResetNotificationEnabled()
1706{
1707 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
1708}
1709
Corentin Walleze3b10e82015-05-20 11:06:25 -04001710const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01001711{
Corentin Walleze3b10e82015-05-20 11:06:25 -04001712 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01001713}
1714
1715EGLenum Context::getClientType() const
1716{
1717 return mClientType;
1718}
1719
1720EGLenum Context::getRenderBuffer() const
1721{
Corentin Wallez37c39792015-08-20 14:19:46 -04001722 auto framebufferIt = mFramebufferMap.find(0);
1723 if (framebufferIt != mFramebufferMap.end())
1724 {
1725 const Framebuffer *framebuffer = framebufferIt->second;
1726 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(GL_BACK);
1727
1728 ASSERT(backAttachment != nullptr);
1729 return backAttachment->getSurface()->getRenderBuffer();
1730 }
1731 else
1732 {
1733 return EGL_NONE;
1734 }
Régis Fénéon83107972015-02-05 12:57:44 +01001735}
1736
Geoff Lang36167ab2015-12-07 10:27:14 -05001737void Context::checkVertexArrayAllocation(GLuint vertexArray)
1738{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001739 // Only called after a prior call to Gen.
Geoff Lang36167ab2015-12-07 10:27:14 -05001740 if (!getVertexArray(vertexArray))
1741 {
1742 VertexArray *vertexArrayObject =
1743 new VertexArray(mRenderer, vertexArray, MAX_VERTEX_ATTRIBS);
1744 mVertexArrayMap[vertexArray] = vertexArrayObject;
1745 }
1746}
1747
1748void Context::checkTransformFeedbackAllocation(GLuint transformFeedback)
1749{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001750 // Only called after a prior call to Gen.
Geoff Lang36167ab2015-12-07 10:27:14 -05001751 if (!getTransformFeedback(transformFeedback))
1752 {
1753 TransformFeedback *transformFeedbackObject =
1754 new TransformFeedback(mRenderer->createTransformFeedback(), transformFeedback, mCaps);
1755 transformFeedbackObject->addRef();
1756 mTransformFeedbackMap[transformFeedback] = transformFeedbackObject;
1757 }
1758}
1759
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001760Framebuffer *Context::checkFramebufferAllocation(GLuint framebuffer)
1761{
1762 // Can be called from Bind without a prior call to Gen.
1763 auto framebufferIt = mFramebufferMap.find(framebuffer);
1764 bool neverCreated = framebufferIt == mFramebufferMap.end();
1765 if (neverCreated || framebufferIt->second == nullptr)
1766 {
1767 Framebuffer *newFBO = new Framebuffer(mCaps, mRenderer, framebuffer);
1768 if (neverCreated)
1769 {
1770 mFramebufferHandleAllocator.reserve(framebuffer);
1771 mFramebufferMap[framebuffer] = newFBO;
1772 return newFBO;
1773 }
1774
1775 framebufferIt->second = newFBO;
1776 }
1777
1778 return framebufferIt->second;
1779}
1780
Geoff Lang36167ab2015-12-07 10:27:14 -05001781bool Context::isVertexArrayGenerated(GLuint vertexArray)
1782{
1783 return mVertexArrayMap.find(vertexArray) != mVertexArrayMap.end();
1784}
1785
1786bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
1787{
1788 return mTransformFeedbackMap.find(transformFeedback) != mTransformFeedbackMap.end();
1789}
1790
Shannon Woods53a94a82014-06-24 15:20:36 -04001791void Context::detachTexture(GLuint texture)
1792{
1793 // Simple pass-through to State's detachTexture method, as textures do not require
1794 // allocation map management either here or in the resource manager at detach time.
1795 // Zero textures are held by the Context, and we don't attempt to request them from
1796 // the State.
Jamie Madille6382c32014-11-07 15:05:26 -05001797 mState.detachTexture(mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04001798}
1799
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001800void Context::detachBuffer(GLuint buffer)
1801{
Yuly Novikov5807a532015-12-03 13:01:22 -05001802 // Simple pass-through to State's detachBuffer method, since
1803 // only buffer attachments to container objects that are bound to the current context
1804 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04001805
Yuly Novikov5807a532015-12-03 13:01:22 -05001806 // [OpenGL ES 3.2] section 5.1.2 page 45:
1807 // Attachments to unbound container objects, such as
1808 // deletion of a buffer attached to a vertex array object which is not bound to the context,
1809 // are not affected and continue to act as references on the deleted object
1810 mState.detachBuffer(buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001811}
1812
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001813void Context::detachFramebuffer(GLuint framebuffer)
1814{
Shannon Woods53a94a82014-06-24 15:20:36 -04001815 // Framebuffer detachment is handled by Context, because 0 is a valid
1816 // Framebuffer object, and a pointer to it must be passed from Context
1817 // to State at binding time.
1818
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001819 // [OpenGL ES 2.0.24] section 4.4 page 107:
1820 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as though
1821 // BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of zero.
1822
Gregoire Payen de La Garanderieed54e5d2015-03-17 16:51:24 +00001823 if (mState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001824 {
1825 bindReadFramebuffer(0);
1826 }
1827
Gregoire Payen de La Garanderieed54e5d2015-03-17 16:51:24 +00001828 if (mState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001829 {
1830 bindDrawFramebuffer(0);
1831 }
1832}
1833
1834void Context::detachRenderbuffer(GLuint renderbuffer)
1835{
Shannon Woods53a94a82014-06-24 15:20:36 -04001836 mState.detachRenderbuffer(renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001837}
1838
Jamie Madill57a89722013-07-02 11:57:03 -04001839void Context::detachVertexArray(GLuint vertexArray)
1840{
Jamie Madill77a72f62015-04-14 11:18:32 -04001841 // Vertex array detachment is handled by Context, because 0 is a valid
1842 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04001843 // binding time.
1844
Jamie Madill57a89722013-07-02 11:57:03 -04001845 // [OpenGL ES 3.0.2] section 2.10 page 43:
1846 // If a vertex array object that is currently bound is deleted, the binding
1847 // for that object reverts to zero and the default vertex array becomes current.
Shannon Woods53a94a82014-06-24 15:20:36 -04001848 if (mState.removeVertexArrayBinding(vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04001849 {
1850 bindVertexArray(0);
1851 }
1852}
1853
Geoff Langc8058452014-02-03 12:04:11 -05001854void Context::detachTransformFeedback(GLuint transformFeedback)
1855{
Shannon Woods53a94a82014-06-24 15:20:36 -04001856 mState.detachTransformFeedback(transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -05001857}
1858
Jamie Madilldc356042013-07-19 16:36:57 -04001859void Context::detachSampler(GLuint sampler)
1860{
Shannon Woods53a94a82014-06-24 15:20:36 -04001861 mState.detachSampler(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001862}
1863
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001864void Context::setVertexAttribDivisor(GLuint index, GLuint divisor)
1865{
Jamie Madill0b9e9032015-08-17 11:51:52 +00001866 mState.setVertexAttribDivisor(index, divisor);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001867}
1868
Jamie Madille29d1672013-07-19 16:36:57 -04001869void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
1870{
1871 mResourceManager->checkSamplerAllocation(sampler);
1872
1873 Sampler *samplerObject = getSampler(sampler);
1874 ASSERT(samplerObject);
1875
Geoff Lang69cce582015-09-17 13:20:36 -04001876 // clang-format off
Jamie Madille29d1672013-07-19 16:36:57 -04001877 switch (pname)
1878 {
Geoff Lang69cce582015-09-17 13:20:36 -04001879 case GL_TEXTURE_MIN_FILTER: samplerObject->setMinFilter(static_cast<GLenum>(param)); break;
1880 case GL_TEXTURE_MAG_FILTER: samplerObject->setMagFilter(static_cast<GLenum>(param)); break;
1881 case GL_TEXTURE_WRAP_S: samplerObject->setWrapS(static_cast<GLenum>(param)); break;
1882 case GL_TEXTURE_WRAP_T: samplerObject->setWrapT(static_cast<GLenum>(param)); break;
1883 case GL_TEXTURE_WRAP_R: samplerObject->setWrapR(static_cast<GLenum>(param)); break;
1884 case GL_TEXTURE_MAX_ANISOTROPY_EXT: samplerObject->setMaxAnisotropy(std::min(static_cast<GLfloat>(param), getExtensions().maxTextureAnisotropy)); break;
1885 case GL_TEXTURE_MIN_LOD: samplerObject->setMinLod(static_cast<GLfloat>(param)); break;
1886 case GL_TEXTURE_MAX_LOD: samplerObject->setMaxLod(static_cast<GLfloat>(param)); break;
1887 case GL_TEXTURE_COMPARE_MODE: samplerObject->setCompareMode(static_cast<GLenum>(param)); break;
1888 case GL_TEXTURE_COMPARE_FUNC: samplerObject->setCompareFunc(static_cast<GLenum>(param)); break;
1889 default: UNREACHABLE(); break;
Jamie Madille29d1672013-07-19 16:36:57 -04001890 }
Geoff Lang69cce582015-09-17 13:20:36 -04001891 // clang-format on
Jamie Madille29d1672013-07-19 16:36:57 -04001892}
1893
1894void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
1895{
1896 mResourceManager->checkSamplerAllocation(sampler);
1897
1898 Sampler *samplerObject = getSampler(sampler);
1899 ASSERT(samplerObject);
1900
Geoff Lang69cce582015-09-17 13:20:36 -04001901 // clang-format off
Jamie Madille29d1672013-07-19 16:36:57 -04001902 switch (pname)
1903 {
Geoff Lang69cce582015-09-17 13:20:36 -04001904 case GL_TEXTURE_MIN_FILTER: samplerObject->setMinFilter(uiround<GLenum>(param)); break;
1905 case GL_TEXTURE_MAG_FILTER: samplerObject->setMagFilter(uiround<GLenum>(param)); break;
1906 case GL_TEXTURE_WRAP_S: samplerObject->setWrapS(uiround<GLenum>(param)); break;
1907 case GL_TEXTURE_WRAP_T: samplerObject->setWrapT(uiround<GLenum>(param)); break;
1908 case GL_TEXTURE_WRAP_R: samplerObject->setWrapR(uiround<GLenum>(param)); break;
1909 case GL_TEXTURE_MAX_ANISOTROPY_EXT: samplerObject->setMaxAnisotropy(std::min(param, getExtensions().maxTextureAnisotropy)); break;
1910 case GL_TEXTURE_MIN_LOD: samplerObject->setMinLod(param); break;
1911 case GL_TEXTURE_MAX_LOD: samplerObject->setMaxLod(param); break;
1912 case GL_TEXTURE_COMPARE_MODE: samplerObject->setCompareMode(uiround<GLenum>(param)); break;
1913 case GL_TEXTURE_COMPARE_FUNC: samplerObject->setCompareFunc(uiround<GLenum>(param)); break;
1914 default: UNREACHABLE(); break;
Jamie Madille29d1672013-07-19 16:36:57 -04001915 }
Geoff Lang69cce582015-09-17 13:20:36 -04001916 // clang-format on
Jamie Madille29d1672013-07-19 16:36:57 -04001917}
1918
Jamie Madill9675b802013-07-19 16:36:59 -04001919GLint Context::getSamplerParameteri(GLuint sampler, GLenum pname)
1920{
1921 mResourceManager->checkSamplerAllocation(sampler);
1922
1923 Sampler *samplerObject = getSampler(sampler);
1924 ASSERT(samplerObject);
1925
Geoff Lang69cce582015-09-17 13:20:36 -04001926 // clang-format off
Jamie Madill9675b802013-07-19 16:36:59 -04001927 switch (pname)
1928 {
Geoff Lang69cce582015-09-17 13:20:36 -04001929 case GL_TEXTURE_MIN_FILTER: return static_cast<GLint>(samplerObject->getMinFilter());
1930 case GL_TEXTURE_MAG_FILTER: return static_cast<GLint>(samplerObject->getMagFilter());
1931 case GL_TEXTURE_WRAP_S: return static_cast<GLint>(samplerObject->getWrapS());
1932 case GL_TEXTURE_WRAP_T: return static_cast<GLint>(samplerObject->getWrapT());
1933 case GL_TEXTURE_WRAP_R: return static_cast<GLint>(samplerObject->getWrapR());
1934 case GL_TEXTURE_MAX_ANISOTROPY_EXT: return static_cast<GLint>(samplerObject->getMaxAnisotropy());
Olli Etuaho6ad07232016-03-03 17:15:49 +02001935 case GL_TEXTURE_MIN_LOD: return iround<GLint>(samplerObject->getMinLod());
1936 case GL_TEXTURE_MAX_LOD: return iround<GLint>(samplerObject->getMaxLod());
Geoff Lang69cce582015-09-17 13:20:36 -04001937 case GL_TEXTURE_COMPARE_MODE: return static_cast<GLint>(samplerObject->getCompareMode());
1938 case GL_TEXTURE_COMPARE_FUNC: return static_cast<GLint>(samplerObject->getCompareFunc());
1939 default: UNREACHABLE(); return 0;
Jamie Madill9675b802013-07-19 16:36:59 -04001940 }
Geoff Lang69cce582015-09-17 13:20:36 -04001941 // clang-format on
Jamie Madill9675b802013-07-19 16:36:59 -04001942}
1943
1944GLfloat Context::getSamplerParameterf(GLuint sampler, GLenum pname)
1945{
1946 mResourceManager->checkSamplerAllocation(sampler);
1947
1948 Sampler *samplerObject = getSampler(sampler);
1949 ASSERT(samplerObject);
1950
Geoff Lang69cce582015-09-17 13:20:36 -04001951 // clang-format off
Jamie Madill9675b802013-07-19 16:36:59 -04001952 switch (pname)
1953 {
Geoff Lang69cce582015-09-17 13:20:36 -04001954 case GL_TEXTURE_MIN_FILTER: return static_cast<GLfloat>(samplerObject->getMinFilter());
1955 case GL_TEXTURE_MAG_FILTER: return static_cast<GLfloat>(samplerObject->getMagFilter());
1956 case GL_TEXTURE_WRAP_S: return static_cast<GLfloat>(samplerObject->getWrapS());
1957 case GL_TEXTURE_WRAP_T: return static_cast<GLfloat>(samplerObject->getWrapT());
1958 case GL_TEXTURE_WRAP_R: return static_cast<GLfloat>(samplerObject->getWrapR());
1959 case GL_TEXTURE_MAX_ANISOTROPY_EXT: return samplerObject->getMaxAnisotropy();
1960 case GL_TEXTURE_MIN_LOD: return samplerObject->getMinLod();
1961 case GL_TEXTURE_MAX_LOD: return samplerObject->getMaxLod();
1962 case GL_TEXTURE_COMPARE_MODE: return static_cast<GLfloat>(samplerObject->getCompareMode());
1963 case GL_TEXTURE_COMPARE_FUNC: return static_cast<GLfloat>(samplerObject->getCompareFunc());
1964 default: UNREACHABLE(); return 0;
Jamie Madill9675b802013-07-19 16:36:59 -04001965 }
Geoff Lang69cce582015-09-17 13:20:36 -04001966 // clang-format on
Jamie Madill9675b802013-07-19 16:36:59 -04001967}
1968
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001969void Context::initRendererString()
1970{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00001971 std::ostringstream rendererString;
1972 rendererString << "ANGLE (";
1973 rendererString << mRenderer->getRendererDescription();
1974 rendererString << ")";
1975
Geoff Langcec35902014-04-16 10:52:36 -04001976 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001977}
1978
Geoff Langc0b9ef42014-07-02 10:02:37 -04001979const std::string &Context::getRendererString() const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001980{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00001981 return mRendererString;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001982}
1983
Geoff Langcec35902014-04-16 10:52:36 -04001984void Context::initExtensionStrings()
1985{
Geoff Lang493daf52014-07-03 13:38:44 -04001986 mExtensionStrings = mExtensions.getStrings();
Geoff Langcec35902014-04-16 10:52:36 -04001987
Geoff Langc0b9ef42014-07-02 10:02:37 -04001988 std::ostringstream combinedStringStream;
1989 std::copy(mExtensionStrings.begin(), mExtensionStrings.end(), std::ostream_iterator<std::string>(combinedStringStream, " "));
1990 mExtensionString = combinedStringStream.str();
Geoff Langcec35902014-04-16 10:52:36 -04001991}
1992
Geoff Langc0b9ef42014-07-02 10:02:37 -04001993const std::string &Context::getExtensionString() const
Geoff Langcec35902014-04-16 10:52:36 -04001994{
1995 return mExtensionString;
1996}
1997
Geoff Langc0b9ef42014-07-02 10:02:37 -04001998const std::string &Context::getExtensionString(size_t idx) const
Geoff Langcec35902014-04-16 10:52:36 -04001999{
2000 return mExtensionStrings[idx];
2001}
2002
2003size_t Context::getExtensionStringCount() const
2004{
2005 return mExtensionStrings.size();
2006}
2007
Geoff Lang493daf52014-07-03 13:38:44 -04002008void Context::initCaps(GLuint clientVersion)
2009{
2010 mCaps = mRenderer->getRendererCaps();
2011
2012 mExtensions = mRenderer->getRendererExtensions();
2013
Austin Kinross02df7962015-07-01 10:03:42 -07002014 mLimitations = mRenderer->getRendererLimitations();
2015
Geoff Lang493daf52014-07-03 13:38:44 -04002016 if (clientVersion < 3)
2017 {
2018 // Disable ES3+ extensions
2019 mExtensions.colorBufferFloat = false;
2020 }
2021
2022 if (clientVersion > 2)
2023 {
2024 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
2025 //mExtensions.sRGB = false;
2026 }
2027
Geoff Lang70d0f492015-12-10 17:45:46 -05002028 // Explicitly enable GL_KHR_debug
2029 mExtensions.debug = true;
2030 mExtensions.maxDebugMessageLength = 1024;
2031 mExtensions.maxDebugLoggedMessages = 1024;
2032 mExtensions.maxDebugGroupStackDepth = 1024;
2033 mExtensions.maxLabelLength = 1024;
2034
Geoff Lang301d1612014-07-09 10:34:37 -04002035 // Apply implementation limits
2036 mCaps.maxVertexAttributes = std::min<GLuint>(mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Geoff Lang301d1612014-07-09 10:34:37 -04002037 mCaps.maxVertexUniformBlocks = std::min<GLuint>(mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
2038 mCaps.maxVertexOutputComponents = std::min<GLuint>(mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
2039
2040 mCaps.maxFragmentInputComponents = std::min<GLuint>(mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
Geoff Lang3a61c322014-07-10 13:01:54 -04002041
Geoff Lang900013c2014-07-07 11:32:19 -04002042 mCaps.compressedTextureFormats.clear();
2043
Geoff Lang493daf52014-07-03 13:38:44 -04002044 const TextureCapsMap &rendererFormats = mRenderer->getRendererTextureCaps();
2045 for (TextureCapsMap::const_iterator i = rendererFormats.begin(); i != rendererFormats.end(); i++)
2046 {
2047 GLenum format = i->first;
2048 TextureCaps formatCaps = i->second;
2049
Geoff Lang5d601382014-07-22 15:14:06 -04002050 const InternalFormat &formatInfo = GetInternalFormatInfo(format);
Geoff Langd87878e2014-09-19 15:42:59 -04002051
Geoff Lang0d8b7242015-09-09 14:56:53 -04002052 // Update the format caps based on the client version and extensions.
2053 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
2054 // ES3.
2055 formatCaps.texturable =
2056 formatCaps.texturable && formatInfo.textureSupport(clientVersion, mExtensions);
2057 formatCaps.renderable =
2058 formatCaps.renderable && formatInfo.renderSupport(clientVersion, mExtensions);
2059 formatCaps.filterable =
2060 formatCaps.filterable && formatInfo.filterSupport(clientVersion, mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04002061
2062 // OpenGL ES does not support multisampling with integer formats
2063 if (!formatInfo.renderSupport || formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)
Geoff Lang493daf52014-07-03 13:38:44 -04002064 {
Geoff Langd87878e2014-09-19 15:42:59 -04002065 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04002066 }
Geoff Langd87878e2014-09-19 15:42:59 -04002067
2068 if (formatCaps.texturable && formatInfo.compressed)
2069 {
2070 mCaps.compressedTextureFormats.push_back(format);
2071 }
2072
2073 mTextureCaps.insert(format, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04002074 }
2075}
2076
Jamie Madill1b94d432015-08-07 13:23:23 -04002077void Context::syncRendererState()
2078{
2079 const State::DirtyBits &dirtyBits = mState.getDirtyBits();
Jamie Madillc9d442d2016-01-20 11:17:24 -05002080 mRenderer->syncState(mState, dirtyBits);
2081 mState.clearDirtyBits();
2082 mState.syncDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -04002083}
2084
Jamie Madillad9f24e2016-02-12 09:27:24 -05002085void Context::syncRendererState(const State::DirtyBits &bitMask,
2086 const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04002087{
2088 const State::DirtyBits &dirtyBits = (mState.getDirtyBits() & bitMask);
Jamie Madillc9d442d2016-01-20 11:17:24 -05002089 mRenderer->syncState(mState, dirtyBits);
2090 mState.clearDirtyBits(dirtyBits);
2091
Jamie Madillad9f24e2016-02-12 09:27:24 -05002092 mState.syncDirtyObjects(objectMask);
Jamie Madill1b94d432015-08-07 13:23:23 -04002093}
Jamie Madillc29968b2016-01-20 11:17:23 -05002094
2095void Context::blitFramebuffer(GLint srcX0,
2096 GLint srcY0,
2097 GLint srcX1,
2098 GLint srcY1,
2099 GLint dstX0,
2100 GLint dstY0,
2101 GLint dstX1,
2102 GLint dstY1,
2103 GLbitfield mask,
2104 GLenum filter)
2105{
2106 Framebuffer *readFramebuffer = mState.getReadFramebuffer();
2107 ASSERT(readFramebuffer);
2108
2109 Framebuffer *drawFramebuffer = mState.getDrawFramebuffer();
2110 ASSERT(drawFramebuffer);
2111
2112 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
2113 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
2114
Jamie Madillad9f24e2016-02-12 09:27:24 -05002115 syncStateForBlit();
Jamie Madillc29968b2016-01-20 11:17:23 -05002116
2117 Error error = drawFramebuffer->blit(mState, srcArea, dstArea, mask, filter, readFramebuffer);
2118 if (error.isError())
2119 {
2120 recordError(error);
2121 return;
2122 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002123}
Jamie Madillc29968b2016-01-20 11:17:23 -05002124
2125void Context::clear(GLbitfield mask)
2126{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002127 syncStateForClear();
Jamie Madillc29968b2016-01-20 11:17:23 -05002128
2129 Error error = mState.getDrawFramebuffer()->clear(mData, mask);
2130 if (error.isError())
2131 {
2132 recordError(error);
2133 }
2134}
2135
2136void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
2137{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002138 syncStateForClear();
Jamie Madillc29968b2016-01-20 11:17:23 -05002139
2140 Error error = mState.getDrawFramebuffer()->clearBufferfv(mData, buffer, drawbuffer, values);
2141 if (error.isError())
2142 {
2143 recordError(error);
2144 }
2145}
2146
2147void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
2148{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002149 syncStateForClear();
Jamie Madillc29968b2016-01-20 11:17:23 -05002150
2151 Error error = mState.getDrawFramebuffer()->clearBufferuiv(mData, buffer, drawbuffer, values);
2152 if (error.isError())
2153 {
2154 recordError(error);
2155 }
2156}
2157
2158void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
2159{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002160 syncStateForClear();
Jamie Madillc29968b2016-01-20 11:17:23 -05002161
2162 Error error = mState.getDrawFramebuffer()->clearBufferiv(mData, buffer, drawbuffer, values);
2163 if (error.isError())
2164 {
2165 recordError(error);
2166 }
2167}
2168
2169void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
2170{
2171 Framebuffer *framebufferObject = mState.getDrawFramebuffer();
2172 ASSERT(framebufferObject);
2173
2174 // If a buffer is not present, the clear has no effect
2175 if (framebufferObject->getDepthbuffer() == nullptr &&
2176 framebufferObject->getStencilbuffer() == nullptr)
2177 {
2178 return;
2179 }
2180
Jamie Madillad9f24e2016-02-12 09:27:24 -05002181 syncStateForClear();
Jamie Madillc29968b2016-01-20 11:17:23 -05002182
2183 Error error = framebufferObject->clearBufferfi(mData, buffer, drawbuffer, depth, stencil);
2184 if (error.isError())
2185 {
2186 recordError(error);
2187 }
2188}
2189
2190void Context::readPixels(GLint x,
2191 GLint y,
2192 GLsizei width,
2193 GLsizei height,
2194 GLenum format,
2195 GLenum type,
2196 GLvoid *pixels)
2197{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002198 syncStateForReadPixels();
Jamie Madillc29968b2016-01-20 11:17:23 -05002199
2200 Framebuffer *framebufferObject = mState.getReadFramebuffer();
2201 ASSERT(framebufferObject);
2202
2203 Rectangle area(x, y, width, height);
2204 Error error = framebufferObject->readPixels(mState, area, format, type, pixels);
2205 if (error.isError())
2206 {
2207 recordError(error);
2208 }
2209}
2210
2211void Context::copyTexImage2D(GLenum target,
2212 GLint level,
2213 GLenum internalformat,
2214 GLint x,
2215 GLint y,
2216 GLsizei width,
2217 GLsizei height,
2218 GLint border)
2219{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002220 // Only sync the read FBO
2221 mState.syncDirtyObject(GL_READ_FRAMEBUFFER);
2222
Jamie Madillc29968b2016-01-20 11:17:23 -05002223 Rectangle sourceArea(x, y, width, height);
2224
2225 const Framebuffer *framebuffer = mState.getReadFramebuffer();
2226 Texture *texture =
2227 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
2228 Error error = texture->copyImage(target, level, sourceArea, internalformat, framebuffer);
2229 if (error.isError())
2230 {
2231 recordError(error);
2232 }
2233}
2234
2235void Context::copyTexSubImage2D(GLenum target,
2236 GLint level,
2237 GLint xoffset,
2238 GLint yoffset,
2239 GLint x,
2240 GLint y,
2241 GLsizei width,
2242 GLsizei height)
2243{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002244 // Only sync the read FBO
2245 mState.syncDirtyObject(GL_READ_FRAMEBUFFER);
2246
Jamie Madillc29968b2016-01-20 11:17:23 -05002247 Offset destOffset(xoffset, yoffset, 0);
2248 Rectangle sourceArea(x, y, width, height);
2249
2250 const Framebuffer *framebuffer = mState.getReadFramebuffer();
2251 Texture *texture =
2252 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
2253 Error error = texture->copySubImage(target, level, destOffset, sourceArea, framebuffer);
2254 if (error.isError())
2255 {
2256 recordError(error);
2257 }
2258}
2259
2260void Context::copyTexSubImage3D(GLenum target,
2261 GLint level,
2262 GLint xoffset,
2263 GLint yoffset,
2264 GLint zoffset,
2265 GLint x,
2266 GLint y,
2267 GLsizei width,
2268 GLsizei height)
2269{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002270 // Only sync the read FBO
2271 mState.syncDirtyObject(GL_READ_FRAMEBUFFER);
2272
Jamie Madillc29968b2016-01-20 11:17:23 -05002273 Offset destOffset(xoffset, yoffset, zoffset);
2274 Rectangle sourceArea(x, y, width, height);
2275
2276 const Framebuffer *framebuffer = mState.getReadFramebuffer();
2277 Texture *texture = getTargetTexture(target);
2278 Error error = texture->copySubImage(target, level, destOffset, sourceArea, framebuffer);
2279 if (error.isError())
2280 {
2281 recordError(error);
2282 }
2283}
2284
2285void Context::framebufferTexture2D(GLenum target,
2286 GLenum attachment,
2287 GLenum textarget,
2288 GLuint texture,
2289 GLint level)
2290{
2291 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
2292 ASSERT(framebuffer);
2293
2294 if (texture != 0)
2295 {
2296 Texture *textureObj = getTexture(texture);
2297
2298 ImageIndex index = ImageIndex::MakeInvalid();
2299
2300 if (textarget == GL_TEXTURE_2D)
2301 {
2302 index = ImageIndex::Make2D(level);
2303 }
2304 else
2305 {
2306 ASSERT(IsCubeMapTextureTarget(textarget));
2307 index = ImageIndex::MakeCube(textarget, level);
2308 }
2309
2310 framebuffer->setAttachment(GL_TEXTURE, attachment, index, textureObj);
2311 }
2312 else
2313 {
2314 framebuffer->resetAttachment(attachment);
2315 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002316
2317 mState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002318}
2319
2320void Context::framebufferRenderbuffer(GLenum target,
2321 GLenum attachment,
2322 GLenum renderbuffertarget,
2323 GLuint renderbuffer)
2324{
2325 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
2326 ASSERT(framebuffer);
2327
2328 if (renderbuffer != 0)
2329 {
2330 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
2331 framebuffer->setAttachment(GL_RENDERBUFFER, attachment, gl::ImageIndex::MakeInvalid(),
2332 renderbufferObject);
2333 }
2334 else
2335 {
2336 framebuffer->resetAttachment(attachment);
2337 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002338
2339 mState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002340}
2341
2342void Context::framebufferTextureLayer(GLenum target,
2343 GLenum attachment,
2344 GLuint texture,
2345 GLint level,
2346 GLint layer)
2347{
2348 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
2349 ASSERT(framebuffer);
2350
2351 if (texture != 0)
2352 {
2353 Texture *textureObject = getTexture(texture);
2354
2355 ImageIndex index = ImageIndex::MakeInvalid();
2356
2357 if (textureObject->getTarget() == GL_TEXTURE_3D)
2358 {
2359 index = ImageIndex::Make3D(level, layer);
2360 }
2361 else
2362 {
2363 ASSERT(textureObject->getTarget() == GL_TEXTURE_2D_ARRAY);
2364 index = ImageIndex::Make2DArray(level, layer);
2365 }
2366
2367 framebuffer->setAttachment(GL_TEXTURE, attachment, index, textureObject);
2368 }
2369 else
2370 {
2371 framebuffer->resetAttachment(attachment);
2372 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002373
2374 mState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002375}
2376
2377void Context::drawBuffers(GLsizei n, const GLenum *bufs)
2378{
2379 Framebuffer *framebuffer = mState.getDrawFramebuffer();
2380 ASSERT(framebuffer);
2381 framebuffer->setDrawBuffers(n, bufs);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002382 mState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05002383}
2384
2385void Context::readBuffer(GLenum mode)
2386{
2387 Framebuffer *readFBO = mState.getReadFramebuffer();
2388 readFBO->setReadBuffer(mode);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002389 mState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05002390}
2391
2392void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
2393{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002394 // Only sync the FBO
2395 mState.syncDirtyObject(target);
2396
Jamie Madillc29968b2016-01-20 11:17:23 -05002397 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
2398 ASSERT(framebuffer);
2399
2400 // The specification isn't clear what should be done when the framebuffer isn't complete.
2401 // We leave it up to the framebuffer implementation to decide what to do.
2402 Error error = framebuffer->discard(numAttachments, attachments);
2403 if (error.isError())
2404 {
2405 recordError(error);
2406 }
2407}
2408
2409void Context::invalidateFramebuffer(GLenum target,
2410 GLsizei numAttachments,
2411 const GLenum *attachments)
2412{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002413 // Only sync the FBO
2414 mState.syncDirtyObject(target);
2415
Jamie Madillc29968b2016-01-20 11:17:23 -05002416 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
2417 ASSERT(framebuffer);
2418
2419 if (framebuffer->checkStatus(mData) == GL_FRAMEBUFFER_COMPLETE)
2420 {
2421 Error error = framebuffer->invalidate(numAttachments, attachments);
2422 if (error.isError())
2423 {
2424 recordError(error);
2425 return;
2426 }
2427 }
2428}
2429
2430void Context::invalidateSubFramebuffer(GLenum target,
2431 GLsizei numAttachments,
2432 const GLenum *attachments,
2433 GLint x,
2434 GLint y,
2435 GLsizei width,
2436 GLsizei height)
2437{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002438 // Only sync the FBO
2439 mState.syncDirtyObject(target);
2440
Jamie Madillc29968b2016-01-20 11:17:23 -05002441 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
2442 ASSERT(framebuffer);
2443
2444 if (framebuffer->checkStatus(mData) == GL_FRAMEBUFFER_COMPLETE)
2445 {
2446 Rectangle area(x, y, width, height);
2447 Error error = framebuffer->invalidateSub(numAttachments, attachments, area);
2448 if (error.isError())
2449 {
2450 recordError(error);
2451 return;
2452 }
2453 }
2454}
2455
Jamie Madill73a84962016-02-12 09:27:23 -05002456void Context::texImage2D(GLenum target,
2457 GLint level,
2458 GLint internalformat,
2459 GLsizei width,
2460 GLsizei height,
2461 GLint border,
2462 GLenum format,
2463 GLenum type,
2464 const GLvoid *pixels)
2465{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002466 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002467
2468 Extents size(width, height, 1);
2469 Texture *texture =
2470 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
2471 Error error = texture->setImage(mState.getUnpackState(), target, level, internalformat, size,
2472 format, type, reinterpret_cast<const uint8_t *>(pixels));
2473 if (error.isError())
2474 {
2475 recordError(error);
2476 }
2477}
2478
2479void Context::texImage3D(GLenum target,
2480 GLint level,
2481 GLint internalformat,
2482 GLsizei width,
2483 GLsizei height,
2484 GLsizei depth,
2485 GLint border,
2486 GLenum format,
2487 GLenum type,
2488 const GLvoid *pixels)
2489{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002490 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002491
2492 Extents size(width, height, depth);
2493 Texture *texture = getTargetTexture(target);
2494 Error error = texture->setImage(mState.getUnpackState(), target, level, internalformat, size,
2495 format, type, reinterpret_cast<const uint8_t *>(pixels));
2496 if (error.isError())
2497 {
2498 recordError(error);
2499 }
2500}
2501
2502void Context::texSubImage2D(GLenum target,
2503 GLint level,
2504 GLint xoffset,
2505 GLint yoffset,
2506 GLsizei width,
2507 GLsizei height,
2508 GLenum format,
2509 GLenum type,
2510 const GLvoid *pixels)
2511{
2512 // Zero sized uploads are valid but no-ops
2513 if (width == 0 || height == 0)
2514 {
2515 return;
2516 }
2517
Jamie Madillad9f24e2016-02-12 09:27:24 -05002518 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002519
2520 Box area(xoffset, yoffset, 0, width, height, 1);
2521 Texture *texture =
2522 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
2523 Error error = texture->setSubImage(mState.getUnpackState(), target, level, area, format, type,
2524 reinterpret_cast<const uint8_t *>(pixels));
2525 if (error.isError())
2526 {
2527 recordError(error);
2528 }
2529}
2530
2531void Context::texSubImage3D(GLenum target,
2532 GLint level,
2533 GLint xoffset,
2534 GLint yoffset,
2535 GLint zoffset,
2536 GLsizei width,
2537 GLsizei height,
2538 GLsizei depth,
2539 GLenum format,
2540 GLenum type,
2541 const GLvoid *pixels)
2542{
2543 // Zero sized uploads are valid but no-ops
2544 if (width == 0 || height == 0 || depth == 0)
2545 {
2546 return;
2547 }
2548
Jamie Madillad9f24e2016-02-12 09:27:24 -05002549 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002550
2551 Box area(xoffset, yoffset, zoffset, width, height, depth);
2552 Texture *texture = getTargetTexture(target);
2553 Error error = texture->setSubImage(mState.getUnpackState(), target, level, area, format, type,
2554 reinterpret_cast<const uint8_t *>(pixels));
2555 if (error.isError())
2556 {
2557 recordError(error);
2558 }
2559}
2560
2561void Context::compressedTexImage2D(GLenum target,
2562 GLint level,
2563 GLenum internalformat,
2564 GLsizei width,
2565 GLsizei height,
2566 GLint border,
2567 GLsizei imageSize,
2568 const GLvoid *data)
2569{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002570 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002571
2572 Extents size(width, height, 1);
2573 Texture *texture =
2574 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
2575 Error error =
2576 texture->setCompressedImage(mState.getUnpackState(), target, level, internalformat, size,
2577 imageSize, reinterpret_cast<const uint8_t *>(data));
2578 if (error.isError())
2579 {
2580 recordError(error);
2581 }
2582}
2583
2584void Context::compressedTexImage3D(GLenum target,
2585 GLint level,
2586 GLenum internalformat,
2587 GLsizei width,
2588 GLsizei height,
2589 GLsizei depth,
2590 GLint border,
2591 GLsizei imageSize,
2592 const GLvoid *data)
2593{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002594 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002595
2596 Extents size(width, height, depth);
2597 Texture *texture = getTargetTexture(target);
2598 Error error =
2599 texture->setCompressedImage(mState.getUnpackState(), target, level, internalformat, size,
2600 imageSize, reinterpret_cast<const uint8_t *>(data));
2601 if (error.isError())
2602 {
2603 recordError(error);
2604 }
2605}
2606
2607void Context::compressedTexSubImage2D(GLenum target,
2608 GLint level,
2609 GLint xoffset,
2610 GLint yoffset,
2611 GLsizei width,
2612 GLsizei height,
2613 GLenum format,
2614 GLsizei imageSize,
2615 const GLvoid *data)
2616{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002617 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002618
2619 Box area(xoffset, yoffset, 0, width, height, 1);
2620 Texture *texture =
2621 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
2622 Error error =
2623 texture->setCompressedSubImage(mState.getUnpackState(), target, level, area, format,
2624 imageSize, reinterpret_cast<const uint8_t *>(data));
2625 if (error.isError())
2626 {
2627 recordError(error);
2628 }
2629}
2630
2631void Context::compressedTexSubImage3D(GLenum target,
2632 GLint level,
2633 GLint xoffset,
2634 GLint yoffset,
2635 GLint zoffset,
2636 GLsizei width,
2637 GLsizei height,
2638 GLsizei depth,
2639 GLenum format,
2640 GLsizei imageSize,
2641 const GLvoid *data)
2642{
2643 // Zero sized uploads are valid but no-ops
2644 if (width == 0 || height == 0)
2645 {
2646 return;
2647 }
2648
Jamie Madillad9f24e2016-02-12 09:27:24 -05002649 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002650
2651 Box area(xoffset, yoffset, zoffset, width, height, depth);
2652 Texture *texture = getTargetTexture(target);
2653 Error error =
2654 texture->setCompressedSubImage(mState.getUnpackState(), target, level, area, format,
2655 imageSize, reinterpret_cast<const uint8_t *>(data));
2656 if (error.isError())
2657 {
2658 recordError(error);
2659 }
2660}
2661
Jamie Madillad9f24e2016-02-12 09:27:24 -05002662void Context::syncStateForReadPixels()
2663{
2664 syncRendererState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
2665}
2666
2667void Context::syncStateForTexImage()
2668{
2669 syncRendererState(mTexImageDirtyBits, mTexImageDirtyObjects);
2670}
2671
2672void Context::syncStateForClear()
2673{
2674 syncRendererState(mClearDirtyBits, mClearDirtyObjects);
2675}
2676
2677void Context::syncStateForBlit()
2678{
2679 syncRendererState(mBlitDirtyBits, mBlitDirtyObjects);
2680}
2681
Jamie Madillc29968b2016-01-20 11:17:23 -05002682} // namespace gl