blob: 2c90c9b97e790c673bb0df553027c78ad303db62 [file] [log] [blame]
Shannon Woods53a94a82014-06-24 15:20:36 -04001//
2// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// State.cpp: Implements the State class, encapsulating raw GL state.
8
Geoff Lang2b5420c2014-11-19 14:20:15 -05009#include "libANGLE/State.h"
Shannon Woods53a94a82014-06-24 15:20:36 -040010
Sami Väisänene45e53b2016-05-25 10:36:04 +030011#include <limits>
12#include <string.h>
13
Jamie Madill20e005b2017-04-07 14:19:22 -040014#include "common/bitset_utils.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030015#include "common/mathutil.h"
jchen10a99ed552017-09-22 08:10:32 +080016#include "common/matrix_utils.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050017#include "libANGLE/Caps.h"
jchen10a99ed552017-09-22 08:10:32 +080018#include "libANGLE/Context.h"
Geoff Lang70d0f492015-12-10 17:45:46 -050019#include "libANGLE/Debug.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050020#include "libANGLE/Framebuffer.h"
21#include "libANGLE/FramebufferAttachment.h"
22#include "libANGLE/Query.h"
23#include "libANGLE/VertexArray.h"
24#include "libANGLE/formatutils.h"
jchen10a99ed552017-09-22 08:10:32 +080025#include "libANGLE/queryconversions.h"
Geoff Lang4751aab2017-10-30 15:14:52 -040026#include "libANGLE/renderer/ContextImpl.h"
Shannon Woods53a94a82014-06-24 15:20:36 -040027
Olli Etuahobbf1c102016-06-28 13:31:33 +030028namespace
29{
30
31GLenum ActiveQueryType(const GLenum type)
32{
33 return (type == GL_ANY_SAMPLES_PASSED_CONSERVATIVE) ? GL_ANY_SAMPLES_PASSED : type;
34}
35
36} // anonymous namepace
37
Shannon Woods53a94a82014-06-24 15:20:36 -040038namespace gl
39{
Geoff Lang76b10c92014-09-05 16:28:14 -040040
James Darpiniane8a93c62018-01-04 18:02:24 -080041void UpdateBufferBinding(const Context *context,
42 BindingPointer<Buffer> *binding,
43 Buffer *buffer,
44 BufferBinding target)
45{
46 if (binding->get())
47 (*binding)->onBindingChanged(false, target);
48 binding->set(context, buffer);
49 if (binding->get())
50 (*binding)->onBindingChanged(true, target);
51}
52
53void UpdateBufferBinding(const Context *context,
54 OffsetBindingPointer<Buffer> *binding,
55 Buffer *buffer,
56 BufferBinding target,
57 GLintptr offset,
58 GLsizeiptr size)
59{
60 if (binding->get())
61 (*binding)->onBindingChanged(false, target);
62 binding->set(context, buffer, offset, size);
63 if (binding->get())
64 (*binding)->onBindingChanged(true, target);
65}
66
Shannon Woods53a94a82014-06-24 15:20:36 -040067State::State()
Jamie Madille79b1e12015-11-04 16:36:37 -050068 : mMaxDrawBuffers(0),
69 mMaxCombinedTextureImageUnits(0),
70 mDepthClearValue(0),
71 mStencilClearValue(0),
72 mScissorTest(false),
73 mSampleCoverage(false),
74 mSampleCoverageValue(0),
75 mSampleCoverageInvert(false),
Jiawei Shaodb342272017-09-27 10:21:45 +080076 mSampleMask(false),
77 mMaxSampleMaskWords(0),
Jamie Madille79b1e12015-11-04 16:36:37 -050078 mStencilRef(0),
79 mStencilBackRef(0),
80 mLineWidth(0),
81 mGenerateMipmapHint(GL_NONE),
82 mFragmentShaderDerivativeHint(GL_NONE),
Geoff Langf41a7152016-09-19 15:11:17 -040083 mBindGeneratesResource(true),
Geoff Langfeb8c682017-02-13 16:07:35 -050084 mClientArraysEnabled(true),
Jamie Madille79b1e12015-11-04 16:36:37 -050085 mNearZ(0),
86 mFarZ(0),
87 mReadFramebuffer(nullptr),
88 mDrawFramebuffer(nullptr),
89 mProgram(nullptr),
90 mVertexArray(nullptr),
91 mActiveSampler(0),
Sami Väisänen74c23472016-05-09 17:30:30 +030092 mPrimitiveRestart(false),
93 mMultiSampling(false),
Geoff Lang1d2c41d2016-10-19 16:14:46 -070094 mSampleAlphaToOne(false),
Jamie Madille08a1d32017-03-07 17:24:06 -050095 mFramebufferSRGB(true),
Jamie Madillc43be722017-07-13 16:22:14 -040096 mRobustResourceInit(false),
97 mProgramBinaryCacheEnabled(false)
Shannon Woods53a94a82014-06-24 15:20:36 -040098{
Geoff Lang76b10c92014-09-05 16:28:14 -040099}
100
101State::~State()
102{
Geoff Lang76b10c92014-09-05 16:28:14 -0400103}
104
Jamie Madill4928b7c2017-06-20 12:57:39 -0400105void State::initialize(const Context *context,
Geoff Langf41a7152016-09-19 15:11:17 -0400106 bool debug,
Geoff Langfeb8c682017-02-13 16:07:35 -0500107 bool bindGeneratesResource,
Jamie Madille08a1d32017-03-07 17:24:06 -0500108 bool clientArraysEnabled,
Jamie Madillc43be722017-07-13 16:22:14 -0400109 bool robustResourceInit,
110 bool programBinaryCacheEnabled)
Geoff Lang76b10c92014-09-05 16:28:14 -0400111{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400112 const Caps &caps = context->getCaps();
113 const Extensions &extensions = context->getExtensions();
Geoff Lang4751aab2017-10-30 15:14:52 -0400114 const Extensions &nativeExtensions = context->getImplementation()->getNativeExtensions();
Jamie Madill4928b7c2017-06-20 12:57:39 -0400115 const Version &clientVersion = context->getClientVersion();
116
Shannon Woods2df6a602014-09-26 16:12:07 -0400117 mMaxDrawBuffers = caps.maxDrawBuffers;
118 mMaxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits;
Shannon Woods53a94a82014-06-24 15:20:36 -0400119
Jamie Madillf75ab352015-03-16 10:46:52 -0400120 setColorClearValue(0.0f, 0.0f, 0.0f, 0.0f);
Shannon Woods53a94a82014-06-24 15:20:36 -0400121
122 mDepthClearValue = 1.0f;
123 mStencilClearValue = 0;
124
Shannon Woods53a94a82014-06-24 15:20:36 -0400125 mScissorTest = false;
126 mScissor.x = 0;
127 mScissor.y = 0;
128 mScissor.width = 0;
129 mScissor.height = 0;
130
Shannon Woods53a94a82014-06-24 15:20:36 -0400131 mBlendColor.red = 0;
132 mBlendColor.green = 0;
133 mBlendColor.blue = 0;
134 mBlendColor.alpha = 0;
135
Shannon Woods53a94a82014-06-24 15:20:36 -0400136 mStencilRef = 0;
137 mStencilBackRef = 0;
138
139 mSampleCoverage = false;
140 mSampleCoverageValue = 1.0f;
141 mSampleCoverageInvert = false;
Jiawei Shaodb342272017-09-27 10:21:45 +0800142
143 mMaxSampleMaskWords = caps.maxSampleMaskWords;
144 mSampleMask = false;
145 mSampleMaskValues.fill(~GLbitfield(0));
146
Shannon Woods53a94a82014-06-24 15:20:36 -0400147 mGenerateMipmapHint = GL_DONT_CARE;
148 mFragmentShaderDerivativeHint = GL_DONT_CARE;
149
Geoff Langf41a7152016-09-19 15:11:17 -0400150 mBindGeneratesResource = bindGeneratesResource;
Geoff Langfeb8c682017-02-13 16:07:35 -0500151 mClientArraysEnabled = clientArraysEnabled;
Geoff Langf41a7152016-09-19 15:11:17 -0400152
Shannon Woods53a94a82014-06-24 15:20:36 -0400153 mLineWidth = 1.0f;
154
155 mViewport.x = 0;
156 mViewport.y = 0;
157 mViewport.width = 0;
158 mViewport.height = 0;
159 mNearZ = 0.0f;
160 mFarZ = 1.0f;
161
162 mBlend.colorMaskRed = true;
163 mBlend.colorMaskGreen = true;
164 mBlend.colorMaskBlue = true;
165 mBlend.colorMaskAlpha = true;
166
Geoff Lang76b10c92014-09-05 16:28:14 -0400167 mActiveSampler = 0;
168
Shannon Woods23e05002014-09-22 19:07:27 -0400169 mVertexAttribCurrentValues.resize(caps.maxVertexAttributes);
Shannon Woods53a94a82014-06-24 15:20:36 -0400170
Brandon Jonesc405ae72017-12-06 14:15:03 -0800171 // Set all indexes in state attributes type mask to float (default)
172 for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++)
173 {
174 mCurrentValuesTypeMask.setIndex(GL_FLOAT, i);
175 }
176
Geoff Lang4dc3af02016-11-18 14:09:27 -0500177 mUniformBuffers.resize(caps.maxUniformBufferBindings);
Shannon Woodsf3acaf92014-09-23 18:07:11 -0400178
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800179 mSamplerTextures[TextureType::_2D].resize(caps.maxCombinedTextureImageUnits);
180 mSamplerTextures[TextureType::CubeMap].resize(caps.maxCombinedTextureImageUnits);
Geoff Langeb66a6e2016-10-31 13:06:12 -0400181 if (clientVersion >= Version(3, 0))
Shannon Woods53a94a82014-06-24 15:20:36 -0400182 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400183 // TODO: These could also be enabled via extension
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800184 mSamplerTextures[TextureType::_2DArray].resize(caps.maxCombinedTextureImageUnits);
185 mSamplerTextures[TextureType::_3D].resize(caps.maxCombinedTextureImageUnits);
Shannon Woods53a94a82014-06-24 15:20:36 -0400186 }
Geoff Lang3b573612016-10-31 14:08:10 -0400187 if (clientVersion >= Version(3, 1))
188 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800189 mSamplerTextures[TextureType::_2DMultisample].resize(caps.maxCombinedTextureImageUnits);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800190
191 mAtomicCounterBuffers.resize(caps.maxAtomicCounterBufferBindings);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800192 mShaderStorageBuffers.resize(caps.maxShaderStorageBufferBindings);
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800193 mImageUnits.resize(caps.maxImageUnits);
Geoff Lang3b573612016-10-31 14:08:10 -0400194 }
Geoff Lang4751aab2017-10-30 15:14:52 -0400195 if (nativeExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400196 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800197 mSamplerTextures[TextureType::Rectangle].resize(caps.maxCombinedTextureImageUnits);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400198 }
Geoff Lang4751aab2017-10-30 15:14:52 -0400199 if (nativeExtensions.eglImageExternal || nativeExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400200 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800201 mSamplerTextures[TextureType::External].resize(caps.maxCombinedTextureImageUnits);
Ian Ewellbda75592016-04-18 17:25:54 -0400202 }
Jamie Madill81c2e252017-09-09 23:32:46 -0400203 mCompleteTextureCache.resize(caps.maxCombinedTextureImageUnits, nullptr);
204 mCompleteTextureBindings.reserve(caps.maxCombinedTextureImageUnits);
Geoff Lange51ba632017-11-21 11:45:25 -0500205 mCachedTexturesInitState = InitState::MayNeedInit;
Jamie Madill81c2e252017-09-09 23:32:46 -0400206 for (uint32_t textureIndex = 0; textureIndex < caps.maxCombinedTextureImageUnits;
207 ++textureIndex)
208 {
Jamie Madilld4442552018-02-27 22:03:47 -0500209 mCompleteTextureBindings.emplace_back(this, textureIndex);
Jamie Madill81c2e252017-09-09 23:32:46 -0400210 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400211
Geoff Lang76b10c92014-09-05 16:28:14 -0400212 mSamplers.resize(caps.maxCombinedTextureImageUnits);
Shannon Woods53a94a82014-06-24 15:20:36 -0400213
Jamie Madill4928b7c2017-06-20 12:57:39 -0400214 mActiveQueries[GL_ANY_SAMPLES_PASSED].set(context, nullptr);
215 mActiveQueries[GL_ANY_SAMPLES_PASSED_CONSERVATIVE].set(context, nullptr);
216 mActiveQueries[GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN].set(context, nullptr);
217 mActiveQueries[GL_TIME_ELAPSED_EXT].set(context, nullptr);
218 mActiveQueries[GL_COMMANDS_COMPLETED_CHROMIUM].set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400219
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500220 mProgram = nullptr;
Shannon Woods53a94a82014-06-24 15:20:36 -0400221
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500222 mReadFramebuffer = nullptr;
223 mDrawFramebuffer = nullptr;
Jamie Madillb4b53c52015-02-03 15:22:48 -0500224
225 mPrimitiveRestart = false;
Geoff Lang70d0f492015-12-10 17:45:46 -0500226
227 mDebug.setOutputEnabled(debug);
228 mDebug.setMaxLoggedMessages(extensions.maxDebugLoggedMessages);
Sami Väisänen74c23472016-05-09 17:30:30 +0300229
Geoff Lang488130e2017-09-27 13:53:11 -0400230 mMultiSampling = true;
231 mSampleAlphaToOne = false;
Sami Väisänena797e062016-05-12 15:23:40 +0300232
233 mCoverageModulation = GL_NONE;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300234
235 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixProj);
236 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixMV);
237 mPathStencilFunc = GL_ALWAYS;
238 mPathStencilRef = 0;
239 mPathStencilMask = std::numeric_limits<GLuint>::max();
Jamie Madille08a1d32017-03-07 17:24:06 -0500240
241 mRobustResourceInit = robustResourceInit;
Jamie Madillc43be722017-07-13 16:22:14 -0400242 mProgramBinaryCacheEnabled = programBinaryCacheEnabled;
Shannon Woods53a94a82014-06-24 15:20:36 -0400243}
244
Jamie Madill6c1f6712017-02-14 19:08:04 -0500245void State::reset(const Context *context)
Shannon Woods53a94a82014-06-24 15:20:36 -0400246{
Jamie Madill8693bdb2017-09-02 15:32:14 -0400247 for (auto &bindingVec : mSamplerTextures)
Shannon Woods53a94a82014-06-24 15:20:36 -0400248 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800249 for (size_t textureIdx = 0; textureIdx < bindingVec.size(); textureIdx++)
Shannon Woods53a94a82014-06-24 15:20:36 -0400250 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800251 bindingVec[textureIdx].set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400252 }
253 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400254 for (size_t samplerIdx = 0; samplerIdx < mSamplers.size(); samplerIdx++)
255 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400256 mSamplers[samplerIdx].set(context, nullptr);
Geoff Lang76b10c92014-09-05 16:28:14 -0400257 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400258
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800259 for (auto &imageUnit : mImageUnits)
260 {
261 imageUnit.texture.set(context, nullptr);
262 imageUnit.level = 0;
263 imageUnit.layered = false;
264 imageUnit.layer = 0;
265 imageUnit.access = GL_READ_ONLY;
266 imageUnit.format = GL_R32UI;
267 }
268
Jamie Madill4928b7c2017-06-20 12:57:39 -0400269 mRenderbuffer.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400270
Corentin Wallez336129f2017-10-17 15:55:40 -0400271 for (auto type : angle::AllEnums<BufferBinding>())
272 {
James Darpiniane8a93c62018-01-04 18:02:24 -0800273 UpdateBufferBinding(context, &mBoundBuffers[type], nullptr, type);
Corentin Wallez336129f2017-10-17 15:55:40 -0400274 }
275
Geoff Lang7dd2e102014-11-10 15:19:26 -0500276 if (mProgram)
277 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500278 mProgram->release(context);
Geoff Lang7dd2e102014-11-10 15:19:26 -0500279 }
Yunchao Hed7297bf2017-04-19 15:27:10 +0800280 mProgram = nullptr;
Geoff Lang7dd2e102014-11-10 15:19:26 -0500281
Yunchao Hea336b902017-08-02 16:05:21 +0800282 mProgramPipeline.set(context, nullptr);
283
James Darpiniane8a93c62018-01-04 18:02:24 -0800284 if (mTransformFeedback.get())
285 mTransformFeedback->onBindingChanged(false);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400286 mTransformFeedback.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400287
288 for (State::ActiveQueryMap::iterator i = mActiveQueries.begin(); i != mActiveQueries.end(); i++)
289 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400290 i->second.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400291 }
292
Corentin Wallez336129f2017-10-17 15:55:40 -0400293 for (auto &buf : mUniformBuffers)
Shannon Woods53a94a82014-06-24 15:20:36 -0400294 {
James Darpiniane8a93c62018-01-04 18:02:24 -0800295 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::Uniform);
Shannon Woods53a94a82014-06-24 15:20:36 -0400296 }
297
Jiajia Qin6eafb042016-12-27 17:04:07 +0800298 for (auto &buf : mAtomicCounterBuffers)
299 {
James Darpiniane8a93c62018-01-04 18:02:24 -0800300 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::AtomicCounter);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800301 }
302
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800303 for (auto &buf : mShaderStorageBuffers)
304 {
James Darpiniane8a93c62018-01-04 18:02:24 -0800305 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::ShaderStorage);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800306 }
307
Sami Väisänene45e53b2016-05-25 10:36:04 +0300308 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixProj);
309 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixMV);
310 mPathStencilFunc = GL_ALWAYS;
311 mPathStencilRef = 0;
312 mPathStencilMask = std::numeric_limits<GLuint>::max();
313
Jamie Madill1b94d432015-08-07 13:23:23 -0400314 // TODO(jmadill): Is this necessary?
315 setAllDirtyBits();
Shannon Woods53a94a82014-06-24 15:20:36 -0400316}
317
318const RasterizerState &State::getRasterizerState() const
319{
320 return mRasterizer;
321}
322
323const BlendState &State::getBlendState() const
324{
325 return mBlend;
326}
327
328const DepthStencilState &State::getDepthStencilState() const
329{
330 return mDepthStencil;
331}
332
Jamie Madillf75ab352015-03-16 10:46:52 -0400333void State::setColorClearValue(float red, float green, float blue, float alpha)
Shannon Woods53a94a82014-06-24 15:20:36 -0400334{
335 mColorClearValue.red = red;
336 mColorClearValue.green = green;
337 mColorClearValue.blue = blue;
338 mColorClearValue.alpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400339 mDirtyBits.set(DIRTY_BIT_CLEAR_COLOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400340}
341
Jamie Madillf75ab352015-03-16 10:46:52 -0400342void State::setDepthClearValue(float depth)
Shannon Woods53a94a82014-06-24 15:20:36 -0400343{
344 mDepthClearValue = depth;
Jamie Madill1b94d432015-08-07 13:23:23 -0400345 mDirtyBits.set(DIRTY_BIT_CLEAR_DEPTH);
Shannon Woods53a94a82014-06-24 15:20:36 -0400346}
347
Jamie Madillf75ab352015-03-16 10:46:52 -0400348void State::setStencilClearValue(int stencil)
Shannon Woods53a94a82014-06-24 15:20:36 -0400349{
350 mStencilClearValue = stencil;
Jamie Madill1b94d432015-08-07 13:23:23 -0400351 mDirtyBits.set(DIRTY_BIT_CLEAR_STENCIL);
Shannon Woods53a94a82014-06-24 15:20:36 -0400352}
353
Shannon Woods53a94a82014-06-24 15:20:36 -0400354void State::setColorMask(bool red, bool green, bool blue, bool alpha)
355{
356 mBlend.colorMaskRed = red;
357 mBlend.colorMaskGreen = green;
358 mBlend.colorMaskBlue = blue;
359 mBlend.colorMaskAlpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400360 mDirtyBits.set(DIRTY_BIT_COLOR_MASK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400361}
362
363void State::setDepthMask(bool mask)
364{
365 mDepthStencil.depthMask = mask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400366 mDirtyBits.set(DIRTY_BIT_DEPTH_MASK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400367}
368
369bool State::isRasterizerDiscardEnabled() const
370{
371 return mRasterizer.rasterizerDiscard;
372}
373
374void State::setRasterizerDiscard(bool enabled)
375{
376 mRasterizer.rasterizerDiscard = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400377 mDirtyBits.set(DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400378}
379
380bool State::isCullFaceEnabled() const
381{
382 return mRasterizer.cullFace;
383}
384
385void State::setCullFace(bool enabled)
386{
387 mRasterizer.cullFace = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400388 mDirtyBits.set(DIRTY_BIT_CULL_FACE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400389}
390
Corentin Wallez2e568cf2017-09-18 17:05:22 -0400391void State::setCullMode(CullFaceMode mode)
Shannon Woods53a94a82014-06-24 15:20:36 -0400392{
393 mRasterizer.cullMode = mode;
Jamie Madill1b94d432015-08-07 13:23:23 -0400394 mDirtyBits.set(DIRTY_BIT_CULL_FACE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400395}
396
397void State::setFrontFace(GLenum front)
398{
399 mRasterizer.frontFace = front;
Jamie Madill1b94d432015-08-07 13:23:23 -0400400 mDirtyBits.set(DIRTY_BIT_FRONT_FACE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400401}
402
403bool State::isDepthTestEnabled() const
404{
405 return mDepthStencil.depthTest;
406}
407
408void State::setDepthTest(bool enabled)
409{
410 mDepthStencil.depthTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400411 mDirtyBits.set(DIRTY_BIT_DEPTH_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400412}
413
414void State::setDepthFunc(GLenum depthFunc)
415{
416 mDepthStencil.depthFunc = depthFunc;
Jamie Madill1b94d432015-08-07 13:23:23 -0400417 mDirtyBits.set(DIRTY_BIT_DEPTH_FUNC);
Shannon Woods53a94a82014-06-24 15:20:36 -0400418}
419
420void State::setDepthRange(float zNear, float zFar)
421{
422 mNearZ = zNear;
423 mFarZ = zFar;
Jamie Madill1b94d432015-08-07 13:23:23 -0400424 mDirtyBits.set(DIRTY_BIT_DEPTH_RANGE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400425}
426
Geoff Langd42f5b82015-04-16 14:03:29 -0400427float State::getNearPlane() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400428{
Geoff Langd42f5b82015-04-16 14:03:29 -0400429 return mNearZ;
430}
431
432float State::getFarPlane() const
433{
434 return mFarZ;
Shannon Woods53a94a82014-06-24 15:20:36 -0400435}
436
437bool State::isBlendEnabled() const
438{
439 return mBlend.blend;
440}
441
442void State::setBlend(bool enabled)
443{
444 mBlend.blend = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400445 mDirtyBits.set(DIRTY_BIT_BLEND_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400446}
447
448void State::setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha)
449{
450 mBlend.sourceBlendRGB = sourceRGB;
451 mBlend.destBlendRGB = destRGB;
452 mBlend.sourceBlendAlpha = sourceAlpha;
453 mBlend.destBlendAlpha = destAlpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400454 mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400455}
456
457void State::setBlendColor(float red, float green, float blue, float alpha)
458{
459 mBlendColor.red = red;
460 mBlendColor.green = green;
461 mBlendColor.blue = blue;
462 mBlendColor.alpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400463 mDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400464}
465
466void State::setBlendEquation(GLenum rgbEquation, GLenum alphaEquation)
467{
468 mBlend.blendEquationRGB = rgbEquation;
469 mBlend.blendEquationAlpha = alphaEquation;
Jamie Madill1b94d432015-08-07 13:23:23 -0400470 mDirtyBits.set(DIRTY_BIT_BLEND_EQUATIONS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400471}
472
473const ColorF &State::getBlendColor() const
474{
475 return mBlendColor;
476}
477
478bool State::isStencilTestEnabled() const
479{
480 return mDepthStencil.stencilTest;
481}
482
483void State::setStencilTest(bool enabled)
484{
485 mDepthStencil.stencilTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400486 mDirtyBits.set(DIRTY_BIT_STENCIL_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400487}
488
489void State::setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask)
490{
491 mDepthStencil.stencilFunc = stencilFunc;
492 mStencilRef = (stencilRef > 0) ? stencilRef : 0;
493 mDepthStencil.stencilMask = stencilMask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400494 mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400495}
496
497void State::setStencilBackParams(GLenum stencilBackFunc, GLint stencilBackRef, GLuint stencilBackMask)
498{
499 mDepthStencil.stencilBackFunc = stencilBackFunc;
500 mStencilBackRef = (stencilBackRef > 0) ? stencilBackRef : 0;
501 mDepthStencil.stencilBackMask = stencilBackMask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400502 mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400503}
504
505void State::setStencilWritemask(GLuint stencilWritemask)
506{
507 mDepthStencil.stencilWritemask = stencilWritemask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400508 mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400509}
510
511void State::setStencilBackWritemask(GLuint stencilBackWritemask)
512{
513 mDepthStencil.stencilBackWritemask = stencilBackWritemask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400514 mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400515}
516
517void State::setStencilOperations(GLenum stencilFail, GLenum stencilPassDepthFail, GLenum stencilPassDepthPass)
518{
519 mDepthStencil.stencilFail = stencilFail;
520 mDepthStencil.stencilPassDepthFail = stencilPassDepthFail;
521 mDepthStencil.stencilPassDepthPass = stencilPassDepthPass;
Jamie Madill1b94d432015-08-07 13:23:23 -0400522 mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400523}
524
525void State::setStencilBackOperations(GLenum stencilBackFail, GLenum stencilBackPassDepthFail, GLenum stencilBackPassDepthPass)
526{
527 mDepthStencil.stencilBackFail = stencilBackFail;
528 mDepthStencil.stencilBackPassDepthFail = stencilBackPassDepthFail;
529 mDepthStencil.stencilBackPassDepthPass = stencilBackPassDepthPass;
Jamie Madill1b94d432015-08-07 13:23:23 -0400530 mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400531}
532
533GLint State::getStencilRef() const
534{
535 return mStencilRef;
536}
537
538GLint State::getStencilBackRef() const
539{
540 return mStencilBackRef;
541}
542
543bool State::isPolygonOffsetFillEnabled() const
544{
545 return mRasterizer.polygonOffsetFill;
546}
547
548void State::setPolygonOffsetFill(bool enabled)
549{
Jamie Madill1b94d432015-08-07 13:23:23 -0400550 mRasterizer.polygonOffsetFill = enabled;
551 mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400552}
553
554void State::setPolygonOffsetParams(GLfloat factor, GLfloat units)
555{
556 // An application can pass NaN values here, so handle this gracefully
557 mRasterizer.polygonOffsetFactor = factor != factor ? 0.0f : factor;
558 mRasterizer.polygonOffsetUnits = units != units ? 0.0f : units;
Jamie Madill1b94d432015-08-07 13:23:23 -0400559 mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET);
Shannon Woods53a94a82014-06-24 15:20:36 -0400560}
561
562bool State::isSampleAlphaToCoverageEnabled() const
563{
564 return mBlend.sampleAlphaToCoverage;
565}
566
567void State::setSampleAlphaToCoverage(bool enabled)
568{
569 mBlend.sampleAlphaToCoverage = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400570 mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400571}
572
573bool State::isSampleCoverageEnabled() const
574{
575 return mSampleCoverage;
576}
577
578void State::setSampleCoverage(bool enabled)
579{
580 mSampleCoverage = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400581 mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400582}
583
584void State::setSampleCoverageParams(GLclampf value, bool invert)
585{
586 mSampleCoverageValue = value;
587 mSampleCoverageInvert = invert;
Jamie Madill1b94d432015-08-07 13:23:23 -0400588 mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400589}
590
Geoff Lang0fbb6002015-04-16 11:11:53 -0400591GLclampf State::getSampleCoverageValue() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400592{
Geoff Lang0fbb6002015-04-16 11:11:53 -0400593 return mSampleCoverageValue;
594}
Shannon Woods53a94a82014-06-24 15:20:36 -0400595
Geoff Lang0fbb6002015-04-16 11:11:53 -0400596bool State::getSampleCoverageInvert() const
597{
598 return mSampleCoverageInvert;
Shannon Woods53a94a82014-06-24 15:20:36 -0400599}
600
Jiawei Shaodb342272017-09-27 10:21:45 +0800601bool State::isSampleMaskEnabled() const
602{
603 return mSampleMask;
604}
605
606void State::setSampleMaskEnabled(bool enabled)
607{
608 mSampleMask = enabled;
609 mDirtyBits.set(DIRTY_BIT_SAMPLE_MASK_ENABLED);
610}
611
612void State::setSampleMaskParams(GLuint maskNumber, GLbitfield mask)
613{
614 ASSERT(maskNumber < mMaxSampleMaskWords);
615 mSampleMaskValues[maskNumber] = mask;
Jamie Madillc67323a2017-11-02 23:11:41 -0400616 // TODO(jmadill): Use a child dirty bit if we ever use more than two words.
617 mDirtyBits.set(DIRTY_BIT_SAMPLE_MASK);
Jiawei Shaodb342272017-09-27 10:21:45 +0800618}
619
620GLbitfield State::getSampleMaskWord(GLuint maskNumber) const
621{
622 ASSERT(maskNumber < mMaxSampleMaskWords);
623 return mSampleMaskValues[maskNumber];
624}
625
626GLuint State::getMaxSampleMaskWords() const
627{
628 return mMaxSampleMaskWords;
629}
630
Sami Väisänen74c23472016-05-09 17:30:30 +0300631void State::setSampleAlphaToOne(bool enabled)
632{
633 mSampleAlphaToOne = enabled;
634 mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_ONE);
635}
636
637bool State::isSampleAlphaToOneEnabled() const
638{
639 return mSampleAlphaToOne;
640}
641
642void State::setMultisampling(bool enabled)
643{
644 mMultiSampling = enabled;
645 mDirtyBits.set(DIRTY_BIT_MULTISAMPLING);
646}
647
648bool State::isMultisamplingEnabled() const
649{
650 return mMultiSampling;
651}
652
Shannon Woods53a94a82014-06-24 15:20:36 -0400653bool State::isScissorTestEnabled() const
654{
655 return mScissorTest;
656}
657
658void State::setScissorTest(bool enabled)
659{
660 mScissorTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400661 mDirtyBits.set(DIRTY_BIT_SCISSOR_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400662}
663
664void State::setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height)
665{
666 mScissor.x = x;
667 mScissor.y = y;
668 mScissor.width = width;
669 mScissor.height = height;
Jamie Madill1b94d432015-08-07 13:23:23 -0400670 mDirtyBits.set(DIRTY_BIT_SCISSOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400671}
672
673const Rectangle &State::getScissor() const
674{
675 return mScissor;
676}
677
678bool State::isDitherEnabled() const
679{
680 return mBlend.dither;
681}
682
683void State::setDither(bool enabled)
684{
685 mBlend.dither = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400686 mDirtyBits.set(DIRTY_BIT_DITHER_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400687}
688
Jamie Madillb4b53c52015-02-03 15:22:48 -0500689bool State::isPrimitiveRestartEnabled() const
690{
691 return mPrimitiveRestart;
692}
693
694void State::setPrimitiveRestart(bool enabled)
695{
696 mPrimitiveRestart = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400697 mDirtyBits.set(DIRTY_BIT_PRIMITIVE_RESTART_ENABLED);
Jamie Madillb4b53c52015-02-03 15:22:48 -0500698}
699
Shannon Woods53a94a82014-06-24 15:20:36 -0400700void State::setEnableFeature(GLenum feature, bool enabled)
701{
702 switch (feature)
703 {
Sami Väisänen74c23472016-05-09 17:30:30 +0300704 case GL_MULTISAMPLE_EXT: setMultisampling(enabled); break;
705 case GL_SAMPLE_ALPHA_TO_ONE_EXT: setSampleAlphaToOne(enabled); break;
Shannon Woods53a94a82014-06-24 15:20:36 -0400706 case GL_CULL_FACE: setCullFace(enabled); break;
707 case GL_POLYGON_OFFSET_FILL: setPolygonOffsetFill(enabled); break;
708 case GL_SAMPLE_ALPHA_TO_COVERAGE: setSampleAlphaToCoverage(enabled); break;
709 case GL_SAMPLE_COVERAGE: setSampleCoverage(enabled); break;
710 case GL_SCISSOR_TEST: setScissorTest(enabled); break;
711 case GL_STENCIL_TEST: setStencilTest(enabled); break;
712 case GL_DEPTH_TEST: setDepthTest(enabled); break;
713 case GL_BLEND: setBlend(enabled); break;
714 case GL_DITHER: setDither(enabled); break;
Jamie Madillb4b53c52015-02-03 15:22:48 -0500715 case GL_PRIMITIVE_RESTART_FIXED_INDEX: setPrimitiveRestart(enabled); break;
Shannon Woods53a94a82014-06-24 15:20:36 -0400716 case GL_RASTERIZER_DISCARD: setRasterizerDiscard(enabled); break;
Geoff Lang3b573612016-10-31 14:08:10 -0400717 case GL_SAMPLE_MASK:
Jiawei Shaodb342272017-09-27 10:21:45 +0800718 setSampleMaskEnabled(enabled);
Geoff Lang3b573612016-10-31 14:08:10 -0400719 break;
Geoff Lang70d0f492015-12-10 17:45:46 -0500720 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
721 mDebug.setOutputSynchronous(enabled);
722 break;
723 case GL_DEBUG_OUTPUT:
724 mDebug.setOutputEnabled(enabled);
725 break;
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700726 case GL_FRAMEBUFFER_SRGB_EXT:
727 setFramebufferSRGB(enabled);
728 break;
Shannon Woods53a94a82014-06-24 15:20:36 -0400729 default: UNREACHABLE();
730 }
731}
732
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700733bool State::getEnableFeature(GLenum feature) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400734{
735 switch (feature)
736 {
Sami Väisänen74c23472016-05-09 17:30:30 +0300737 case GL_MULTISAMPLE_EXT: return isMultisamplingEnabled();
738 case GL_SAMPLE_ALPHA_TO_ONE_EXT: return isSampleAlphaToOneEnabled();
Shannon Woods53a94a82014-06-24 15:20:36 -0400739 case GL_CULL_FACE: return isCullFaceEnabled();
740 case GL_POLYGON_OFFSET_FILL: return isPolygonOffsetFillEnabled();
741 case GL_SAMPLE_ALPHA_TO_COVERAGE: return isSampleAlphaToCoverageEnabled();
742 case GL_SAMPLE_COVERAGE: return isSampleCoverageEnabled();
743 case GL_SCISSOR_TEST: return isScissorTestEnabled();
744 case GL_STENCIL_TEST: return isStencilTestEnabled();
745 case GL_DEPTH_TEST: return isDepthTestEnabled();
746 case GL_BLEND: return isBlendEnabled();
747 case GL_DITHER: return isDitherEnabled();
Jamie Madillb4b53c52015-02-03 15:22:48 -0500748 case GL_PRIMITIVE_RESTART_FIXED_INDEX: return isPrimitiveRestartEnabled();
Shannon Woods53a94a82014-06-24 15:20:36 -0400749 case GL_RASTERIZER_DISCARD: return isRasterizerDiscardEnabled();
Geoff Langb5e997f2016-12-06 10:55:34 -0500750 case GL_SAMPLE_MASK:
Jiawei Shaodb342272017-09-27 10:21:45 +0800751 return isSampleMaskEnabled();
Geoff Lang70d0f492015-12-10 17:45:46 -0500752 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
753 return mDebug.isOutputSynchronous();
754 case GL_DEBUG_OUTPUT:
755 return mDebug.isOutputEnabled();
Geoff Langf41a7152016-09-19 15:11:17 -0400756 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
757 return isBindGeneratesResourceEnabled();
Geoff Langfeb8c682017-02-13 16:07:35 -0500758 case GL_CLIENT_ARRAYS_ANGLE:
759 return areClientArraysEnabled();
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700760 case GL_FRAMEBUFFER_SRGB_EXT:
761 return getFramebufferSRGB();
Geoff Langb433e872017-10-05 14:01:47 -0400762 case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
Jamie Madille08a1d32017-03-07 17:24:06 -0500763 return mRobustResourceInit;
Jamie Madillc43be722017-07-13 16:22:14 -0400764 case GL_PROGRAM_CACHE_ENABLED_ANGLE:
765 return mProgramBinaryCacheEnabled;
766
767 default:
768 UNREACHABLE();
769 return false;
Shannon Woods53a94a82014-06-24 15:20:36 -0400770 }
771}
772
773void State::setLineWidth(GLfloat width)
774{
775 mLineWidth = width;
Jamie Madill1b94d432015-08-07 13:23:23 -0400776 mDirtyBits.set(DIRTY_BIT_LINE_WIDTH);
Shannon Woods53a94a82014-06-24 15:20:36 -0400777}
778
Geoff Lang4b3f4162015-04-16 13:22:05 -0400779float State::getLineWidth() const
780{
781 return mLineWidth;
782}
783
Shannon Woods53a94a82014-06-24 15:20:36 -0400784void State::setGenerateMipmapHint(GLenum hint)
785{
786 mGenerateMipmapHint = hint;
Jamie Madill1b94d432015-08-07 13:23:23 -0400787 mDirtyBits.set(DIRTY_BIT_GENERATE_MIPMAP_HINT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400788}
789
790void State::setFragmentShaderDerivativeHint(GLenum hint)
791{
792 mFragmentShaderDerivativeHint = hint;
Jamie Madill1b94d432015-08-07 13:23:23 -0400793 mDirtyBits.set(DIRTY_BIT_SHADER_DERIVATIVE_HINT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400794 // TODO: Propagate the hint to shader translator so we can write
795 // ddx, ddx_coarse, or ddx_fine depending on the hint.
796 // Ignore for now. It is valid for implementations to ignore hint.
797}
798
Geoff Langf41a7152016-09-19 15:11:17 -0400799bool State::isBindGeneratesResourceEnabled() const
800{
801 return mBindGeneratesResource;
802}
803
Geoff Langfeb8c682017-02-13 16:07:35 -0500804bool State::areClientArraysEnabled() const
805{
806 return mClientArraysEnabled;
807}
808
Shannon Woods53a94a82014-06-24 15:20:36 -0400809void State::setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height)
810{
811 mViewport.x = x;
812 mViewport.y = y;
813 mViewport.width = width;
814 mViewport.height = height;
Jamie Madill1b94d432015-08-07 13:23:23 -0400815 mDirtyBits.set(DIRTY_BIT_VIEWPORT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400816}
817
818const Rectangle &State::getViewport() const
819{
820 return mViewport;
821}
822
823void State::setActiveSampler(unsigned int active)
824{
825 mActiveSampler = active;
826}
827
828unsigned int State::getActiveSampler() const
829{
Cooper Partin4d61f7e2015-08-12 10:56:50 -0700830 return static_cast<unsigned int>(mActiveSampler);
Shannon Woods53a94a82014-06-24 15:20:36 -0400831}
832
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800833void State::setSamplerTexture(const Context *context, TextureType type, Texture *texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400834{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400835 mSamplerTextures[type][mActiveSampler].set(context, texture);
Jamie Madill81c2e252017-09-09 23:32:46 -0400836 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
837 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Shannon Woods53a94a82014-06-24 15:20:36 -0400838}
839
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800840Texture *State::getTargetTexture(TextureType type) const
Jamie Madillc29968b2016-01-20 11:17:23 -0500841{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800842 return getSamplerTexture(static_cast<unsigned int>(mActiveSampler), type);
Jamie Madillc29968b2016-01-20 11:17:23 -0500843}
844
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800845Texture *State::getSamplerTexture(unsigned int sampler, TextureType type) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400846{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800847 ASSERT(sampler < mSamplerTextures[type].size());
848 return mSamplerTextures[type][sampler].get();
Shannon Woods53a94a82014-06-24 15:20:36 -0400849}
850
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800851GLuint State::getSamplerTextureId(unsigned int sampler, TextureType type) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400852{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800853 ASSERT(sampler < mSamplerTextures[type].size());
854 return mSamplerTextures[type][sampler].id();
Shannon Woods53a94a82014-06-24 15:20:36 -0400855}
856
Jamie Madilla02315b2017-02-23 14:14:47 -0500857void State::detachTexture(const Context *context, const TextureMap &zeroTextures, GLuint texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400858{
859 // Textures have a detach method on State rather than a simple
860 // removeBinding, because the zero/null texture objects are managed
861 // separately, and don't have to go through the Context's maps or
862 // the ResourceManager.
863
864 // [OpenGL ES 2.0.24] section 3.8 page 84:
865 // If a texture object is deleted, it is as if all texture units which are bound to that texture object are
866 // rebound to texture object zero
867
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800868 for (TextureType type : angle::AllEnums<TextureType>())
Shannon Woods53a94a82014-06-24 15:20:36 -0400869 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800870 TextureBindingVector &textureVector = mSamplerTextures[type];
Jamie Madill81c2e252017-09-09 23:32:46 -0400871 for (BindingPointer<Texture> &binding : textureVector)
Shannon Woods53a94a82014-06-24 15:20:36 -0400872 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400873 if (binding.id() == texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400874 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800875 Texture *zeroTexture = zeroTextures[type].get();
876 ASSERT(zeroTexture != nullptr);
Jamie Madille6382c32014-11-07 15:05:26 -0500877 // Zero textures are the "default" textures instead of NULL
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800878 binding.set(context, zeroTexture);
Jamie Madill81c2e252017-09-09 23:32:46 -0400879 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400880 }
881 }
882 }
883
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800884 for (auto &bindingImageUnit : mImageUnits)
885 {
886 if (bindingImageUnit.texture.id() == texture)
887 {
888 bindingImageUnit.texture.set(context, nullptr);
889 bindingImageUnit.level = 0;
890 bindingImageUnit.layered = false;
891 bindingImageUnit.layer = 0;
892 bindingImageUnit.access = GL_READ_ONLY;
893 bindingImageUnit.format = GL_R32UI;
894 break;
895 }
896 }
897
Shannon Woods53a94a82014-06-24 15:20:36 -0400898 // [OpenGL ES 2.0.24] section 4.4 page 112:
899 // If a texture object is deleted while its image is attached to the currently bound framebuffer, then it is
900 // as if Texture2DAttachment had been called, with a texture of 0, for each attachment point to which this
901 // image was attached in the currently bound framebuffer.
902
Jamie Madill8693bdb2017-09-02 15:32:14 -0400903 if (mReadFramebuffer && mReadFramebuffer->detachTexture(context, texture))
Shannon Woods53a94a82014-06-24 15:20:36 -0400904 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400905 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -0400906 }
907
Jamie Madill8693bdb2017-09-02 15:32:14 -0400908 if (mDrawFramebuffer && mDrawFramebuffer->detachTexture(context, texture))
Shannon Woods53a94a82014-06-24 15:20:36 -0400909 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400910 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -0400911 }
912}
913
Jamie Madill4928b7c2017-06-20 12:57:39 -0400914void State::initializeZeroTextures(const Context *context, const TextureMap &zeroTextures)
Jamie Madille6382c32014-11-07 15:05:26 -0500915{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800916 for (TextureType type : angle::AllEnums<TextureType>())
Jamie Madille6382c32014-11-07 15:05:26 -0500917 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800918 for (size_t textureUnit = 0; textureUnit < mSamplerTextures[type].size(); ++textureUnit)
Jamie Madille6382c32014-11-07 15:05:26 -0500919 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800920 mSamplerTextures[type][textureUnit].set(context, zeroTextures[type].get());
Jamie Madille6382c32014-11-07 15:05:26 -0500921 }
922 }
923}
924
Jamie Madill4928b7c2017-06-20 12:57:39 -0400925void State::setSamplerBinding(const Context *context, GLuint textureUnit, Sampler *sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -0400926{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400927 mSamplers[textureUnit].set(context, sampler);
Jamie Madill81c2e252017-09-09 23:32:46 -0400928 mDirtyBits.set(DIRTY_BIT_SAMPLER_BINDINGS);
929 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Shannon Woods53a94a82014-06-24 15:20:36 -0400930}
931
932GLuint State::getSamplerId(GLuint textureUnit) const
933{
Geoff Lang76b10c92014-09-05 16:28:14 -0400934 ASSERT(textureUnit < mSamplers.size());
Shannon Woods53a94a82014-06-24 15:20:36 -0400935 return mSamplers[textureUnit].id();
936}
937
938Sampler *State::getSampler(GLuint textureUnit) const
939{
940 return mSamplers[textureUnit].get();
941}
942
Jamie Madill4928b7c2017-06-20 12:57:39 -0400943void State::detachSampler(const Context *context, GLuint sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -0400944{
945 // [OpenGL ES 3.0.2] section 3.8.2 pages 123-124:
946 // If a sampler object that is currently bound to one or more texture units is
947 // deleted, it is as though BindSampler is called once for each texture unit to
948 // which the sampler is bound, with unit set to the texture unit and sampler set to zero.
Jamie Madill81c2e252017-09-09 23:32:46 -0400949 for (BindingPointer<Sampler> &samplerBinding : mSamplers)
Shannon Woods53a94a82014-06-24 15:20:36 -0400950 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400951 if (samplerBinding.id() == sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -0400952 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400953 samplerBinding.set(context, nullptr);
Jamie Madill81c2e252017-09-09 23:32:46 -0400954 mDirtyBits.set(DIRTY_BIT_SAMPLER_BINDINGS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400955 }
956 }
957}
958
Jamie Madill4928b7c2017-06-20 12:57:39 -0400959void State::setRenderbufferBinding(const Context *context, Renderbuffer *renderbuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -0400960{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400961 mRenderbuffer.set(context, renderbuffer);
Jamie Madill8693bdb2017-09-02 15:32:14 -0400962 mDirtyBits.set(DIRTY_BIT_RENDERBUFFER_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -0400963}
964
965GLuint State::getRenderbufferId() const
966{
967 return mRenderbuffer.id();
968}
969
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700970Renderbuffer *State::getCurrentRenderbuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400971{
972 return mRenderbuffer.get();
973}
974
Jamie Madilla02315b2017-02-23 14:14:47 -0500975void State::detachRenderbuffer(const Context *context, GLuint renderbuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -0400976{
977 // [OpenGL ES 2.0.24] section 4.4 page 109:
978 // If a renderbuffer that is currently bound to RENDERBUFFER is deleted, it is as though BindRenderbuffer
979 // had been executed with the target RENDERBUFFER and name of zero.
980
981 if (mRenderbuffer.id() == renderbuffer)
982 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400983 setRenderbufferBinding(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400984 }
985
986 // [OpenGL ES 2.0.24] section 4.4 page 111:
987 // If a renderbuffer object is deleted while its image is attached to the currently bound framebuffer,
988 // then it is as if FramebufferRenderbuffer had been called, with a renderbuffer of 0, for each attachment
989 // point to which this image was attached in the currently bound framebuffer.
990
991 Framebuffer *readFramebuffer = mReadFramebuffer;
992 Framebuffer *drawFramebuffer = mDrawFramebuffer;
993
Jamie Madill8693bdb2017-09-02 15:32:14 -0400994 if (readFramebuffer && readFramebuffer->detachRenderbuffer(context, renderbuffer))
Shannon Woods53a94a82014-06-24 15:20:36 -0400995 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400996 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -0400997 }
998
999 if (drawFramebuffer && drawFramebuffer != readFramebuffer)
1000 {
Jamie Madill8693bdb2017-09-02 15:32:14 -04001001 if (drawFramebuffer->detachRenderbuffer(context, renderbuffer))
1002 {
1003 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
1004 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001005 }
1006
1007}
1008
1009void State::setReadFramebufferBinding(Framebuffer *framebuffer)
1010{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001011 if (mReadFramebuffer == framebuffer)
1012 return;
1013
Shannon Woods53a94a82014-06-24 15:20:36 -04001014 mReadFramebuffer = framebuffer;
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001015 mDirtyBits.set(DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
1016
1017 if (mReadFramebuffer && mReadFramebuffer->hasAnyDirtyBit())
1018 {
1019 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
1020 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001021}
1022
1023void State::setDrawFramebufferBinding(Framebuffer *framebuffer)
1024{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001025 if (mDrawFramebuffer == framebuffer)
1026 return;
1027
Shannon Woods53a94a82014-06-24 15:20:36 -04001028 mDrawFramebuffer = framebuffer;
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001029 mDirtyBits.set(DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
1030
1031 if (mDrawFramebuffer && mDrawFramebuffer->hasAnyDirtyBit())
1032 {
1033 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
1034 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001035}
1036
1037Framebuffer *State::getTargetFramebuffer(GLenum target) const
1038{
1039 switch (target)
1040 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001041 case GL_READ_FRAMEBUFFER_ANGLE:
1042 return mReadFramebuffer;
1043 case GL_DRAW_FRAMEBUFFER_ANGLE:
1044 case GL_FRAMEBUFFER:
1045 return mDrawFramebuffer;
1046 default:
1047 UNREACHABLE();
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001048 return nullptr;
Shannon Woods53a94a82014-06-24 15:20:36 -04001049 }
1050}
1051
Jamie Madill51f40ec2016-06-15 14:06:00 -04001052Framebuffer *State::getReadFramebuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001053{
1054 return mReadFramebuffer;
1055}
1056
Jamie Madill51f40ec2016-06-15 14:06:00 -04001057Framebuffer *State::getDrawFramebuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001058{
1059 return mDrawFramebuffer;
1060}
1061
1062bool State::removeReadFramebufferBinding(GLuint framebuffer)
1063{
Jamie Madill77a72f62015-04-14 11:18:32 -04001064 if (mReadFramebuffer != nullptr &&
1065 mReadFramebuffer->id() == framebuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001066 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001067 setReadFramebufferBinding(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001068 return true;
1069 }
1070
1071 return false;
1072}
1073
1074bool State::removeDrawFramebufferBinding(GLuint framebuffer)
1075{
Jamie Madill77a72f62015-04-14 11:18:32 -04001076 if (mReadFramebuffer != nullptr &&
1077 mDrawFramebuffer->id() == framebuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001078 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001079 setDrawFramebufferBinding(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001080 return true;
1081 }
1082
1083 return false;
1084}
1085
1086void State::setVertexArrayBinding(VertexArray *vertexArray)
1087{
James Darpiniane8a93c62018-01-04 18:02:24 -08001088 if (mVertexArray == vertexArray)
1089 return;
1090 if (mVertexArray)
1091 mVertexArray->onBindingChanged(false);
Shannon Woods53a94a82014-06-24 15:20:36 -04001092 mVertexArray = vertexArray;
James Darpiniane8a93c62018-01-04 18:02:24 -08001093 if (vertexArray)
1094 vertexArray->onBindingChanged(true);
Jamie Madill0b9e9032015-08-17 11:51:52 +00001095 mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001096
1097 if (mVertexArray && mVertexArray->hasAnyDirtyBit())
1098 {
1099 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1100 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001101}
1102
1103GLuint State::getVertexArrayId() const
1104{
Yunchao He4f285442017-04-21 12:15:49 +08001105 ASSERT(mVertexArray != nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001106 return mVertexArray->id();
1107}
1108
1109VertexArray *State::getVertexArray() const
1110{
Yunchao He4f285442017-04-21 12:15:49 +08001111 ASSERT(mVertexArray != nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001112 return mVertexArray;
1113}
1114
1115bool State::removeVertexArrayBinding(GLuint vertexArray)
1116{
James Darpiniane8a93c62018-01-04 18:02:24 -08001117 if (mVertexArray && mVertexArray->id() == vertexArray)
Shannon Woods53a94a82014-06-24 15:20:36 -04001118 {
James Darpiniane8a93c62018-01-04 18:02:24 -08001119 mVertexArray->onBindingChanged(false);
Yunchao Hed7297bf2017-04-19 15:27:10 +08001120 mVertexArray = nullptr;
Jamie Madill0b9e9032015-08-17 11:51:52 +00001121 mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001122 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001123 return true;
1124 }
1125
1126 return false;
1127}
1128
Jamie Madill4928b7c2017-06-20 12:57:39 -04001129void State::bindVertexBuffer(const Context *context,
1130 GLuint bindingIndex,
Shao80957d92017-02-20 21:25:59 +08001131 Buffer *boundBuffer,
1132 GLintptr offset,
1133 GLsizei stride)
1134{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001135 getVertexArray()->bindVertexBuffer(context, bindingIndex, boundBuffer, offset, stride);
Shao80957d92017-02-20 21:25:59 +08001136 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1137}
1138
Shaodde78e82017-05-22 14:13:27 +08001139void State::setVertexAttribBinding(const Context *context, GLuint attribIndex, GLuint bindingIndex)
Shao80957d92017-02-20 21:25:59 +08001140{
Shaodde78e82017-05-22 14:13:27 +08001141 getVertexArray()->setVertexAttribBinding(context, attribIndex, bindingIndex);
Shao80957d92017-02-20 21:25:59 +08001142 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1143}
1144
1145void State::setVertexAttribFormat(GLuint attribIndex,
1146 GLint size,
1147 GLenum type,
1148 bool normalized,
1149 bool pureInteger,
1150 GLuint relativeOffset)
1151{
1152 getVertexArray()->setVertexAttribFormat(attribIndex, size, type, normalized, pureInteger,
1153 relativeOffset);
1154 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1155}
1156
1157void State::setVertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
1158{
1159 getVertexArray()->setVertexBindingDivisor(bindingIndex, divisor);
1160 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1161}
1162
Jamie Madill6c1f6712017-02-14 19:08:04 -05001163void State::setProgram(const Context *context, Program *newProgram)
Shannon Woods53a94a82014-06-24 15:20:36 -04001164{
Geoff Lang7dd2e102014-11-10 15:19:26 -05001165 if (mProgram != newProgram)
Shannon Woods53a94a82014-06-24 15:20:36 -04001166 {
Geoff Lang7dd2e102014-11-10 15:19:26 -05001167 if (mProgram)
1168 {
Jamie Madill6c1f6712017-02-14 19:08:04 -05001169 mProgram->release(context);
Geoff Lang7dd2e102014-11-10 15:19:26 -05001170 }
1171
1172 mProgram = newProgram;
1173
1174 if (mProgram)
1175 {
1176 newProgram->addRef();
Jamie Madill81c2e252017-09-09 23:32:46 -04001177 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Geoff Lang7dd2e102014-11-10 15:19:26 -05001178 }
Jamie Madilla779b612017-07-24 11:46:05 -04001179 mDirtyBits.set(DIRTY_BIT_PROGRAM_EXECUTABLE);
1180 mDirtyBits.set(DIRTY_BIT_PROGRAM_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001181 }
1182}
1183
Geoff Lang7dd2e102014-11-10 15:19:26 -05001184Program *State::getProgram() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001185{
Geoff Lang7dd2e102014-11-10 15:19:26 -05001186 return mProgram;
Shannon Woods53a94a82014-06-24 15:20:36 -04001187}
1188
Jamie Madill4928b7c2017-06-20 12:57:39 -04001189void State::setTransformFeedbackBinding(const Context *context,
1190 TransformFeedback *transformFeedback)
Shannon Woods53a94a82014-06-24 15:20:36 -04001191{
James Darpiniane8a93c62018-01-04 18:02:24 -08001192 if (transformFeedback == mTransformFeedback.get())
1193 return;
1194 if (mTransformFeedback.get())
1195 mTransformFeedback->onBindingChanged(false);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001196 mTransformFeedback.set(context, transformFeedback);
James Darpiniane8a93c62018-01-04 18:02:24 -08001197 if (mTransformFeedback.get())
1198 mTransformFeedback->onBindingChanged(true);
Geoff Langded79232017-11-28 15:21:11 -05001199 mDirtyBits.set(DIRTY_BIT_TRANSFORM_FEEDBACK_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001200}
1201
1202TransformFeedback *State::getCurrentTransformFeedback() const
1203{
1204 return mTransformFeedback.get();
1205}
1206
Gregoire Payen de La Garanderie52742022015-02-04 14:55:39 +00001207bool State::isTransformFeedbackActiveUnpaused() const
1208{
Jamie Madill81c2e252017-09-09 23:32:46 -04001209 TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
Geoff Langbb0a0bb2015-03-27 12:16:57 -04001210 return curTransformFeedback && curTransformFeedback->isActive() && !curTransformFeedback->isPaused();
Gregoire Payen de La Garanderie52742022015-02-04 14:55:39 +00001211}
1212
Jamie Madill4928b7c2017-06-20 12:57:39 -04001213bool State::removeTransformFeedbackBinding(const Context *context, GLuint transformFeedback)
Shannon Woods53a94a82014-06-24 15:20:36 -04001214{
1215 if (mTransformFeedback.id() == transformFeedback)
1216 {
James Darpiniane8a93c62018-01-04 18:02:24 -08001217 if (mTransformFeedback.get())
1218 mTransformFeedback->onBindingChanged(false);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001219 mTransformFeedback.set(context, nullptr);
Corentin Walleza2257da2016-04-19 16:43:12 -04001220 return true;
Shannon Woods53a94a82014-06-24 15:20:36 -04001221 }
Corentin Walleza2257da2016-04-19 16:43:12 -04001222
1223 return false;
Shannon Woods53a94a82014-06-24 15:20:36 -04001224}
1225
Yunchao Hea336b902017-08-02 16:05:21 +08001226void State::setProgramPipelineBinding(const Context *context, ProgramPipeline *pipeline)
1227{
1228 mProgramPipeline.set(context, pipeline);
1229}
1230
1231void State::detachProgramPipeline(const Context *context, GLuint pipeline)
1232{
1233 mProgramPipeline.set(context, nullptr);
1234}
1235
Olli Etuahobbf1c102016-06-28 13:31:33 +03001236bool State::isQueryActive(const GLenum type) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001237{
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001238 for (auto &iter : mActiveQueries)
Shannon Woods53a94a82014-06-24 15:20:36 -04001239 {
Olli Etuahobbf1c102016-06-28 13:31:33 +03001240 const Query *query = iter.second.get();
1241 if (query != nullptr && ActiveQueryType(query->getType()) == ActiveQueryType(type))
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001242 {
1243 return true;
1244 }
1245 }
1246
1247 return false;
1248}
1249
1250bool State::isQueryActive(Query *query) const
1251{
1252 for (auto &iter : mActiveQueries)
1253 {
1254 if (iter.second.get() == query)
Shannon Woods53a94a82014-06-24 15:20:36 -04001255 {
1256 return true;
1257 }
1258 }
1259
1260 return false;
1261}
1262
Jamie Madill4928b7c2017-06-20 12:57:39 -04001263void State::setActiveQuery(const Context *context, GLenum target, Query *query)
Shannon Woods53a94a82014-06-24 15:20:36 -04001264{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001265 mActiveQueries[target].set(context, query);
Shannon Woods53a94a82014-06-24 15:20:36 -04001266}
1267
1268GLuint State::getActiveQueryId(GLenum target) const
1269{
1270 const Query *query = getActiveQuery(target);
1271 return (query ? query->id() : 0u);
1272}
1273
1274Query *State::getActiveQuery(GLenum target) const
1275{
Jamie Madill5864ac22015-01-12 14:43:07 -05001276 const auto it = mActiveQueries.find(target);
Shannon Woods53a94a82014-06-24 15:20:36 -04001277
Jamie Madill5864ac22015-01-12 14:43:07 -05001278 // All query types should already exist in the activeQueries map
1279 ASSERT(it != mActiveQueries.end());
1280
1281 return it->second.get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001282}
1283
Corentin Wallez336129f2017-10-17 15:55:40 -04001284void State::setBufferBinding(const Context *context, BufferBinding target, Buffer *buffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001285{
Corentin Wallez336129f2017-10-17 15:55:40 -04001286 switch (target)
1287 {
1288 case BufferBinding::PixelPack:
James Darpiniane8a93c62018-01-04 18:02:24 -08001289 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Corentin Wallez336129f2017-10-17 15:55:40 -04001290 mDirtyBits.set(DIRTY_BIT_PACK_BUFFER_BINDING);
1291 break;
1292 case BufferBinding::PixelUnpack:
James Darpiniane8a93c62018-01-04 18:02:24 -08001293 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Corentin Wallez336129f2017-10-17 15:55:40 -04001294 mDirtyBits.set(DIRTY_BIT_UNPACK_BUFFER_BINDING);
1295 break;
1296 case BufferBinding::DrawIndirect:
James Darpiniane8a93c62018-01-04 18:02:24 -08001297 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Corentin Wallez336129f2017-10-17 15:55:40 -04001298 mDirtyBits.set(DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING);
1299 break;
Qin Jiajiaa98a2812017-11-30 18:12:06 +08001300 case BufferBinding::DispatchIndirect:
James Darpiniane8a93c62018-01-04 18:02:24 -08001301 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Qin Jiajiaa98a2812017-11-30 18:12:06 +08001302 mDirtyBits.set(DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
1303 break;
Corentin Wallez336129f2017-10-17 15:55:40 -04001304 case BufferBinding::ElementArray:
1305 getVertexArray()->setElementArrayBuffer(context, buffer);
1306 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1307 break;
Xinghua Cao10a4d432017-11-28 14:46:26 +08001308 case BufferBinding::ShaderStorage:
James Darpiniane8a93c62018-01-04 18:02:24 -08001309 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Xinghua Cao10a4d432017-11-28 14:46:26 +08001310 mDirtyBits.set(DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
1311 break;
Corentin Wallez336129f2017-10-17 15:55:40 -04001312 default:
James Darpiniane8a93c62018-01-04 18:02:24 -08001313 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Corentin Wallez336129f2017-10-17 15:55:40 -04001314 break;
1315 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001316}
James Darpiniane8a93c62018-01-04 18:02:24 -08001317
Corentin Wallez336129f2017-10-17 15:55:40 -04001318void State::setIndexedBufferBinding(const Context *context,
1319 BufferBinding target,
1320 GLuint index,
1321 Buffer *buffer,
1322 GLintptr offset,
1323 GLsizeiptr size)
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001324{
Corentin Wallez336129f2017-10-17 15:55:40 -04001325 setBufferBinding(context, target, buffer);
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001326
Corentin Wallez336129f2017-10-17 15:55:40 -04001327 switch (target)
1328 {
1329 case BufferBinding::TransformFeedback:
1330 mTransformFeedback->bindIndexedBuffer(context, index, buffer, offset, size);
James Darpiniane8a93c62018-01-04 18:02:24 -08001331 setBufferBinding(context, target, buffer);
Corentin Wallez336129f2017-10-17 15:55:40 -04001332 break;
1333 case BufferBinding::Uniform:
James Darpiniane8a93c62018-01-04 18:02:24 -08001334 UpdateBufferBinding(context, &mUniformBuffers[index], buffer, target, offset, size);
Jamie Madillf4141212017-12-12 15:08:07 -05001335 mDirtyBits.set(DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
Corentin Wallez336129f2017-10-17 15:55:40 -04001336 break;
1337 case BufferBinding::AtomicCounter:
James Darpiniane8a93c62018-01-04 18:02:24 -08001338 UpdateBufferBinding(context, &mAtomicCounterBuffers[index], buffer, target, offset,
1339 size);
Corentin Wallez336129f2017-10-17 15:55:40 -04001340 break;
1341 case BufferBinding::ShaderStorage:
James Darpiniane8a93c62018-01-04 18:02:24 -08001342 UpdateBufferBinding(context, &mShaderStorageBuffers[index], buffer, target, offset,
1343 size);
Corentin Wallez336129f2017-10-17 15:55:40 -04001344 break;
1345 default:
1346 UNREACHABLE();
1347 break;
1348 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001349}
1350
Geoff Lang5d124a62015-09-15 13:03:27 -04001351const OffsetBindingPointer<Buffer> &State::getIndexedUniformBuffer(size_t index) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001352{
Shannon Woodsf3acaf92014-09-23 18:07:11 -04001353 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
Geoff Lang5d124a62015-09-15 13:03:27 -04001354 return mUniformBuffers[index];
Gregoire Payen de La Garanderie68694e92015-03-24 14:03:37 +00001355}
1356
Jiajia Qin6eafb042016-12-27 17:04:07 +08001357const OffsetBindingPointer<Buffer> &State::getIndexedAtomicCounterBuffer(size_t index) const
1358{
1359 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
1360 return mAtomicCounterBuffers[index];
1361}
1362
Jiajia Qinf546e7d2017-03-27 14:12:59 +08001363const OffsetBindingPointer<Buffer> &State::getIndexedShaderStorageBuffer(size_t index) const
1364{
1365 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
1366 return mShaderStorageBuffers[index];
1367}
1368
Corentin Wallez336129f2017-10-17 15:55:40 -04001369Buffer *State::getTargetBuffer(BufferBinding target) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001370{
1371 switch (target)
1372 {
Corentin Wallez336129f2017-10-17 15:55:40 -04001373 case BufferBinding::ElementArray:
1374 return getVertexArray()->getElementArrayBuffer().get();
Corentin Wallez336129f2017-10-17 15:55:40 -04001375 default:
1376 return mBoundBuffers[target].get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001377 }
1378}
1379
Jamie Madill4928b7c2017-06-20 12:57:39 -04001380void State::detachBuffer(const Context *context, GLuint bufferName)
Yuly Novikov5807a532015-12-03 13:01:22 -05001381{
James Darpiniane8a93c62018-01-04 18:02:24 -08001382 for (auto target : angle::AllEnums<BufferBinding>())
Yuly Novikov5807a532015-12-03 13:01:22 -05001383 {
James Darpiniane8a93c62018-01-04 18:02:24 -08001384 if (mBoundBuffers[target].id() == bufferName)
Yuly Novikov5807a532015-12-03 13:01:22 -05001385 {
James Darpiniane8a93c62018-01-04 18:02:24 -08001386 UpdateBufferBinding(context, &mBoundBuffers[target], nullptr, target);
Yuly Novikov5807a532015-12-03 13:01:22 -05001387 }
1388 }
1389
1390 TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
1391 if (curTransformFeedback)
1392 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001393 curTransformFeedback->detachBuffer(context, bufferName);
Yuly Novikov5807a532015-12-03 13:01:22 -05001394 }
1395
Jamie Madill4928b7c2017-06-20 12:57:39 -04001396 getVertexArray()->detachBuffer(context, bufferName);
James Darpiniane8a93c62018-01-04 18:02:24 -08001397
1398 for (auto &buf : mUniformBuffers)
1399 {
1400 if (buf.id() == bufferName)
1401 {
1402 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::Uniform);
1403 }
1404 }
1405
1406 for (auto &buf : mAtomicCounterBuffers)
1407 {
1408 if (buf.id() == bufferName)
1409 {
1410 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::AtomicCounter);
1411 }
1412 }
1413
1414 for (auto &buf : mShaderStorageBuffers)
1415 {
1416 if (buf.id() == bufferName)
1417 {
1418 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::ShaderStorage);
1419 }
1420 }
Yuly Novikov5807a532015-12-03 13:01:22 -05001421}
1422
Shannon Woods53a94a82014-06-24 15:20:36 -04001423void State::setEnableVertexAttribArray(unsigned int attribNum, bool enabled)
1424{
1425 getVertexArray()->enableAttribute(attribNum, enabled);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001426 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001427}
1428
1429void State::setVertexAttribf(GLuint index, const GLfloat values[4])
1430{
Shannon Woods23e05002014-09-22 19:07:27 -04001431 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001432 mVertexAttribCurrentValues[index].setFloatValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001433 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1434 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001435 mCurrentValuesTypeMask.setIndex(GL_FLOAT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001436}
1437
1438void State::setVertexAttribu(GLuint index, const GLuint values[4])
1439{
Shannon Woods23e05002014-09-22 19:07:27 -04001440 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001441 mVertexAttribCurrentValues[index].setUnsignedIntValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001442 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1443 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001444 mCurrentValuesTypeMask.setIndex(GL_UNSIGNED_INT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001445}
1446
1447void State::setVertexAttribi(GLuint index, const GLint values[4])
1448{
Shannon Woods23e05002014-09-22 19:07:27 -04001449 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001450 mVertexAttribCurrentValues[index].setIntValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001451 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1452 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001453 mCurrentValuesTypeMask.setIndex(GL_INT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001454}
1455
Shaodde78e82017-05-22 14:13:27 +08001456void State::setVertexAttribPointer(const Context *context,
1457 unsigned int attribNum,
1458 Buffer *boundBuffer,
1459 GLint size,
1460 GLenum type,
1461 bool normalized,
1462 bool pureInteger,
1463 GLsizei stride,
1464 const void *pointer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001465{
Shaodde78e82017-05-22 14:13:27 +08001466 getVertexArray()->setVertexAttribPointer(context, attribNum, boundBuffer, size, type,
1467 normalized, pureInteger, stride, pointer);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001468 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Jamie Madill0b9e9032015-08-17 11:51:52 +00001469}
1470
Shaodde78e82017-05-22 14:13:27 +08001471void State::setVertexAttribDivisor(const Context *context, GLuint index, GLuint divisor)
Jamie Madill0b9e9032015-08-17 11:51:52 +00001472{
Shaodde78e82017-05-22 14:13:27 +08001473 getVertexArray()->setVertexAttribDivisor(context, index, divisor);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001474 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001475}
1476
Jamie Madill6de51852017-04-12 09:53:01 -04001477const VertexAttribCurrentValueData &State::getVertexAttribCurrentValue(size_t attribNum) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001478{
Jamie Madill6de51852017-04-12 09:53:01 -04001479 ASSERT(attribNum < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001480 return mVertexAttribCurrentValues[attribNum];
1481}
1482
Jamie Madillcac94a92017-11-10 10:09:32 -05001483const std::vector<VertexAttribCurrentValueData> &State::getVertexAttribCurrentValues() const
1484{
1485 return mVertexAttribCurrentValues;
1486}
1487
Shannon Woods53a94a82014-06-24 15:20:36 -04001488const void *State::getVertexAttribPointer(unsigned int attribNum) const
1489{
1490 return getVertexArray()->getVertexAttribute(attribNum).pointer;
1491}
1492
1493void State::setPackAlignment(GLint alignment)
1494{
1495 mPack.alignment = alignment;
Jamie Madillc67323a2017-11-02 23:11:41 -04001496 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001497}
1498
1499GLint State::getPackAlignment() const
1500{
1501 return mPack.alignment;
1502}
1503
1504void State::setPackReverseRowOrder(bool reverseRowOrder)
1505{
1506 mPack.reverseRowOrder = reverseRowOrder;
Jamie Madillc67323a2017-11-02 23:11:41 -04001507 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001508}
1509
1510bool State::getPackReverseRowOrder() const
1511{
1512 return mPack.reverseRowOrder;
1513}
1514
Minmin Gongadff67b2015-10-14 10:34:45 -04001515void State::setPackRowLength(GLint rowLength)
1516{
1517 mPack.rowLength = rowLength;
Jamie Madillc67323a2017-11-02 23:11:41 -04001518 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001519}
1520
1521GLint State::getPackRowLength() const
1522{
1523 return mPack.rowLength;
1524}
1525
1526void State::setPackSkipRows(GLint skipRows)
1527{
1528 mPack.skipRows = skipRows;
Jamie Madillc67323a2017-11-02 23:11:41 -04001529 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001530}
1531
1532GLint State::getPackSkipRows() const
1533{
1534 return mPack.skipRows;
1535}
1536
1537void State::setPackSkipPixels(GLint skipPixels)
1538{
1539 mPack.skipPixels = skipPixels;
Jamie Madillc67323a2017-11-02 23:11:41 -04001540 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001541}
1542
1543GLint State::getPackSkipPixels() const
1544{
1545 return mPack.skipPixels;
1546}
1547
Shannon Woods53a94a82014-06-24 15:20:36 -04001548const PixelPackState &State::getPackState() const
1549{
1550 return mPack;
1551}
1552
Jamie Madill87de3622015-03-16 10:41:44 -04001553PixelPackState &State::getPackState()
1554{
1555 return mPack;
1556}
1557
Shannon Woods53a94a82014-06-24 15:20:36 -04001558void State::setUnpackAlignment(GLint alignment)
1559{
1560 mUnpack.alignment = alignment;
Jamie Madillc67323a2017-11-02 23:11:41 -04001561 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001562}
1563
1564GLint State::getUnpackAlignment() const
1565{
1566 return mUnpack.alignment;
1567}
1568
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001569void State::setUnpackRowLength(GLint rowLength)
1570{
1571 mUnpack.rowLength = rowLength;
Jamie Madillc67323a2017-11-02 23:11:41 -04001572 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001573}
1574
1575GLint State::getUnpackRowLength() const
1576{
1577 return mUnpack.rowLength;
1578}
1579
Minmin Gongadff67b2015-10-14 10:34:45 -04001580void State::setUnpackImageHeight(GLint imageHeight)
1581{
1582 mUnpack.imageHeight = imageHeight;
Jamie Madillc67323a2017-11-02 23:11:41 -04001583 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001584}
1585
1586GLint State::getUnpackImageHeight() const
1587{
1588 return mUnpack.imageHeight;
1589}
1590
1591void State::setUnpackSkipImages(GLint skipImages)
1592{
1593 mUnpack.skipImages = skipImages;
Jamie Madillc67323a2017-11-02 23:11:41 -04001594 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001595}
1596
1597GLint State::getUnpackSkipImages() const
1598{
1599 return mUnpack.skipImages;
1600}
1601
1602void State::setUnpackSkipRows(GLint skipRows)
1603{
1604 mUnpack.skipRows = skipRows;
Jamie Madillc67323a2017-11-02 23:11:41 -04001605 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001606}
1607
1608GLint State::getUnpackSkipRows() const
1609{
1610 return mUnpack.skipRows;
1611}
1612
1613void State::setUnpackSkipPixels(GLint skipPixels)
1614{
1615 mUnpack.skipPixels = skipPixels;
Jamie Madillc67323a2017-11-02 23:11:41 -04001616 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001617}
1618
1619GLint State::getUnpackSkipPixels() const
1620{
1621 return mUnpack.skipPixels;
1622}
1623
Shannon Woods53a94a82014-06-24 15:20:36 -04001624const PixelUnpackState &State::getUnpackState() const
1625{
1626 return mUnpack;
1627}
1628
Jamie Madill67102f02015-03-16 10:41:42 -04001629PixelUnpackState &State::getUnpackState()
1630{
1631 return mUnpack;
1632}
1633
Geoff Lang70d0f492015-12-10 17:45:46 -05001634const Debug &State::getDebug() const
1635{
1636 return mDebug;
1637}
1638
1639Debug &State::getDebug()
1640{
1641 return mDebug;
1642}
1643
Sami Väisänena797e062016-05-12 15:23:40 +03001644void State::setCoverageModulation(GLenum components)
1645{
1646 mCoverageModulation = components;
1647 mDirtyBits.set(DIRTY_BIT_COVERAGE_MODULATION);
1648}
1649
1650GLenum State::getCoverageModulation() const
1651{
1652 return mCoverageModulation;
1653}
1654
Sami Väisänene45e53b2016-05-25 10:36:04 +03001655void State::loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix)
1656{
1657 if (matrixMode == GL_PATH_MODELVIEW_CHROMIUM)
1658 {
1659 memcpy(mPathMatrixMV, matrix, 16 * sizeof(GLfloat));
1660 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_MATRIX_MV);
1661 }
1662 else if (matrixMode == GL_PATH_PROJECTION_CHROMIUM)
1663 {
1664 memcpy(mPathMatrixProj, matrix, 16 * sizeof(GLfloat));
1665 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_MATRIX_PROJ);
1666 }
1667 else
1668 {
1669 UNREACHABLE();
1670 }
1671}
1672
1673const GLfloat *State::getPathRenderingMatrix(GLenum which) const
1674{
1675 if (which == GL_PATH_MODELVIEW_MATRIX_CHROMIUM)
1676 {
1677 return mPathMatrixMV;
1678 }
1679 else if (which == GL_PATH_PROJECTION_MATRIX_CHROMIUM)
1680 {
1681 return mPathMatrixProj;
1682 }
1683
1684 UNREACHABLE();
1685 return nullptr;
1686}
1687
1688void State::setPathStencilFunc(GLenum func, GLint ref, GLuint mask)
1689{
1690 mPathStencilFunc = func;
1691 mPathStencilRef = ref;
1692 mPathStencilMask = mask;
1693 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_STENCIL_STATE);
1694}
1695
1696GLenum State::getPathStencilFunc() const
1697{
1698 return mPathStencilFunc;
1699}
1700
1701GLint State::getPathStencilRef() const
1702{
1703 return mPathStencilRef;
1704}
1705
1706GLuint State::getPathStencilMask() const
1707{
1708 return mPathStencilMask;
1709}
1710
Geoff Lang1d2c41d2016-10-19 16:14:46 -07001711void State::setFramebufferSRGB(bool sRGB)
1712{
1713 mFramebufferSRGB = sRGB;
1714 mDirtyBits.set(DIRTY_BIT_FRAMEBUFFER_SRGB);
1715}
1716
1717bool State::getFramebufferSRGB() const
1718{
1719 return mFramebufferSRGB;
1720}
1721
Shannon Woods53a94a82014-06-24 15:20:36 -04001722void State::getBooleanv(GLenum pname, GLboolean *params)
1723{
1724 switch (pname)
1725 {
1726 case GL_SAMPLE_COVERAGE_INVERT: *params = mSampleCoverageInvert; break;
1727 case GL_DEPTH_WRITEMASK: *params = mDepthStencil.depthMask; break;
1728 case GL_COLOR_WRITEMASK:
1729 params[0] = mBlend.colorMaskRed;
1730 params[1] = mBlend.colorMaskGreen;
1731 params[2] = mBlend.colorMaskBlue;
1732 params[3] = mBlend.colorMaskAlpha;
1733 break;
Corentin Wallez2e568cf2017-09-18 17:05:22 -04001734 case GL_CULL_FACE:
1735 *params = mRasterizer.cullFace;
1736 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001737 case GL_POLYGON_OFFSET_FILL: *params = mRasterizer.polygonOffsetFill; break;
1738 case GL_SAMPLE_ALPHA_TO_COVERAGE: *params = mBlend.sampleAlphaToCoverage; break;
1739 case GL_SAMPLE_COVERAGE: *params = mSampleCoverage; break;
Jiawei Shaodb342272017-09-27 10:21:45 +08001740 case GL_SAMPLE_MASK:
1741 *params = mSampleMask;
1742 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001743 case GL_SCISSOR_TEST: *params = mScissorTest; break;
1744 case GL_STENCIL_TEST: *params = mDepthStencil.stencilTest; break;
1745 case GL_DEPTH_TEST: *params = mDepthStencil.depthTest; break;
1746 case GL_BLEND: *params = mBlend.blend; break;
1747 case GL_DITHER: *params = mBlend.dither; break;
Geoff Langbb0a0bb2015-03-27 12:16:57 -04001748 case GL_TRANSFORM_FEEDBACK_ACTIVE: *params = getCurrentTransformFeedback()->isActive() ? GL_TRUE : GL_FALSE; break;
1749 case GL_TRANSFORM_FEEDBACK_PAUSED: *params = getCurrentTransformFeedback()->isPaused() ? GL_TRUE : GL_FALSE; break;
Jamie Madille2cd53d2015-10-27 11:15:46 -04001750 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1751 *params = mPrimitiveRestart;
1752 break;
Geoff Langab831f02015-12-01 09:39:10 -05001753 case GL_RASTERIZER_DISCARD:
1754 *params = isRasterizerDiscardEnabled() ? GL_TRUE : GL_FALSE;
1755 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001756 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
1757 *params = mDebug.isOutputSynchronous() ? GL_TRUE : GL_FALSE;
1758 break;
1759 case GL_DEBUG_OUTPUT:
1760 *params = mDebug.isOutputEnabled() ? GL_TRUE : GL_FALSE;
1761 break;
Sami Väisänen74c23472016-05-09 17:30:30 +03001762 case GL_MULTISAMPLE_EXT:
1763 *params = mMultiSampling;
1764 break;
1765 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1766 *params = mSampleAlphaToOne;
1767 break;
Geoff Langf41a7152016-09-19 15:11:17 -04001768 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
1769 *params = isBindGeneratesResourceEnabled() ? GL_TRUE : GL_FALSE;
1770 break;
Geoff Langfeb8c682017-02-13 16:07:35 -05001771 case GL_CLIENT_ARRAYS_ANGLE:
1772 *params = areClientArraysEnabled() ? GL_TRUE : GL_FALSE;
1773 break;
Geoff Lang1d2c41d2016-10-19 16:14:46 -07001774 case GL_FRAMEBUFFER_SRGB_EXT:
1775 *params = getFramebufferSRGB() ? GL_TRUE : GL_FALSE;
1776 break;
Geoff Langb433e872017-10-05 14:01:47 -04001777 case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
Jamie Madille08a1d32017-03-07 17:24:06 -05001778 *params = mRobustResourceInit ? GL_TRUE : GL_FALSE;
1779 break;
Jamie Madillc43be722017-07-13 16:22:14 -04001780 case GL_PROGRAM_CACHE_ENABLED_ANGLE:
1781 *params = mProgramBinaryCacheEnabled ? GL_TRUE : GL_FALSE;
1782 break;
1783
Shannon Woods53a94a82014-06-24 15:20:36 -04001784 default:
1785 UNREACHABLE();
1786 break;
1787 }
1788}
1789
1790void State::getFloatv(GLenum pname, GLfloat *params)
1791{
1792 // Please note: DEPTH_CLEAR_VALUE is included in our internal getFloatv implementation
1793 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1794 // GetIntegerv as its native query function. As it would require conversion in any
1795 // case, this should make no difference to the calling application.
1796 switch (pname)
1797 {
1798 case GL_LINE_WIDTH: *params = mLineWidth; break;
1799 case GL_SAMPLE_COVERAGE_VALUE: *params = mSampleCoverageValue; break;
1800 case GL_DEPTH_CLEAR_VALUE: *params = mDepthClearValue; break;
1801 case GL_POLYGON_OFFSET_FACTOR: *params = mRasterizer.polygonOffsetFactor; break;
1802 case GL_POLYGON_OFFSET_UNITS: *params = mRasterizer.polygonOffsetUnits; break;
1803 case GL_DEPTH_RANGE:
1804 params[0] = mNearZ;
1805 params[1] = mFarZ;
1806 break;
1807 case GL_COLOR_CLEAR_VALUE:
1808 params[0] = mColorClearValue.red;
1809 params[1] = mColorClearValue.green;
1810 params[2] = mColorClearValue.blue;
1811 params[3] = mColorClearValue.alpha;
1812 break;
1813 case GL_BLEND_COLOR:
1814 params[0] = mBlendColor.red;
1815 params[1] = mBlendColor.green;
1816 params[2] = mBlendColor.blue;
1817 params[3] = mBlendColor.alpha;
1818 break;
Sami Väisänen74c23472016-05-09 17:30:30 +03001819 case GL_MULTISAMPLE_EXT:
1820 *params = static_cast<GLfloat>(mMultiSampling);
1821 break;
1822 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1823 *params = static_cast<GLfloat>(mSampleAlphaToOne);
Nico Weber41b072b2018-02-09 10:01:32 -05001824 break;
Sami Väisänena797e062016-05-12 15:23:40 +03001825 case GL_COVERAGE_MODULATION_CHROMIUM:
Nico Weber41b072b2018-02-09 10:01:32 -05001826 params[0] = static_cast<GLfloat>(mCoverageModulation);
1827 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001828 default:
1829 UNREACHABLE();
1830 break;
1831 }
1832}
1833
Jamie Madilldd43e6c2017-03-24 14:18:49 -04001834void State::getIntegerv(const Context *context, GLenum pname, GLint *params)
Shannon Woods53a94a82014-06-24 15:20:36 -04001835{
1836 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
1837 {
1838 unsigned int colorAttachment = (pname - GL_DRAW_BUFFER0_EXT);
Shannon Woods2df6a602014-09-26 16:12:07 -04001839 ASSERT(colorAttachment < mMaxDrawBuffers);
Shannon Woods53a94a82014-06-24 15:20:36 -04001840 Framebuffer *framebuffer = mDrawFramebuffer;
1841 *params = framebuffer->getDrawBufferState(colorAttachment);
1842 return;
1843 }
1844
1845 // Please note: DEPTH_CLEAR_VALUE is not included in our internal getIntegerv implementation
1846 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1847 // GetIntegerv as its native query function. As it would require conversion in any
1848 // case, this should make no difference to the calling application. You may find it in
1849 // State::getFloatv.
1850 switch (pname)
1851 {
Corentin Wallez336129f2017-10-17 15:55:40 -04001852 case GL_ARRAY_BUFFER_BINDING:
1853 *params = mBoundBuffers[BufferBinding::Array].id();
1854 break;
1855 case GL_DRAW_INDIRECT_BUFFER_BINDING:
1856 *params = mBoundBuffers[BufferBinding::DrawIndirect].id();
1857 break;
1858 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
1859 *params = getVertexArray()->getElementArrayBuffer().id();
1860 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001861 //case GL_FRAMEBUFFER_BINDING: // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1862 case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE: *params = mDrawFramebuffer->id(); break;
1863 case GL_READ_FRAMEBUFFER_BINDING_ANGLE: *params = mReadFramebuffer->id(); break;
1864 case GL_RENDERBUFFER_BINDING: *params = mRenderbuffer.id(); break;
1865 case GL_VERTEX_ARRAY_BINDING: *params = mVertexArray->id(); break;
Geoff Lang7dd2e102014-11-10 15:19:26 -05001866 case GL_CURRENT_PROGRAM: *params = mProgram ? mProgram->id() : 0; break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001867 case GL_PACK_ALIGNMENT: *params = mPack.alignment; break;
1868 case GL_PACK_REVERSE_ROW_ORDER_ANGLE: *params = mPack.reverseRowOrder; break;
Minmin Gongadff67b2015-10-14 10:34:45 -04001869 case GL_PACK_ROW_LENGTH:
1870 *params = mPack.rowLength;
1871 break;
1872 case GL_PACK_SKIP_ROWS:
1873 *params = mPack.skipRows;
1874 break;
1875 case GL_PACK_SKIP_PIXELS:
1876 *params = mPack.skipPixels;
1877 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001878 case GL_UNPACK_ALIGNMENT: *params = mUnpack.alignment; break;
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001879 case GL_UNPACK_ROW_LENGTH: *params = mUnpack.rowLength; break;
Minmin Gongadff67b2015-10-14 10:34:45 -04001880 case GL_UNPACK_IMAGE_HEIGHT:
1881 *params = mUnpack.imageHeight;
1882 break;
1883 case GL_UNPACK_SKIP_IMAGES:
1884 *params = mUnpack.skipImages;
1885 break;
1886 case GL_UNPACK_SKIP_ROWS:
1887 *params = mUnpack.skipRows;
1888 break;
1889 case GL_UNPACK_SKIP_PIXELS:
1890 *params = mUnpack.skipPixels;
1891 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001892 case GL_GENERATE_MIPMAP_HINT: *params = mGenerateMipmapHint; break;
1893 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: *params = mFragmentShaderDerivativeHint; break;
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001894 case GL_ACTIVE_TEXTURE:
1895 *params = (static_cast<GLint>(mActiveSampler) + GL_TEXTURE0);
1896 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001897 case GL_STENCIL_FUNC: *params = mDepthStencil.stencilFunc; break;
1898 case GL_STENCIL_REF: *params = mStencilRef; break;
jchen10a99ed552017-09-22 08:10:32 +08001899 case GL_STENCIL_VALUE_MASK:
1900 *params = CastMaskValue(context, mDepthStencil.stencilMask);
1901 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001902 case GL_STENCIL_BACK_FUNC: *params = mDepthStencil.stencilBackFunc; break;
1903 case GL_STENCIL_BACK_REF: *params = mStencilBackRef; break;
jchen10a99ed552017-09-22 08:10:32 +08001904 case GL_STENCIL_BACK_VALUE_MASK:
1905 *params = CastMaskValue(context, mDepthStencil.stencilBackMask);
1906 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001907 case GL_STENCIL_FAIL: *params = mDepthStencil.stencilFail; break;
1908 case GL_STENCIL_PASS_DEPTH_FAIL: *params = mDepthStencil.stencilPassDepthFail; break;
1909 case GL_STENCIL_PASS_DEPTH_PASS: *params = mDepthStencil.stencilPassDepthPass; break;
1910 case GL_STENCIL_BACK_FAIL: *params = mDepthStencil.stencilBackFail; break;
1911 case GL_STENCIL_BACK_PASS_DEPTH_FAIL: *params = mDepthStencil.stencilBackPassDepthFail; break;
1912 case GL_STENCIL_BACK_PASS_DEPTH_PASS: *params = mDepthStencil.stencilBackPassDepthPass; break;
1913 case GL_DEPTH_FUNC: *params = mDepthStencil.depthFunc; break;
1914 case GL_BLEND_SRC_RGB: *params = mBlend.sourceBlendRGB; break;
1915 case GL_BLEND_SRC_ALPHA: *params = mBlend.sourceBlendAlpha; break;
1916 case GL_BLEND_DST_RGB: *params = mBlend.destBlendRGB; break;
1917 case GL_BLEND_DST_ALPHA: *params = mBlend.destBlendAlpha; break;
1918 case GL_BLEND_EQUATION_RGB: *params = mBlend.blendEquationRGB; break;
1919 case GL_BLEND_EQUATION_ALPHA: *params = mBlend.blendEquationAlpha; break;
jchen10a99ed552017-09-22 08:10:32 +08001920 case GL_STENCIL_WRITEMASK:
1921 *params = CastMaskValue(context, mDepthStencil.stencilWritemask);
1922 break;
1923 case GL_STENCIL_BACK_WRITEMASK:
1924 *params = CastMaskValue(context, mDepthStencil.stencilBackWritemask);
1925 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001926 case GL_STENCIL_CLEAR_VALUE: *params = mStencilClearValue; break;
Jamie Madill4928b7c2017-06-20 12:57:39 -04001927 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
1928 *params = mReadFramebuffer->getImplementationColorReadType(context);
1929 break;
1930 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
1931 *params = mReadFramebuffer->getImplementationColorReadFormat(context);
1932 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001933 case GL_SAMPLE_BUFFERS:
1934 case GL_SAMPLES:
1935 {
Jamie Madill81c2e252017-09-09 23:32:46 -04001936 Framebuffer *framebuffer = mDrawFramebuffer;
Jamie Madilldd43e6c2017-03-24 14:18:49 -04001937 if (framebuffer->checkStatus(context) == GL_FRAMEBUFFER_COMPLETE)
Shannon Woods53a94a82014-06-24 15:20:36 -04001938 {
1939 switch (pname)
1940 {
Jamie Madilla0016b72017-07-14 14:30:46 -04001941 case GL_SAMPLE_BUFFERS:
1942 if (framebuffer->getSamples(context) != 0)
1943 {
1944 *params = 1;
1945 }
1946 else
1947 {
1948 *params = 0;
1949 }
1950 break;
1951 case GL_SAMPLES:
1952 *params = framebuffer->getSamples(context);
1953 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001954 }
1955 }
1956 else
1957 {
1958 *params = 0;
1959 }
1960 }
1961 break;
1962 case GL_VIEWPORT:
1963 params[0] = mViewport.x;
1964 params[1] = mViewport.y;
1965 params[2] = mViewport.width;
1966 params[3] = mViewport.height;
1967 break;
1968 case GL_SCISSOR_BOX:
1969 params[0] = mScissor.x;
1970 params[1] = mScissor.y;
1971 params[2] = mScissor.width;
1972 params[3] = mScissor.height;
1973 break;
Corentin Wallez2e568cf2017-09-18 17:05:22 -04001974 case GL_CULL_FACE_MODE:
1975 *params = ToGLenum(mRasterizer.cullMode);
1976 break;
1977 case GL_FRONT_FACE:
1978 *params = mRasterizer.frontFace;
1979 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001980 case GL_RED_BITS:
1981 case GL_GREEN_BITS:
1982 case GL_BLUE_BITS:
1983 case GL_ALPHA_BITS:
1984 {
Jamie Madill81c2e252017-09-09 23:32:46 -04001985 Framebuffer *framebuffer = getDrawFramebuffer();
1986 const FramebufferAttachment *colorbuffer = framebuffer->getFirstColorbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04001987
1988 if (colorbuffer)
1989 {
1990 switch (pname)
1991 {
1992 case GL_RED_BITS: *params = colorbuffer->getRedSize(); break;
1993 case GL_GREEN_BITS: *params = colorbuffer->getGreenSize(); break;
1994 case GL_BLUE_BITS: *params = colorbuffer->getBlueSize(); break;
1995 case GL_ALPHA_BITS: *params = colorbuffer->getAlphaSize(); break;
1996 }
1997 }
1998 else
1999 {
2000 *params = 0;
2001 }
2002 }
2003 break;
2004 case GL_DEPTH_BITS:
2005 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002006 const Framebuffer *framebuffer = getDrawFramebuffer();
2007 const FramebufferAttachment *depthbuffer = framebuffer->getDepthbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04002008
2009 if (depthbuffer)
2010 {
2011 *params = depthbuffer->getDepthSize();
2012 }
2013 else
2014 {
2015 *params = 0;
2016 }
2017 }
2018 break;
2019 case GL_STENCIL_BITS:
2020 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002021 const Framebuffer *framebuffer = getDrawFramebuffer();
2022 const FramebufferAttachment *stencilbuffer = framebuffer->getStencilbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04002023
2024 if (stencilbuffer)
2025 {
2026 *params = stencilbuffer->getStencilSize();
2027 }
2028 else
2029 {
2030 *params = 0;
2031 }
2032 }
2033 break;
2034 case GL_TEXTURE_BINDING_2D:
Shannon Woods2df6a602014-09-26 16:12:07 -04002035 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002036 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::_2D);
Shannon Woods53a94a82014-06-24 15:20:36 -04002037 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04002038 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
2039 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2040 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002041 TextureType::Rectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04002042 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002043 case GL_TEXTURE_BINDING_CUBE_MAP:
Shannon Woods2df6a602014-09-26 16:12:07 -04002044 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Cooper Partin4d61f7e2015-08-12 10:56:50 -07002045 *params =
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002046 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::CubeMap);
Shannon Woods53a94a82014-06-24 15:20:36 -04002047 break;
2048 case GL_TEXTURE_BINDING_3D:
Shannon Woods2df6a602014-09-26 16:12:07 -04002049 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002050 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::_3D);
Shannon Woods53a94a82014-06-24 15:20:36 -04002051 break;
2052 case GL_TEXTURE_BINDING_2D_ARRAY:
Shannon Woods2df6a602014-09-26 16:12:07 -04002053 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Cooper Partin4d61f7e2015-08-12 10:56:50 -07002054 *params =
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002055 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::_2DArray);
Shannon Woods53a94a82014-06-24 15:20:36 -04002056 break;
JiangYizhou24fe74c2017-07-06 16:56:50 +08002057 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
2058 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2059 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002060 TextureType::_2DMultisample);
JiangYizhou24fe74c2017-07-06 16:56:50 +08002061 break;
John Bauman18319182016-09-28 14:22:27 -07002062 case GL_TEXTURE_BINDING_EXTERNAL_OES:
2063 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002064 *params =
2065 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::External);
John Bauman18319182016-09-28 14:22:27 -07002066 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002067 case GL_UNIFORM_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002068 *params = mBoundBuffers[BufferBinding::Uniform].id();
2069 break;
Frank Henigman22581ff2015-11-06 14:25:54 -05002070 case GL_TRANSFORM_FEEDBACK_BINDING:
James Darpiniane8a93c62018-01-04 18:02:24 -08002071 *params = mTransformFeedback.id();
2072 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002073 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
James Darpiniane8a93c62018-01-04 18:02:24 -08002074 *params = mBoundBuffers[BufferBinding::TransformFeedback].id();
Corentin Wallez336129f2017-10-17 15:55:40 -04002075 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002076 case GL_COPY_READ_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002077 *params = mBoundBuffers[BufferBinding::CopyRead].id();
2078 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002079 case GL_COPY_WRITE_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002080 *params = mBoundBuffers[BufferBinding::CopyWrite].id();
2081 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002082 case GL_PIXEL_PACK_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002083 *params = mBoundBuffers[BufferBinding::PixelPack].id();
Corentin Wallezcda6af12017-10-30 19:20:37 -04002084 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002085 case GL_PIXEL_UNPACK_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002086 *params = mBoundBuffers[BufferBinding::PixelUnpack].id();
Corentin Wallezcda6af12017-10-30 19:20:37 -04002087 break;
Olli Etuaho86821db2016-03-04 12:05:47 +02002088 case GL_READ_BUFFER:
2089 *params = mReadFramebuffer->getReadBufferState();
2090 break;
2091 case GL_SAMPLER_BINDING:
2092 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2093 *params = getSamplerId(static_cast<GLuint>(mActiveSampler));
2094 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05002095 case GL_DEBUG_LOGGED_MESSAGES:
2096 *params = static_cast<GLint>(mDebug.getMessageCount());
2097 break;
2098 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
2099 *params = static_cast<GLint>(mDebug.getNextMessageLength());
2100 break;
2101 case GL_DEBUG_GROUP_STACK_DEPTH:
2102 *params = static_cast<GLint>(mDebug.getGroupStackDepth());
2103 break;
Sami Väisänen74c23472016-05-09 17:30:30 +03002104 case GL_MULTISAMPLE_EXT:
2105 *params = static_cast<GLint>(mMultiSampling);
2106 break;
2107 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
2108 *params = static_cast<GLint>(mSampleAlphaToOne);
Nico Weber41b072b2018-02-09 10:01:32 -05002109 break;
Sami Väisänena797e062016-05-12 15:23:40 +03002110 case GL_COVERAGE_MODULATION_CHROMIUM:
2111 *params = static_cast<GLint>(mCoverageModulation);
Sami Väisänen74c23472016-05-09 17:30:30 +03002112 break;
Jiajia Qin6eafb042016-12-27 17:04:07 +08002113 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002114 *params = mBoundBuffers[BufferBinding::AtomicCounter].id();
Jiajia Qin6eafb042016-12-27 17:04:07 +08002115 break;
Jiajia Qinf546e7d2017-03-27 14:12:59 +08002116 case GL_SHADER_STORAGE_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002117 *params = mBoundBuffers[BufferBinding::ShaderStorage].id();
Jiajia Qinf546e7d2017-03-27 14:12:59 +08002118 break;
Qin Jiajiaa98a2812017-11-30 18:12:06 +08002119 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
2120 *params = mBoundBuffers[BufferBinding::DispatchIndirect].id();
2121 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002122 default:
2123 UNREACHABLE();
2124 break;
2125 }
2126}
2127
Geoff Lang70d0f492015-12-10 17:45:46 -05002128void State::getPointerv(GLenum pname, void **params) const
2129{
2130 switch (pname)
2131 {
2132 case GL_DEBUG_CALLBACK_FUNCTION:
2133 *params = reinterpret_cast<void *>(mDebug.getCallback());
2134 break;
2135 case GL_DEBUG_CALLBACK_USER_PARAM:
2136 *params = const_cast<void *>(mDebug.getUserParam());
2137 break;
2138 default:
2139 UNREACHABLE();
2140 break;
2141 }
2142}
2143
Martin Radev66fb8202016-07-28 11:45:20 +03002144void State::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods53a94a82014-06-24 15:20:36 -04002145{
2146 switch (target)
2147 {
2148 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002149 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2150 *data = mTransformFeedback->getIndexedBuffer(index).id();
2151 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002152 case GL_UNIFORM_BUFFER_BINDING:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002153 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2154 *data = mUniformBuffers[index].id();
2155 break;
2156 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
2157 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2158 *data = mAtomicCounterBuffers[index].id();
2159 break;
Jiajia Qinf546e7d2017-03-27 14:12:59 +08002160 case GL_SHADER_STORAGE_BUFFER_BINDING:
2161 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2162 *data = mShaderStorageBuffers[index].id();
2163 break;
Shao80957d92017-02-20 21:25:59 +08002164 case GL_VERTEX_BINDING_BUFFER:
2165 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
Martin Radevdd5f27e2017-06-07 10:17:09 +03002166 *data = mVertexArray->getVertexBinding(index).getBuffer().id();
Shao80957d92017-02-20 21:25:59 +08002167 break;
2168 case GL_VERTEX_BINDING_DIVISOR:
2169 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
Martin Radevdd5f27e2017-06-07 10:17:09 +03002170 *data = mVertexArray->getVertexBinding(index).getDivisor();
Shao80957d92017-02-20 21:25:59 +08002171 break;
2172 case GL_VERTEX_BINDING_OFFSET:
2173 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
Martin Radevdd5f27e2017-06-07 10:17:09 +03002174 *data = static_cast<GLuint>(mVertexArray->getVertexBinding(index).getOffset());
Shao80957d92017-02-20 21:25:59 +08002175 break;
2176 case GL_VERTEX_BINDING_STRIDE:
2177 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
Martin Radevdd5f27e2017-06-07 10:17:09 +03002178 *data = mVertexArray->getVertexBinding(index).getStride();
Shao80957d92017-02-20 21:25:59 +08002179 break;
Jiawei Shaodb342272017-09-27 10:21:45 +08002180 case GL_SAMPLE_MASK_VALUE:
2181 ASSERT(static_cast<size_t>(index) < mSampleMaskValues.size());
2182 *data = mSampleMaskValues[index];
2183 break;
Xinghua Cao9c8e1a32017-12-06 17:59:58 +08002184 case GL_IMAGE_BINDING_NAME:
2185 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2186 *data = mImageUnits[index].texture.id();
2187 break;
2188 case GL_IMAGE_BINDING_LEVEL:
2189 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2190 *data = mImageUnits[index].level;
2191 break;
2192 case GL_IMAGE_BINDING_LAYER:
2193 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2194 *data = mImageUnits[index].layer;
2195 break;
2196 case GL_IMAGE_BINDING_ACCESS:
2197 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2198 *data = mImageUnits[index].access;
2199 break;
2200 case GL_IMAGE_BINDING_FORMAT:
2201 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2202 *data = mImageUnits[index].format;
2203 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002204 default:
Martin Radev66fb8202016-07-28 11:45:20 +03002205 UNREACHABLE();
2206 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002207 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002208}
2209
Martin Radev66fb8202016-07-28 11:45:20 +03002210void State::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods53a94a82014-06-24 15:20:36 -04002211{
2212 switch (target)
2213 {
2214 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002215 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2216 *data = mTransformFeedback->getIndexedBuffer(index).getOffset();
2217 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002218 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002219 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2220 *data = mTransformFeedback->getIndexedBuffer(index).getSize();
2221 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002222 case GL_UNIFORM_BUFFER_START:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002223 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2224 *data = mUniformBuffers[index].getOffset();
2225 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002226 case GL_UNIFORM_BUFFER_SIZE:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002227 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2228 *data = mUniformBuffers[index].getSize();
2229 break;
2230 case GL_ATOMIC_COUNTER_BUFFER_START:
2231 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2232 *data = mAtomicCounterBuffers[index].getOffset();
2233 break;
2234 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
2235 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2236 *data = mAtomicCounterBuffers[index].getSize();
2237 break;
Jiajia Qinf546e7d2017-03-27 14:12:59 +08002238 case GL_SHADER_STORAGE_BUFFER_START:
2239 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2240 *data = mShaderStorageBuffers[index].getOffset();
2241 break;
2242 case GL_SHADER_STORAGE_BUFFER_SIZE:
2243 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2244 *data = mShaderStorageBuffers[index].getSize();
2245 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002246 default:
Martin Radev66fb8202016-07-28 11:45:20 +03002247 UNREACHABLE();
2248 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002249 }
Martin Radev66fb8202016-07-28 11:45:20 +03002250}
Shannon Woods53a94a82014-06-24 15:20:36 -04002251
Martin Radev66fb8202016-07-28 11:45:20 +03002252void State::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
2253{
Xinghua Cao9c8e1a32017-12-06 17:59:58 +08002254 switch (target)
2255 {
2256 case GL_IMAGE_BINDING_LAYERED:
2257 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2258 *data = mImageUnits[index].layered;
2259 break;
2260 default:
2261 UNREACHABLE();
2262 break;
2263 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002264}
2265
Corentin Wallez336129f2017-10-17 15:55:40 -04002266bool State::hasMappedBuffer(BufferBinding target) const
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002267{
Corentin Wallez336129f2017-10-17 15:55:40 -04002268 if (target == BufferBinding::Array)
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002269 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002270 const VertexArray *vao = getVertexArray();
Jamie Madilleea3a6e2015-04-15 10:02:48 -04002271 const auto &vertexAttribs = vao->getVertexAttributes();
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002272 const auto &vertexBindings = vao->getVertexBindings();
Jamie Madilld078c682018-01-02 11:50:24 -05002273 for (size_t attribIndex : vao->getEnabledAttributesMask())
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002274 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002275 const VertexAttribute &vertexAttrib = vertexAttribs[attribIndex];
Martin Radevdd5f27e2017-06-07 10:17:09 +03002276 auto *boundBuffer = vertexBindings[vertexAttrib.bindingIndex].getBuffer().get();
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002277 if (vertexAttrib.enabled && boundBuffer && boundBuffer->isMapped())
2278 {
2279 return true;
2280 }
2281 }
2282
2283 return false;
2284 }
2285 else
2286 {
2287 Buffer *buffer = getTargetBuffer(target);
2288 return (buffer && buffer->isMapped());
2289 }
2290}
2291
Jamie Madillbc918e72018-03-08 09:47:21 -05002292Error State::syncDirtyObjects(const Context *context)
Jamie Madillc9d442d2016-01-20 11:17:24 -05002293{
2294 if (!mDirtyObjects.any())
Jamie Madillbc918e72018-03-08 09:47:21 -05002295 return NoError();
Jamie Madillc9d442d2016-01-20 11:17:24 -05002296
Jamie Madillbc918e72018-03-08 09:47:21 -05002297 return syncDirtyObjects(context, mDirtyObjects);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002298}
2299
Jamie Madillbc918e72018-03-08 09:47:21 -05002300Error State::syncDirtyObjects(const Context *context, const DirtyObjects &bitset)
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002301{
Jamie Madill6de51852017-04-12 09:53:01 -04002302 for (auto dirtyObject : bitset)
Jamie Madillc9d442d2016-01-20 11:17:24 -05002303 {
2304 switch (dirtyObject)
2305 {
2306 case DIRTY_OBJECT_READ_FRAMEBUFFER:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002307 ASSERT(mReadFramebuffer);
Jamie Madill19fa1c62018-03-08 09:47:21 -05002308 ANGLE_TRY(mReadFramebuffer->syncState(context));
Jamie Madillc9d442d2016-01-20 11:17:24 -05002309 break;
2310 case DIRTY_OBJECT_DRAW_FRAMEBUFFER:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002311 ASSERT(mDrawFramebuffer);
Jamie Madill19fa1c62018-03-08 09:47:21 -05002312 ANGLE_TRY(mDrawFramebuffer->syncState(context));
Jamie Madillc9d442d2016-01-20 11:17:24 -05002313 break;
2314 case DIRTY_OBJECT_VERTEX_ARRAY:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002315 ASSERT(mVertexArray);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002316 mVertexArray->syncState(context);
Jamie Madillc9d442d2016-01-20 11:17:24 -05002317 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002318 case DIRTY_OBJECT_PROGRAM_TEXTURES:
2319 syncProgramTextures(context);
2320 break;
2321
Jamie Madillc9d442d2016-01-20 11:17:24 -05002322 default:
2323 UNREACHABLE();
2324 break;
2325 }
2326 }
2327
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002328 mDirtyObjects &= ~bitset;
Jamie Madillbc918e72018-03-08 09:47:21 -05002329 return NoError();
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002330}
2331
Jamie Madill81c2e252017-09-09 23:32:46 -04002332void State::syncProgramTextures(const Context *context)
2333{
Jamie Madill81c2e252017-09-09 23:32:46 -04002334 // TODO(jmadill): Fine-grained updates.
2335 if (!mProgram)
2336 {
2337 return;
2338 }
2339
2340 ASSERT(mDirtyObjects[DIRTY_OBJECT_PROGRAM_TEXTURES]);
2341 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
2342
Jamie Madill0f80ed82017-09-19 00:24:56 -04002343 ActiveTextureMask newActiveTextures;
2344
Geoff Lange51ba632017-11-21 11:45:25 -05002345 // Initialize to the 'Initialized' state and set to 'MayNeedInit' if any texture is not
2346 // initialized.
2347 mCachedTexturesInitState = InitState::Initialized;
2348
Jamie Madill81c2e252017-09-09 23:32:46 -04002349 for (const SamplerBinding &samplerBinding : mProgram->getSamplerBindings())
2350 {
2351 if (samplerBinding.unreferenced)
2352 continue;
2353
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002354 TextureType textureType = samplerBinding.textureType;
Jamie Madill81c2e252017-09-09 23:32:46 -04002355 for (GLuint textureUnitIndex : samplerBinding.boundTextureUnits)
2356 {
2357 Texture *texture = getSamplerTexture(textureUnitIndex, textureType);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002358 Sampler *sampler = getSampler(textureUnitIndex);
Jamie Madill0f80ed82017-09-19 00:24:56 -04002359 ASSERT(static_cast<size_t>(textureUnitIndex) < mCompleteTextureCache.size());
2360 ASSERT(static_cast<size_t>(textureUnitIndex) < newActiveTextures.size());
Jamie Madill81c2e252017-09-09 23:32:46 -04002361
Jamie Madill42975642017-10-12 12:31:51 -04002362 ASSERT(texture);
Jamie Madill81c2e252017-09-09 23:32:46 -04002363
Jamie Madill42975642017-10-12 12:31:51 -04002364 // Mark the texture binding bit as dirty if the texture completeness changes.
2365 // TODO(jmadill): Use specific dirty bit for completeness change.
2366 if (texture->isSamplerComplete(context, sampler) &&
2367 !mDrawFramebuffer->hasTextureAttachment(texture))
2368 {
2369 texture->syncState();
2370 mCompleteTextureCache[textureUnitIndex] = texture;
Jamie Madill81c2e252017-09-09 23:32:46 -04002371 }
Jamie Madill42975642017-10-12 12:31:51 -04002372 else
2373 {
2374 mCompleteTextureCache[textureUnitIndex] = nullptr;
2375 }
2376
2377 // Bind the texture unconditionally, to recieve completeness change notifications.
Jamie Madill888081d2018-02-27 00:24:46 -05002378 mCompleteTextureBindings[textureUnitIndex].bind(texture->getSubject());
Jamie Madilla59fc192017-11-02 12:57:58 -04002379 mActiveTexturesMask.set(textureUnitIndex);
Jamie Madill42975642017-10-12 12:31:51 -04002380 newActiveTextures.set(textureUnitIndex);
Jamie Madill81c2e252017-09-09 23:32:46 -04002381
Jamie Madill06ef36b2017-09-09 23:32:46 -04002382 if (sampler != nullptr)
2383 {
2384 sampler->syncState(context);
2385 }
Geoff Lange51ba632017-11-21 11:45:25 -05002386
2387 if (texture->initState() == InitState::MayNeedInit)
2388 {
2389 mCachedTexturesInitState = InitState::MayNeedInit;
2390 }
Jamie Madill81c2e252017-09-09 23:32:46 -04002391 }
2392 }
Jamie Madill0f80ed82017-09-19 00:24:56 -04002393
2394 // Unset now missing textures.
Jamie Madilla59fc192017-11-02 12:57:58 -04002395 ActiveTextureMask negativeMask = mActiveTexturesMask & ~newActiveTextures;
Jamie Madill0f80ed82017-09-19 00:24:56 -04002396 if (negativeMask.any())
2397 {
2398 for (auto textureIndex : negativeMask)
2399 {
2400 mCompleteTextureBindings[textureIndex].reset();
2401 mCompleteTextureCache[textureIndex] = nullptr;
Jamie Madilla59fc192017-11-02 12:57:58 -04002402 mActiveTexturesMask.reset(textureIndex);
Jamie Madill0f80ed82017-09-19 00:24:56 -04002403 }
2404 }
Jamie Madill81c2e252017-09-09 23:32:46 -04002405}
2406
Jamie Madillbc918e72018-03-08 09:47:21 -05002407Error State::syncDirtyObject(const Context *context, GLenum target)
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002408{
2409 DirtyObjects localSet;
2410
2411 switch (target)
2412 {
2413 case GL_READ_FRAMEBUFFER:
2414 localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2415 break;
2416 case GL_DRAW_FRAMEBUFFER:
2417 localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2418 break;
2419 case GL_FRAMEBUFFER:
2420 localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2421 localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2422 break;
2423 case GL_VERTEX_ARRAY:
2424 localSet.set(DIRTY_OBJECT_VERTEX_ARRAY);
2425 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002426 case GL_TEXTURE:
2427 case GL_SAMPLER:
2428 case GL_PROGRAM:
2429 localSet.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
2430 break;
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002431 }
2432
Jamie Madillbc918e72018-03-08 09:47:21 -05002433 return syncDirtyObjects(context, localSet);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002434}
2435
2436void State::setObjectDirty(GLenum target)
2437{
2438 switch (target)
2439 {
2440 case GL_READ_FRAMEBUFFER:
2441 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2442 break;
2443 case GL_DRAW_FRAMEBUFFER:
2444 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2445 break;
2446 case GL_FRAMEBUFFER:
2447 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2448 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2449 break;
2450 case GL_VERTEX_ARRAY:
2451 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
2452 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002453 case GL_TEXTURE:
2454 case GL_SAMPLER:
Jamie Madill81c2e252017-09-09 23:32:46 -04002455 case GL_PROGRAM:
2456 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
2457 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
2458 break;
Jamie Madilla779b612017-07-24 11:46:05 -04002459 }
2460}
2461
Jamie Madill888081d2018-02-27 00:24:46 -05002462void State::setFramebufferDirty(const Framebuffer *framebuffer) const
2463{
2464 if (framebuffer == mReadFramebuffer)
2465 {
2466 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2467 }
2468 if (framebuffer == mDrawFramebuffer)
2469 {
2470 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2471 }
2472}
2473
Jamie Madilla779b612017-07-24 11:46:05 -04002474void State::onProgramExecutableChange(Program *program)
2475{
2476 // OpenGL Spec:
2477 // "If LinkProgram or ProgramBinary successfully re-links a program object
2478 // that was already in use as a result of a previous call to UseProgram, then the
2479 // generated executable code will be installed as part of the current rendering state."
2480 if (program->isLinked() && mProgram == program)
2481 {
2482 mDirtyBits.set(DIRTY_BIT_PROGRAM_EXECUTABLE);
Jamie Madill81c2e252017-09-09 23:32:46 -04002483 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002484 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002485}
Jamie Madillc9d442d2016-01-20 11:17:24 -05002486
Xinghua Cao65ec0b22017-03-28 16:10:52 +08002487void State::setImageUnit(const Context *context,
2488 GLuint unit,
2489 Texture *texture,
2490 GLint level,
2491 GLboolean layered,
2492 GLint layer,
2493 GLenum access,
2494 GLenum format)
2495{
2496 mImageUnits[unit].texture.set(context, texture);
2497 mImageUnits[unit].level = level;
2498 mImageUnits[unit].layered = layered;
2499 mImageUnits[unit].layer = layer;
2500 mImageUnits[unit].access = access;
2501 mImageUnits[unit].format = format;
2502}
2503
2504const ImageUnit &State::getImageUnit(GLuint unit) const
2505{
2506 return mImageUnits[unit];
2507}
2508
Jamie Madill81c2e252017-09-09 23:32:46 -04002509// Handle a dirty texture event.
Jamie Madilld4442552018-02-27 22:03:47 -05002510void State::onSubjectStateChange(const Context *context,
2511 angle::SubjectIndex index,
2512 angle::SubjectMessage message)
Jamie Madill81c2e252017-09-09 23:32:46 -04002513{
2514 // Conservatively assume all textures are dirty.
2515 // TODO(jmadill): More fine-grained update.
2516 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Geoff Lange51ba632017-11-21 11:45:25 -05002517
Jamie Madilld4442552018-02-27 22:03:47 -05002518 if (!mCompleteTextureCache[index] ||
2519 mCompleteTextureCache[index]->initState() == InitState::MayNeedInit)
Geoff Lange51ba632017-11-21 11:45:25 -05002520 {
2521 mCachedTexturesInitState = InitState::MayNeedInit;
2522 }
Jamie Madill81c2e252017-09-09 23:32:46 -04002523}
2524
Jamie Madill05b35b22017-10-03 09:01:44 -04002525Error State::clearUnclearedActiveTextures(const Context *context)
2526{
Jamie Madilla59fc192017-11-02 12:57:58 -04002527 ASSERT(mRobustResourceInit);
Jamie Madill05b35b22017-10-03 09:01:44 -04002528
Geoff Lange51ba632017-11-21 11:45:25 -05002529 if (mCachedTexturesInitState == InitState::Initialized)
2530 {
2531 return NoError();
2532 }
2533
Jamie Madilla59fc192017-11-02 12:57:58 -04002534 for (auto textureIndex : mActiveTexturesMask)
Jamie Madill05b35b22017-10-03 09:01:44 -04002535 {
Jamie Madilla59fc192017-11-02 12:57:58 -04002536 Texture *texture = mCompleteTextureCache[textureIndex];
Jamie Madill05b35b22017-10-03 09:01:44 -04002537 if (texture)
2538 {
2539 ANGLE_TRY(texture->ensureInitialized(context));
2540 }
2541 }
Jamie Madilla59fc192017-11-02 12:57:58 -04002542
Geoff Lange51ba632017-11-21 11:45:25 -05002543 mCachedTexturesInitState = InitState::Initialized;
2544
Jamie Madill05b35b22017-10-03 09:01:44 -04002545 return NoError();
2546}
2547
Jamie Madillc67323a2017-11-02 23:11:41 -04002548AttributesMask State::getAndResetDirtyCurrentValues() const
2549{
2550 AttributesMask retVal = mDirtyCurrentValues;
2551 mDirtyCurrentValues.reset();
2552 return retVal;
2553}
2554
James Darpiniane8a93c62018-01-04 18:02:24 -08002555bool State::isCurrentTransformFeedback(const TransformFeedback *tf) const
2556{
2557 return tf == mTransformFeedback.get();
2558}
2559bool State::isCurrentVertexArray(const VertexArray *va) const
2560{
2561 return va == mVertexArray;
2562}
2563
Jamie Madillc9d442d2016-01-20 11:17:24 -05002564} // namespace gl