blob: 5aad808d31e064e5fe111872a80d3e51f91eb94b [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:
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00001462 case GL_TEXTURE_BINDING_3D:
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001463 case GL_TEXTURE_BINDING_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001464 case GL_MAX_3D_TEXTURE_SIZE:
shannon.woods%transgaming.com@gtempaccount.coma98a8112013-04-13 03:45:57 +00001465 case GL_MAX_ARRAY_TEXTURE_LAYERS:
shannonwoods@chromium.orgf2d76f82013-05-30 00:06:32 +00001466 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
1467 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
1468 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
Geoff Lange6d4e122015-06-29 13:33:55 -04001469 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1470 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
Geoff Langd3ff9002014-05-08 11:19:27 -04001471 case GL_MAX_VARYING_COMPONENTS:
Jamie Madill38850df2013-07-19 16:36:55 -04001472 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
1473 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Geoff Lange6d4e122015-06-29 13:33:55 -04001474 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1475 case GL_MAX_PROGRAM_TEXEL_OFFSET:
Geoff Lang23c81692013-08-12 10:46:58 -04001476 case GL_NUM_EXTENSIONS:
Jamie Madillee7010d2013-10-17 10:45:47 -04001477 case GL_MAJOR_VERSION:
1478 case GL_MINOR_VERSION:
Jamie Madill13a2f852013-12-11 16:35:08 -05001479 case GL_MAX_ELEMENTS_INDICES:
1480 case GL_MAX_ELEMENTS_VERTICES:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05001481 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
Jamie Madill2e503552013-12-19 13:48:34 -05001482 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05001483 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
Minmin Gongadff67b2015-10-14 10:34:45 -04001484 case GL_UNPACK_IMAGE_HEIGHT:
Jamie Madill023a2902015-10-23 16:43:24 +00001485 case GL_UNPACK_SKIP_IMAGES:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001486 {
1487 *type = GL_INT;
1488 *numParams = 1;
1489 }
1490 return true;
Jamie Madill0fda9862013-07-19 16:36:55 -04001491
1492 case GL_MAX_ELEMENT_INDEX:
1493 case GL_MAX_UNIFORM_BLOCK_SIZE:
1494 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
1495 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
1496 case GL_MAX_SERVER_WAIT_TIMEOUT:
1497 {
1498 *type = GL_INT_64_ANGLEX;
1499 *numParams = 1;
1500 }
1501 return true;
Jamie Madill2e503552013-12-19 13:48:34 -05001502
1503 case GL_TRANSFORM_FEEDBACK_ACTIVE:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05001504 case GL_TRANSFORM_FEEDBACK_PAUSED:
Jamie Madille2cd53d2015-10-27 11:15:46 -04001505 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
Geoff Langab831f02015-12-01 09:39:10 -05001506 case GL_RASTERIZER_DISCARD:
Jamie Madill2e503552013-12-19 13:48:34 -05001507 {
1508 *type = GL_BOOL;
1509 *numParams = 1;
1510 }
1511 return true;
Geoff Lange6d4e122015-06-29 13:33:55 -04001512
1513 case GL_MAX_TEXTURE_LOD_BIAS:
1514 {
1515 *type = GL_FLOAT;
1516 *numParams = 1;
1517 }
1518 return true;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001519 }
1520
1521 return false;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001522}
1523
Shannon Woods1b2fb852013-08-19 14:28:48 -04001524bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
1525{
1526 if (mClientVersion < 3)
1527 {
1528 return false;
1529 }
1530
1531 switch (target)
1532 {
1533 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
1534 case GL_UNIFORM_BUFFER_BINDING:
1535 {
1536 *type = GL_INT;
1537 *numParams = 1;
1538 }
1539 return true;
1540 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
1541 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
1542 case GL_UNIFORM_BUFFER_START:
1543 case GL_UNIFORM_BUFFER_SIZE:
1544 {
1545 *type = GL_INT_64_ANGLEX;
1546 *numParams = 1;
1547 }
1548 }
1549
1550 return false;
1551}
1552
Geoff Langf6db0982015-08-25 13:04:00 -04001553Error Context::drawArrays(GLenum mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001554{
Jamie Madill1b94d432015-08-07 13:23:23 -04001555 syncRendererState();
Geoff Langf6db0982015-08-25 13:04:00 -04001556 Error error = mRenderer->drawArrays(getData(), mode, first, count);
Geoff Lang520c4ae2015-05-05 13:12:36 -04001557 if (error.isError())
1558 {
1559 return error;
1560 }
1561
Geoff Langf6db0982015-08-25 13:04:00 -04001562 MarkTransformFeedbackBufferUsage(mState.getCurrentTransformFeedback());
Geoff Lang520c4ae2015-05-05 13:12:36 -04001563
1564 return Error(GL_NO_ERROR);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001565}
1566
Geoff Langf6db0982015-08-25 13:04:00 -04001567Error Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
1568{
1569 syncRendererState();
1570 Error error = mRenderer->drawArraysInstanced(getData(), mode, first, count, instanceCount);
1571 if (error.isError())
1572 {
1573 return error;
1574 }
1575
1576 MarkTransformFeedbackBufferUsage(mState.getCurrentTransformFeedback());
1577
1578 return Error(GL_NO_ERROR);
1579}
1580
1581Error Context::drawElements(GLenum mode,
1582 GLsizei count,
1583 GLenum type,
1584 const GLvoid *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -04001585 const IndexRange &indexRange)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001586{
Jamie Madill1b94d432015-08-07 13:23:23 -04001587 syncRendererState();
Geoff Langf6db0982015-08-25 13:04:00 -04001588 return mRenderer->drawElements(getData(), mode, count, type, indices, indexRange);
1589}
1590
1591Error Context::drawElementsInstanced(GLenum mode,
1592 GLsizei count,
1593 GLenum type,
1594 const GLvoid *indices,
1595 GLsizei instances,
Geoff Lang3edfe032015-09-04 16:38:24 -04001596 const IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -04001597{
1598 syncRendererState();
1599 return mRenderer->drawElementsInstanced(getData(), mode, count, type, indices, instances,
1600 indexRange);
1601}
1602
1603Error Context::drawRangeElements(GLenum mode,
1604 GLuint start,
1605 GLuint end,
1606 GLsizei count,
1607 GLenum type,
1608 const GLvoid *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -04001609 const IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -04001610{
1611 syncRendererState();
1612 return mRenderer->drawRangeElements(getData(), mode, start, end, count, type, indices,
1613 indexRange);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001614}
1615
Geoff Lang129753a2015-01-09 16:52:09 -05001616Error Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001617{
Geoff Lang129753a2015-01-09 16:52:09 -05001618 return mRenderer->flush();
1619}
1620
1621Error Context::finish()
1622{
1623 return mRenderer->finish();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001624}
1625
Austin Kinross6ee1e782015-05-29 17:05:37 -07001626void Context::insertEventMarker(GLsizei length, const char *marker)
1627{
1628 ASSERT(mRenderer);
1629 mRenderer->insertEventMarker(length, marker);
1630}
1631
1632void Context::pushGroupMarker(GLsizei length, const char *marker)
1633{
1634 ASSERT(mRenderer);
1635 mRenderer->pushGroupMarker(length, marker);
1636}
1637
1638void Context::popGroupMarker()
1639{
1640 ASSERT(mRenderer);
1641 mRenderer->popGroupMarker();
1642}
1643
Geoff Langda5777c2014-07-11 09:52:58 -04001644void Context::recordError(const Error &error)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001645{
Geoff Langda5777c2014-07-11 09:52:58 -04001646 if (error.isError())
1647 {
1648 mErrors.insert(error.getCode());
Geoff Lang70d0f492015-12-10 17:45:46 -05001649
1650 if (!error.getMessage().empty())
1651 {
1652 auto &debug = mState.getDebug();
1653 debug.insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, error.getID(),
1654 GL_DEBUG_SEVERITY_HIGH, error.getMessage());
1655 }
Geoff Langda5777c2014-07-11 09:52:58 -04001656 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001657}
1658
1659// Get one of the recorded errors and clear its flag, if any.
1660// [OpenGL ES 2.0.24] section 2.5 page 13.
1661GLenum Context::getError()
1662{
Geoff Langda5777c2014-07-11 09:52:58 -04001663 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001664 {
Geoff Langda5777c2014-07-11 09:52:58 -04001665 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001666 }
Geoff Langda5777c2014-07-11 09:52:58 -04001667 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001668 {
Geoff Langda5777c2014-07-11 09:52:58 -04001669 GLenum error = *mErrors.begin();
1670 mErrors.erase(mErrors.begin());
1671 return error;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001672 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001673}
1674
1675GLenum Context::getResetStatus()
1676{
Jamie Madill93e13fb2014-11-06 15:27:25 -05001677 //TODO(jmadill): needs MANGLE reworking
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00001678 if (mResetStatus == GL_NO_ERROR && !mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001679 {
daniel@transgaming.comf688c0d2012-10-31 17:52:57 +00001680 // mResetStatus will be set by the markContextLost callback
1681 // in the case a notification is sent
Jamie Madill4c76fea2014-11-24 11:38:52 -05001682 if (mRenderer->testDeviceLost())
Jamie Madill9dd0cf02014-11-24 11:38:51 -05001683 {
1684 mRenderer->notifyDeviceLost();
1685 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001686 }
1687
1688 GLenum status = mResetStatus;
1689
1690 if (mResetStatus != GL_NO_ERROR)
1691 {
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00001692 ASSERT(mContextLost);
1693
daniel@transgaming.com621ce052012-10-31 17:52:29 +00001694 if (mRenderer->testDeviceResettable())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001695 {
1696 mResetStatus = GL_NO_ERROR;
1697 }
1698 }
Jamie Madill893ab082014-05-16 16:56:10 -04001699
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001700 return status;
1701}
1702
1703bool Context::isResetNotificationEnabled()
1704{
1705 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
1706}
1707
Corentin Walleze3b10e82015-05-20 11:06:25 -04001708const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01001709{
Corentin Walleze3b10e82015-05-20 11:06:25 -04001710 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01001711}
1712
1713EGLenum Context::getClientType() const
1714{
1715 return mClientType;
1716}
1717
1718EGLenum Context::getRenderBuffer() const
1719{
Corentin Wallez37c39792015-08-20 14:19:46 -04001720 auto framebufferIt = mFramebufferMap.find(0);
1721 if (framebufferIt != mFramebufferMap.end())
1722 {
1723 const Framebuffer *framebuffer = framebufferIt->second;
1724 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(GL_BACK);
1725
1726 ASSERT(backAttachment != nullptr);
1727 return backAttachment->getSurface()->getRenderBuffer();
1728 }
1729 else
1730 {
1731 return EGL_NONE;
1732 }
Régis Fénéon83107972015-02-05 12:57:44 +01001733}
1734
Geoff Lang36167ab2015-12-07 10:27:14 -05001735void Context::checkVertexArrayAllocation(GLuint vertexArray)
1736{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001737 // Only called after a prior call to Gen.
Geoff Lang36167ab2015-12-07 10:27:14 -05001738 if (!getVertexArray(vertexArray))
1739 {
1740 VertexArray *vertexArrayObject =
1741 new VertexArray(mRenderer, vertexArray, MAX_VERTEX_ATTRIBS);
1742 mVertexArrayMap[vertexArray] = vertexArrayObject;
1743 }
1744}
1745
1746void Context::checkTransformFeedbackAllocation(GLuint transformFeedback)
1747{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001748 // Only called after a prior call to Gen.
Geoff Lang36167ab2015-12-07 10:27:14 -05001749 if (!getTransformFeedback(transformFeedback))
1750 {
1751 TransformFeedback *transformFeedbackObject =
1752 new TransformFeedback(mRenderer->createTransformFeedback(), transformFeedback, mCaps);
1753 transformFeedbackObject->addRef();
1754 mTransformFeedbackMap[transformFeedback] = transformFeedbackObject;
1755 }
1756}
1757
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001758Framebuffer *Context::checkFramebufferAllocation(GLuint framebuffer)
1759{
1760 // Can be called from Bind without a prior call to Gen.
1761 auto framebufferIt = mFramebufferMap.find(framebuffer);
1762 bool neverCreated = framebufferIt == mFramebufferMap.end();
1763 if (neverCreated || framebufferIt->second == nullptr)
1764 {
1765 Framebuffer *newFBO = new Framebuffer(mCaps, mRenderer, framebuffer);
1766 if (neverCreated)
1767 {
1768 mFramebufferHandleAllocator.reserve(framebuffer);
1769 mFramebufferMap[framebuffer] = newFBO;
1770 return newFBO;
1771 }
1772
1773 framebufferIt->second = newFBO;
1774 }
1775
1776 return framebufferIt->second;
1777}
1778
Geoff Lang36167ab2015-12-07 10:27:14 -05001779bool Context::isVertexArrayGenerated(GLuint vertexArray)
1780{
1781 return mVertexArrayMap.find(vertexArray) != mVertexArrayMap.end();
1782}
1783
1784bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
1785{
1786 return mTransformFeedbackMap.find(transformFeedback) != mTransformFeedbackMap.end();
1787}
1788
Shannon Woods53a94a82014-06-24 15:20:36 -04001789void Context::detachTexture(GLuint texture)
1790{
1791 // Simple pass-through to State's detachTexture method, as textures do not require
1792 // allocation map management either here or in the resource manager at detach time.
1793 // Zero textures are held by the Context, and we don't attempt to request them from
1794 // the State.
Jamie Madille6382c32014-11-07 15:05:26 -05001795 mState.detachTexture(mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04001796}
1797
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001798void Context::detachBuffer(GLuint buffer)
1799{
Yuly Novikov5807a532015-12-03 13:01:22 -05001800 // Simple pass-through to State's detachBuffer method, since
1801 // only buffer attachments to container objects that are bound to the current context
1802 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04001803
Yuly Novikov5807a532015-12-03 13:01:22 -05001804 // [OpenGL ES 3.2] section 5.1.2 page 45:
1805 // Attachments to unbound container objects, such as
1806 // deletion of a buffer attached to a vertex array object which is not bound to the context,
1807 // are not affected and continue to act as references on the deleted object
1808 mState.detachBuffer(buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001809}
1810
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001811void Context::detachFramebuffer(GLuint framebuffer)
1812{
Shannon Woods53a94a82014-06-24 15:20:36 -04001813 // Framebuffer detachment is handled by Context, because 0 is a valid
1814 // Framebuffer object, and a pointer to it must be passed from Context
1815 // to State at binding time.
1816
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001817 // [OpenGL ES 2.0.24] section 4.4 page 107:
1818 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as though
1819 // BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of zero.
1820
Gregoire Payen de La Garanderieed54e5d2015-03-17 16:51:24 +00001821 if (mState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001822 {
1823 bindReadFramebuffer(0);
1824 }
1825
Gregoire Payen de La Garanderieed54e5d2015-03-17 16:51:24 +00001826 if (mState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001827 {
1828 bindDrawFramebuffer(0);
1829 }
1830}
1831
1832void Context::detachRenderbuffer(GLuint renderbuffer)
1833{
Shannon Woods53a94a82014-06-24 15:20:36 -04001834 mState.detachRenderbuffer(renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001835}
1836
Jamie Madill57a89722013-07-02 11:57:03 -04001837void Context::detachVertexArray(GLuint vertexArray)
1838{
Jamie Madill77a72f62015-04-14 11:18:32 -04001839 // Vertex array detachment is handled by Context, because 0 is a valid
1840 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04001841 // binding time.
1842
Jamie Madill57a89722013-07-02 11:57:03 -04001843 // [OpenGL ES 3.0.2] section 2.10 page 43:
1844 // If a vertex array object that is currently bound is deleted, the binding
1845 // for that object reverts to zero and the default vertex array becomes current.
Shannon Woods53a94a82014-06-24 15:20:36 -04001846 if (mState.removeVertexArrayBinding(vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04001847 {
1848 bindVertexArray(0);
1849 }
1850}
1851
Geoff Langc8058452014-02-03 12:04:11 -05001852void Context::detachTransformFeedback(GLuint transformFeedback)
1853{
Shannon Woods53a94a82014-06-24 15:20:36 -04001854 mState.detachTransformFeedback(transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -05001855}
1856
Jamie Madilldc356042013-07-19 16:36:57 -04001857void Context::detachSampler(GLuint sampler)
1858{
Shannon Woods53a94a82014-06-24 15:20:36 -04001859 mState.detachSampler(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001860}
1861
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001862void Context::setVertexAttribDivisor(GLuint index, GLuint divisor)
1863{
Jamie Madill0b9e9032015-08-17 11:51:52 +00001864 mState.setVertexAttribDivisor(index, divisor);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001865}
1866
Jamie Madille29d1672013-07-19 16:36:57 -04001867void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
1868{
1869 mResourceManager->checkSamplerAllocation(sampler);
1870
1871 Sampler *samplerObject = getSampler(sampler);
1872 ASSERT(samplerObject);
1873
Geoff Lang69cce582015-09-17 13:20:36 -04001874 // clang-format off
Jamie Madille29d1672013-07-19 16:36:57 -04001875 switch (pname)
1876 {
Geoff Lang69cce582015-09-17 13:20:36 -04001877 case GL_TEXTURE_MIN_FILTER: samplerObject->setMinFilter(static_cast<GLenum>(param)); break;
1878 case GL_TEXTURE_MAG_FILTER: samplerObject->setMagFilter(static_cast<GLenum>(param)); break;
1879 case GL_TEXTURE_WRAP_S: samplerObject->setWrapS(static_cast<GLenum>(param)); break;
1880 case GL_TEXTURE_WRAP_T: samplerObject->setWrapT(static_cast<GLenum>(param)); break;
1881 case GL_TEXTURE_WRAP_R: samplerObject->setWrapR(static_cast<GLenum>(param)); break;
1882 case GL_TEXTURE_MAX_ANISOTROPY_EXT: samplerObject->setMaxAnisotropy(std::min(static_cast<GLfloat>(param), getExtensions().maxTextureAnisotropy)); break;
1883 case GL_TEXTURE_MIN_LOD: samplerObject->setMinLod(static_cast<GLfloat>(param)); break;
1884 case GL_TEXTURE_MAX_LOD: samplerObject->setMaxLod(static_cast<GLfloat>(param)); break;
1885 case GL_TEXTURE_COMPARE_MODE: samplerObject->setCompareMode(static_cast<GLenum>(param)); break;
1886 case GL_TEXTURE_COMPARE_FUNC: samplerObject->setCompareFunc(static_cast<GLenum>(param)); break;
1887 default: UNREACHABLE(); break;
Jamie Madille29d1672013-07-19 16:36:57 -04001888 }
Geoff Lang69cce582015-09-17 13:20:36 -04001889 // clang-format on
Jamie Madille29d1672013-07-19 16:36:57 -04001890}
1891
1892void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
1893{
1894 mResourceManager->checkSamplerAllocation(sampler);
1895
1896 Sampler *samplerObject = getSampler(sampler);
1897 ASSERT(samplerObject);
1898
Geoff Lang69cce582015-09-17 13:20:36 -04001899 // clang-format off
Jamie Madille29d1672013-07-19 16:36:57 -04001900 switch (pname)
1901 {
Geoff Lang69cce582015-09-17 13:20:36 -04001902 case GL_TEXTURE_MIN_FILTER: samplerObject->setMinFilter(uiround<GLenum>(param)); break;
1903 case GL_TEXTURE_MAG_FILTER: samplerObject->setMagFilter(uiround<GLenum>(param)); break;
1904 case GL_TEXTURE_WRAP_S: samplerObject->setWrapS(uiround<GLenum>(param)); break;
1905 case GL_TEXTURE_WRAP_T: samplerObject->setWrapT(uiround<GLenum>(param)); break;
1906 case GL_TEXTURE_WRAP_R: samplerObject->setWrapR(uiround<GLenum>(param)); break;
1907 case GL_TEXTURE_MAX_ANISOTROPY_EXT: samplerObject->setMaxAnisotropy(std::min(param, getExtensions().maxTextureAnisotropy)); break;
1908 case GL_TEXTURE_MIN_LOD: samplerObject->setMinLod(param); break;
1909 case GL_TEXTURE_MAX_LOD: samplerObject->setMaxLod(param); break;
1910 case GL_TEXTURE_COMPARE_MODE: samplerObject->setCompareMode(uiround<GLenum>(param)); break;
1911 case GL_TEXTURE_COMPARE_FUNC: samplerObject->setCompareFunc(uiround<GLenum>(param)); break;
1912 default: UNREACHABLE(); break;
Jamie Madille29d1672013-07-19 16:36:57 -04001913 }
Geoff Lang69cce582015-09-17 13:20:36 -04001914 // clang-format on
Jamie Madille29d1672013-07-19 16:36:57 -04001915}
1916
Jamie Madill9675b802013-07-19 16:36:59 -04001917GLint Context::getSamplerParameteri(GLuint sampler, GLenum pname)
1918{
1919 mResourceManager->checkSamplerAllocation(sampler);
1920
1921 Sampler *samplerObject = getSampler(sampler);
1922 ASSERT(samplerObject);
1923
Geoff Lang69cce582015-09-17 13:20:36 -04001924 // clang-format off
Jamie Madill9675b802013-07-19 16:36:59 -04001925 switch (pname)
1926 {
Geoff Lang69cce582015-09-17 13:20:36 -04001927 case GL_TEXTURE_MIN_FILTER: return static_cast<GLint>(samplerObject->getMinFilter());
1928 case GL_TEXTURE_MAG_FILTER: return static_cast<GLint>(samplerObject->getMagFilter());
1929 case GL_TEXTURE_WRAP_S: return static_cast<GLint>(samplerObject->getWrapS());
1930 case GL_TEXTURE_WRAP_T: return static_cast<GLint>(samplerObject->getWrapT());
1931 case GL_TEXTURE_WRAP_R: return static_cast<GLint>(samplerObject->getWrapR());
1932 case GL_TEXTURE_MAX_ANISOTROPY_EXT: return static_cast<GLint>(samplerObject->getMaxAnisotropy());
1933 case GL_TEXTURE_MIN_LOD: return uiround<GLint>(samplerObject->getMinLod());
1934 case GL_TEXTURE_MAX_LOD: return uiround<GLint>(samplerObject->getMaxLod());
1935 case GL_TEXTURE_COMPARE_MODE: return static_cast<GLint>(samplerObject->getCompareMode());
1936 case GL_TEXTURE_COMPARE_FUNC: return static_cast<GLint>(samplerObject->getCompareFunc());
1937 default: UNREACHABLE(); return 0;
Jamie Madill9675b802013-07-19 16:36:59 -04001938 }
Geoff Lang69cce582015-09-17 13:20:36 -04001939 // clang-format on
Jamie Madill9675b802013-07-19 16:36:59 -04001940}
1941
1942GLfloat Context::getSamplerParameterf(GLuint sampler, GLenum pname)
1943{
1944 mResourceManager->checkSamplerAllocation(sampler);
1945
1946 Sampler *samplerObject = getSampler(sampler);
1947 ASSERT(samplerObject);
1948
Geoff Lang69cce582015-09-17 13:20:36 -04001949 // clang-format off
Jamie Madill9675b802013-07-19 16:36:59 -04001950 switch (pname)
1951 {
Geoff Lang69cce582015-09-17 13:20:36 -04001952 case GL_TEXTURE_MIN_FILTER: return static_cast<GLfloat>(samplerObject->getMinFilter());
1953 case GL_TEXTURE_MAG_FILTER: return static_cast<GLfloat>(samplerObject->getMagFilter());
1954 case GL_TEXTURE_WRAP_S: return static_cast<GLfloat>(samplerObject->getWrapS());
1955 case GL_TEXTURE_WRAP_T: return static_cast<GLfloat>(samplerObject->getWrapT());
1956 case GL_TEXTURE_WRAP_R: return static_cast<GLfloat>(samplerObject->getWrapR());
1957 case GL_TEXTURE_MAX_ANISOTROPY_EXT: return samplerObject->getMaxAnisotropy();
1958 case GL_TEXTURE_MIN_LOD: return samplerObject->getMinLod();
1959 case GL_TEXTURE_MAX_LOD: return samplerObject->getMaxLod();
1960 case GL_TEXTURE_COMPARE_MODE: return static_cast<GLfloat>(samplerObject->getCompareMode());
1961 case GL_TEXTURE_COMPARE_FUNC: return static_cast<GLfloat>(samplerObject->getCompareFunc());
1962 default: UNREACHABLE(); return 0;
Jamie Madill9675b802013-07-19 16:36:59 -04001963 }
Geoff Lang69cce582015-09-17 13:20:36 -04001964 // clang-format on
Jamie Madill9675b802013-07-19 16:36:59 -04001965}
1966
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001967void Context::initRendererString()
1968{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00001969 std::ostringstream rendererString;
1970 rendererString << "ANGLE (";
1971 rendererString << mRenderer->getRendererDescription();
1972 rendererString << ")";
1973
Geoff Langcec35902014-04-16 10:52:36 -04001974 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001975}
1976
Geoff Langc0b9ef42014-07-02 10:02:37 -04001977const std::string &Context::getRendererString() const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001978{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00001979 return mRendererString;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001980}
1981
Geoff Langcec35902014-04-16 10:52:36 -04001982void Context::initExtensionStrings()
1983{
Geoff Lang493daf52014-07-03 13:38:44 -04001984 mExtensionStrings = mExtensions.getStrings();
Geoff Langcec35902014-04-16 10:52:36 -04001985
Geoff Langc0b9ef42014-07-02 10:02:37 -04001986 std::ostringstream combinedStringStream;
1987 std::copy(mExtensionStrings.begin(), mExtensionStrings.end(), std::ostream_iterator<std::string>(combinedStringStream, " "));
1988 mExtensionString = combinedStringStream.str();
Geoff Langcec35902014-04-16 10:52:36 -04001989}
1990
Geoff Langc0b9ef42014-07-02 10:02:37 -04001991const std::string &Context::getExtensionString() const
Geoff Langcec35902014-04-16 10:52:36 -04001992{
1993 return mExtensionString;
1994}
1995
Geoff Langc0b9ef42014-07-02 10:02:37 -04001996const std::string &Context::getExtensionString(size_t idx) const
Geoff Langcec35902014-04-16 10:52:36 -04001997{
1998 return mExtensionStrings[idx];
1999}
2000
2001size_t Context::getExtensionStringCount() const
2002{
2003 return mExtensionStrings.size();
2004}
2005
Geoff Lang493daf52014-07-03 13:38:44 -04002006void Context::initCaps(GLuint clientVersion)
2007{
2008 mCaps = mRenderer->getRendererCaps();
2009
2010 mExtensions = mRenderer->getRendererExtensions();
2011
Austin Kinross02df7962015-07-01 10:03:42 -07002012 mLimitations = mRenderer->getRendererLimitations();
2013
Geoff Lang493daf52014-07-03 13:38:44 -04002014 if (clientVersion < 3)
2015 {
2016 // Disable ES3+ extensions
2017 mExtensions.colorBufferFloat = false;
2018 }
2019
2020 if (clientVersion > 2)
2021 {
2022 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
2023 //mExtensions.sRGB = false;
2024 }
2025
Geoff Lang70d0f492015-12-10 17:45:46 -05002026 // Explicitly enable GL_KHR_debug
2027 mExtensions.debug = true;
2028 mExtensions.maxDebugMessageLength = 1024;
2029 mExtensions.maxDebugLoggedMessages = 1024;
2030 mExtensions.maxDebugGroupStackDepth = 1024;
2031 mExtensions.maxLabelLength = 1024;
2032
Geoff Lang301d1612014-07-09 10:34:37 -04002033 // Apply implementation limits
2034 mCaps.maxVertexAttributes = std::min<GLuint>(mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Geoff Lang301d1612014-07-09 10:34:37 -04002035 mCaps.maxVertexUniformBlocks = std::min<GLuint>(mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
2036 mCaps.maxVertexOutputComponents = std::min<GLuint>(mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
2037
2038 mCaps.maxFragmentInputComponents = std::min<GLuint>(mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
Geoff Lang3a61c322014-07-10 13:01:54 -04002039
Geoff Lang900013c2014-07-07 11:32:19 -04002040 mCaps.compressedTextureFormats.clear();
2041
Geoff Lang493daf52014-07-03 13:38:44 -04002042 const TextureCapsMap &rendererFormats = mRenderer->getRendererTextureCaps();
2043 for (TextureCapsMap::const_iterator i = rendererFormats.begin(); i != rendererFormats.end(); i++)
2044 {
2045 GLenum format = i->first;
2046 TextureCaps formatCaps = i->second;
2047
Geoff Lang5d601382014-07-22 15:14:06 -04002048 const InternalFormat &formatInfo = GetInternalFormatInfo(format);
Geoff Langd87878e2014-09-19 15:42:59 -04002049
Geoff Lang0d8b7242015-09-09 14:56:53 -04002050 // Update the format caps based on the client version and extensions.
2051 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
2052 // ES3.
2053 formatCaps.texturable =
2054 formatCaps.texturable && formatInfo.textureSupport(clientVersion, mExtensions);
2055 formatCaps.renderable =
2056 formatCaps.renderable && formatInfo.renderSupport(clientVersion, mExtensions);
2057 formatCaps.filterable =
2058 formatCaps.filterable && formatInfo.filterSupport(clientVersion, mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04002059
2060 // OpenGL ES does not support multisampling with integer formats
2061 if (!formatInfo.renderSupport || formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)
Geoff Lang493daf52014-07-03 13:38:44 -04002062 {
Geoff Langd87878e2014-09-19 15:42:59 -04002063 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04002064 }
Geoff Langd87878e2014-09-19 15:42:59 -04002065
2066 if (formatCaps.texturable && formatInfo.compressed)
2067 {
2068 mCaps.compressedTextureFormats.push_back(format);
2069 }
2070
2071 mTextureCaps.insert(format, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04002072 }
2073}
2074
Jamie Madill1b94d432015-08-07 13:23:23 -04002075void Context::syncRendererState()
2076{
2077 const State::DirtyBits &dirtyBits = mState.getDirtyBits();
Jamie Madillc9d442d2016-01-20 11:17:24 -05002078 mRenderer->syncState(mState, dirtyBits);
2079 mState.clearDirtyBits();
2080 mState.syncDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -04002081}
2082
Jamie Madillad9f24e2016-02-12 09:27:24 -05002083void Context::syncRendererState(const State::DirtyBits &bitMask,
2084 const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04002085{
2086 const State::DirtyBits &dirtyBits = (mState.getDirtyBits() & bitMask);
Jamie Madillc9d442d2016-01-20 11:17:24 -05002087 mRenderer->syncState(mState, dirtyBits);
2088 mState.clearDirtyBits(dirtyBits);
2089
Jamie Madillad9f24e2016-02-12 09:27:24 -05002090 mState.syncDirtyObjects(objectMask);
Jamie Madill1b94d432015-08-07 13:23:23 -04002091}
Jamie Madillc29968b2016-01-20 11:17:23 -05002092
2093void Context::blitFramebuffer(GLint srcX0,
2094 GLint srcY0,
2095 GLint srcX1,
2096 GLint srcY1,
2097 GLint dstX0,
2098 GLint dstY0,
2099 GLint dstX1,
2100 GLint dstY1,
2101 GLbitfield mask,
2102 GLenum filter)
2103{
2104 Framebuffer *readFramebuffer = mState.getReadFramebuffer();
2105 ASSERT(readFramebuffer);
2106
2107 Framebuffer *drawFramebuffer = mState.getDrawFramebuffer();
2108 ASSERT(drawFramebuffer);
2109
2110 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
2111 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
2112
Jamie Madillad9f24e2016-02-12 09:27:24 -05002113 syncStateForBlit();
Jamie Madillc29968b2016-01-20 11:17:23 -05002114
2115 Error error = drawFramebuffer->blit(mState, srcArea, dstArea, mask, filter, readFramebuffer);
2116 if (error.isError())
2117 {
2118 recordError(error);
2119 return;
2120 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002121}
Jamie Madillc29968b2016-01-20 11:17:23 -05002122
2123void Context::clear(GLbitfield mask)
2124{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002125 syncStateForClear();
Jamie Madillc29968b2016-01-20 11:17:23 -05002126
2127 Error error = mState.getDrawFramebuffer()->clear(mData, mask);
2128 if (error.isError())
2129 {
2130 recordError(error);
2131 }
2132}
2133
2134void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
2135{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002136 syncStateForClear();
Jamie Madillc29968b2016-01-20 11:17:23 -05002137
2138 Error error = mState.getDrawFramebuffer()->clearBufferfv(mData, buffer, drawbuffer, values);
2139 if (error.isError())
2140 {
2141 recordError(error);
2142 }
2143}
2144
2145void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
2146{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002147 syncStateForClear();
Jamie Madillc29968b2016-01-20 11:17:23 -05002148
2149 Error error = mState.getDrawFramebuffer()->clearBufferuiv(mData, buffer, drawbuffer, values);
2150 if (error.isError())
2151 {
2152 recordError(error);
2153 }
2154}
2155
2156void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
2157{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002158 syncStateForClear();
Jamie Madillc29968b2016-01-20 11:17:23 -05002159
2160 Error error = mState.getDrawFramebuffer()->clearBufferiv(mData, buffer, drawbuffer, values);
2161 if (error.isError())
2162 {
2163 recordError(error);
2164 }
2165}
2166
2167void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
2168{
2169 Framebuffer *framebufferObject = mState.getDrawFramebuffer();
2170 ASSERT(framebufferObject);
2171
2172 // If a buffer is not present, the clear has no effect
2173 if (framebufferObject->getDepthbuffer() == nullptr &&
2174 framebufferObject->getStencilbuffer() == nullptr)
2175 {
2176 return;
2177 }
2178
Jamie Madillad9f24e2016-02-12 09:27:24 -05002179 syncStateForClear();
Jamie Madillc29968b2016-01-20 11:17:23 -05002180
2181 Error error = framebufferObject->clearBufferfi(mData, buffer, drawbuffer, depth, stencil);
2182 if (error.isError())
2183 {
2184 recordError(error);
2185 }
2186}
2187
2188void Context::readPixels(GLint x,
2189 GLint y,
2190 GLsizei width,
2191 GLsizei height,
2192 GLenum format,
2193 GLenum type,
2194 GLvoid *pixels)
2195{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002196 syncStateForReadPixels();
Jamie Madillc29968b2016-01-20 11:17:23 -05002197
2198 Framebuffer *framebufferObject = mState.getReadFramebuffer();
2199 ASSERT(framebufferObject);
2200
2201 Rectangle area(x, y, width, height);
2202 Error error = framebufferObject->readPixels(mState, area, format, type, pixels);
2203 if (error.isError())
2204 {
2205 recordError(error);
2206 }
2207}
2208
2209void Context::copyTexImage2D(GLenum target,
2210 GLint level,
2211 GLenum internalformat,
2212 GLint x,
2213 GLint y,
2214 GLsizei width,
2215 GLsizei height,
2216 GLint border)
2217{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002218 // Only sync the read FBO
2219 mState.syncDirtyObject(GL_READ_FRAMEBUFFER);
2220
Jamie Madillc29968b2016-01-20 11:17:23 -05002221 Rectangle sourceArea(x, y, width, height);
2222
2223 const Framebuffer *framebuffer = mState.getReadFramebuffer();
2224 Texture *texture =
2225 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
2226 Error error = texture->copyImage(target, level, sourceArea, internalformat, framebuffer);
2227 if (error.isError())
2228 {
2229 recordError(error);
2230 }
2231}
2232
2233void Context::copyTexSubImage2D(GLenum target,
2234 GLint level,
2235 GLint xoffset,
2236 GLint yoffset,
2237 GLint x,
2238 GLint y,
2239 GLsizei width,
2240 GLsizei height)
2241{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002242 // Only sync the read FBO
2243 mState.syncDirtyObject(GL_READ_FRAMEBUFFER);
2244
Jamie Madillc29968b2016-01-20 11:17:23 -05002245 Offset destOffset(xoffset, yoffset, 0);
2246 Rectangle sourceArea(x, y, width, height);
2247
2248 const Framebuffer *framebuffer = mState.getReadFramebuffer();
2249 Texture *texture =
2250 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
2251 Error error = texture->copySubImage(target, level, destOffset, sourceArea, framebuffer);
2252 if (error.isError())
2253 {
2254 recordError(error);
2255 }
2256}
2257
2258void Context::copyTexSubImage3D(GLenum target,
2259 GLint level,
2260 GLint xoffset,
2261 GLint yoffset,
2262 GLint zoffset,
2263 GLint x,
2264 GLint y,
2265 GLsizei width,
2266 GLsizei height)
2267{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002268 // Only sync the read FBO
2269 mState.syncDirtyObject(GL_READ_FRAMEBUFFER);
2270
Jamie Madillc29968b2016-01-20 11:17:23 -05002271 Offset destOffset(xoffset, yoffset, zoffset);
2272 Rectangle sourceArea(x, y, width, height);
2273
2274 const Framebuffer *framebuffer = mState.getReadFramebuffer();
2275 Texture *texture = getTargetTexture(target);
2276 Error error = texture->copySubImage(target, level, destOffset, sourceArea, framebuffer);
2277 if (error.isError())
2278 {
2279 recordError(error);
2280 }
2281}
2282
2283void Context::framebufferTexture2D(GLenum target,
2284 GLenum attachment,
2285 GLenum textarget,
2286 GLuint texture,
2287 GLint level)
2288{
2289 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
2290 ASSERT(framebuffer);
2291
2292 if (texture != 0)
2293 {
2294 Texture *textureObj = getTexture(texture);
2295
2296 ImageIndex index = ImageIndex::MakeInvalid();
2297
2298 if (textarget == GL_TEXTURE_2D)
2299 {
2300 index = ImageIndex::Make2D(level);
2301 }
2302 else
2303 {
2304 ASSERT(IsCubeMapTextureTarget(textarget));
2305 index = ImageIndex::MakeCube(textarget, level);
2306 }
2307
2308 framebuffer->setAttachment(GL_TEXTURE, attachment, index, textureObj);
2309 }
2310 else
2311 {
2312 framebuffer->resetAttachment(attachment);
2313 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002314
2315 mState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002316}
2317
2318void Context::framebufferRenderbuffer(GLenum target,
2319 GLenum attachment,
2320 GLenum renderbuffertarget,
2321 GLuint renderbuffer)
2322{
2323 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
2324 ASSERT(framebuffer);
2325
2326 if (renderbuffer != 0)
2327 {
2328 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
2329 framebuffer->setAttachment(GL_RENDERBUFFER, attachment, gl::ImageIndex::MakeInvalid(),
2330 renderbufferObject);
2331 }
2332 else
2333 {
2334 framebuffer->resetAttachment(attachment);
2335 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002336
2337 mState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002338}
2339
2340void Context::framebufferTextureLayer(GLenum target,
2341 GLenum attachment,
2342 GLuint texture,
2343 GLint level,
2344 GLint layer)
2345{
2346 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
2347 ASSERT(framebuffer);
2348
2349 if (texture != 0)
2350 {
2351 Texture *textureObject = getTexture(texture);
2352
2353 ImageIndex index = ImageIndex::MakeInvalid();
2354
2355 if (textureObject->getTarget() == GL_TEXTURE_3D)
2356 {
2357 index = ImageIndex::Make3D(level, layer);
2358 }
2359 else
2360 {
2361 ASSERT(textureObject->getTarget() == GL_TEXTURE_2D_ARRAY);
2362 index = ImageIndex::Make2DArray(level, layer);
2363 }
2364
2365 framebuffer->setAttachment(GL_TEXTURE, attachment, index, textureObject);
2366 }
2367 else
2368 {
2369 framebuffer->resetAttachment(attachment);
2370 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002371
2372 mState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002373}
2374
2375void Context::drawBuffers(GLsizei n, const GLenum *bufs)
2376{
2377 Framebuffer *framebuffer = mState.getDrawFramebuffer();
2378 ASSERT(framebuffer);
2379 framebuffer->setDrawBuffers(n, bufs);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002380 mState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05002381}
2382
2383void Context::readBuffer(GLenum mode)
2384{
2385 Framebuffer *readFBO = mState.getReadFramebuffer();
2386 readFBO->setReadBuffer(mode);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002387 mState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05002388}
2389
2390void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
2391{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002392 // Only sync the FBO
2393 mState.syncDirtyObject(target);
2394
Jamie Madillc29968b2016-01-20 11:17:23 -05002395 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
2396 ASSERT(framebuffer);
2397
2398 // The specification isn't clear what should be done when the framebuffer isn't complete.
2399 // We leave it up to the framebuffer implementation to decide what to do.
2400 Error error = framebuffer->discard(numAttachments, attachments);
2401 if (error.isError())
2402 {
2403 recordError(error);
2404 }
2405}
2406
2407void Context::invalidateFramebuffer(GLenum target,
2408 GLsizei numAttachments,
2409 const GLenum *attachments)
2410{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002411 // Only sync the FBO
2412 mState.syncDirtyObject(target);
2413
Jamie Madillc29968b2016-01-20 11:17:23 -05002414 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
2415 ASSERT(framebuffer);
2416
2417 if (framebuffer->checkStatus(mData) == GL_FRAMEBUFFER_COMPLETE)
2418 {
2419 Error error = framebuffer->invalidate(numAttachments, attachments);
2420 if (error.isError())
2421 {
2422 recordError(error);
2423 return;
2424 }
2425 }
2426}
2427
2428void Context::invalidateSubFramebuffer(GLenum target,
2429 GLsizei numAttachments,
2430 const GLenum *attachments,
2431 GLint x,
2432 GLint y,
2433 GLsizei width,
2434 GLsizei height)
2435{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002436 // Only sync the FBO
2437 mState.syncDirtyObject(target);
2438
Jamie Madillc29968b2016-01-20 11:17:23 -05002439 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
2440 ASSERT(framebuffer);
2441
2442 if (framebuffer->checkStatus(mData) == GL_FRAMEBUFFER_COMPLETE)
2443 {
2444 Rectangle area(x, y, width, height);
2445 Error error = framebuffer->invalidateSub(numAttachments, attachments, area);
2446 if (error.isError())
2447 {
2448 recordError(error);
2449 return;
2450 }
2451 }
2452}
2453
Jamie Madill73a84962016-02-12 09:27:23 -05002454void Context::texImage2D(GLenum target,
2455 GLint level,
2456 GLint internalformat,
2457 GLsizei width,
2458 GLsizei height,
2459 GLint border,
2460 GLenum format,
2461 GLenum type,
2462 const GLvoid *pixels)
2463{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002464 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002465
2466 Extents size(width, height, 1);
2467 Texture *texture =
2468 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
2469 Error error = texture->setImage(mState.getUnpackState(), target, level, internalformat, size,
2470 format, type, reinterpret_cast<const uint8_t *>(pixels));
2471 if (error.isError())
2472 {
2473 recordError(error);
2474 }
2475}
2476
2477void Context::texImage3D(GLenum target,
2478 GLint level,
2479 GLint internalformat,
2480 GLsizei width,
2481 GLsizei height,
2482 GLsizei depth,
2483 GLint border,
2484 GLenum format,
2485 GLenum type,
2486 const GLvoid *pixels)
2487{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002488 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002489
2490 Extents size(width, height, depth);
2491 Texture *texture = getTargetTexture(target);
2492 Error error = texture->setImage(mState.getUnpackState(), target, level, internalformat, size,
2493 format, type, reinterpret_cast<const uint8_t *>(pixels));
2494 if (error.isError())
2495 {
2496 recordError(error);
2497 }
2498}
2499
2500void Context::texSubImage2D(GLenum target,
2501 GLint level,
2502 GLint xoffset,
2503 GLint yoffset,
2504 GLsizei width,
2505 GLsizei height,
2506 GLenum format,
2507 GLenum type,
2508 const GLvoid *pixels)
2509{
2510 // Zero sized uploads are valid but no-ops
2511 if (width == 0 || height == 0)
2512 {
2513 return;
2514 }
2515
Jamie Madillad9f24e2016-02-12 09:27:24 -05002516 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002517
2518 Box area(xoffset, yoffset, 0, width, height, 1);
2519 Texture *texture =
2520 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
2521 Error error = texture->setSubImage(mState.getUnpackState(), target, level, area, format, type,
2522 reinterpret_cast<const uint8_t *>(pixels));
2523 if (error.isError())
2524 {
2525 recordError(error);
2526 }
2527}
2528
2529void Context::texSubImage3D(GLenum target,
2530 GLint level,
2531 GLint xoffset,
2532 GLint yoffset,
2533 GLint zoffset,
2534 GLsizei width,
2535 GLsizei height,
2536 GLsizei depth,
2537 GLenum format,
2538 GLenum type,
2539 const GLvoid *pixels)
2540{
2541 // Zero sized uploads are valid but no-ops
2542 if (width == 0 || height == 0 || depth == 0)
2543 {
2544 return;
2545 }
2546
Jamie Madillad9f24e2016-02-12 09:27:24 -05002547 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002548
2549 Box area(xoffset, yoffset, zoffset, width, height, depth);
2550 Texture *texture = getTargetTexture(target);
2551 Error error = texture->setSubImage(mState.getUnpackState(), target, level, area, format, type,
2552 reinterpret_cast<const uint8_t *>(pixels));
2553 if (error.isError())
2554 {
2555 recordError(error);
2556 }
2557}
2558
2559void Context::compressedTexImage2D(GLenum target,
2560 GLint level,
2561 GLenum internalformat,
2562 GLsizei width,
2563 GLsizei height,
2564 GLint border,
2565 GLsizei imageSize,
2566 const GLvoid *data)
2567{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002568 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002569
2570 Extents size(width, height, 1);
2571 Texture *texture =
2572 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
2573 Error error =
2574 texture->setCompressedImage(mState.getUnpackState(), target, level, internalformat, size,
2575 imageSize, reinterpret_cast<const uint8_t *>(data));
2576 if (error.isError())
2577 {
2578 recordError(error);
2579 }
2580}
2581
2582void Context::compressedTexImage3D(GLenum target,
2583 GLint level,
2584 GLenum internalformat,
2585 GLsizei width,
2586 GLsizei height,
2587 GLsizei depth,
2588 GLint border,
2589 GLsizei imageSize,
2590 const GLvoid *data)
2591{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002592 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002593
2594 Extents size(width, height, depth);
2595 Texture *texture = getTargetTexture(target);
2596 Error error =
2597 texture->setCompressedImage(mState.getUnpackState(), target, level, internalformat, size,
2598 imageSize, reinterpret_cast<const uint8_t *>(data));
2599 if (error.isError())
2600 {
2601 recordError(error);
2602 }
2603}
2604
2605void Context::compressedTexSubImage2D(GLenum target,
2606 GLint level,
2607 GLint xoffset,
2608 GLint yoffset,
2609 GLsizei width,
2610 GLsizei height,
2611 GLenum format,
2612 GLsizei imageSize,
2613 const GLvoid *data)
2614{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002615 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002616
2617 Box area(xoffset, yoffset, 0, width, height, 1);
2618 Texture *texture =
2619 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
2620 Error error =
2621 texture->setCompressedSubImage(mState.getUnpackState(), target, level, area, format,
2622 imageSize, reinterpret_cast<const uint8_t *>(data));
2623 if (error.isError())
2624 {
2625 recordError(error);
2626 }
2627}
2628
2629void Context::compressedTexSubImage3D(GLenum target,
2630 GLint level,
2631 GLint xoffset,
2632 GLint yoffset,
2633 GLint zoffset,
2634 GLsizei width,
2635 GLsizei height,
2636 GLsizei depth,
2637 GLenum format,
2638 GLsizei imageSize,
2639 const GLvoid *data)
2640{
2641 // Zero sized uploads are valid but no-ops
2642 if (width == 0 || height == 0)
2643 {
2644 return;
2645 }
2646
Jamie Madillad9f24e2016-02-12 09:27:24 -05002647 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002648
2649 Box area(xoffset, yoffset, zoffset, width, height, depth);
2650 Texture *texture = getTargetTexture(target);
2651 Error error =
2652 texture->setCompressedSubImage(mState.getUnpackState(), target, level, area, format,
2653 imageSize, reinterpret_cast<const uint8_t *>(data));
2654 if (error.isError())
2655 {
2656 recordError(error);
2657 }
2658}
2659
Jamie Madillad9f24e2016-02-12 09:27:24 -05002660void Context::syncStateForReadPixels()
2661{
2662 syncRendererState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
2663}
2664
2665void Context::syncStateForTexImage()
2666{
2667 syncRendererState(mTexImageDirtyBits, mTexImageDirtyObjects);
2668}
2669
2670void Context::syncStateForClear()
2671{
2672 syncRendererState(mClearDirtyBits, mClearDirtyObjects);
2673}
2674
2675void Context::syncStateForBlit()
2676{
2677 syncRendererState(mBlitDirtyBits, mBlitDirtyObjects);
2678}
2679
Jamie Madillc29968b2016-01-20 11:17:23 -05002680} // namespace gl