blob: 10e52b529c7c0adad3cc8e2fe6920728d136940f [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 <string.h>
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -070012#include <limits>
Sami Väisänene45e53b2016-05-25 10:36:04 +030013
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
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700101State::~State() {}
Geoff Lang76b10c92014-09-05 16:28:14 -0400102
Jamie Madill4928b7c2017-06-20 12:57:39 -0400103void State::initialize(const Context *context,
Geoff Langf41a7152016-09-19 15:11:17 -0400104 bool debug,
Geoff Langfeb8c682017-02-13 16:07:35 -0500105 bool bindGeneratesResource,
Jamie Madille08a1d32017-03-07 17:24:06 -0500106 bool clientArraysEnabled,
Jamie Madillc43be722017-07-13 16:22:14 -0400107 bool robustResourceInit,
108 bool programBinaryCacheEnabled)
Geoff Lang76b10c92014-09-05 16:28:14 -0400109{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700110 const Caps &caps = context->getCaps();
111 const Extensions &extensions = context->getExtensions();
Geoff Lang4751aab2017-10-30 15:14:52 -0400112 const Extensions &nativeExtensions = context->getImplementation()->getNativeExtensions();
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700113 const Version &clientVersion = context->getClientVersion();
Jamie Madill4928b7c2017-06-20 12:57:39 -0400114
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700115 mMaxDrawBuffers = caps.maxDrawBuffers;
Shannon Woods2df6a602014-09-26 16:12:07 -0400116 mMaxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits;
Shannon Woods53a94a82014-06-24 15:20:36 -0400117
Jamie Madillf75ab352015-03-16 10:46:52 -0400118 setColorClearValue(0.0f, 0.0f, 0.0f, 0.0f);
Shannon Woods53a94a82014-06-24 15:20:36 -0400119
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700120 mDepthClearValue = 1.0f;
Shannon Woods53a94a82014-06-24 15:20:36 -0400121 mStencilClearValue = 0;
122
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700123 mScissorTest = false;
124 mScissor.x = 0;
125 mScissor.y = 0;
126 mScissor.width = 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400127 mScissor.height = 0;
128
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700129 mBlendColor.red = 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400130 mBlendColor.green = 0;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700131 mBlendColor.blue = 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400132 mBlendColor.alpha = 0;
133
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700134 mStencilRef = 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400135 mStencilBackRef = 0;
136
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700137 mSampleCoverage = false;
138 mSampleCoverageValue = 1.0f;
Shannon Woods53a94a82014-06-24 15:20:36 -0400139 mSampleCoverageInvert = false;
Jiawei Shaodb342272017-09-27 10:21:45 +0800140
141 mMaxSampleMaskWords = caps.maxSampleMaskWords;
142 mSampleMask = false;
143 mSampleMaskValues.fill(~GLbitfield(0));
144
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700145 mGenerateMipmapHint = GL_DONT_CARE;
Shannon Woods53a94a82014-06-24 15:20:36 -0400146 mFragmentShaderDerivativeHint = GL_DONT_CARE;
147
Geoff Langf41a7152016-09-19 15:11:17 -0400148 mBindGeneratesResource = bindGeneratesResource;
Geoff Langfeb8c682017-02-13 16:07:35 -0500149 mClientArraysEnabled = clientArraysEnabled;
Geoff Langf41a7152016-09-19 15:11:17 -0400150
Shannon Woods53a94a82014-06-24 15:20:36 -0400151 mLineWidth = 1.0f;
152
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700153 mViewport.x = 0;
154 mViewport.y = 0;
155 mViewport.width = 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400156 mViewport.height = 0;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700157 mNearZ = 0.0f;
158 mFarZ = 1.0f;
Shannon Woods53a94a82014-06-24 15:20:36 -0400159
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700160 mBlend.colorMaskRed = true;
Shannon Woods53a94a82014-06-24 15:20:36 -0400161 mBlend.colorMaskGreen = true;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700162 mBlend.colorMaskBlue = true;
Shannon Woods53a94a82014-06-24 15:20:36 -0400163 mBlend.colorMaskAlpha = true;
164
Geoff Lang76b10c92014-09-05 16:28:14 -0400165 mActiveSampler = 0;
166
Shannon Woods23e05002014-09-22 19:07:27 -0400167 mVertexAttribCurrentValues.resize(caps.maxVertexAttributes);
Shannon Woods53a94a82014-06-24 15:20:36 -0400168
Brandon Jonesc405ae72017-12-06 14:15:03 -0800169 // Set all indexes in state attributes type mask to float (default)
170 for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++)
171 {
172 mCurrentValuesTypeMask.setIndex(GL_FLOAT, i);
173 }
174
Geoff Lang4dc3af02016-11-18 14:09:27 -0500175 mUniformBuffers.resize(caps.maxUniformBufferBindings);
Shannon Woodsf3acaf92014-09-23 18:07:11 -0400176
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800177 mSamplerTextures[TextureType::_2D].resize(caps.maxCombinedTextureImageUnits);
178 mSamplerTextures[TextureType::CubeMap].resize(caps.maxCombinedTextureImageUnits);
Geoff Langeb66a6e2016-10-31 13:06:12 -0400179 if (clientVersion >= Version(3, 0))
Shannon Woods53a94a82014-06-24 15:20:36 -0400180 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400181 // TODO: These could also be enabled via extension
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800182 mSamplerTextures[TextureType::_2DArray].resize(caps.maxCombinedTextureImageUnits);
183 mSamplerTextures[TextureType::_3D].resize(caps.maxCombinedTextureImageUnits);
Shannon Woods53a94a82014-06-24 15:20:36 -0400184 }
Geoff Lang3b573612016-10-31 14:08:10 -0400185 if (clientVersion >= Version(3, 1))
186 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800187 mSamplerTextures[TextureType::_2DMultisample].resize(caps.maxCombinedTextureImageUnits);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800188
189 mAtomicCounterBuffers.resize(caps.maxAtomicCounterBufferBindings);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800190 mShaderStorageBuffers.resize(caps.maxShaderStorageBufferBindings);
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800191 mImageUnits.resize(caps.maxImageUnits);
Geoff Lang3b573612016-10-31 14:08:10 -0400192 }
Geoff Lang4751aab2017-10-30 15:14:52 -0400193 if (nativeExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400194 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800195 mSamplerTextures[TextureType::Rectangle].resize(caps.maxCombinedTextureImageUnits);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400196 }
Geoff Lang4751aab2017-10-30 15:14:52 -0400197 if (nativeExtensions.eglImageExternal || nativeExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400198 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800199 mSamplerTextures[TextureType::External].resize(caps.maxCombinedTextureImageUnits);
Ian Ewellbda75592016-04-18 17:25:54 -0400200 }
Jamie Madill81c2e252017-09-09 23:32:46 -0400201 mCompleteTextureCache.resize(caps.maxCombinedTextureImageUnits, nullptr);
202 mCompleteTextureBindings.reserve(caps.maxCombinedTextureImageUnits);
Geoff Lange51ba632017-11-21 11:45:25 -0500203 mCachedTexturesInitState = InitState::MayNeedInit;
Jamie Madill81c2e252017-09-09 23:32:46 -0400204 for (uint32_t textureIndex = 0; textureIndex < caps.maxCombinedTextureImageUnits;
205 ++textureIndex)
206 {
Jamie Madilld4442552018-02-27 22:03:47 -0500207 mCompleteTextureBindings.emplace_back(this, textureIndex);
Jamie Madill81c2e252017-09-09 23:32:46 -0400208 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400209
Geoff Lang76b10c92014-09-05 16:28:14 -0400210 mSamplers.resize(caps.maxCombinedTextureImageUnits);
Shannon Woods53a94a82014-06-24 15:20:36 -0400211
Jamie Madill4928b7c2017-06-20 12:57:39 -0400212 mActiveQueries[GL_ANY_SAMPLES_PASSED].set(context, nullptr);
213 mActiveQueries[GL_ANY_SAMPLES_PASSED_CONSERVATIVE].set(context, nullptr);
214 mActiveQueries[GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN].set(context, nullptr);
215 mActiveQueries[GL_TIME_ELAPSED_EXT].set(context, nullptr);
216 mActiveQueries[GL_COMMANDS_COMPLETED_CHROMIUM].set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400217
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500218 mProgram = nullptr;
Shannon Woods53a94a82014-06-24 15:20:36 -0400219
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500220 mReadFramebuffer = nullptr;
221 mDrawFramebuffer = nullptr;
Jamie Madillb4b53c52015-02-03 15:22:48 -0500222
223 mPrimitiveRestart = false;
Geoff Lang70d0f492015-12-10 17:45:46 -0500224
225 mDebug.setOutputEnabled(debug);
226 mDebug.setMaxLoggedMessages(extensions.maxDebugLoggedMessages);
Sami Väisänen74c23472016-05-09 17:30:30 +0300227
Geoff Lang488130e2017-09-27 13:53:11 -0400228 mMultiSampling = true;
229 mSampleAlphaToOne = false;
Sami Väisänena797e062016-05-12 15:23:40 +0300230
231 mCoverageModulation = GL_NONE;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300232
233 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixProj);
234 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixMV);
235 mPathStencilFunc = GL_ALWAYS;
236 mPathStencilRef = 0;
237 mPathStencilMask = std::numeric_limits<GLuint>::max();
Jamie Madille08a1d32017-03-07 17:24:06 -0500238
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700239 mRobustResourceInit = robustResourceInit;
Jamie Madillc43be722017-07-13 16:22:14 -0400240 mProgramBinaryCacheEnabled = programBinaryCacheEnabled;
Shannon Woods53a94a82014-06-24 15:20:36 -0400241}
242
Jamie Madill6c1f6712017-02-14 19:08:04 -0500243void State::reset(const Context *context)
Shannon Woods53a94a82014-06-24 15:20:36 -0400244{
Jamie Madill8693bdb2017-09-02 15:32:14 -0400245 for (auto &bindingVec : mSamplerTextures)
Shannon Woods53a94a82014-06-24 15:20:36 -0400246 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800247 for (size_t textureIdx = 0; textureIdx < bindingVec.size(); textureIdx++)
Shannon Woods53a94a82014-06-24 15:20:36 -0400248 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800249 bindingVec[textureIdx].set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400250 }
251 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400252 for (size_t samplerIdx = 0; samplerIdx < mSamplers.size(); samplerIdx++)
253 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400254 mSamplers[samplerIdx].set(context, nullptr);
Geoff Lang76b10c92014-09-05 16:28:14 -0400255 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400256
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800257 for (auto &imageUnit : mImageUnits)
258 {
259 imageUnit.texture.set(context, nullptr);
260 imageUnit.level = 0;
261 imageUnit.layered = false;
262 imageUnit.layer = 0;
263 imageUnit.access = GL_READ_ONLY;
264 imageUnit.format = GL_R32UI;
265 }
266
Jamie Madill4928b7c2017-06-20 12:57:39 -0400267 mRenderbuffer.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400268
Corentin Wallez336129f2017-10-17 15:55:40 -0400269 for (auto type : angle::AllEnums<BufferBinding>())
270 {
James Darpiniane8a93c62018-01-04 18:02:24 -0800271 UpdateBufferBinding(context, &mBoundBuffers[type], nullptr, type);
Corentin Wallez336129f2017-10-17 15:55:40 -0400272 }
273
Geoff Lang7dd2e102014-11-10 15:19:26 -0500274 if (mProgram)
275 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500276 mProgram->release(context);
Geoff Lang7dd2e102014-11-10 15:19:26 -0500277 }
Yunchao Hed7297bf2017-04-19 15:27:10 +0800278 mProgram = nullptr;
Geoff Lang7dd2e102014-11-10 15:19:26 -0500279
Yunchao Hea336b902017-08-02 16:05:21 +0800280 mProgramPipeline.set(context, nullptr);
281
James Darpiniane8a93c62018-01-04 18:02:24 -0800282 if (mTransformFeedback.get())
283 mTransformFeedback->onBindingChanged(false);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400284 mTransformFeedback.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400285
286 for (State::ActiveQueryMap::iterator i = mActiveQueries.begin(); i != mActiveQueries.end(); i++)
287 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400288 i->second.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400289 }
290
Corentin Wallez336129f2017-10-17 15:55:40 -0400291 for (auto &buf : mUniformBuffers)
Shannon Woods53a94a82014-06-24 15:20:36 -0400292 {
James Darpiniane8a93c62018-01-04 18:02:24 -0800293 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::Uniform);
Shannon Woods53a94a82014-06-24 15:20:36 -0400294 }
295
Jiajia Qin6eafb042016-12-27 17:04:07 +0800296 for (auto &buf : mAtomicCounterBuffers)
297 {
James Darpiniane8a93c62018-01-04 18:02:24 -0800298 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::AtomicCounter);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800299 }
300
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800301 for (auto &buf : mShaderStorageBuffers)
302 {
James Darpiniane8a93c62018-01-04 18:02:24 -0800303 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::ShaderStorage);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800304 }
305
Sami Väisänene45e53b2016-05-25 10:36:04 +0300306 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixProj);
307 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixMV);
308 mPathStencilFunc = GL_ALWAYS;
309 mPathStencilRef = 0;
310 mPathStencilMask = std::numeric_limits<GLuint>::max();
311
Jamie Madill1b94d432015-08-07 13:23:23 -0400312 // TODO(jmadill): Is this necessary?
313 setAllDirtyBits();
Shannon Woods53a94a82014-06-24 15:20:36 -0400314}
315
316const RasterizerState &State::getRasterizerState() const
317{
318 return mRasterizer;
319}
320
321const BlendState &State::getBlendState() const
322{
323 return mBlend;
324}
325
326const DepthStencilState &State::getDepthStencilState() const
327{
328 return mDepthStencil;
329}
330
Jamie Madillf75ab352015-03-16 10:46:52 -0400331void State::setColorClearValue(float red, float green, float blue, float alpha)
Shannon Woods53a94a82014-06-24 15:20:36 -0400332{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700333 mColorClearValue.red = red;
Shannon Woods53a94a82014-06-24 15:20:36 -0400334 mColorClearValue.green = green;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700335 mColorClearValue.blue = blue;
Shannon Woods53a94a82014-06-24 15:20:36 -0400336 mColorClearValue.alpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400337 mDirtyBits.set(DIRTY_BIT_CLEAR_COLOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400338}
339
Jamie Madillf75ab352015-03-16 10:46:52 -0400340void State::setDepthClearValue(float depth)
Shannon Woods53a94a82014-06-24 15:20:36 -0400341{
342 mDepthClearValue = depth;
Jamie Madill1b94d432015-08-07 13:23:23 -0400343 mDirtyBits.set(DIRTY_BIT_CLEAR_DEPTH);
Shannon Woods53a94a82014-06-24 15:20:36 -0400344}
345
Jamie Madillf75ab352015-03-16 10:46:52 -0400346void State::setStencilClearValue(int stencil)
Shannon Woods53a94a82014-06-24 15:20:36 -0400347{
348 mStencilClearValue = stencil;
Jamie Madill1b94d432015-08-07 13:23:23 -0400349 mDirtyBits.set(DIRTY_BIT_CLEAR_STENCIL);
Shannon Woods53a94a82014-06-24 15:20:36 -0400350}
351
Shannon Woods53a94a82014-06-24 15:20:36 -0400352void State::setColorMask(bool red, bool green, bool blue, bool alpha)
353{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700354 mBlend.colorMaskRed = red;
Shannon Woods53a94a82014-06-24 15:20:36 -0400355 mBlend.colorMaskGreen = green;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700356 mBlend.colorMaskBlue = blue;
Shannon Woods53a94a82014-06-24 15:20:36 -0400357 mBlend.colorMaskAlpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400358 mDirtyBits.set(DIRTY_BIT_COLOR_MASK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400359}
360
361void State::setDepthMask(bool mask)
362{
363 mDepthStencil.depthMask = mask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400364 mDirtyBits.set(DIRTY_BIT_DEPTH_MASK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400365}
366
367bool State::isRasterizerDiscardEnabled() const
368{
369 return mRasterizer.rasterizerDiscard;
370}
371
372void State::setRasterizerDiscard(bool enabled)
373{
374 mRasterizer.rasterizerDiscard = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400375 mDirtyBits.set(DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400376}
377
378bool State::isCullFaceEnabled() const
379{
380 return mRasterizer.cullFace;
381}
382
383void State::setCullFace(bool enabled)
384{
385 mRasterizer.cullFace = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400386 mDirtyBits.set(DIRTY_BIT_CULL_FACE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400387}
388
Corentin Wallez2e568cf2017-09-18 17:05:22 -0400389void State::setCullMode(CullFaceMode mode)
Shannon Woods53a94a82014-06-24 15:20:36 -0400390{
391 mRasterizer.cullMode = mode;
Jamie Madill1b94d432015-08-07 13:23:23 -0400392 mDirtyBits.set(DIRTY_BIT_CULL_FACE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400393}
394
395void State::setFrontFace(GLenum front)
396{
397 mRasterizer.frontFace = front;
Jamie Madill1b94d432015-08-07 13:23:23 -0400398 mDirtyBits.set(DIRTY_BIT_FRONT_FACE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400399}
400
401bool State::isDepthTestEnabled() const
402{
403 return mDepthStencil.depthTest;
404}
405
406void State::setDepthTest(bool enabled)
407{
408 mDepthStencil.depthTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400409 mDirtyBits.set(DIRTY_BIT_DEPTH_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400410}
411
412void State::setDepthFunc(GLenum depthFunc)
413{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700414 mDepthStencil.depthFunc = depthFunc;
415 mDirtyBits.set(DIRTY_BIT_DEPTH_FUNC);
Shannon Woods53a94a82014-06-24 15:20:36 -0400416}
417
418void State::setDepthRange(float zNear, float zFar)
419{
420 mNearZ = zNear;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700421 mFarZ = zFar;
Jamie Madill1b94d432015-08-07 13:23:23 -0400422 mDirtyBits.set(DIRTY_BIT_DEPTH_RANGE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400423}
424
Geoff Langd42f5b82015-04-16 14:03:29 -0400425float State::getNearPlane() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400426{
Geoff Langd42f5b82015-04-16 14:03:29 -0400427 return mNearZ;
428}
429
430float State::getFarPlane() const
431{
432 return mFarZ;
Shannon Woods53a94a82014-06-24 15:20:36 -0400433}
434
435bool State::isBlendEnabled() const
436{
437 return mBlend.blend;
438}
439
440void State::setBlend(bool enabled)
441{
442 mBlend.blend = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400443 mDirtyBits.set(DIRTY_BIT_BLEND_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400444}
445
446void State::setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha)
447{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700448 mBlend.sourceBlendRGB = sourceRGB;
449 mBlend.destBlendRGB = destRGB;
Shannon Woods53a94a82014-06-24 15:20:36 -0400450 mBlend.sourceBlendAlpha = sourceAlpha;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700451 mBlend.destBlendAlpha = destAlpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400452 mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400453}
454
455void State::setBlendColor(float red, float green, float blue, float alpha)
456{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700457 mBlendColor.red = red;
Shannon Woods53a94a82014-06-24 15:20:36 -0400458 mBlendColor.green = green;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700459 mBlendColor.blue = blue;
Shannon Woods53a94a82014-06-24 15:20:36 -0400460 mBlendColor.alpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400461 mDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400462}
463
464void State::setBlendEquation(GLenum rgbEquation, GLenum alphaEquation)
465{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700466 mBlend.blendEquationRGB = rgbEquation;
Shannon Woods53a94a82014-06-24 15:20:36 -0400467 mBlend.blendEquationAlpha = alphaEquation;
Jamie Madill1b94d432015-08-07 13:23:23 -0400468 mDirtyBits.set(DIRTY_BIT_BLEND_EQUATIONS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400469}
470
471const ColorF &State::getBlendColor() const
472{
473 return mBlendColor;
474}
475
476bool State::isStencilTestEnabled() const
477{
478 return mDepthStencil.stencilTest;
479}
480
481void State::setStencilTest(bool enabled)
482{
483 mDepthStencil.stencilTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400484 mDirtyBits.set(DIRTY_BIT_STENCIL_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400485}
486
487void State::setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask)
488{
489 mDepthStencil.stencilFunc = stencilFunc;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700490 mStencilRef = (stencilRef > 0) ? stencilRef : 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400491 mDepthStencil.stencilMask = stencilMask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400492 mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400493}
494
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700495void State::setStencilBackParams(GLenum stencilBackFunc,
496 GLint stencilBackRef,
497 GLuint stencilBackMask)
Shannon Woods53a94a82014-06-24 15:20:36 -0400498{
499 mDepthStencil.stencilBackFunc = stencilBackFunc;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700500 mStencilBackRef = (stencilBackRef > 0) ? stencilBackRef : 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400501 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
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700517void State::setStencilOperations(GLenum stencilFail,
518 GLenum stencilPassDepthFail,
519 GLenum stencilPassDepthPass)
Shannon Woods53a94a82014-06-24 15:20:36 -0400520{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700521 mDepthStencil.stencilFail = stencilFail;
Shannon Woods53a94a82014-06-24 15:20:36 -0400522 mDepthStencil.stencilPassDepthFail = stencilPassDepthFail;
523 mDepthStencil.stencilPassDepthPass = stencilPassDepthPass;
Jamie Madill1b94d432015-08-07 13:23:23 -0400524 mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400525}
526
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700527void State::setStencilBackOperations(GLenum stencilBackFail,
528 GLenum stencilBackPassDepthFail,
529 GLenum stencilBackPassDepthPass)
Shannon Woods53a94a82014-06-24 15:20:36 -0400530{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700531 mDepthStencil.stencilBackFail = stencilBackFail;
Shannon Woods53a94a82014-06-24 15:20:36 -0400532 mDepthStencil.stencilBackPassDepthFail = stencilBackPassDepthFail;
533 mDepthStencil.stencilBackPassDepthPass = stencilBackPassDepthPass;
Jamie Madill1b94d432015-08-07 13:23:23 -0400534 mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400535}
536
537GLint State::getStencilRef() const
538{
539 return mStencilRef;
540}
541
542GLint State::getStencilBackRef() const
543{
544 return mStencilBackRef;
545}
546
547bool State::isPolygonOffsetFillEnabled() const
548{
549 return mRasterizer.polygonOffsetFill;
550}
551
552void State::setPolygonOffsetFill(bool enabled)
553{
Jamie Madill1b94d432015-08-07 13:23:23 -0400554 mRasterizer.polygonOffsetFill = enabled;
555 mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400556}
557
558void State::setPolygonOffsetParams(GLfloat factor, GLfloat units)
559{
560 // An application can pass NaN values here, so handle this gracefully
561 mRasterizer.polygonOffsetFactor = factor != factor ? 0.0f : factor;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700562 mRasterizer.polygonOffsetUnits = units != units ? 0.0f : units;
Jamie Madill1b94d432015-08-07 13:23:23 -0400563 mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET);
Shannon Woods53a94a82014-06-24 15:20:36 -0400564}
565
566bool State::isSampleAlphaToCoverageEnabled() const
567{
568 return mBlend.sampleAlphaToCoverage;
569}
570
571void State::setSampleAlphaToCoverage(bool enabled)
572{
573 mBlend.sampleAlphaToCoverage = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400574 mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400575}
576
577bool State::isSampleCoverageEnabled() const
578{
579 return mSampleCoverage;
580}
581
582void State::setSampleCoverage(bool enabled)
583{
584 mSampleCoverage = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400585 mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400586}
587
588void State::setSampleCoverageParams(GLclampf value, bool invert)
589{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700590 mSampleCoverageValue = value;
Shannon Woods53a94a82014-06-24 15:20:36 -0400591 mSampleCoverageInvert = invert;
Jamie Madill1b94d432015-08-07 13:23:23 -0400592 mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400593}
594
Geoff Lang0fbb6002015-04-16 11:11:53 -0400595GLclampf State::getSampleCoverageValue() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400596{
Geoff Lang0fbb6002015-04-16 11:11:53 -0400597 return mSampleCoverageValue;
598}
Shannon Woods53a94a82014-06-24 15:20:36 -0400599
Geoff Lang0fbb6002015-04-16 11:11:53 -0400600bool State::getSampleCoverageInvert() const
601{
602 return mSampleCoverageInvert;
Shannon Woods53a94a82014-06-24 15:20:36 -0400603}
604
Jiawei Shaodb342272017-09-27 10:21:45 +0800605bool State::isSampleMaskEnabled() const
606{
607 return mSampleMask;
608}
609
610void State::setSampleMaskEnabled(bool enabled)
611{
612 mSampleMask = enabled;
613 mDirtyBits.set(DIRTY_BIT_SAMPLE_MASK_ENABLED);
614}
615
616void State::setSampleMaskParams(GLuint maskNumber, GLbitfield mask)
617{
618 ASSERT(maskNumber < mMaxSampleMaskWords);
619 mSampleMaskValues[maskNumber] = mask;
Jamie Madillc67323a2017-11-02 23:11:41 -0400620 // TODO(jmadill): Use a child dirty bit if we ever use more than two words.
621 mDirtyBits.set(DIRTY_BIT_SAMPLE_MASK);
Jiawei Shaodb342272017-09-27 10:21:45 +0800622}
623
624GLbitfield State::getSampleMaskWord(GLuint maskNumber) const
625{
626 ASSERT(maskNumber < mMaxSampleMaskWords);
627 return mSampleMaskValues[maskNumber];
628}
629
630GLuint State::getMaxSampleMaskWords() const
631{
632 return mMaxSampleMaskWords;
633}
634
Sami Väisänen74c23472016-05-09 17:30:30 +0300635void State::setSampleAlphaToOne(bool enabled)
636{
637 mSampleAlphaToOne = enabled;
638 mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_ONE);
639}
640
641bool State::isSampleAlphaToOneEnabled() const
642{
643 return mSampleAlphaToOne;
644}
645
646void State::setMultisampling(bool enabled)
647{
648 mMultiSampling = enabled;
649 mDirtyBits.set(DIRTY_BIT_MULTISAMPLING);
650}
651
652bool State::isMultisamplingEnabled() const
653{
654 return mMultiSampling;
655}
656
Shannon Woods53a94a82014-06-24 15:20:36 -0400657bool State::isScissorTestEnabled() const
658{
659 return mScissorTest;
660}
661
662void State::setScissorTest(bool enabled)
663{
664 mScissorTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400665 mDirtyBits.set(DIRTY_BIT_SCISSOR_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400666}
667
668void State::setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height)
669{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700670 mScissor.x = x;
671 mScissor.y = y;
672 mScissor.width = width;
Shannon Woods53a94a82014-06-24 15:20:36 -0400673 mScissor.height = height;
Jamie Madill1b94d432015-08-07 13:23:23 -0400674 mDirtyBits.set(DIRTY_BIT_SCISSOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400675}
676
677const Rectangle &State::getScissor() const
678{
679 return mScissor;
680}
681
682bool State::isDitherEnabled() const
683{
684 return mBlend.dither;
685}
686
687void State::setDither(bool enabled)
688{
689 mBlend.dither = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400690 mDirtyBits.set(DIRTY_BIT_DITHER_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400691}
692
Jamie Madillb4b53c52015-02-03 15:22:48 -0500693bool State::isPrimitiveRestartEnabled() const
694{
695 return mPrimitiveRestart;
696}
697
698void State::setPrimitiveRestart(bool enabled)
699{
700 mPrimitiveRestart = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400701 mDirtyBits.set(DIRTY_BIT_PRIMITIVE_RESTART_ENABLED);
Jamie Madillb4b53c52015-02-03 15:22:48 -0500702}
703
Shannon Woods53a94a82014-06-24 15:20:36 -0400704void State::setEnableFeature(GLenum feature, bool enabled)
705{
706 switch (feature)
707 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700708 case GL_MULTISAMPLE_EXT:
709 setMultisampling(enabled);
710 break;
711 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
712 setSampleAlphaToOne(enabled);
713 break;
714 case GL_CULL_FACE:
715 setCullFace(enabled);
716 break;
717 case GL_POLYGON_OFFSET_FILL:
718 setPolygonOffsetFill(enabled);
719 break;
720 case GL_SAMPLE_ALPHA_TO_COVERAGE:
721 setSampleAlphaToCoverage(enabled);
722 break;
723 case GL_SAMPLE_COVERAGE:
724 setSampleCoverage(enabled);
725 break;
726 case GL_SCISSOR_TEST:
727 setScissorTest(enabled);
728 break;
729 case GL_STENCIL_TEST:
730 setStencilTest(enabled);
731 break;
732 case GL_DEPTH_TEST:
733 setDepthTest(enabled);
734 break;
735 case GL_BLEND:
736 setBlend(enabled);
737 break;
738 case GL_DITHER:
739 setDither(enabled);
740 break;
741 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
742 setPrimitiveRestart(enabled);
743 break;
744 case GL_RASTERIZER_DISCARD:
745 setRasterizerDiscard(enabled);
746 break;
747 case GL_SAMPLE_MASK:
748 setSampleMaskEnabled(enabled);
749 break;
750 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
751 mDebug.setOutputSynchronous(enabled);
752 break;
753 case GL_DEBUG_OUTPUT:
754 mDebug.setOutputEnabled(enabled);
755 break;
756 case GL_FRAMEBUFFER_SRGB_EXT:
757 setFramebufferSRGB(enabled);
758 break;
759 default:
760 UNREACHABLE();
Shannon Woods53a94a82014-06-24 15:20:36 -0400761 }
762}
763
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700764bool State::getEnableFeature(GLenum feature) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400765{
766 switch (feature)
767 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700768 case GL_MULTISAMPLE_EXT:
769 return isMultisamplingEnabled();
770 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
771 return isSampleAlphaToOneEnabled();
772 case GL_CULL_FACE:
773 return isCullFaceEnabled();
774 case GL_POLYGON_OFFSET_FILL:
775 return isPolygonOffsetFillEnabled();
776 case GL_SAMPLE_ALPHA_TO_COVERAGE:
777 return isSampleAlphaToCoverageEnabled();
778 case GL_SAMPLE_COVERAGE:
779 return isSampleCoverageEnabled();
780 case GL_SCISSOR_TEST:
781 return isScissorTestEnabled();
782 case GL_STENCIL_TEST:
783 return isStencilTestEnabled();
784 case GL_DEPTH_TEST:
785 return isDepthTestEnabled();
786 case GL_BLEND:
787 return isBlendEnabled();
788 case GL_DITHER:
789 return isDitherEnabled();
790 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
791 return isPrimitiveRestartEnabled();
792 case GL_RASTERIZER_DISCARD:
793 return isRasterizerDiscardEnabled();
794 case GL_SAMPLE_MASK:
795 return isSampleMaskEnabled();
796 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
797 return mDebug.isOutputSynchronous();
798 case GL_DEBUG_OUTPUT:
799 return mDebug.isOutputEnabled();
800 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
801 return isBindGeneratesResourceEnabled();
802 case GL_CLIENT_ARRAYS_ANGLE:
803 return areClientArraysEnabled();
804 case GL_FRAMEBUFFER_SRGB_EXT:
805 return getFramebufferSRGB();
806 case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
807 return mRobustResourceInit;
808 case GL_PROGRAM_CACHE_ENABLED_ANGLE:
809 return mProgramBinaryCacheEnabled;
Jamie Madillc43be722017-07-13 16:22:14 -0400810
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700811 default:
812 UNREACHABLE();
813 return false;
Shannon Woods53a94a82014-06-24 15:20:36 -0400814 }
815}
816
817void State::setLineWidth(GLfloat width)
818{
819 mLineWidth = width;
Jamie Madill1b94d432015-08-07 13:23:23 -0400820 mDirtyBits.set(DIRTY_BIT_LINE_WIDTH);
Shannon Woods53a94a82014-06-24 15:20:36 -0400821}
822
Geoff Lang4b3f4162015-04-16 13:22:05 -0400823float State::getLineWidth() const
824{
825 return mLineWidth;
826}
827
Shannon Woods53a94a82014-06-24 15:20:36 -0400828void State::setGenerateMipmapHint(GLenum hint)
829{
830 mGenerateMipmapHint = hint;
Jamie Madill1b94d432015-08-07 13:23:23 -0400831 mDirtyBits.set(DIRTY_BIT_GENERATE_MIPMAP_HINT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400832}
833
834void State::setFragmentShaderDerivativeHint(GLenum hint)
835{
836 mFragmentShaderDerivativeHint = hint;
Jamie Madill1b94d432015-08-07 13:23:23 -0400837 mDirtyBits.set(DIRTY_BIT_SHADER_DERIVATIVE_HINT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400838 // TODO: Propagate the hint to shader translator so we can write
839 // ddx, ddx_coarse, or ddx_fine depending on the hint.
840 // Ignore for now. It is valid for implementations to ignore hint.
841}
842
Geoff Langf41a7152016-09-19 15:11:17 -0400843bool State::isBindGeneratesResourceEnabled() const
844{
845 return mBindGeneratesResource;
846}
847
Geoff Langfeb8c682017-02-13 16:07:35 -0500848bool State::areClientArraysEnabled() const
849{
850 return mClientArraysEnabled;
851}
852
Shannon Woods53a94a82014-06-24 15:20:36 -0400853void State::setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height)
854{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700855 mViewport.x = x;
856 mViewport.y = y;
857 mViewport.width = width;
Shannon Woods53a94a82014-06-24 15:20:36 -0400858 mViewport.height = height;
Jamie Madill1b94d432015-08-07 13:23:23 -0400859 mDirtyBits.set(DIRTY_BIT_VIEWPORT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400860}
861
862const Rectangle &State::getViewport() const
863{
864 return mViewport;
865}
866
867void State::setActiveSampler(unsigned int active)
868{
869 mActiveSampler = active;
870}
871
872unsigned int State::getActiveSampler() const
873{
Cooper Partin4d61f7e2015-08-12 10:56:50 -0700874 return static_cast<unsigned int>(mActiveSampler);
Shannon Woods53a94a82014-06-24 15:20:36 -0400875}
876
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800877void State::setSamplerTexture(const Context *context, TextureType type, Texture *texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400878{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400879 mSamplerTextures[type][mActiveSampler].set(context, texture);
Jamie Madill81c2e252017-09-09 23:32:46 -0400880 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
881 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Shannon Woods53a94a82014-06-24 15:20:36 -0400882}
883
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800884Texture *State::getTargetTexture(TextureType type) const
Jamie Madillc29968b2016-01-20 11:17:23 -0500885{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800886 return getSamplerTexture(static_cast<unsigned int>(mActiveSampler), type);
Jamie Madillc29968b2016-01-20 11:17:23 -0500887}
888
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800889Texture *State::getSamplerTexture(unsigned int sampler, TextureType type) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400890{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800891 ASSERT(sampler < mSamplerTextures[type].size());
892 return mSamplerTextures[type][sampler].get();
Shannon Woods53a94a82014-06-24 15:20:36 -0400893}
894
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800895GLuint State::getSamplerTextureId(unsigned int sampler, TextureType type) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400896{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800897 ASSERT(sampler < mSamplerTextures[type].size());
898 return mSamplerTextures[type][sampler].id();
Shannon Woods53a94a82014-06-24 15:20:36 -0400899}
900
Jamie Madilla02315b2017-02-23 14:14:47 -0500901void State::detachTexture(const Context *context, const TextureMap &zeroTextures, GLuint texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400902{
903 // Textures have a detach method on State rather than a simple
904 // removeBinding, because the zero/null texture objects are managed
905 // separately, and don't have to go through the Context's maps or
906 // the ResourceManager.
907
908 // [OpenGL ES 2.0.24] section 3.8 page 84:
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700909 // If a texture object is deleted, it is as if all texture units which are bound to that texture
910 // object are rebound to texture object zero
Shannon Woods53a94a82014-06-24 15:20:36 -0400911
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800912 for (TextureType type : angle::AllEnums<TextureType>())
Shannon Woods53a94a82014-06-24 15:20:36 -0400913 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800914 TextureBindingVector &textureVector = mSamplerTextures[type];
Jamie Madill81c2e252017-09-09 23:32:46 -0400915 for (BindingPointer<Texture> &binding : textureVector)
Shannon Woods53a94a82014-06-24 15:20:36 -0400916 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400917 if (binding.id() == texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400918 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800919 Texture *zeroTexture = zeroTextures[type].get();
920 ASSERT(zeroTexture != nullptr);
Jamie Madille6382c32014-11-07 15:05:26 -0500921 // Zero textures are the "default" textures instead of NULL
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800922 binding.set(context, zeroTexture);
Jamie Madill81c2e252017-09-09 23:32:46 -0400923 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400924 }
925 }
926 }
927
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800928 for (auto &bindingImageUnit : mImageUnits)
929 {
930 if (bindingImageUnit.texture.id() == texture)
931 {
932 bindingImageUnit.texture.set(context, nullptr);
933 bindingImageUnit.level = 0;
934 bindingImageUnit.layered = false;
935 bindingImageUnit.layer = 0;
936 bindingImageUnit.access = GL_READ_ONLY;
937 bindingImageUnit.format = GL_R32UI;
938 break;
939 }
940 }
941
Shannon Woods53a94a82014-06-24 15:20:36 -0400942 // [OpenGL ES 2.0.24] section 4.4 page 112:
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700943 // If a texture object is deleted while its image is attached to the currently bound
944 // framebuffer, then it is as if Texture2DAttachment had been called, with a texture of 0, for
945 // each attachment point to which this image was attached in the currently bound framebuffer.
Shannon Woods53a94a82014-06-24 15:20:36 -0400946
Jamie Madill8693bdb2017-09-02 15:32:14 -0400947 if (mReadFramebuffer && mReadFramebuffer->detachTexture(context, texture))
Shannon Woods53a94a82014-06-24 15:20:36 -0400948 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400949 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -0400950 }
951
Jamie Madill8693bdb2017-09-02 15:32:14 -0400952 if (mDrawFramebuffer && mDrawFramebuffer->detachTexture(context, texture))
Shannon Woods53a94a82014-06-24 15:20:36 -0400953 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400954 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -0400955 }
956}
957
Jamie Madill4928b7c2017-06-20 12:57:39 -0400958void State::initializeZeroTextures(const Context *context, const TextureMap &zeroTextures)
Jamie Madille6382c32014-11-07 15:05:26 -0500959{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800960 for (TextureType type : angle::AllEnums<TextureType>())
Jamie Madille6382c32014-11-07 15:05:26 -0500961 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800962 for (size_t textureUnit = 0; textureUnit < mSamplerTextures[type].size(); ++textureUnit)
Jamie Madille6382c32014-11-07 15:05:26 -0500963 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800964 mSamplerTextures[type][textureUnit].set(context, zeroTextures[type].get());
Jamie Madille6382c32014-11-07 15:05:26 -0500965 }
966 }
967}
968
Jamie Madill4928b7c2017-06-20 12:57:39 -0400969void State::setSamplerBinding(const Context *context, GLuint textureUnit, Sampler *sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -0400970{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400971 mSamplers[textureUnit].set(context, sampler);
Jamie Madill81c2e252017-09-09 23:32:46 -0400972 mDirtyBits.set(DIRTY_BIT_SAMPLER_BINDINGS);
973 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Shannon Woods53a94a82014-06-24 15:20:36 -0400974}
975
976GLuint State::getSamplerId(GLuint textureUnit) const
977{
Geoff Lang76b10c92014-09-05 16:28:14 -0400978 ASSERT(textureUnit < mSamplers.size());
Shannon Woods53a94a82014-06-24 15:20:36 -0400979 return mSamplers[textureUnit].id();
980}
981
982Sampler *State::getSampler(GLuint textureUnit) const
983{
984 return mSamplers[textureUnit].get();
985}
986
Jamie Madill4928b7c2017-06-20 12:57:39 -0400987void State::detachSampler(const Context *context, GLuint sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -0400988{
989 // [OpenGL ES 3.0.2] section 3.8.2 pages 123-124:
990 // If a sampler object that is currently bound to one or more texture units is
991 // deleted, it is as though BindSampler is called once for each texture unit to
992 // which the sampler is bound, with unit set to the texture unit and sampler set to zero.
Jamie Madill81c2e252017-09-09 23:32:46 -0400993 for (BindingPointer<Sampler> &samplerBinding : mSamplers)
Shannon Woods53a94a82014-06-24 15:20:36 -0400994 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400995 if (samplerBinding.id() == sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -0400996 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400997 samplerBinding.set(context, nullptr);
Jamie Madill81c2e252017-09-09 23:32:46 -0400998 mDirtyBits.set(DIRTY_BIT_SAMPLER_BINDINGS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400999 }
1000 }
1001}
1002
Jamie Madill4928b7c2017-06-20 12:57:39 -04001003void State::setRenderbufferBinding(const Context *context, Renderbuffer *renderbuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001004{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001005 mRenderbuffer.set(context, renderbuffer);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001006 mDirtyBits.set(DIRTY_BIT_RENDERBUFFER_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001007}
1008
1009GLuint State::getRenderbufferId() const
1010{
1011 return mRenderbuffer.id();
1012}
1013
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001014Renderbuffer *State::getCurrentRenderbuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001015{
1016 return mRenderbuffer.get();
1017}
1018
Jamie Madilla02315b2017-02-23 14:14:47 -05001019void State::detachRenderbuffer(const Context *context, GLuint renderbuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001020{
1021 // [OpenGL ES 2.0.24] section 4.4 page 109:
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001022 // If a renderbuffer that is currently bound to RENDERBUFFER is deleted, it is as though
1023 // BindRenderbuffer had been executed with the target RENDERBUFFER and name of zero.
Shannon Woods53a94a82014-06-24 15:20:36 -04001024
1025 if (mRenderbuffer.id() == renderbuffer)
1026 {
Jamie Madill8693bdb2017-09-02 15:32:14 -04001027 setRenderbufferBinding(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001028 }
1029
1030 // [OpenGL ES 2.0.24] section 4.4 page 111:
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001031 // If a renderbuffer object is deleted while its image is attached to the currently bound
1032 // framebuffer, then it is as if FramebufferRenderbuffer had been called, with a renderbuffer of
1033 // 0, for each attachment point to which this image was attached in the currently bound
1034 // framebuffer.
Shannon Woods53a94a82014-06-24 15:20:36 -04001035
1036 Framebuffer *readFramebuffer = mReadFramebuffer;
1037 Framebuffer *drawFramebuffer = mDrawFramebuffer;
1038
Jamie Madill8693bdb2017-09-02 15:32:14 -04001039 if (readFramebuffer && readFramebuffer->detachRenderbuffer(context, renderbuffer))
Shannon Woods53a94a82014-06-24 15:20:36 -04001040 {
Jamie Madill8693bdb2017-09-02 15:32:14 -04001041 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -04001042 }
1043
1044 if (drawFramebuffer && drawFramebuffer != readFramebuffer)
1045 {
Jamie Madill8693bdb2017-09-02 15:32:14 -04001046 if (drawFramebuffer->detachRenderbuffer(context, renderbuffer))
1047 {
1048 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
1049 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001050 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001051}
1052
1053void State::setReadFramebufferBinding(Framebuffer *framebuffer)
1054{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001055 if (mReadFramebuffer == framebuffer)
1056 return;
1057
Shannon Woods53a94a82014-06-24 15:20:36 -04001058 mReadFramebuffer = framebuffer;
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001059 mDirtyBits.set(DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
1060
1061 if (mReadFramebuffer && mReadFramebuffer->hasAnyDirtyBit())
1062 {
1063 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
1064 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001065}
1066
1067void State::setDrawFramebufferBinding(Framebuffer *framebuffer)
1068{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001069 if (mDrawFramebuffer == framebuffer)
1070 return;
1071
Shannon Woods53a94a82014-06-24 15:20:36 -04001072 mDrawFramebuffer = framebuffer;
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001073 mDirtyBits.set(DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
1074
1075 if (mDrawFramebuffer && mDrawFramebuffer->hasAnyDirtyBit())
1076 {
1077 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
1078 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001079}
1080
1081Framebuffer *State::getTargetFramebuffer(GLenum target) const
1082{
1083 switch (target)
1084 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001085 case GL_READ_FRAMEBUFFER_ANGLE:
1086 return mReadFramebuffer;
1087 case GL_DRAW_FRAMEBUFFER_ANGLE:
1088 case GL_FRAMEBUFFER:
1089 return mDrawFramebuffer;
1090 default:
1091 UNREACHABLE();
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001092 return nullptr;
Shannon Woods53a94a82014-06-24 15:20:36 -04001093 }
1094}
1095
Jamie Madill51f40ec2016-06-15 14:06:00 -04001096Framebuffer *State::getReadFramebuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001097{
1098 return mReadFramebuffer;
1099}
1100
Jamie Madill51f40ec2016-06-15 14:06:00 -04001101Framebuffer *State::getDrawFramebuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001102{
1103 return mDrawFramebuffer;
1104}
1105
1106bool State::removeReadFramebufferBinding(GLuint framebuffer)
1107{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001108 if (mReadFramebuffer != nullptr && mReadFramebuffer->id() == framebuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001109 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001110 setReadFramebufferBinding(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001111 return true;
1112 }
1113
1114 return false;
1115}
1116
1117bool State::removeDrawFramebufferBinding(GLuint framebuffer)
1118{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001119 if (mReadFramebuffer != nullptr && mDrawFramebuffer->id() == framebuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001120 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001121 setDrawFramebufferBinding(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001122 return true;
1123 }
1124
1125 return false;
1126}
1127
1128void State::setVertexArrayBinding(VertexArray *vertexArray)
1129{
James Darpiniane8a93c62018-01-04 18:02:24 -08001130 if (mVertexArray == vertexArray)
1131 return;
1132 if (mVertexArray)
1133 mVertexArray->onBindingChanged(false);
Shannon Woods53a94a82014-06-24 15:20:36 -04001134 mVertexArray = vertexArray;
James Darpiniane8a93c62018-01-04 18:02:24 -08001135 if (vertexArray)
1136 vertexArray->onBindingChanged(true);
Jamie Madill0b9e9032015-08-17 11:51:52 +00001137 mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001138
1139 if (mVertexArray && mVertexArray->hasAnyDirtyBit())
1140 {
1141 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1142 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001143}
1144
1145GLuint State::getVertexArrayId() const
1146{
Yunchao He4f285442017-04-21 12:15:49 +08001147 ASSERT(mVertexArray != nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001148 return mVertexArray->id();
1149}
1150
1151VertexArray *State::getVertexArray() const
1152{
Yunchao He4f285442017-04-21 12:15:49 +08001153 ASSERT(mVertexArray != nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001154 return mVertexArray;
1155}
1156
1157bool State::removeVertexArrayBinding(GLuint vertexArray)
1158{
James Darpiniane8a93c62018-01-04 18:02:24 -08001159 if (mVertexArray && mVertexArray->id() == vertexArray)
Shannon Woods53a94a82014-06-24 15:20:36 -04001160 {
James Darpiniane8a93c62018-01-04 18:02:24 -08001161 mVertexArray->onBindingChanged(false);
Yunchao Hed7297bf2017-04-19 15:27:10 +08001162 mVertexArray = nullptr;
Jamie Madill0b9e9032015-08-17 11:51:52 +00001163 mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001164 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001165 return true;
1166 }
1167
1168 return false;
1169}
1170
Jamie Madill4928b7c2017-06-20 12:57:39 -04001171void State::bindVertexBuffer(const Context *context,
1172 GLuint bindingIndex,
Shao80957d92017-02-20 21:25:59 +08001173 Buffer *boundBuffer,
1174 GLintptr offset,
1175 GLsizei stride)
1176{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001177 getVertexArray()->bindVertexBuffer(context, bindingIndex, boundBuffer, offset, stride);
Shao80957d92017-02-20 21:25:59 +08001178 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1179}
1180
Shaodde78e82017-05-22 14:13:27 +08001181void State::setVertexAttribBinding(const Context *context, GLuint attribIndex, GLuint bindingIndex)
Shao80957d92017-02-20 21:25:59 +08001182{
Shaodde78e82017-05-22 14:13:27 +08001183 getVertexArray()->setVertexAttribBinding(context, attribIndex, bindingIndex);
Shao80957d92017-02-20 21:25:59 +08001184 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1185}
1186
1187void State::setVertexAttribFormat(GLuint attribIndex,
1188 GLint size,
1189 GLenum type,
1190 bool normalized,
1191 bool pureInteger,
1192 GLuint relativeOffset)
1193{
1194 getVertexArray()->setVertexAttribFormat(attribIndex, size, type, normalized, pureInteger,
1195 relativeOffset);
1196 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1197}
1198
1199void State::setVertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
1200{
1201 getVertexArray()->setVertexBindingDivisor(bindingIndex, divisor);
1202 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1203}
1204
Jamie Madill6c1f6712017-02-14 19:08:04 -05001205void State::setProgram(const Context *context, Program *newProgram)
Shannon Woods53a94a82014-06-24 15:20:36 -04001206{
Geoff Lang7dd2e102014-11-10 15:19:26 -05001207 if (mProgram != newProgram)
Shannon Woods53a94a82014-06-24 15:20:36 -04001208 {
Geoff Lang7dd2e102014-11-10 15:19:26 -05001209 if (mProgram)
1210 {
Jamie Madill6c1f6712017-02-14 19:08:04 -05001211 mProgram->release(context);
Geoff Lang7dd2e102014-11-10 15:19:26 -05001212 }
1213
1214 mProgram = newProgram;
1215
1216 if (mProgram)
1217 {
1218 newProgram->addRef();
Jamie Madill81c2e252017-09-09 23:32:46 -04001219 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Geoff Lang7dd2e102014-11-10 15:19:26 -05001220 }
Jamie Madilla779b612017-07-24 11:46:05 -04001221 mDirtyBits.set(DIRTY_BIT_PROGRAM_EXECUTABLE);
1222 mDirtyBits.set(DIRTY_BIT_PROGRAM_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001223 }
1224}
1225
Geoff Lang7dd2e102014-11-10 15:19:26 -05001226Program *State::getProgram() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001227{
Geoff Lang7dd2e102014-11-10 15:19:26 -05001228 return mProgram;
Shannon Woods53a94a82014-06-24 15:20:36 -04001229}
1230
Jamie Madill4928b7c2017-06-20 12:57:39 -04001231void State::setTransformFeedbackBinding(const Context *context,
1232 TransformFeedback *transformFeedback)
Shannon Woods53a94a82014-06-24 15:20:36 -04001233{
James Darpiniane8a93c62018-01-04 18:02:24 -08001234 if (transformFeedback == mTransformFeedback.get())
1235 return;
1236 if (mTransformFeedback.get())
1237 mTransformFeedback->onBindingChanged(false);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001238 mTransformFeedback.set(context, transformFeedback);
James Darpiniane8a93c62018-01-04 18:02:24 -08001239 if (mTransformFeedback.get())
1240 mTransformFeedback->onBindingChanged(true);
Geoff Langded79232017-11-28 15:21:11 -05001241 mDirtyBits.set(DIRTY_BIT_TRANSFORM_FEEDBACK_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001242}
1243
1244TransformFeedback *State::getCurrentTransformFeedback() const
1245{
1246 return mTransformFeedback.get();
1247}
1248
Gregoire Payen de La Garanderie52742022015-02-04 14:55:39 +00001249bool State::isTransformFeedbackActiveUnpaused() const
1250{
Jamie Madill81c2e252017-09-09 23:32:46 -04001251 TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001252 return curTransformFeedback && curTransformFeedback->isActive() &&
1253 !curTransformFeedback->isPaused();
Gregoire Payen de La Garanderie52742022015-02-04 14:55:39 +00001254}
1255
Jamie Madill4928b7c2017-06-20 12:57:39 -04001256bool State::removeTransformFeedbackBinding(const Context *context, GLuint transformFeedback)
Shannon Woods53a94a82014-06-24 15:20:36 -04001257{
1258 if (mTransformFeedback.id() == transformFeedback)
1259 {
James Darpiniane8a93c62018-01-04 18:02:24 -08001260 if (mTransformFeedback.get())
1261 mTransformFeedback->onBindingChanged(false);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001262 mTransformFeedback.set(context, nullptr);
Corentin Walleza2257da2016-04-19 16:43:12 -04001263 return true;
Shannon Woods53a94a82014-06-24 15:20:36 -04001264 }
Corentin Walleza2257da2016-04-19 16:43:12 -04001265
1266 return false;
Shannon Woods53a94a82014-06-24 15:20:36 -04001267}
1268
Yunchao Hea336b902017-08-02 16:05:21 +08001269void State::setProgramPipelineBinding(const Context *context, ProgramPipeline *pipeline)
1270{
1271 mProgramPipeline.set(context, pipeline);
1272}
1273
1274void State::detachProgramPipeline(const Context *context, GLuint pipeline)
1275{
1276 mProgramPipeline.set(context, nullptr);
1277}
1278
Olli Etuahobbf1c102016-06-28 13:31:33 +03001279bool State::isQueryActive(const GLenum type) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001280{
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001281 for (auto &iter : mActiveQueries)
Shannon Woods53a94a82014-06-24 15:20:36 -04001282 {
Olli Etuahobbf1c102016-06-28 13:31:33 +03001283 const Query *query = iter.second.get();
1284 if (query != nullptr && ActiveQueryType(query->getType()) == ActiveQueryType(type))
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001285 {
1286 return true;
1287 }
1288 }
1289
1290 return false;
1291}
1292
1293bool State::isQueryActive(Query *query) const
1294{
1295 for (auto &iter : mActiveQueries)
1296 {
1297 if (iter.second.get() == query)
Shannon Woods53a94a82014-06-24 15:20:36 -04001298 {
1299 return true;
1300 }
1301 }
1302
1303 return false;
1304}
1305
Jamie Madill4928b7c2017-06-20 12:57:39 -04001306void State::setActiveQuery(const Context *context, GLenum target, Query *query)
Shannon Woods53a94a82014-06-24 15:20:36 -04001307{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001308 mActiveQueries[target].set(context, query);
Shannon Woods53a94a82014-06-24 15:20:36 -04001309}
1310
1311GLuint State::getActiveQueryId(GLenum target) const
1312{
1313 const Query *query = getActiveQuery(target);
1314 return (query ? query->id() : 0u);
1315}
1316
1317Query *State::getActiveQuery(GLenum target) const
1318{
Jamie Madill5864ac22015-01-12 14:43:07 -05001319 const auto it = mActiveQueries.find(target);
Shannon Woods53a94a82014-06-24 15:20:36 -04001320
Jamie Madill5864ac22015-01-12 14:43:07 -05001321 // All query types should already exist in the activeQueries map
1322 ASSERT(it != mActiveQueries.end());
1323
1324 return it->second.get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001325}
1326
Corentin Wallez336129f2017-10-17 15:55:40 -04001327void State::setBufferBinding(const Context *context, BufferBinding target, Buffer *buffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001328{
Corentin Wallez336129f2017-10-17 15:55:40 -04001329 switch (target)
1330 {
1331 case BufferBinding::PixelPack:
James Darpiniane8a93c62018-01-04 18:02:24 -08001332 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Corentin Wallez336129f2017-10-17 15:55:40 -04001333 mDirtyBits.set(DIRTY_BIT_PACK_BUFFER_BINDING);
1334 break;
1335 case BufferBinding::PixelUnpack:
James Darpiniane8a93c62018-01-04 18:02:24 -08001336 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Corentin Wallez336129f2017-10-17 15:55:40 -04001337 mDirtyBits.set(DIRTY_BIT_UNPACK_BUFFER_BINDING);
1338 break;
1339 case BufferBinding::DrawIndirect:
James Darpiniane8a93c62018-01-04 18:02:24 -08001340 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Corentin Wallez336129f2017-10-17 15:55:40 -04001341 mDirtyBits.set(DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING);
1342 break;
Qin Jiajiaa98a2812017-11-30 18:12:06 +08001343 case BufferBinding::DispatchIndirect:
James Darpiniane8a93c62018-01-04 18:02:24 -08001344 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Qin Jiajiaa98a2812017-11-30 18:12:06 +08001345 mDirtyBits.set(DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
1346 break;
Corentin Wallez336129f2017-10-17 15:55:40 -04001347 case BufferBinding::ElementArray:
1348 getVertexArray()->setElementArrayBuffer(context, buffer);
1349 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1350 break;
Xinghua Cao10a4d432017-11-28 14:46:26 +08001351 case BufferBinding::ShaderStorage:
James Darpiniane8a93c62018-01-04 18:02:24 -08001352 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Xinghua Cao10a4d432017-11-28 14:46:26 +08001353 mDirtyBits.set(DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
1354 break;
Corentin Wallez336129f2017-10-17 15:55:40 -04001355 default:
James Darpiniane8a93c62018-01-04 18:02:24 -08001356 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Corentin Wallez336129f2017-10-17 15:55:40 -04001357 break;
1358 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001359}
James Darpiniane8a93c62018-01-04 18:02:24 -08001360
Corentin Wallez336129f2017-10-17 15:55:40 -04001361void State::setIndexedBufferBinding(const Context *context,
1362 BufferBinding target,
1363 GLuint index,
1364 Buffer *buffer,
1365 GLintptr offset,
1366 GLsizeiptr size)
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001367{
Corentin Wallez336129f2017-10-17 15:55:40 -04001368 setBufferBinding(context, target, buffer);
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001369
Corentin Wallez336129f2017-10-17 15:55:40 -04001370 switch (target)
1371 {
1372 case BufferBinding::TransformFeedback:
1373 mTransformFeedback->bindIndexedBuffer(context, index, buffer, offset, size);
James Darpiniane8a93c62018-01-04 18:02:24 -08001374 setBufferBinding(context, target, buffer);
Corentin Wallez336129f2017-10-17 15:55:40 -04001375 break;
1376 case BufferBinding::Uniform:
James Darpiniane8a93c62018-01-04 18:02:24 -08001377 UpdateBufferBinding(context, &mUniformBuffers[index], buffer, target, offset, size);
Jamie Madillf4141212017-12-12 15:08:07 -05001378 mDirtyBits.set(DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
Corentin Wallez336129f2017-10-17 15:55:40 -04001379 break;
1380 case BufferBinding::AtomicCounter:
James Darpiniane8a93c62018-01-04 18:02:24 -08001381 UpdateBufferBinding(context, &mAtomicCounterBuffers[index], buffer, target, offset,
1382 size);
Corentin Wallez336129f2017-10-17 15:55:40 -04001383 break;
1384 case BufferBinding::ShaderStorage:
James Darpiniane8a93c62018-01-04 18:02:24 -08001385 UpdateBufferBinding(context, &mShaderStorageBuffers[index], buffer, target, offset,
1386 size);
Corentin Wallez336129f2017-10-17 15:55:40 -04001387 break;
1388 default:
1389 UNREACHABLE();
1390 break;
1391 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001392}
1393
Geoff Lang5d124a62015-09-15 13:03:27 -04001394const OffsetBindingPointer<Buffer> &State::getIndexedUniformBuffer(size_t index) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001395{
Shannon Woodsf3acaf92014-09-23 18:07:11 -04001396 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
Geoff Lang5d124a62015-09-15 13:03:27 -04001397 return mUniformBuffers[index];
Gregoire Payen de La Garanderie68694e92015-03-24 14:03:37 +00001398}
1399
Jiajia Qin6eafb042016-12-27 17:04:07 +08001400const OffsetBindingPointer<Buffer> &State::getIndexedAtomicCounterBuffer(size_t index) const
1401{
1402 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
1403 return mAtomicCounterBuffers[index];
1404}
1405
Jiajia Qinf546e7d2017-03-27 14:12:59 +08001406const OffsetBindingPointer<Buffer> &State::getIndexedShaderStorageBuffer(size_t index) const
1407{
1408 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
1409 return mShaderStorageBuffers[index];
1410}
1411
Corentin Wallez336129f2017-10-17 15:55:40 -04001412Buffer *State::getTargetBuffer(BufferBinding target) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001413{
1414 switch (target)
1415 {
Corentin Wallez336129f2017-10-17 15:55:40 -04001416 case BufferBinding::ElementArray:
1417 return getVertexArray()->getElementArrayBuffer().get();
Corentin Wallez336129f2017-10-17 15:55:40 -04001418 default:
1419 return mBoundBuffers[target].get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001420 }
1421}
1422
Jamie Madill4928b7c2017-06-20 12:57:39 -04001423void State::detachBuffer(const Context *context, GLuint bufferName)
Yuly Novikov5807a532015-12-03 13:01:22 -05001424{
James Darpiniane8a93c62018-01-04 18:02:24 -08001425 for (auto target : angle::AllEnums<BufferBinding>())
Yuly Novikov5807a532015-12-03 13:01:22 -05001426 {
James Darpiniane8a93c62018-01-04 18:02:24 -08001427 if (mBoundBuffers[target].id() == bufferName)
Yuly Novikov5807a532015-12-03 13:01:22 -05001428 {
James Darpiniane8a93c62018-01-04 18:02:24 -08001429 UpdateBufferBinding(context, &mBoundBuffers[target], nullptr, target);
Yuly Novikov5807a532015-12-03 13:01:22 -05001430 }
1431 }
1432
1433 TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
1434 if (curTransformFeedback)
1435 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001436 curTransformFeedback->detachBuffer(context, bufferName);
Yuly Novikov5807a532015-12-03 13:01:22 -05001437 }
1438
Jamie Madill4928b7c2017-06-20 12:57:39 -04001439 getVertexArray()->detachBuffer(context, bufferName);
James Darpiniane8a93c62018-01-04 18:02:24 -08001440
1441 for (auto &buf : mUniformBuffers)
1442 {
1443 if (buf.id() == bufferName)
1444 {
1445 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::Uniform);
1446 }
1447 }
1448
1449 for (auto &buf : mAtomicCounterBuffers)
1450 {
1451 if (buf.id() == bufferName)
1452 {
1453 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::AtomicCounter);
1454 }
1455 }
1456
1457 for (auto &buf : mShaderStorageBuffers)
1458 {
1459 if (buf.id() == bufferName)
1460 {
1461 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::ShaderStorage);
1462 }
1463 }
Yuly Novikov5807a532015-12-03 13:01:22 -05001464}
1465
Shannon Woods53a94a82014-06-24 15:20:36 -04001466void State::setEnableVertexAttribArray(unsigned int attribNum, bool enabled)
1467{
1468 getVertexArray()->enableAttribute(attribNum, enabled);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001469 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001470}
1471
1472void State::setVertexAttribf(GLuint index, const GLfloat values[4])
1473{
Shannon Woods23e05002014-09-22 19:07:27 -04001474 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001475 mVertexAttribCurrentValues[index].setFloatValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001476 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1477 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001478 mCurrentValuesTypeMask.setIndex(GL_FLOAT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001479}
1480
1481void State::setVertexAttribu(GLuint index, const GLuint values[4])
1482{
Shannon Woods23e05002014-09-22 19:07:27 -04001483 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001484 mVertexAttribCurrentValues[index].setUnsignedIntValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001485 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1486 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001487 mCurrentValuesTypeMask.setIndex(GL_UNSIGNED_INT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001488}
1489
1490void State::setVertexAttribi(GLuint index, const GLint values[4])
1491{
Shannon Woods23e05002014-09-22 19:07:27 -04001492 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001493 mVertexAttribCurrentValues[index].setIntValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001494 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1495 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001496 mCurrentValuesTypeMask.setIndex(GL_INT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001497}
1498
Shaodde78e82017-05-22 14:13:27 +08001499void State::setVertexAttribPointer(const Context *context,
1500 unsigned int attribNum,
1501 Buffer *boundBuffer,
1502 GLint size,
1503 GLenum type,
1504 bool normalized,
1505 bool pureInteger,
1506 GLsizei stride,
1507 const void *pointer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001508{
Shaodde78e82017-05-22 14:13:27 +08001509 getVertexArray()->setVertexAttribPointer(context, attribNum, boundBuffer, size, type,
1510 normalized, pureInteger, stride, pointer);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001511 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Jamie Madill0b9e9032015-08-17 11:51:52 +00001512}
1513
Shaodde78e82017-05-22 14:13:27 +08001514void State::setVertexAttribDivisor(const Context *context, GLuint index, GLuint divisor)
Jamie Madill0b9e9032015-08-17 11:51:52 +00001515{
Shaodde78e82017-05-22 14:13:27 +08001516 getVertexArray()->setVertexAttribDivisor(context, index, divisor);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001517 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001518}
1519
Jamie Madill6de51852017-04-12 09:53:01 -04001520const VertexAttribCurrentValueData &State::getVertexAttribCurrentValue(size_t attribNum) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001521{
Jamie Madill6de51852017-04-12 09:53:01 -04001522 ASSERT(attribNum < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001523 return mVertexAttribCurrentValues[attribNum];
1524}
1525
Jamie Madillcac94a92017-11-10 10:09:32 -05001526const std::vector<VertexAttribCurrentValueData> &State::getVertexAttribCurrentValues() const
1527{
1528 return mVertexAttribCurrentValues;
1529}
1530
Shannon Woods53a94a82014-06-24 15:20:36 -04001531const void *State::getVertexAttribPointer(unsigned int attribNum) const
1532{
1533 return getVertexArray()->getVertexAttribute(attribNum).pointer;
1534}
1535
1536void State::setPackAlignment(GLint alignment)
1537{
1538 mPack.alignment = alignment;
Jamie Madillc67323a2017-11-02 23:11:41 -04001539 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001540}
1541
1542GLint State::getPackAlignment() const
1543{
1544 return mPack.alignment;
1545}
1546
1547void State::setPackReverseRowOrder(bool reverseRowOrder)
1548{
1549 mPack.reverseRowOrder = reverseRowOrder;
Jamie Madillc67323a2017-11-02 23:11:41 -04001550 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001551}
1552
1553bool State::getPackReverseRowOrder() const
1554{
1555 return mPack.reverseRowOrder;
1556}
1557
Minmin Gongadff67b2015-10-14 10:34:45 -04001558void State::setPackRowLength(GLint rowLength)
1559{
1560 mPack.rowLength = rowLength;
Jamie Madillc67323a2017-11-02 23:11:41 -04001561 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001562}
1563
1564GLint State::getPackRowLength() const
1565{
1566 return mPack.rowLength;
1567}
1568
1569void State::setPackSkipRows(GLint skipRows)
1570{
1571 mPack.skipRows = skipRows;
Jamie Madillc67323a2017-11-02 23:11:41 -04001572 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001573}
1574
1575GLint State::getPackSkipRows() const
1576{
1577 return mPack.skipRows;
1578}
1579
1580void State::setPackSkipPixels(GLint skipPixels)
1581{
1582 mPack.skipPixels = skipPixels;
Jamie Madillc67323a2017-11-02 23:11:41 -04001583 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001584}
1585
1586GLint State::getPackSkipPixels() const
1587{
1588 return mPack.skipPixels;
1589}
1590
Shannon Woods53a94a82014-06-24 15:20:36 -04001591const PixelPackState &State::getPackState() const
1592{
1593 return mPack;
1594}
1595
Jamie Madill87de3622015-03-16 10:41:44 -04001596PixelPackState &State::getPackState()
1597{
1598 return mPack;
1599}
1600
Shannon Woods53a94a82014-06-24 15:20:36 -04001601void State::setUnpackAlignment(GLint alignment)
1602{
1603 mUnpack.alignment = alignment;
Jamie Madillc67323a2017-11-02 23:11:41 -04001604 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001605}
1606
1607GLint State::getUnpackAlignment() const
1608{
1609 return mUnpack.alignment;
1610}
1611
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001612void State::setUnpackRowLength(GLint rowLength)
1613{
1614 mUnpack.rowLength = rowLength;
Jamie Madillc67323a2017-11-02 23:11:41 -04001615 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001616}
1617
1618GLint State::getUnpackRowLength() const
1619{
1620 return mUnpack.rowLength;
1621}
1622
Minmin Gongadff67b2015-10-14 10:34:45 -04001623void State::setUnpackImageHeight(GLint imageHeight)
1624{
1625 mUnpack.imageHeight = imageHeight;
Jamie Madillc67323a2017-11-02 23:11:41 -04001626 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001627}
1628
1629GLint State::getUnpackImageHeight() const
1630{
1631 return mUnpack.imageHeight;
1632}
1633
1634void State::setUnpackSkipImages(GLint skipImages)
1635{
1636 mUnpack.skipImages = skipImages;
Jamie Madillc67323a2017-11-02 23:11:41 -04001637 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001638}
1639
1640GLint State::getUnpackSkipImages() const
1641{
1642 return mUnpack.skipImages;
1643}
1644
1645void State::setUnpackSkipRows(GLint skipRows)
1646{
1647 mUnpack.skipRows = skipRows;
Jamie Madillc67323a2017-11-02 23:11:41 -04001648 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001649}
1650
1651GLint State::getUnpackSkipRows() const
1652{
1653 return mUnpack.skipRows;
1654}
1655
1656void State::setUnpackSkipPixels(GLint skipPixels)
1657{
1658 mUnpack.skipPixels = skipPixels;
Jamie Madillc67323a2017-11-02 23:11:41 -04001659 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001660}
1661
1662GLint State::getUnpackSkipPixels() const
1663{
1664 return mUnpack.skipPixels;
1665}
1666
Shannon Woods53a94a82014-06-24 15:20:36 -04001667const PixelUnpackState &State::getUnpackState() const
1668{
1669 return mUnpack;
1670}
1671
Jamie Madill67102f02015-03-16 10:41:42 -04001672PixelUnpackState &State::getUnpackState()
1673{
1674 return mUnpack;
1675}
1676
Geoff Lang70d0f492015-12-10 17:45:46 -05001677const Debug &State::getDebug() const
1678{
1679 return mDebug;
1680}
1681
1682Debug &State::getDebug()
1683{
1684 return mDebug;
1685}
1686
Sami Väisänena797e062016-05-12 15:23:40 +03001687void State::setCoverageModulation(GLenum components)
1688{
1689 mCoverageModulation = components;
1690 mDirtyBits.set(DIRTY_BIT_COVERAGE_MODULATION);
1691}
1692
1693GLenum State::getCoverageModulation() const
1694{
1695 return mCoverageModulation;
1696}
1697
Sami Väisänene45e53b2016-05-25 10:36:04 +03001698void State::loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix)
1699{
1700 if (matrixMode == GL_PATH_MODELVIEW_CHROMIUM)
1701 {
1702 memcpy(mPathMatrixMV, matrix, 16 * sizeof(GLfloat));
1703 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_MATRIX_MV);
1704 }
1705 else if (matrixMode == GL_PATH_PROJECTION_CHROMIUM)
1706 {
1707 memcpy(mPathMatrixProj, matrix, 16 * sizeof(GLfloat));
1708 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_MATRIX_PROJ);
1709 }
1710 else
1711 {
1712 UNREACHABLE();
1713 }
1714}
1715
1716const GLfloat *State::getPathRenderingMatrix(GLenum which) const
1717{
1718 if (which == GL_PATH_MODELVIEW_MATRIX_CHROMIUM)
1719 {
1720 return mPathMatrixMV;
1721 }
1722 else if (which == GL_PATH_PROJECTION_MATRIX_CHROMIUM)
1723 {
1724 return mPathMatrixProj;
1725 }
1726
1727 UNREACHABLE();
1728 return nullptr;
1729}
1730
1731void State::setPathStencilFunc(GLenum func, GLint ref, GLuint mask)
1732{
1733 mPathStencilFunc = func;
1734 mPathStencilRef = ref;
1735 mPathStencilMask = mask;
1736 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_STENCIL_STATE);
1737}
1738
1739GLenum State::getPathStencilFunc() const
1740{
1741 return mPathStencilFunc;
1742}
1743
1744GLint State::getPathStencilRef() const
1745{
1746 return mPathStencilRef;
1747}
1748
1749GLuint State::getPathStencilMask() const
1750{
1751 return mPathStencilMask;
1752}
1753
Geoff Lang1d2c41d2016-10-19 16:14:46 -07001754void State::setFramebufferSRGB(bool sRGB)
1755{
1756 mFramebufferSRGB = sRGB;
1757 mDirtyBits.set(DIRTY_BIT_FRAMEBUFFER_SRGB);
1758}
1759
1760bool State::getFramebufferSRGB() const
1761{
1762 return mFramebufferSRGB;
1763}
1764
Shannon Woods53a94a82014-06-24 15:20:36 -04001765void State::getBooleanv(GLenum pname, GLboolean *params)
1766{
1767 switch (pname)
1768 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001769 case GL_SAMPLE_COVERAGE_INVERT:
1770 *params = mSampleCoverageInvert;
1771 break;
1772 case GL_DEPTH_WRITEMASK:
1773 *params = mDepthStencil.depthMask;
1774 break;
1775 case GL_COLOR_WRITEMASK:
1776 params[0] = mBlend.colorMaskRed;
1777 params[1] = mBlend.colorMaskGreen;
1778 params[2] = mBlend.colorMaskBlue;
1779 params[3] = mBlend.colorMaskAlpha;
1780 break;
1781 case GL_CULL_FACE:
1782 *params = mRasterizer.cullFace;
1783 break;
1784 case GL_POLYGON_OFFSET_FILL:
1785 *params = mRasterizer.polygonOffsetFill;
1786 break;
1787 case GL_SAMPLE_ALPHA_TO_COVERAGE:
1788 *params = mBlend.sampleAlphaToCoverage;
1789 break;
1790 case GL_SAMPLE_COVERAGE:
1791 *params = mSampleCoverage;
1792 break;
1793 case GL_SAMPLE_MASK:
1794 *params = mSampleMask;
1795 break;
1796 case GL_SCISSOR_TEST:
1797 *params = mScissorTest;
1798 break;
1799 case GL_STENCIL_TEST:
1800 *params = mDepthStencil.stencilTest;
1801 break;
1802 case GL_DEPTH_TEST:
1803 *params = mDepthStencil.depthTest;
1804 break;
1805 case GL_BLEND:
1806 *params = mBlend.blend;
1807 break;
1808 case GL_DITHER:
1809 *params = mBlend.dither;
1810 break;
1811 case GL_TRANSFORM_FEEDBACK_ACTIVE:
1812 *params = getCurrentTransformFeedback()->isActive() ? GL_TRUE : GL_FALSE;
1813 break;
1814 case GL_TRANSFORM_FEEDBACK_PAUSED:
1815 *params = getCurrentTransformFeedback()->isPaused() ? GL_TRUE : GL_FALSE;
1816 break;
1817 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1818 *params = mPrimitiveRestart;
1819 break;
1820 case GL_RASTERIZER_DISCARD:
1821 *params = isRasterizerDiscardEnabled() ? GL_TRUE : GL_FALSE;
1822 break;
1823 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
1824 *params = mDebug.isOutputSynchronous() ? GL_TRUE : GL_FALSE;
1825 break;
1826 case GL_DEBUG_OUTPUT:
1827 *params = mDebug.isOutputEnabled() ? GL_TRUE : GL_FALSE;
1828 break;
1829 case GL_MULTISAMPLE_EXT:
1830 *params = mMultiSampling;
1831 break;
1832 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1833 *params = mSampleAlphaToOne;
1834 break;
1835 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
1836 *params = isBindGeneratesResourceEnabled() ? GL_TRUE : GL_FALSE;
1837 break;
1838 case GL_CLIENT_ARRAYS_ANGLE:
1839 *params = areClientArraysEnabled() ? GL_TRUE : GL_FALSE;
1840 break;
1841 case GL_FRAMEBUFFER_SRGB_EXT:
1842 *params = getFramebufferSRGB() ? GL_TRUE : GL_FALSE;
1843 break;
1844 case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
1845 *params = mRobustResourceInit ? GL_TRUE : GL_FALSE;
1846 break;
1847 case GL_PROGRAM_CACHE_ENABLED_ANGLE:
1848 *params = mProgramBinaryCacheEnabled ? GL_TRUE : GL_FALSE;
1849 break;
Jamie Madillc43be722017-07-13 16:22:14 -04001850
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001851 default:
1852 UNREACHABLE();
1853 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001854 }
1855}
1856
1857void State::getFloatv(GLenum pname, GLfloat *params)
1858{
1859 // Please note: DEPTH_CLEAR_VALUE is included in our internal getFloatv implementation
1860 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1861 // GetIntegerv as its native query function. As it would require conversion in any
1862 // case, this should make no difference to the calling application.
1863 switch (pname)
1864 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001865 case GL_LINE_WIDTH:
1866 *params = mLineWidth;
1867 break;
1868 case GL_SAMPLE_COVERAGE_VALUE:
1869 *params = mSampleCoverageValue;
1870 break;
1871 case GL_DEPTH_CLEAR_VALUE:
1872 *params = mDepthClearValue;
1873 break;
1874 case GL_POLYGON_OFFSET_FACTOR:
1875 *params = mRasterizer.polygonOffsetFactor;
1876 break;
1877 case GL_POLYGON_OFFSET_UNITS:
1878 *params = mRasterizer.polygonOffsetUnits;
1879 break;
1880 case GL_DEPTH_RANGE:
1881 params[0] = mNearZ;
1882 params[1] = mFarZ;
1883 break;
1884 case GL_COLOR_CLEAR_VALUE:
1885 params[0] = mColorClearValue.red;
1886 params[1] = mColorClearValue.green;
1887 params[2] = mColorClearValue.blue;
1888 params[3] = mColorClearValue.alpha;
1889 break;
1890 case GL_BLEND_COLOR:
1891 params[0] = mBlendColor.red;
1892 params[1] = mBlendColor.green;
1893 params[2] = mBlendColor.blue;
1894 params[3] = mBlendColor.alpha;
1895 break;
1896 case GL_MULTISAMPLE_EXT:
1897 *params = static_cast<GLfloat>(mMultiSampling);
1898 break;
1899 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1900 *params = static_cast<GLfloat>(mSampleAlphaToOne);
1901 break;
1902 case GL_COVERAGE_MODULATION_CHROMIUM:
1903 params[0] = static_cast<GLfloat>(mCoverageModulation);
1904 break;
1905 default:
1906 UNREACHABLE();
1907 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001908 }
1909}
1910
Jamie Madille98b1b52018-03-08 09:47:23 -05001911Error State::getIntegerv(const Context *context, GLenum pname, GLint *params)
Shannon Woods53a94a82014-06-24 15:20:36 -04001912{
1913 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
1914 {
1915 unsigned int colorAttachment = (pname - GL_DRAW_BUFFER0_EXT);
Shannon Woods2df6a602014-09-26 16:12:07 -04001916 ASSERT(colorAttachment < mMaxDrawBuffers);
Shannon Woods53a94a82014-06-24 15:20:36 -04001917 Framebuffer *framebuffer = mDrawFramebuffer;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001918 *params = framebuffer->getDrawBufferState(colorAttachment);
Jamie Madille98b1b52018-03-08 09:47:23 -05001919 return NoError();
Shannon Woods53a94a82014-06-24 15:20:36 -04001920 }
1921
1922 // Please note: DEPTH_CLEAR_VALUE is not included in our internal getIntegerv implementation
1923 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1924 // GetIntegerv as its native query function. As it would require conversion in any
1925 // case, this should make no difference to the calling application. You may find it in
1926 // State::getFloatv.
1927 switch (pname)
1928 {
Corentin Wallez336129f2017-10-17 15:55:40 -04001929 case GL_ARRAY_BUFFER_BINDING:
1930 *params = mBoundBuffers[BufferBinding::Array].id();
1931 break;
1932 case GL_DRAW_INDIRECT_BUFFER_BINDING:
1933 *params = mBoundBuffers[BufferBinding::DrawIndirect].id();
1934 break;
1935 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
1936 *params = getVertexArray()->getElementArrayBuffer().id();
1937 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001938 // case GL_FRAMEBUFFER_BINDING:
1939 // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1940 case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE:
1941 *params = mDrawFramebuffer->id();
1942 break;
1943 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
1944 *params = mReadFramebuffer->id();
1945 break;
1946 case GL_RENDERBUFFER_BINDING:
1947 *params = mRenderbuffer.id();
1948 break;
1949 case GL_VERTEX_ARRAY_BINDING:
1950 *params = mVertexArray->id();
1951 break;
1952 case GL_CURRENT_PROGRAM:
1953 *params = mProgram ? mProgram->id() : 0;
1954 break;
1955 case GL_PACK_ALIGNMENT:
1956 *params = mPack.alignment;
1957 break;
1958 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
1959 *params = mPack.reverseRowOrder;
1960 break;
1961 case GL_PACK_ROW_LENGTH:
1962 *params = mPack.rowLength;
1963 break;
1964 case GL_PACK_SKIP_ROWS:
1965 *params = mPack.skipRows;
1966 break;
1967 case GL_PACK_SKIP_PIXELS:
1968 *params = mPack.skipPixels;
1969 break;
1970 case GL_UNPACK_ALIGNMENT:
1971 *params = mUnpack.alignment;
1972 break;
1973 case GL_UNPACK_ROW_LENGTH:
1974 *params = mUnpack.rowLength;
1975 break;
1976 case GL_UNPACK_IMAGE_HEIGHT:
1977 *params = mUnpack.imageHeight;
1978 break;
1979 case GL_UNPACK_SKIP_IMAGES:
1980 *params = mUnpack.skipImages;
1981 break;
1982 case GL_UNPACK_SKIP_ROWS:
1983 *params = mUnpack.skipRows;
1984 break;
1985 case GL_UNPACK_SKIP_PIXELS:
1986 *params = mUnpack.skipPixels;
1987 break;
1988 case GL_GENERATE_MIPMAP_HINT:
1989 *params = mGenerateMipmapHint;
1990 break;
1991 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
1992 *params = mFragmentShaderDerivativeHint;
1993 break;
1994 case GL_ACTIVE_TEXTURE:
1995 *params = (static_cast<GLint>(mActiveSampler) + GL_TEXTURE0);
1996 break;
1997 case GL_STENCIL_FUNC:
1998 *params = mDepthStencil.stencilFunc;
1999 break;
2000 case GL_STENCIL_REF:
2001 *params = mStencilRef;
2002 break;
2003 case GL_STENCIL_VALUE_MASK:
2004 *params = CastMaskValue(context, mDepthStencil.stencilMask);
2005 break;
2006 case GL_STENCIL_BACK_FUNC:
2007 *params = mDepthStencil.stencilBackFunc;
2008 break;
2009 case GL_STENCIL_BACK_REF:
2010 *params = mStencilBackRef;
2011 break;
2012 case GL_STENCIL_BACK_VALUE_MASK:
2013 *params = CastMaskValue(context, mDepthStencil.stencilBackMask);
2014 break;
2015 case GL_STENCIL_FAIL:
2016 *params = mDepthStencil.stencilFail;
2017 break;
2018 case GL_STENCIL_PASS_DEPTH_FAIL:
2019 *params = mDepthStencil.stencilPassDepthFail;
2020 break;
2021 case GL_STENCIL_PASS_DEPTH_PASS:
2022 *params = mDepthStencil.stencilPassDepthPass;
2023 break;
2024 case GL_STENCIL_BACK_FAIL:
2025 *params = mDepthStencil.stencilBackFail;
2026 break;
2027 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
2028 *params = mDepthStencil.stencilBackPassDepthFail;
2029 break;
2030 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
2031 *params = mDepthStencil.stencilBackPassDepthPass;
2032 break;
2033 case GL_DEPTH_FUNC:
2034 *params = mDepthStencil.depthFunc;
2035 break;
2036 case GL_BLEND_SRC_RGB:
2037 *params = mBlend.sourceBlendRGB;
2038 break;
2039 case GL_BLEND_SRC_ALPHA:
2040 *params = mBlend.sourceBlendAlpha;
2041 break;
2042 case GL_BLEND_DST_RGB:
2043 *params = mBlend.destBlendRGB;
2044 break;
2045 case GL_BLEND_DST_ALPHA:
2046 *params = mBlend.destBlendAlpha;
2047 break;
2048 case GL_BLEND_EQUATION_RGB:
2049 *params = mBlend.blendEquationRGB;
2050 break;
2051 case GL_BLEND_EQUATION_ALPHA:
2052 *params = mBlend.blendEquationAlpha;
2053 break;
2054 case GL_STENCIL_WRITEMASK:
2055 *params = CastMaskValue(context, mDepthStencil.stencilWritemask);
2056 break;
2057 case GL_STENCIL_BACK_WRITEMASK:
2058 *params = CastMaskValue(context, mDepthStencil.stencilBackWritemask);
2059 break;
2060 case GL_STENCIL_CLEAR_VALUE:
2061 *params = mStencilClearValue;
2062 break;
2063 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
2064 *params = mReadFramebuffer->getImplementationColorReadType(context);
2065 break;
2066 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
2067 *params = mReadFramebuffer->getImplementationColorReadFormat(context);
2068 break;
2069 case GL_SAMPLE_BUFFERS:
2070 case GL_SAMPLES:
Shannon Woods53a94a82014-06-24 15:20:36 -04002071 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002072 Framebuffer *framebuffer = mDrawFramebuffer;
Jamie Madille98b1b52018-03-08 09:47:23 -05002073 bool complete = false;
2074 ANGLE_TRY(framebuffer->isComplete(context, &complete));
2075 if (complete)
Shannon Woods53a94a82014-06-24 15:20:36 -04002076 {
Jamie Madille98b1b52018-03-08 09:47:23 -05002077 GLint samples = 0;
2078 ANGLE_TRY(framebuffer->getSamples(context, &samples));
Shannon Woods53a94a82014-06-24 15:20:36 -04002079 switch (pname)
2080 {
Jamie Madilla0016b72017-07-14 14:30:46 -04002081 case GL_SAMPLE_BUFFERS:
Jamie Madille98b1b52018-03-08 09:47:23 -05002082 if (samples != 0)
Jamie Madilla0016b72017-07-14 14:30:46 -04002083 {
2084 *params = 1;
2085 }
2086 else
2087 {
2088 *params = 0;
2089 }
2090 break;
2091 case GL_SAMPLES:
Jamie Madille98b1b52018-03-08 09:47:23 -05002092 *params = samples;
Jamie Madilla0016b72017-07-14 14:30:46 -04002093 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002094 }
2095 }
2096 else
2097 {
2098 *params = 0;
2099 }
2100 }
2101 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002102 case GL_VIEWPORT:
2103 params[0] = mViewport.x;
2104 params[1] = mViewport.y;
2105 params[2] = mViewport.width;
2106 params[3] = mViewport.height;
2107 break;
2108 case GL_SCISSOR_BOX:
2109 params[0] = mScissor.x;
2110 params[1] = mScissor.y;
2111 params[2] = mScissor.width;
2112 params[3] = mScissor.height;
2113 break;
2114 case GL_CULL_FACE_MODE:
2115 *params = ToGLenum(mRasterizer.cullMode);
2116 break;
2117 case GL_FRONT_FACE:
2118 *params = mRasterizer.frontFace;
2119 break;
2120 case GL_RED_BITS:
2121 case GL_GREEN_BITS:
2122 case GL_BLUE_BITS:
2123 case GL_ALPHA_BITS:
Shannon Woods53a94a82014-06-24 15:20:36 -04002124 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002125 Framebuffer *framebuffer = getDrawFramebuffer();
2126 const FramebufferAttachment *colorbuffer = framebuffer->getFirstColorbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04002127
2128 if (colorbuffer)
2129 {
2130 switch (pname)
2131 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002132 case GL_RED_BITS:
2133 *params = colorbuffer->getRedSize();
2134 break;
2135 case GL_GREEN_BITS:
2136 *params = colorbuffer->getGreenSize();
2137 break;
2138 case GL_BLUE_BITS:
2139 *params = colorbuffer->getBlueSize();
2140 break;
2141 case GL_ALPHA_BITS:
2142 *params = colorbuffer->getAlphaSize();
2143 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002144 }
2145 }
2146 else
2147 {
2148 *params = 0;
2149 }
2150 }
2151 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002152 case GL_DEPTH_BITS:
Shannon Woods53a94a82014-06-24 15:20:36 -04002153 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002154 const Framebuffer *framebuffer = getDrawFramebuffer();
2155 const FramebufferAttachment *depthbuffer = framebuffer->getDepthbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04002156
2157 if (depthbuffer)
2158 {
2159 *params = depthbuffer->getDepthSize();
2160 }
2161 else
2162 {
2163 *params = 0;
2164 }
2165 }
2166 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002167 case GL_STENCIL_BITS:
Shannon Woods53a94a82014-06-24 15:20:36 -04002168 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002169 const Framebuffer *framebuffer = getDrawFramebuffer();
2170 const FramebufferAttachment *stencilbuffer = framebuffer->getStencilbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04002171
2172 if (stencilbuffer)
2173 {
2174 *params = stencilbuffer->getStencilSize();
2175 }
2176 else
2177 {
2178 *params = 0;
2179 }
2180 }
2181 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002182 case GL_TEXTURE_BINDING_2D:
2183 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2184 *params =
2185 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::_2D);
2186 break;
2187 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
2188 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2189 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2190 TextureType::Rectangle);
2191 break;
2192 case GL_TEXTURE_BINDING_CUBE_MAP:
2193 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2194 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2195 TextureType::CubeMap);
2196 break;
2197 case GL_TEXTURE_BINDING_3D:
2198 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2199 *params =
2200 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::_3D);
2201 break;
2202 case GL_TEXTURE_BINDING_2D_ARRAY:
2203 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2204 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2205 TextureType::_2DArray);
2206 break;
2207 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
2208 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2209 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2210 TextureType::_2DMultisample);
2211 break;
2212 case GL_TEXTURE_BINDING_EXTERNAL_OES:
2213 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2214 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2215 TextureType::External);
2216 break;
2217 case GL_UNIFORM_BUFFER_BINDING:
2218 *params = mBoundBuffers[BufferBinding::Uniform].id();
2219 break;
2220 case GL_TRANSFORM_FEEDBACK_BINDING:
2221 *params = mTransformFeedback.id();
2222 break;
2223 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
2224 *params = mBoundBuffers[BufferBinding::TransformFeedback].id();
2225 break;
2226 case GL_COPY_READ_BUFFER_BINDING:
2227 *params = mBoundBuffers[BufferBinding::CopyRead].id();
2228 break;
2229 case GL_COPY_WRITE_BUFFER_BINDING:
2230 *params = mBoundBuffers[BufferBinding::CopyWrite].id();
2231 break;
2232 case GL_PIXEL_PACK_BUFFER_BINDING:
2233 *params = mBoundBuffers[BufferBinding::PixelPack].id();
2234 break;
2235 case GL_PIXEL_UNPACK_BUFFER_BINDING:
2236 *params = mBoundBuffers[BufferBinding::PixelUnpack].id();
2237 break;
2238 case GL_READ_BUFFER:
2239 *params = mReadFramebuffer->getReadBufferState();
2240 break;
2241 case GL_SAMPLER_BINDING:
2242 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2243 *params = getSamplerId(static_cast<GLuint>(mActiveSampler));
2244 break;
2245 case GL_DEBUG_LOGGED_MESSAGES:
2246 *params = static_cast<GLint>(mDebug.getMessageCount());
2247 break;
2248 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
2249 *params = static_cast<GLint>(mDebug.getNextMessageLength());
2250 break;
2251 case GL_DEBUG_GROUP_STACK_DEPTH:
2252 *params = static_cast<GLint>(mDebug.getGroupStackDepth());
2253 break;
2254 case GL_MULTISAMPLE_EXT:
2255 *params = static_cast<GLint>(mMultiSampling);
2256 break;
2257 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
2258 *params = static_cast<GLint>(mSampleAlphaToOne);
2259 break;
2260 case GL_COVERAGE_MODULATION_CHROMIUM:
2261 *params = static_cast<GLint>(mCoverageModulation);
2262 break;
2263 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
2264 *params = mBoundBuffers[BufferBinding::AtomicCounter].id();
2265 break;
2266 case GL_SHADER_STORAGE_BUFFER_BINDING:
2267 *params = mBoundBuffers[BufferBinding::ShaderStorage].id();
2268 break;
2269 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
2270 *params = mBoundBuffers[BufferBinding::DispatchIndirect].id();
2271 break;
2272 default:
2273 UNREACHABLE();
2274 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002275 }
Jamie Madille98b1b52018-03-08 09:47:23 -05002276
2277 return NoError();
Shannon Woods53a94a82014-06-24 15:20:36 -04002278}
2279
Geoff Lang70d0f492015-12-10 17:45:46 -05002280void State::getPointerv(GLenum pname, void **params) const
2281{
2282 switch (pname)
2283 {
2284 case GL_DEBUG_CALLBACK_FUNCTION:
2285 *params = reinterpret_cast<void *>(mDebug.getCallback());
2286 break;
2287 case GL_DEBUG_CALLBACK_USER_PARAM:
2288 *params = const_cast<void *>(mDebug.getUserParam());
2289 break;
2290 default:
2291 UNREACHABLE();
2292 break;
2293 }
2294}
2295
Martin Radev66fb8202016-07-28 11:45:20 +03002296void State::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods53a94a82014-06-24 15:20:36 -04002297{
2298 switch (target)
2299 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002300 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
2301 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2302 *data = mTransformFeedback->getIndexedBuffer(index).id();
2303 break;
2304 case GL_UNIFORM_BUFFER_BINDING:
2305 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2306 *data = mUniformBuffers[index].id();
2307 break;
2308 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
2309 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2310 *data = mAtomicCounterBuffers[index].id();
2311 break;
2312 case GL_SHADER_STORAGE_BUFFER_BINDING:
2313 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2314 *data = mShaderStorageBuffers[index].id();
2315 break;
2316 case GL_VERTEX_BINDING_BUFFER:
2317 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
2318 *data = mVertexArray->getVertexBinding(index).getBuffer().id();
2319 break;
2320 case GL_VERTEX_BINDING_DIVISOR:
2321 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
2322 *data = mVertexArray->getVertexBinding(index).getDivisor();
2323 break;
2324 case GL_VERTEX_BINDING_OFFSET:
2325 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
2326 *data = static_cast<GLuint>(mVertexArray->getVertexBinding(index).getOffset());
2327 break;
2328 case GL_VERTEX_BINDING_STRIDE:
2329 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
2330 *data = mVertexArray->getVertexBinding(index).getStride();
2331 break;
2332 case GL_SAMPLE_MASK_VALUE:
2333 ASSERT(static_cast<size_t>(index) < mSampleMaskValues.size());
2334 *data = mSampleMaskValues[index];
2335 break;
2336 case GL_IMAGE_BINDING_NAME:
2337 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2338 *data = mImageUnits[index].texture.id();
2339 break;
2340 case GL_IMAGE_BINDING_LEVEL:
2341 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2342 *data = mImageUnits[index].level;
2343 break;
2344 case GL_IMAGE_BINDING_LAYER:
2345 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2346 *data = mImageUnits[index].layer;
2347 break;
2348 case GL_IMAGE_BINDING_ACCESS:
2349 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2350 *data = mImageUnits[index].access;
2351 break;
2352 case GL_IMAGE_BINDING_FORMAT:
2353 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2354 *data = mImageUnits[index].format;
2355 break;
2356 default:
2357 UNREACHABLE();
2358 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002359 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002360}
2361
Martin Radev66fb8202016-07-28 11:45:20 +03002362void State::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods53a94a82014-06-24 15:20:36 -04002363{
2364 switch (target)
2365 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002366 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
2367 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2368 *data = mTransformFeedback->getIndexedBuffer(index).getOffset();
2369 break;
2370 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
2371 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2372 *data = mTransformFeedback->getIndexedBuffer(index).getSize();
2373 break;
2374 case GL_UNIFORM_BUFFER_START:
2375 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2376 *data = mUniformBuffers[index].getOffset();
2377 break;
2378 case GL_UNIFORM_BUFFER_SIZE:
2379 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2380 *data = mUniformBuffers[index].getSize();
2381 break;
2382 case GL_ATOMIC_COUNTER_BUFFER_START:
2383 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2384 *data = mAtomicCounterBuffers[index].getOffset();
2385 break;
2386 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
2387 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2388 *data = mAtomicCounterBuffers[index].getSize();
2389 break;
2390 case GL_SHADER_STORAGE_BUFFER_START:
2391 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2392 *data = mShaderStorageBuffers[index].getOffset();
2393 break;
2394 case GL_SHADER_STORAGE_BUFFER_SIZE:
2395 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2396 *data = mShaderStorageBuffers[index].getSize();
2397 break;
2398 default:
2399 UNREACHABLE();
2400 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002401 }
Martin Radev66fb8202016-07-28 11:45:20 +03002402}
Shannon Woods53a94a82014-06-24 15:20:36 -04002403
Martin Radev66fb8202016-07-28 11:45:20 +03002404void State::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
2405{
Xinghua Cao9c8e1a32017-12-06 17:59:58 +08002406 switch (target)
2407 {
2408 case GL_IMAGE_BINDING_LAYERED:
2409 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2410 *data = mImageUnits[index].layered;
2411 break;
2412 default:
2413 UNREACHABLE();
2414 break;
2415 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002416}
2417
Corentin Wallez336129f2017-10-17 15:55:40 -04002418bool State::hasMappedBuffer(BufferBinding target) const
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002419{
Corentin Wallez336129f2017-10-17 15:55:40 -04002420 if (target == BufferBinding::Array)
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002421 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002422 const VertexArray *vao = getVertexArray();
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002423 const auto &vertexAttribs = vao->getVertexAttributes();
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002424 const auto &vertexBindings = vao->getVertexBindings();
Jamie Madilld078c682018-01-02 11:50:24 -05002425 for (size_t attribIndex : vao->getEnabledAttributesMask())
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002426 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002427 const VertexAttribute &vertexAttrib = vertexAttribs[attribIndex];
Martin Radevdd5f27e2017-06-07 10:17:09 +03002428 auto *boundBuffer = vertexBindings[vertexAttrib.bindingIndex].getBuffer().get();
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002429 if (vertexAttrib.enabled && boundBuffer && boundBuffer->isMapped())
2430 {
2431 return true;
2432 }
2433 }
2434
2435 return false;
2436 }
2437 else
2438 {
2439 Buffer *buffer = getTargetBuffer(target);
2440 return (buffer && buffer->isMapped());
2441 }
2442}
2443
Jamie Madillbc918e72018-03-08 09:47:21 -05002444Error State::syncDirtyObjects(const Context *context)
Jamie Madillc9d442d2016-01-20 11:17:24 -05002445{
2446 if (!mDirtyObjects.any())
Jamie Madillbc918e72018-03-08 09:47:21 -05002447 return NoError();
Jamie Madillc9d442d2016-01-20 11:17:24 -05002448
Jamie Madillbc918e72018-03-08 09:47:21 -05002449 return syncDirtyObjects(context, mDirtyObjects);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002450}
2451
Jamie Madillbc918e72018-03-08 09:47:21 -05002452Error State::syncDirtyObjects(const Context *context, const DirtyObjects &bitset)
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002453{
Jamie Madill6de51852017-04-12 09:53:01 -04002454 for (auto dirtyObject : bitset)
Jamie Madillc9d442d2016-01-20 11:17:24 -05002455 {
2456 switch (dirtyObject)
2457 {
2458 case DIRTY_OBJECT_READ_FRAMEBUFFER:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002459 ASSERT(mReadFramebuffer);
Jamie Madill19fa1c62018-03-08 09:47:21 -05002460 ANGLE_TRY(mReadFramebuffer->syncState(context));
Jamie Madillc9d442d2016-01-20 11:17:24 -05002461 break;
2462 case DIRTY_OBJECT_DRAW_FRAMEBUFFER:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002463 ASSERT(mDrawFramebuffer);
Jamie Madill19fa1c62018-03-08 09:47:21 -05002464 ANGLE_TRY(mDrawFramebuffer->syncState(context));
Jamie Madillc9d442d2016-01-20 11:17:24 -05002465 break;
2466 case DIRTY_OBJECT_VERTEX_ARRAY:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002467 ASSERT(mVertexArray);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002468 mVertexArray->syncState(context);
Jamie Madillc9d442d2016-01-20 11:17:24 -05002469 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002470 case DIRTY_OBJECT_PROGRAM_TEXTURES:
2471 syncProgramTextures(context);
2472 break;
2473
Jamie Madillc9d442d2016-01-20 11:17:24 -05002474 default:
2475 UNREACHABLE();
2476 break;
2477 }
2478 }
2479
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002480 mDirtyObjects &= ~bitset;
Jamie Madillbc918e72018-03-08 09:47:21 -05002481 return NoError();
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002482}
2483
Jamie Madill81c2e252017-09-09 23:32:46 -04002484void State::syncProgramTextures(const Context *context)
2485{
Jamie Madill81c2e252017-09-09 23:32:46 -04002486 // TODO(jmadill): Fine-grained updates.
2487 if (!mProgram)
2488 {
2489 return;
2490 }
2491
2492 ASSERT(mDirtyObjects[DIRTY_OBJECT_PROGRAM_TEXTURES]);
2493 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
2494
Jamie Madill0f80ed82017-09-19 00:24:56 -04002495 ActiveTextureMask newActiveTextures;
2496
Geoff Lange51ba632017-11-21 11:45:25 -05002497 // Initialize to the 'Initialized' state and set to 'MayNeedInit' if any texture is not
2498 // initialized.
2499 mCachedTexturesInitState = InitState::Initialized;
2500
Jamie Madill81c2e252017-09-09 23:32:46 -04002501 for (const SamplerBinding &samplerBinding : mProgram->getSamplerBindings())
2502 {
2503 if (samplerBinding.unreferenced)
2504 continue;
2505
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002506 TextureType textureType = samplerBinding.textureType;
Jamie Madill81c2e252017-09-09 23:32:46 -04002507 for (GLuint textureUnitIndex : samplerBinding.boundTextureUnits)
2508 {
2509 Texture *texture = getSamplerTexture(textureUnitIndex, textureType);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002510 Sampler *sampler = getSampler(textureUnitIndex);
Jamie Madill0f80ed82017-09-19 00:24:56 -04002511 ASSERT(static_cast<size_t>(textureUnitIndex) < mCompleteTextureCache.size());
2512 ASSERT(static_cast<size_t>(textureUnitIndex) < newActiveTextures.size());
Jamie Madill81c2e252017-09-09 23:32:46 -04002513
Jamie Madill42975642017-10-12 12:31:51 -04002514 ASSERT(texture);
Jamie Madill81c2e252017-09-09 23:32:46 -04002515
Jamie Madill42975642017-10-12 12:31:51 -04002516 // Mark the texture binding bit as dirty if the texture completeness changes.
2517 // TODO(jmadill): Use specific dirty bit for completeness change.
2518 if (texture->isSamplerComplete(context, sampler) &&
2519 !mDrawFramebuffer->hasTextureAttachment(texture))
2520 {
2521 texture->syncState();
2522 mCompleteTextureCache[textureUnitIndex] = texture;
Jamie Madill81c2e252017-09-09 23:32:46 -04002523 }
Jamie Madill42975642017-10-12 12:31:51 -04002524 else
2525 {
2526 mCompleteTextureCache[textureUnitIndex] = nullptr;
2527 }
2528
2529 // Bind the texture unconditionally, to recieve completeness change notifications.
Jamie Madill888081d2018-02-27 00:24:46 -05002530 mCompleteTextureBindings[textureUnitIndex].bind(texture->getSubject());
Jamie Madilla59fc192017-11-02 12:57:58 -04002531 mActiveTexturesMask.set(textureUnitIndex);
Jamie Madill42975642017-10-12 12:31:51 -04002532 newActiveTextures.set(textureUnitIndex);
Jamie Madill81c2e252017-09-09 23:32:46 -04002533
Jamie Madill06ef36b2017-09-09 23:32:46 -04002534 if (sampler != nullptr)
2535 {
2536 sampler->syncState(context);
2537 }
Geoff Lange51ba632017-11-21 11:45:25 -05002538
2539 if (texture->initState() == InitState::MayNeedInit)
2540 {
2541 mCachedTexturesInitState = InitState::MayNeedInit;
2542 }
Jamie Madill81c2e252017-09-09 23:32:46 -04002543 }
2544 }
Jamie Madill0f80ed82017-09-19 00:24:56 -04002545
2546 // Unset now missing textures.
Jamie Madilla59fc192017-11-02 12:57:58 -04002547 ActiveTextureMask negativeMask = mActiveTexturesMask & ~newActiveTextures;
Jamie Madill0f80ed82017-09-19 00:24:56 -04002548 if (negativeMask.any())
2549 {
2550 for (auto textureIndex : negativeMask)
2551 {
2552 mCompleteTextureBindings[textureIndex].reset();
2553 mCompleteTextureCache[textureIndex] = nullptr;
Jamie Madilla59fc192017-11-02 12:57:58 -04002554 mActiveTexturesMask.reset(textureIndex);
Jamie Madill0f80ed82017-09-19 00:24:56 -04002555 }
2556 }
Jamie Madill81c2e252017-09-09 23:32:46 -04002557}
2558
Jamie Madillbc918e72018-03-08 09:47:21 -05002559Error State::syncDirtyObject(const Context *context, GLenum target)
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002560{
2561 DirtyObjects localSet;
2562
2563 switch (target)
2564 {
2565 case GL_READ_FRAMEBUFFER:
2566 localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2567 break;
2568 case GL_DRAW_FRAMEBUFFER:
2569 localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2570 break;
2571 case GL_FRAMEBUFFER:
2572 localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2573 localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2574 break;
2575 case GL_VERTEX_ARRAY:
2576 localSet.set(DIRTY_OBJECT_VERTEX_ARRAY);
2577 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002578 case GL_TEXTURE:
2579 case GL_SAMPLER:
2580 case GL_PROGRAM:
2581 localSet.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
2582 break;
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002583 }
2584
Jamie Madillbc918e72018-03-08 09:47:21 -05002585 return syncDirtyObjects(context, localSet);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002586}
2587
2588void State::setObjectDirty(GLenum target)
2589{
2590 switch (target)
2591 {
2592 case GL_READ_FRAMEBUFFER:
2593 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2594 break;
2595 case GL_DRAW_FRAMEBUFFER:
2596 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2597 break;
2598 case GL_FRAMEBUFFER:
2599 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2600 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2601 break;
2602 case GL_VERTEX_ARRAY:
2603 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
2604 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002605 case GL_TEXTURE:
2606 case GL_SAMPLER:
Jamie Madill81c2e252017-09-09 23:32:46 -04002607 case GL_PROGRAM:
2608 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
2609 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
2610 break;
Jamie Madilla779b612017-07-24 11:46:05 -04002611 }
2612}
2613
Jamie Madill888081d2018-02-27 00:24:46 -05002614void State::setFramebufferDirty(const Framebuffer *framebuffer) const
2615{
2616 if (framebuffer == mReadFramebuffer)
2617 {
2618 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2619 }
2620 if (framebuffer == mDrawFramebuffer)
2621 {
2622 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2623 }
2624}
2625
Jamie Madilla779b612017-07-24 11:46:05 -04002626void State::onProgramExecutableChange(Program *program)
2627{
2628 // OpenGL Spec:
2629 // "If LinkProgram or ProgramBinary successfully re-links a program object
2630 // that was already in use as a result of a previous call to UseProgram, then the
2631 // generated executable code will be installed as part of the current rendering state."
2632 if (program->isLinked() && mProgram == program)
2633 {
2634 mDirtyBits.set(DIRTY_BIT_PROGRAM_EXECUTABLE);
Jamie Madill81c2e252017-09-09 23:32:46 -04002635 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002636 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002637}
Jamie Madillc9d442d2016-01-20 11:17:24 -05002638
Xinghua Cao65ec0b22017-03-28 16:10:52 +08002639void State::setImageUnit(const Context *context,
2640 GLuint unit,
2641 Texture *texture,
2642 GLint level,
2643 GLboolean layered,
2644 GLint layer,
2645 GLenum access,
2646 GLenum format)
2647{
2648 mImageUnits[unit].texture.set(context, texture);
2649 mImageUnits[unit].level = level;
2650 mImageUnits[unit].layered = layered;
2651 mImageUnits[unit].layer = layer;
2652 mImageUnits[unit].access = access;
2653 mImageUnits[unit].format = format;
2654}
2655
2656const ImageUnit &State::getImageUnit(GLuint unit) const
2657{
2658 return mImageUnits[unit];
2659}
2660
Jamie Madill81c2e252017-09-09 23:32:46 -04002661// Handle a dirty texture event.
Jamie Madilld4442552018-02-27 22:03:47 -05002662void State::onSubjectStateChange(const Context *context,
2663 angle::SubjectIndex index,
2664 angle::SubjectMessage message)
Jamie Madill81c2e252017-09-09 23:32:46 -04002665{
2666 // Conservatively assume all textures are dirty.
2667 // TODO(jmadill): More fine-grained update.
2668 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Geoff Lange51ba632017-11-21 11:45:25 -05002669
Jamie Madilld4442552018-02-27 22:03:47 -05002670 if (!mCompleteTextureCache[index] ||
2671 mCompleteTextureCache[index]->initState() == InitState::MayNeedInit)
Geoff Lange51ba632017-11-21 11:45:25 -05002672 {
2673 mCachedTexturesInitState = InitState::MayNeedInit;
2674 }
Jamie Madill81c2e252017-09-09 23:32:46 -04002675}
2676
Jamie Madill05b35b22017-10-03 09:01:44 -04002677Error State::clearUnclearedActiveTextures(const Context *context)
2678{
Jamie Madilla59fc192017-11-02 12:57:58 -04002679 ASSERT(mRobustResourceInit);
Jamie Madill05b35b22017-10-03 09:01:44 -04002680
Geoff Lange51ba632017-11-21 11:45:25 -05002681 if (mCachedTexturesInitState == InitState::Initialized)
2682 {
2683 return NoError();
2684 }
2685
Geoff Langd4fff502017-09-22 11:28:28 -04002686 ASSERT(!mDirtyObjects.any());
2687
Jamie Madilla59fc192017-11-02 12:57:58 -04002688 for (auto textureIndex : mActiveTexturesMask)
Jamie Madill05b35b22017-10-03 09:01:44 -04002689 {
Jamie Madilla59fc192017-11-02 12:57:58 -04002690 Texture *texture = mCompleteTextureCache[textureIndex];
Jamie Madill05b35b22017-10-03 09:01:44 -04002691 if (texture)
2692 {
2693 ANGLE_TRY(texture->ensureInitialized(context));
2694 }
2695 }
Jamie Madilla59fc192017-11-02 12:57:58 -04002696
Geoff Lange51ba632017-11-21 11:45:25 -05002697 mCachedTexturesInitState = InitState::Initialized;
2698
Jamie Madill05b35b22017-10-03 09:01:44 -04002699 return NoError();
2700}
2701
Jamie Madillc67323a2017-11-02 23:11:41 -04002702AttributesMask State::getAndResetDirtyCurrentValues() const
2703{
2704 AttributesMask retVal = mDirtyCurrentValues;
2705 mDirtyCurrentValues.reset();
2706 return retVal;
2707}
2708
James Darpiniane8a93c62018-01-04 18:02:24 -08002709bool State::isCurrentTransformFeedback(const TransformFeedback *tf) const
2710{
2711 return tf == mTransformFeedback.get();
2712}
2713bool State::isCurrentVertexArray(const VertexArray *va) const
2714{
2715 return va == mVertexArray;
2716}
2717
Jamie Madillc9d442d2016-01-20 11:17:24 -05002718} // namespace gl