blob: 7ea72fad168712c1bc8ce18a4c3f8899a88defa3 [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);
Jiawei Shaod2fa07e2018-03-15 09:20:25 +0800217 mActiveQueries[GL_PRIMITIVES_GENERATED_EXT].set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400218
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500219 mProgram = nullptr;
Shannon Woods53a94a82014-06-24 15:20:36 -0400220
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500221 mReadFramebuffer = nullptr;
222 mDrawFramebuffer = nullptr;
Jamie Madillb4b53c52015-02-03 15:22:48 -0500223
224 mPrimitiveRestart = false;
Geoff Lang70d0f492015-12-10 17:45:46 -0500225
226 mDebug.setOutputEnabled(debug);
227 mDebug.setMaxLoggedMessages(extensions.maxDebugLoggedMessages);
Sami Väisänen74c23472016-05-09 17:30:30 +0300228
Geoff Lang488130e2017-09-27 13:53:11 -0400229 mMultiSampling = true;
230 mSampleAlphaToOne = false;
Sami Väisänena797e062016-05-12 15:23:40 +0300231
232 mCoverageModulation = GL_NONE;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300233
234 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixProj);
235 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixMV);
236 mPathStencilFunc = GL_ALWAYS;
237 mPathStencilRef = 0;
238 mPathStencilMask = std::numeric_limits<GLuint>::max();
Jamie Madille08a1d32017-03-07 17:24:06 -0500239
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700240 mRobustResourceInit = robustResourceInit;
Jamie Madillc43be722017-07-13 16:22:14 -0400241 mProgramBinaryCacheEnabled = programBinaryCacheEnabled;
Lingfeng Yangdbb9c532018-02-25 19:58:24 -0800242
243 // GLES1 emulation: Initialize state for GLES1 if version
244 // applies
245 if (clientVersion < Version(2, 0))
246 {
247 mGLES1State.initialize(context);
248 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400249}
250
Jamie Madill6c1f6712017-02-14 19:08:04 -0500251void State::reset(const Context *context)
Shannon Woods53a94a82014-06-24 15:20:36 -0400252{
Jamie Madill8693bdb2017-09-02 15:32:14 -0400253 for (auto &bindingVec : mSamplerTextures)
Shannon Woods53a94a82014-06-24 15:20:36 -0400254 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800255 for (size_t textureIdx = 0; textureIdx < bindingVec.size(); textureIdx++)
Shannon Woods53a94a82014-06-24 15:20:36 -0400256 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800257 bindingVec[textureIdx].set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400258 }
259 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400260 for (size_t samplerIdx = 0; samplerIdx < mSamplers.size(); samplerIdx++)
261 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400262 mSamplers[samplerIdx].set(context, nullptr);
Geoff Lang76b10c92014-09-05 16:28:14 -0400263 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400264
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800265 for (auto &imageUnit : mImageUnits)
266 {
267 imageUnit.texture.set(context, nullptr);
268 imageUnit.level = 0;
269 imageUnit.layered = false;
270 imageUnit.layer = 0;
271 imageUnit.access = GL_READ_ONLY;
272 imageUnit.format = GL_R32UI;
273 }
274
Jamie Madill4928b7c2017-06-20 12:57:39 -0400275 mRenderbuffer.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400276
Corentin Wallez336129f2017-10-17 15:55:40 -0400277 for (auto type : angle::AllEnums<BufferBinding>())
278 {
James Darpiniane8a93c62018-01-04 18:02:24 -0800279 UpdateBufferBinding(context, &mBoundBuffers[type], nullptr, type);
Corentin Wallez336129f2017-10-17 15:55:40 -0400280 }
281
Geoff Lang7dd2e102014-11-10 15:19:26 -0500282 if (mProgram)
283 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500284 mProgram->release(context);
Geoff Lang7dd2e102014-11-10 15:19:26 -0500285 }
Yunchao Hed7297bf2017-04-19 15:27:10 +0800286 mProgram = nullptr;
Geoff Lang7dd2e102014-11-10 15:19:26 -0500287
Yunchao Hea336b902017-08-02 16:05:21 +0800288 mProgramPipeline.set(context, nullptr);
289
James Darpiniane8a93c62018-01-04 18:02:24 -0800290 if (mTransformFeedback.get())
291 mTransformFeedback->onBindingChanged(false);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400292 mTransformFeedback.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400293
294 for (State::ActiveQueryMap::iterator i = mActiveQueries.begin(); i != mActiveQueries.end(); i++)
295 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400296 i->second.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400297 }
298
Corentin Wallez336129f2017-10-17 15:55:40 -0400299 for (auto &buf : mUniformBuffers)
Shannon Woods53a94a82014-06-24 15:20:36 -0400300 {
James Darpiniane8a93c62018-01-04 18:02:24 -0800301 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::Uniform);
Shannon Woods53a94a82014-06-24 15:20:36 -0400302 }
303
Jiajia Qin6eafb042016-12-27 17:04:07 +0800304 for (auto &buf : mAtomicCounterBuffers)
305 {
James Darpiniane8a93c62018-01-04 18:02:24 -0800306 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::AtomicCounter);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800307 }
308
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800309 for (auto &buf : mShaderStorageBuffers)
310 {
James Darpiniane8a93c62018-01-04 18:02:24 -0800311 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::ShaderStorage);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800312 }
313
Sami Väisänene45e53b2016-05-25 10:36:04 +0300314 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixProj);
315 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixMV);
316 mPathStencilFunc = GL_ALWAYS;
317 mPathStencilRef = 0;
318 mPathStencilMask = std::numeric_limits<GLuint>::max();
319
Jamie Madill1b94d432015-08-07 13:23:23 -0400320 // TODO(jmadill): Is this necessary?
321 setAllDirtyBits();
Shannon Woods53a94a82014-06-24 15:20:36 -0400322}
323
324const RasterizerState &State::getRasterizerState() const
325{
326 return mRasterizer;
327}
328
329const BlendState &State::getBlendState() const
330{
331 return mBlend;
332}
333
334const DepthStencilState &State::getDepthStencilState() const
335{
336 return mDepthStencil;
337}
338
Jamie Madillf75ab352015-03-16 10:46:52 -0400339void State::setColorClearValue(float red, float green, float blue, float alpha)
Shannon Woods53a94a82014-06-24 15:20:36 -0400340{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700341 mColorClearValue.red = red;
Shannon Woods53a94a82014-06-24 15:20:36 -0400342 mColorClearValue.green = green;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700343 mColorClearValue.blue = blue;
Shannon Woods53a94a82014-06-24 15:20:36 -0400344 mColorClearValue.alpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400345 mDirtyBits.set(DIRTY_BIT_CLEAR_COLOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400346}
347
Jamie Madillf75ab352015-03-16 10:46:52 -0400348void State::setDepthClearValue(float depth)
Shannon Woods53a94a82014-06-24 15:20:36 -0400349{
350 mDepthClearValue = depth;
Jamie Madill1b94d432015-08-07 13:23:23 -0400351 mDirtyBits.set(DIRTY_BIT_CLEAR_DEPTH);
Shannon Woods53a94a82014-06-24 15:20:36 -0400352}
353
Jamie Madillf75ab352015-03-16 10:46:52 -0400354void State::setStencilClearValue(int stencil)
Shannon Woods53a94a82014-06-24 15:20:36 -0400355{
356 mStencilClearValue = stencil;
Jamie Madill1b94d432015-08-07 13:23:23 -0400357 mDirtyBits.set(DIRTY_BIT_CLEAR_STENCIL);
Shannon Woods53a94a82014-06-24 15:20:36 -0400358}
359
Shannon Woods53a94a82014-06-24 15:20:36 -0400360void State::setColorMask(bool red, bool green, bool blue, bool alpha)
361{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700362 mBlend.colorMaskRed = red;
Shannon Woods53a94a82014-06-24 15:20:36 -0400363 mBlend.colorMaskGreen = green;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700364 mBlend.colorMaskBlue = blue;
Shannon Woods53a94a82014-06-24 15:20:36 -0400365 mBlend.colorMaskAlpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400366 mDirtyBits.set(DIRTY_BIT_COLOR_MASK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400367}
368
369void State::setDepthMask(bool mask)
370{
371 mDepthStencil.depthMask = mask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400372 mDirtyBits.set(DIRTY_BIT_DEPTH_MASK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400373}
374
375bool State::isRasterizerDiscardEnabled() const
376{
377 return mRasterizer.rasterizerDiscard;
378}
379
380void State::setRasterizerDiscard(bool enabled)
381{
382 mRasterizer.rasterizerDiscard = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400383 mDirtyBits.set(DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400384}
385
386bool State::isCullFaceEnabled() const
387{
388 return mRasterizer.cullFace;
389}
390
391void State::setCullFace(bool enabled)
392{
393 mRasterizer.cullFace = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400394 mDirtyBits.set(DIRTY_BIT_CULL_FACE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400395}
396
Corentin Wallez2e568cf2017-09-18 17:05:22 -0400397void State::setCullMode(CullFaceMode mode)
Shannon Woods53a94a82014-06-24 15:20:36 -0400398{
399 mRasterizer.cullMode = mode;
Jamie Madill1b94d432015-08-07 13:23:23 -0400400 mDirtyBits.set(DIRTY_BIT_CULL_FACE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400401}
402
403void State::setFrontFace(GLenum front)
404{
405 mRasterizer.frontFace = front;
Jamie Madill1b94d432015-08-07 13:23:23 -0400406 mDirtyBits.set(DIRTY_BIT_FRONT_FACE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400407}
408
409bool State::isDepthTestEnabled() const
410{
411 return mDepthStencil.depthTest;
412}
413
414void State::setDepthTest(bool enabled)
415{
416 mDepthStencil.depthTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400417 mDirtyBits.set(DIRTY_BIT_DEPTH_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400418}
419
420void State::setDepthFunc(GLenum depthFunc)
421{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700422 mDepthStencil.depthFunc = depthFunc;
423 mDirtyBits.set(DIRTY_BIT_DEPTH_FUNC);
Shannon Woods53a94a82014-06-24 15:20:36 -0400424}
425
426void State::setDepthRange(float zNear, float zFar)
427{
428 mNearZ = zNear;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700429 mFarZ = zFar;
Jamie Madill1b94d432015-08-07 13:23:23 -0400430 mDirtyBits.set(DIRTY_BIT_DEPTH_RANGE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400431}
432
Geoff Langd42f5b82015-04-16 14:03:29 -0400433float State::getNearPlane() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400434{
Geoff Langd42f5b82015-04-16 14:03:29 -0400435 return mNearZ;
436}
437
438float State::getFarPlane() const
439{
440 return mFarZ;
Shannon Woods53a94a82014-06-24 15:20:36 -0400441}
442
443bool State::isBlendEnabled() const
444{
445 return mBlend.blend;
446}
447
448void State::setBlend(bool enabled)
449{
450 mBlend.blend = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400451 mDirtyBits.set(DIRTY_BIT_BLEND_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400452}
453
454void State::setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha)
455{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700456 mBlend.sourceBlendRGB = sourceRGB;
457 mBlend.destBlendRGB = destRGB;
Shannon Woods53a94a82014-06-24 15:20:36 -0400458 mBlend.sourceBlendAlpha = sourceAlpha;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700459 mBlend.destBlendAlpha = destAlpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400460 mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400461}
462
463void State::setBlendColor(float red, float green, float blue, float alpha)
464{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700465 mBlendColor.red = red;
Shannon Woods53a94a82014-06-24 15:20:36 -0400466 mBlendColor.green = green;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700467 mBlendColor.blue = blue;
Shannon Woods53a94a82014-06-24 15:20:36 -0400468 mBlendColor.alpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400469 mDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400470}
471
472void State::setBlendEquation(GLenum rgbEquation, GLenum alphaEquation)
473{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700474 mBlend.blendEquationRGB = rgbEquation;
Shannon Woods53a94a82014-06-24 15:20:36 -0400475 mBlend.blendEquationAlpha = alphaEquation;
Jamie Madill1b94d432015-08-07 13:23:23 -0400476 mDirtyBits.set(DIRTY_BIT_BLEND_EQUATIONS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400477}
478
479const ColorF &State::getBlendColor() const
480{
481 return mBlendColor;
482}
483
484bool State::isStencilTestEnabled() const
485{
486 return mDepthStencil.stencilTest;
487}
488
489void State::setStencilTest(bool enabled)
490{
491 mDepthStencil.stencilTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400492 mDirtyBits.set(DIRTY_BIT_STENCIL_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400493}
494
495void State::setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask)
496{
497 mDepthStencil.stencilFunc = stencilFunc;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700498 mStencilRef = (stencilRef > 0) ? stencilRef : 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400499 mDepthStencil.stencilMask = stencilMask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400500 mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400501}
502
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700503void State::setStencilBackParams(GLenum stencilBackFunc,
504 GLint stencilBackRef,
505 GLuint stencilBackMask)
Shannon Woods53a94a82014-06-24 15:20:36 -0400506{
507 mDepthStencil.stencilBackFunc = stencilBackFunc;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700508 mStencilBackRef = (stencilBackRef > 0) ? stencilBackRef : 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400509 mDepthStencil.stencilBackMask = stencilBackMask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400510 mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400511}
512
513void State::setStencilWritemask(GLuint stencilWritemask)
514{
515 mDepthStencil.stencilWritemask = stencilWritemask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400516 mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400517}
518
519void State::setStencilBackWritemask(GLuint stencilBackWritemask)
520{
521 mDepthStencil.stencilBackWritemask = stencilBackWritemask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400522 mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400523}
524
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700525void State::setStencilOperations(GLenum stencilFail,
526 GLenum stencilPassDepthFail,
527 GLenum stencilPassDepthPass)
Shannon Woods53a94a82014-06-24 15:20:36 -0400528{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700529 mDepthStencil.stencilFail = stencilFail;
Shannon Woods53a94a82014-06-24 15:20:36 -0400530 mDepthStencil.stencilPassDepthFail = stencilPassDepthFail;
531 mDepthStencil.stencilPassDepthPass = stencilPassDepthPass;
Jamie Madill1b94d432015-08-07 13:23:23 -0400532 mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400533}
534
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700535void State::setStencilBackOperations(GLenum stencilBackFail,
536 GLenum stencilBackPassDepthFail,
537 GLenum stencilBackPassDepthPass)
Shannon Woods53a94a82014-06-24 15:20:36 -0400538{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700539 mDepthStencil.stencilBackFail = stencilBackFail;
Shannon Woods53a94a82014-06-24 15:20:36 -0400540 mDepthStencil.stencilBackPassDepthFail = stencilBackPassDepthFail;
541 mDepthStencil.stencilBackPassDepthPass = stencilBackPassDepthPass;
Jamie Madill1b94d432015-08-07 13:23:23 -0400542 mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400543}
544
545GLint State::getStencilRef() const
546{
547 return mStencilRef;
548}
549
550GLint State::getStencilBackRef() const
551{
552 return mStencilBackRef;
553}
554
555bool State::isPolygonOffsetFillEnabled() const
556{
557 return mRasterizer.polygonOffsetFill;
558}
559
560void State::setPolygonOffsetFill(bool enabled)
561{
Jamie Madill1b94d432015-08-07 13:23:23 -0400562 mRasterizer.polygonOffsetFill = enabled;
563 mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400564}
565
566void State::setPolygonOffsetParams(GLfloat factor, GLfloat units)
567{
568 // An application can pass NaN values here, so handle this gracefully
569 mRasterizer.polygonOffsetFactor = factor != factor ? 0.0f : factor;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700570 mRasterizer.polygonOffsetUnits = units != units ? 0.0f : units;
Jamie Madill1b94d432015-08-07 13:23:23 -0400571 mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET);
Shannon Woods53a94a82014-06-24 15:20:36 -0400572}
573
574bool State::isSampleAlphaToCoverageEnabled() const
575{
576 return mBlend.sampleAlphaToCoverage;
577}
578
579void State::setSampleAlphaToCoverage(bool enabled)
580{
581 mBlend.sampleAlphaToCoverage = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400582 mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400583}
584
585bool State::isSampleCoverageEnabled() const
586{
587 return mSampleCoverage;
588}
589
590void State::setSampleCoverage(bool enabled)
591{
592 mSampleCoverage = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400593 mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400594}
595
596void State::setSampleCoverageParams(GLclampf value, bool invert)
597{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700598 mSampleCoverageValue = value;
Shannon Woods53a94a82014-06-24 15:20:36 -0400599 mSampleCoverageInvert = invert;
Jamie Madill1b94d432015-08-07 13:23:23 -0400600 mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400601}
602
Geoff Lang0fbb6002015-04-16 11:11:53 -0400603GLclampf State::getSampleCoverageValue() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400604{
Geoff Lang0fbb6002015-04-16 11:11:53 -0400605 return mSampleCoverageValue;
606}
Shannon Woods53a94a82014-06-24 15:20:36 -0400607
Geoff Lang0fbb6002015-04-16 11:11:53 -0400608bool State::getSampleCoverageInvert() const
609{
610 return mSampleCoverageInvert;
Shannon Woods53a94a82014-06-24 15:20:36 -0400611}
612
Jiawei Shaodb342272017-09-27 10:21:45 +0800613bool State::isSampleMaskEnabled() const
614{
615 return mSampleMask;
616}
617
618void State::setSampleMaskEnabled(bool enabled)
619{
620 mSampleMask = enabled;
621 mDirtyBits.set(DIRTY_BIT_SAMPLE_MASK_ENABLED);
622}
623
624void State::setSampleMaskParams(GLuint maskNumber, GLbitfield mask)
625{
626 ASSERT(maskNumber < mMaxSampleMaskWords);
627 mSampleMaskValues[maskNumber] = mask;
Jamie Madillc67323a2017-11-02 23:11:41 -0400628 // TODO(jmadill): Use a child dirty bit if we ever use more than two words.
629 mDirtyBits.set(DIRTY_BIT_SAMPLE_MASK);
Jiawei Shaodb342272017-09-27 10:21:45 +0800630}
631
632GLbitfield State::getSampleMaskWord(GLuint maskNumber) const
633{
634 ASSERT(maskNumber < mMaxSampleMaskWords);
635 return mSampleMaskValues[maskNumber];
636}
637
638GLuint State::getMaxSampleMaskWords() const
639{
640 return mMaxSampleMaskWords;
641}
642
Sami Väisänen74c23472016-05-09 17:30:30 +0300643void State::setSampleAlphaToOne(bool enabled)
644{
645 mSampleAlphaToOne = enabled;
646 mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_ONE);
647}
648
649bool State::isSampleAlphaToOneEnabled() const
650{
651 return mSampleAlphaToOne;
652}
653
654void State::setMultisampling(bool enabled)
655{
656 mMultiSampling = enabled;
657 mDirtyBits.set(DIRTY_BIT_MULTISAMPLING);
658}
659
660bool State::isMultisamplingEnabled() const
661{
662 return mMultiSampling;
663}
664
Shannon Woods53a94a82014-06-24 15:20:36 -0400665bool State::isScissorTestEnabled() const
666{
667 return mScissorTest;
668}
669
670void State::setScissorTest(bool enabled)
671{
672 mScissorTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400673 mDirtyBits.set(DIRTY_BIT_SCISSOR_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400674}
675
676void State::setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height)
677{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700678 mScissor.x = x;
679 mScissor.y = y;
680 mScissor.width = width;
Shannon Woods53a94a82014-06-24 15:20:36 -0400681 mScissor.height = height;
Jamie Madill1b94d432015-08-07 13:23:23 -0400682 mDirtyBits.set(DIRTY_BIT_SCISSOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400683}
684
685const Rectangle &State::getScissor() const
686{
687 return mScissor;
688}
689
690bool State::isDitherEnabled() const
691{
692 return mBlend.dither;
693}
694
695void State::setDither(bool enabled)
696{
697 mBlend.dither = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400698 mDirtyBits.set(DIRTY_BIT_DITHER_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400699}
700
Jamie Madillb4b53c52015-02-03 15:22:48 -0500701bool State::isPrimitiveRestartEnabled() const
702{
703 return mPrimitiveRestart;
704}
705
706void State::setPrimitiveRestart(bool enabled)
707{
708 mPrimitiveRestart = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400709 mDirtyBits.set(DIRTY_BIT_PRIMITIVE_RESTART_ENABLED);
Jamie Madillb4b53c52015-02-03 15:22:48 -0500710}
711
Shannon Woods53a94a82014-06-24 15:20:36 -0400712void State::setEnableFeature(GLenum feature, bool enabled)
713{
714 switch (feature)
715 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700716 case GL_MULTISAMPLE_EXT:
717 setMultisampling(enabled);
718 break;
719 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
720 setSampleAlphaToOne(enabled);
721 break;
722 case GL_CULL_FACE:
723 setCullFace(enabled);
724 break;
725 case GL_POLYGON_OFFSET_FILL:
726 setPolygonOffsetFill(enabled);
727 break;
728 case GL_SAMPLE_ALPHA_TO_COVERAGE:
729 setSampleAlphaToCoverage(enabled);
730 break;
731 case GL_SAMPLE_COVERAGE:
732 setSampleCoverage(enabled);
733 break;
734 case GL_SCISSOR_TEST:
735 setScissorTest(enabled);
736 break;
737 case GL_STENCIL_TEST:
738 setStencilTest(enabled);
739 break;
740 case GL_DEPTH_TEST:
741 setDepthTest(enabled);
742 break;
743 case GL_BLEND:
744 setBlend(enabled);
745 break;
746 case GL_DITHER:
747 setDither(enabled);
748 break;
749 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
750 setPrimitiveRestart(enabled);
751 break;
752 case GL_RASTERIZER_DISCARD:
753 setRasterizerDiscard(enabled);
754 break;
755 case GL_SAMPLE_MASK:
756 setSampleMaskEnabled(enabled);
757 break;
758 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
759 mDebug.setOutputSynchronous(enabled);
760 break;
761 case GL_DEBUG_OUTPUT:
762 mDebug.setOutputEnabled(enabled);
763 break;
764 case GL_FRAMEBUFFER_SRGB_EXT:
765 setFramebufferSRGB(enabled);
766 break;
767 default:
768 UNREACHABLE();
Shannon Woods53a94a82014-06-24 15:20:36 -0400769 }
770}
771
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700772bool State::getEnableFeature(GLenum feature) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400773{
774 switch (feature)
775 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700776 case GL_MULTISAMPLE_EXT:
777 return isMultisamplingEnabled();
778 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
779 return isSampleAlphaToOneEnabled();
780 case GL_CULL_FACE:
781 return isCullFaceEnabled();
782 case GL_POLYGON_OFFSET_FILL:
783 return isPolygonOffsetFillEnabled();
784 case GL_SAMPLE_ALPHA_TO_COVERAGE:
785 return isSampleAlphaToCoverageEnabled();
786 case GL_SAMPLE_COVERAGE:
787 return isSampleCoverageEnabled();
788 case GL_SCISSOR_TEST:
789 return isScissorTestEnabled();
790 case GL_STENCIL_TEST:
791 return isStencilTestEnabled();
792 case GL_DEPTH_TEST:
793 return isDepthTestEnabled();
794 case GL_BLEND:
795 return isBlendEnabled();
796 case GL_DITHER:
797 return isDitherEnabled();
798 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
799 return isPrimitiveRestartEnabled();
800 case GL_RASTERIZER_DISCARD:
801 return isRasterizerDiscardEnabled();
802 case GL_SAMPLE_MASK:
803 return isSampleMaskEnabled();
804 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
805 return mDebug.isOutputSynchronous();
806 case GL_DEBUG_OUTPUT:
807 return mDebug.isOutputEnabled();
808 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
809 return isBindGeneratesResourceEnabled();
810 case GL_CLIENT_ARRAYS_ANGLE:
811 return areClientArraysEnabled();
812 case GL_FRAMEBUFFER_SRGB_EXT:
813 return getFramebufferSRGB();
814 case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
815 return mRobustResourceInit;
816 case GL_PROGRAM_CACHE_ENABLED_ANGLE:
817 return mProgramBinaryCacheEnabled;
Jamie Madillc43be722017-07-13 16:22:14 -0400818
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700819 default:
820 UNREACHABLE();
821 return false;
Shannon Woods53a94a82014-06-24 15:20:36 -0400822 }
823}
824
825void State::setLineWidth(GLfloat width)
826{
827 mLineWidth = width;
Jamie Madill1b94d432015-08-07 13:23:23 -0400828 mDirtyBits.set(DIRTY_BIT_LINE_WIDTH);
Shannon Woods53a94a82014-06-24 15:20:36 -0400829}
830
Geoff Lang4b3f4162015-04-16 13:22:05 -0400831float State::getLineWidth() const
832{
833 return mLineWidth;
834}
835
Shannon Woods53a94a82014-06-24 15:20:36 -0400836void State::setGenerateMipmapHint(GLenum hint)
837{
838 mGenerateMipmapHint = hint;
Jamie Madill1b94d432015-08-07 13:23:23 -0400839 mDirtyBits.set(DIRTY_BIT_GENERATE_MIPMAP_HINT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400840}
841
842void State::setFragmentShaderDerivativeHint(GLenum hint)
843{
844 mFragmentShaderDerivativeHint = hint;
Jamie Madill1b94d432015-08-07 13:23:23 -0400845 mDirtyBits.set(DIRTY_BIT_SHADER_DERIVATIVE_HINT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400846 // TODO: Propagate the hint to shader translator so we can write
847 // ddx, ddx_coarse, or ddx_fine depending on the hint.
848 // Ignore for now. It is valid for implementations to ignore hint.
849}
850
Geoff Langf41a7152016-09-19 15:11:17 -0400851bool State::isBindGeneratesResourceEnabled() const
852{
853 return mBindGeneratesResource;
854}
855
Geoff Langfeb8c682017-02-13 16:07:35 -0500856bool State::areClientArraysEnabled() const
857{
858 return mClientArraysEnabled;
859}
860
Shannon Woods53a94a82014-06-24 15:20:36 -0400861void State::setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height)
862{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700863 mViewport.x = x;
864 mViewport.y = y;
865 mViewport.width = width;
Shannon Woods53a94a82014-06-24 15:20:36 -0400866 mViewport.height = height;
Jamie Madill1b94d432015-08-07 13:23:23 -0400867 mDirtyBits.set(DIRTY_BIT_VIEWPORT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400868}
869
870const Rectangle &State::getViewport() const
871{
872 return mViewport;
873}
874
875void State::setActiveSampler(unsigned int active)
876{
877 mActiveSampler = active;
878}
879
880unsigned int State::getActiveSampler() const
881{
Cooper Partin4d61f7e2015-08-12 10:56:50 -0700882 return static_cast<unsigned int>(mActiveSampler);
Shannon Woods53a94a82014-06-24 15:20:36 -0400883}
884
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800885void State::setSamplerTexture(const Context *context, TextureType type, Texture *texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400886{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400887 mSamplerTextures[type][mActiveSampler].set(context, texture);
Jamie Madill81c2e252017-09-09 23:32:46 -0400888 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
889 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Shannon Woods53a94a82014-06-24 15:20:36 -0400890}
891
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800892Texture *State::getTargetTexture(TextureType type) const
Jamie Madillc29968b2016-01-20 11:17:23 -0500893{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800894 return getSamplerTexture(static_cast<unsigned int>(mActiveSampler), type);
Jamie Madillc29968b2016-01-20 11:17:23 -0500895}
896
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800897Texture *State::getSamplerTexture(unsigned int sampler, TextureType type) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400898{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800899 ASSERT(sampler < mSamplerTextures[type].size());
900 return mSamplerTextures[type][sampler].get();
Shannon Woods53a94a82014-06-24 15:20:36 -0400901}
902
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800903GLuint State::getSamplerTextureId(unsigned int sampler, TextureType type) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400904{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800905 ASSERT(sampler < mSamplerTextures[type].size());
906 return mSamplerTextures[type][sampler].id();
Shannon Woods53a94a82014-06-24 15:20:36 -0400907}
908
Jamie Madilla02315b2017-02-23 14:14:47 -0500909void State::detachTexture(const Context *context, const TextureMap &zeroTextures, GLuint texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400910{
911 // Textures have a detach method on State rather than a simple
912 // removeBinding, because the zero/null texture objects are managed
913 // separately, and don't have to go through the Context's maps or
914 // the ResourceManager.
915
916 // [OpenGL ES 2.0.24] section 3.8 page 84:
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700917 // If a texture object is deleted, it is as if all texture units which are bound to that texture
918 // object are rebound to texture object zero
Shannon Woods53a94a82014-06-24 15:20:36 -0400919
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800920 for (TextureType type : angle::AllEnums<TextureType>())
Shannon Woods53a94a82014-06-24 15:20:36 -0400921 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800922 TextureBindingVector &textureVector = mSamplerTextures[type];
Jamie Madill81c2e252017-09-09 23:32:46 -0400923 for (BindingPointer<Texture> &binding : textureVector)
Shannon Woods53a94a82014-06-24 15:20:36 -0400924 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400925 if (binding.id() == texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400926 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800927 Texture *zeroTexture = zeroTextures[type].get();
928 ASSERT(zeroTexture != nullptr);
Jamie Madille6382c32014-11-07 15:05:26 -0500929 // Zero textures are the "default" textures instead of NULL
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800930 binding.set(context, zeroTexture);
Jamie Madill81c2e252017-09-09 23:32:46 -0400931 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400932 }
933 }
934 }
935
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800936 for (auto &bindingImageUnit : mImageUnits)
937 {
938 if (bindingImageUnit.texture.id() == texture)
939 {
940 bindingImageUnit.texture.set(context, nullptr);
941 bindingImageUnit.level = 0;
942 bindingImageUnit.layered = false;
943 bindingImageUnit.layer = 0;
944 bindingImageUnit.access = GL_READ_ONLY;
945 bindingImageUnit.format = GL_R32UI;
946 break;
947 }
948 }
949
Shannon Woods53a94a82014-06-24 15:20:36 -0400950 // [OpenGL ES 2.0.24] section 4.4 page 112:
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700951 // If a texture object is deleted while its image is attached to the currently bound
952 // framebuffer, then it is as if Texture2DAttachment had been called, with a texture of 0, for
953 // each attachment point to which this image was attached in the currently bound framebuffer.
Shannon Woods53a94a82014-06-24 15:20:36 -0400954
Jamie Madill8693bdb2017-09-02 15:32:14 -0400955 if (mReadFramebuffer && mReadFramebuffer->detachTexture(context, texture))
Shannon Woods53a94a82014-06-24 15:20:36 -0400956 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400957 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -0400958 }
959
Jamie Madill8693bdb2017-09-02 15:32:14 -0400960 if (mDrawFramebuffer && mDrawFramebuffer->detachTexture(context, texture))
Shannon Woods53a94a82014-06-24 15:20:36 -0400961 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400962 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -0400963 }
964}
965
Jamie Madill4928b7c2017-06-20 12:57:39 -0400966void State::initializeZeroTextures(const Context *context, const TextureMap &zeroTextures)
Jamie Madille6382c32014-11-07 15:05:26 -0500967{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800968 for (TextureType type : angle::AllEnums<TextureType>())
Jamie Madille6382c32014-11-07 15:05:26 -0500969 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800970 for (size_t textureUnit = 0; textureUnit < mSamplerTextures[type].size(); ++textureUnit)
Jamie Madille6382c32014-11-07 15:05:26 -0500971 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800972 mSamplerTextures[type][textureUnit].set(context, zeroTextures[type].get());
Jamie Madille6382c32014-11-07 15:05:26 -0500973 }
974 }
975}
976
Jamie Madill4928b7c2017-06-20 12:57:39 -0400977void State::setSamplerBinding(const Context *context, GLuint textureUnit, Sampler *sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -0400978{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400979 mSamplers[textureUnit].set(context, sampler);
Jamie Madill81c2e252017-09-09 23:32:46 -0400980 mDirtyBits.set(DIRTY_BIT_SAMPLER_BINDINGS);
981 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Shannon Woods53a94a82014-06-24 15:20:36 -0400982}
983
984GLuint State::getSamplerId(GLuint textureUnit) const
985{
Geoff Lang76b10c92014-09-05 16:28:14 -0400986 ASSERT(textureUnit < mSamplers.size());
Shannon Woods53a94a82014-06-24 15:20:36 -0400987 return mSamplers[textureUnit].id();
988}
989
990Sampler *State::getSampler(GLuint textureUnit) const
991{
992 return mSamplers[textureUnit].get();
993}
994
Jamie Madill4928b7c2017-06-20 12:57:39 -0400995void State::detachSampler(const Context *context, GLuint sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -0400996{
997 // [OpenGL ES 3.0.2] section 3.8.2 pages 123-124:
998 // If a sampler object that is currently bound to one or more texture units is
999 // deleted, it is as though BindSampler is called once for each texture unit to
1000 // which the sampler is bound, with unit set to the texture unit and sampler set to zero.
Jamie Madill81c2e252017-09-09 23:32:46 -04001001 for (BindingPointer<Sampler> &samplerBinding : mSamplers)
Shannon Woods53a94a82014-06-24 15:20:36 -04001002 {
Geoff Lang76b10c92014-09-05 16:28:14 -04001003 if (samplerBinding.id() == sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -04001004 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001005 samplerBinding.set(context, nullptr);
Jamie Madill81c2e252017-09-09 23:32:46 -04001006 mDirtyBits.set(DIRTY_BIT_SAMPLER_BINDINGS);
Shannon Woods53a94a82014-06-24 15:20:36 -04001007 }
1008 }
1009}
1010
Jamie Madill4928b7c2017-06-20 12:57:39 -04001011void State::setRenderbufferBinding(const Context *context, Renderbuffer *renderbuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001012{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001013 mRenderbuffer.set(context, renderbuffer);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001014 mDirtyBits.set(DIRTY_BIT_RENDERBUFFER_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001015}
1016
1017GLuint State::getRenderbufferId() const
1018{
1019 return mRenderbuffer.id();
1020}
1021
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001022Renderbuffer *State::getCurrentRenderbuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001023{
1024 return mRenderbuffer.get();
1025}
1026
Jamie Madilla02315b2017-02-23 14:14:47 -05001027void State::detachRenderbuffer(const Context *context, GLuint renderbuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001028{
1029 // [OpenGL ES 2.0.24] section 4.4 page 109:
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001030 // If a renderbuffer that is currently bound to RENDERBUFFER is deleted, it is as though
1031 // BindRenderbuffer had been executed with the target RENDERBUFFER and name of zero.
Shannon Woods53a94a82014-06-24 15:20:36 -04001032
1033 if (mRenderbuffer.id() == renderbuffer)
1034 {
Jamie Madill8693bdb2017-09-02 15:32:14 -04001035 setRenderbufferBinding(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001036 }
1037
1038 // [OpenGL ES 2.0.24] section 4.4 page 111:
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001039 // If a renderbuffer object is deleted while its image is attached to the currently bound
1040 // framebuffer, then it is as if FramebufferRenderbuffer had been called, with a renderbuffer of
1041 // 0, for each attachment point to which this image was attached in the currently bound
1042 // framebuffer.
Shannon Woods53a94a82014-06-24 15:20:36 -04001043
1044 Framebuffer *readFramebuffer = mReadFramebuffer;
1045 Framebuffer *drawFramebuffer = mDrawFramebuffer;
1046
Jamie Madill8693bdb2017-09-02 15:32:14 -04001047 if (readFramebuffer && readFramebuffer->detachRenderbuffer(context, renderbuffer))
Shannon Woods53a94a82014-06-24 15:20:36 -04001048 {
Jamie Madill8693bdb2017-09-02 15:32:14 -04001049 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -04001050 }
1051
1052 if (drawFramebuffer && drawFramebuffer != readFramebuffer)
1053 {
Jamie Madill8693bdb2017-09-02 15:32:14 -04001054 if (drawFramebuffer->detachRenderbuffer(context, renderbuffer))
1055 {
1056 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
1057 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001058 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001059}
1060
1061void State::setReadFramebufferBinding(Framebuffer *framebuffer)
1062{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001063 if (mReadFramebuffer == framebuffer)
1064 return;
1065
Shannon Woods53a94a82014-06-24 15:20:36 -04001066 mReadFramebuffer = framebuffer;
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001067 mDirtyBits.set(DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
1068
1069 if (mReadFramebuffer && mReadFramebuffer->hasAnyDirtyBit())
1070 {
1071 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
1072 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001073}
1074
1075void State::setDrawFramebufferBinding(Framebuffer *framebuffer)
1076{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001077 if (mDrawFramebuffer == framebuffer)
1078 return;
1079
Shannon Woods53a94a82014-06-24 15:20:36 -04001080 mDrawFramebuffer = framebuffer;
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001081 mDirtyBits.set(DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
1082
1083 if (mDrawFramebuffer && mDrawFramebuffer->hasAnyDirtyBit())
1084 {
1085 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
1086 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001087}
1088
1089Framebuffer *State::getTargetFramebuffer(GLenum target) const
1090{
1091 switch (target)
1092 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001093 case GL_READ_FRAMEBUFFER_ANGLE:
1094 return mReadFramebuffer;
1095 case GL_DRAW_FRAMEBUFFER_ANGLE:
1096 case GL_FRAMEBUFFER:
1097 return mDrawFramebuffer;
1098 default:
1099 UNREACHABLE();
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001100 return nullptr;
Shannon Woods53a94a82014-06-24 15:20:36 -04001101 }
1102}
1103
Jamie Madill51f40ec2016-06-15 14:06:00 -04001104Framebuffer *State::getReadFramebuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001105{
1106 return mReadFramebuffer;
1107}
1108
Jamie Madill51f40ec2016-06-15 14:06:00 -04001109Framebuffer *State::getDrawFramebuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001110{
1111 return mDrawFramebuffer;
1112}
1113
1114bool State::removeReadFramebufferBinding(GLuint framebuffer)
1115{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001116 if (mReadFramebuffer != nullptr && mReadFramebuffer->id() == framebuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001117 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001118 setReadFramebufferBinding(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001119 return true;
1120 }
1121
1122 return false;
1123}
1124
1125bool State::removeDrawFramebufferBinding(GLuint framebuffer)
1126{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001127 if (mReadFramebuffer != nullptr && mDrawFramebuffer->id() == framebuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001128 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001129 setDrawFramebufferBinding(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001130 return true;
1131 }
1132
1133 return false;
1134}
1135
1136void State::setVertexArrayBinding(VertexArray *vertexArray)
1137{
James Darpiniane8a93c62018-01-04 18:02:24 -08001138 if (mVertexArray == vertexArray)
1139 return;
1140 if (mVertexArray)
1141 mVertexArray->onBindingChanged(false);
Shannon Woods53a94a82014-06-24 15:20:36 -04001142 mVertexArray = vertexArray;
James Darpiniane8a93c62018-01-04 18:02:24 -08001143 if (vertexArray)
1144 vertexArray->onBindingChanged(true);
Jamie Madill0b9e9032015-08-17 11:51:52 +00001145 mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001146
1147 if (mVertexArray && mVertexArray->hasAnyDirtyBit())
1148 {
1149 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1150 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001151}
1152
1153GLuint State::getVertexArrayId() const
1154{
Yunchao He4f285442017-04-21 12:15:49 +08001155 ASSERT(mVertexArray != nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001156 return mVertexArray->id();
1157}
1158
1159VertexArray *State::getVertexArray() const
1160{
Yunchao He4f285442017-04-21 12:15:49 +08001161 ASSERT(mVertexArray != nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001162 return mVertexArray;
1163}
1164
1165bool State::removeVertexArrayBinding(GLuint vertexArray)
1166{
James Darpiniane8a93c62018-01-04 18:02:24 -08001167 if (mVertexArray && mVertexArray->id() == vertexArray)
Shannon Woods53a94a82014-06-24 15:20:36 -04001168 {
James Darpiniane8a93c62018-01-04 18:02:24 -08001169 mVertexArray->onBindingChanged(false);
Yunchao Hed7297bf2017-04-19 15:27:10 +08001170 mVertexArray = nullptr;
Jamie Madill0b9e9032015-08-17 11:51:52 +00001171 mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001172 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001173 return true;
1174 }
1175
1176 return false;
1177}
1178
Jamie Madill4928b7c2017-06-20 12:57:39 -04001179void State::bindVertexBuffer(const Context *context,
1180 GLuint bindingIndex,
Shao80957d92017-02-20 21:25:59 +08001181 Buffer *boundBuffer,
1182 GLintptr offset,
1183 GLsizei stride)
1184{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001185 getVertexArray()->bindVertexBuffer(context, bindingIndex, boundBuffer, offset, stride);
Shao80957d92017-02-20 21:25:59 +08001186 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1187}
1188
Shaodde78e82017-05-22 14:13:27 +08001189void State::setVertexAttribBinding(const Context *context, GLuint attribIndex, GLuint bindingIndex)
Shao80957d92017-02-20 21:25:59 +08001190{
Shaodde78e82017-05-22 14:13:27 +08001191 getVertexArray()->setVertexAttribBinding(context, attribIndex, bindingIndex);
Shao80957d92017-02-20 21:25:59 +08001192 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1193}
1194
1195void State::setVertexAttribFormat(GLuint attribIndex,
1196 GLint size,
1197 GLenum type,
1198 bool normalized,
1199 bool pureInteger,
1200 GLuint relativeOffset)
1201{
1202 getVertexArray()->setVertexAttribFormat(attribIndex, size, type, normalized, pureInteger,
1203 relativeOffset);
1204 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1205}
1206
1207void State::setVertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
1208{
1209 getVertexArray()->setVertexBindingDivisor(bindingIndex, divisor);
1210 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1211}
1212
Jamie Madill6c1f6712017-02-14 19:08:04 -05001213void State::setProgram(const Context *context, Program *newProgram)
Shannon Woods53a94a82014-06-24 15:20:36 -04001214{
Geoff Lang7dd2e102014-11-10 15:19:26 -05001215 if (mProgram != newProgram)
Shannon Woods53a94a82014-06-24 15:20:36 -04001216 {
Geoff Lang7dd2e102014-11-10 15:19:26 -05001217 if (mProgram)
1218 {
Jamie Madill6c1f6712017-02-14 19:08:04 -05001219 mProgram->release(context);
Geoff Lang7dd2e102014-11-10 15:19:26 -05001220 }
1221
1222 mProgram = newProgram;
1223
1224 if (mProgram)
1225 {
1226 newProgram->addRef();
Jamie Madill81c2e252017-09-09 23:32:46 -04001227 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Geoff Lang7dd2e102014-11-10 15:19:26 -05001228 }
Jamie Madilla779b612017-07-24 11:46:05 -04001229 mDirtyBits.set(DIRTY_BIT_PROGRAM_EXECUTABLE);
1230 mDirtyBits.set(DIRTY_BIT_PROGRAM_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001231 }
1232}
1233
Geoff Lang7dd2e102014-11-10 15:19:26 -05001234Program *State::getProgram() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001235{
Geoff Lang7dd2e102014-11-10 15:19:26 -05001236 return mProgram;
Shannon Woods53a94a82014-06-24 15:20:36 -04001237}
1238
Jamie Madill4928b7c2017-06-20 12:57:39 -04001239void State::setTransformFeedbackBinding(const Context *context,
1240 TransformFeedback *transformFeedback)
Shannon Woods53a94a82014-06-24 15:20:36 -04001241{
James Darpiniane8a93c62018-01-04 18:02:24 -08001242 if (transformFeedback == mTransformFeedback.get())
1243 return;
1244 if (mTransformFeedback.get())
1245 mTransformFeedback->onBindingChanged(false);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001246 mTransformFeedback.set(context, transformFeedback);
James Darpiniane8a93c62018-01-04 18:02:24 -08001247 if (mTransformFeedback.get())
1248 mTransformFeedback->onBindingChanged(true);
Geoff Langded79232017-11-28 15:21:11 -05001249 mDirtyBits.set(DIRTY_BIT_TRANSFORM_FEEDBACK_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001250}
1251
1252TransformFeedback *State::getCurrentTransformFeedback() const
1253{
1254 return mTransformFeedback.get();
1255}
1256
Gregoire Payen de La Garanderie52742022015-02-04 14:55:39 +00001257bool State::isTransformFeedbackActiveUnpaused() const
1258{
Jamie Madill81c2e252017-09-09 23:32:46 -04001259 TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001260 return curTransformFeedback && curTransformFeedback->isActive() &&
1261 !curTransformFeedback->isPaused();
Gregoire Payen de La Garanderie52742022015-02-04 14:55:39 +00001262}
1263
Jamie Madill4928b7c2017-06-20 12:57:39 -04001264bool State::removeTransformFeedbackBinding(const Context *context, GLuint transformFeedback)
Shannon Woods53a94a82014-06-24 15:20:36 -04001265{
1266 if (mTransformFeedback.id() == transformFeedback)
1267 {
James Darpiniane8a93c62018-01-04 18:02:24 -08001268 if (mTransformFeedback.get())
1269 mTransformFeedback->onBindingChanged(false);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001270 mTransformFeedback.set(context, nullptr);
Corentin Walleza2257da2016-04-19 16:43:12 -04001271 return true;
Shannon Woods53a94a82014-06-24 15:20:36 -04001272 }
Corentin Walleza2257da2016-04-19 16:43:12 -04001273
1274 return false;
Shannon Woods53a94a82014-06-24 15:20:36 -04001275}
1276
Yunchao Hea336b902017-08-02 16:05:21 +08001277void State::setProgramPipelineBinding(const Context *context, ProgramPipeline *pipeline)
1278{
1279 mProgramPipeline.set(context, pipeline);
1280}
1281
1282void State::detachProgramPipeline(const Context *context, GLuint pipeline)
1283{
1284 mProgramPipeline.set(context, nullptr);
1285}
1286
Olli Etuahobbf1c102016-06-28 13:31:33 +03001287bool State::isQueryActive(const GLenum type) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001288{
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001289 for (auto &iter : mActiveQueries)
Shannon Woods53a94a82014-06-24 15:20:36 -04001290 {
Olli Etuahobbf1c102016-06-28 13:31:33 +03001291 const Query *query = iter.second.get();
1292 if (query != nullptr && ActiveQueryType(query->getType()) == ActiveQueryType(type))
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001293 {
1294 return true;
1295 }
1296 }
1297
1298 return false;
1299}
1300
1301bool State::isQueryActive(Query *query) const
1302{
1303 for (auto &iter : mActiveQueries)
1304 {
1305 if (iter.second.get() == query)
Shannon Woods53a94a82014-06-24 15:20:36 -04001306 {
1307 return true;
1308 }
1309 }
1310
1311 return false;
1312}
1313
Jamie Madill4928b7c2017-06-20 12:57:39 -04001314void State::setActiveQuery(const Context *context, GLenum target, Query *query)
Shannon Woods53a94a82014-06-24 15:20:36 -04001315{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001316 mActiveQueries[target].set(context, query);
Shannon Woods53a94a82014-06-24 15:20:36 -04001317}
1318
1319GLuint State::getActiveQueryId(GLenum target) const
1320{
1321 const Query *query = getActiveQuery(target);
1322 return (query ? query->id() : 0u);
1323}
1324
1325Query *State::getActiveQuery(GLenum target) const
1326{
Jamie Madill5864ac22015-01-12 14:43:07 -05001327 const auto it = mActiveQueries.find(target);
Shannon Woods53a94a82014-06-24 15:20:36 -04001328
Jamie Madill5864ac22015-01-12 14:43:07 -05001329 // All query types should already exist in the activeQueries map
1330 ASSERT(it != mActiveQueries.end());
1331
1332 return it->second.get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001333}
1334
Corentin Wallez336129f2017-10-17 15:55:40 -04001335void State::setBufferBinding(const Context *context, BufferBinding target, Buffer *buffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001336{
Corentin Wallez336129f2017-10-17 15:55:40 -04001337 switch (target)
1338 {
1339 case BufferBinding::PixelPack:
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_PACK_BUFFER_BINDING);
1342 break;
1343 case BufferBinding::PixelUnpack:
James Darpiniane8a93c62018-01-04 18:02:24 -08001344 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Corentin Wallez336129f2017-10-17 15:55:40 -04001345 mDirtyBits.set(DIRTY_BIT_UNPACK_BUFFER_BINDING);
1346 break;
1347 case BufferBinding::DrawIndirect:
James Darpiniane8a93c62018-01-04 18:02:24 -08001348 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Corentin Wallez336129f2017-10-17 15:55:40 -04001349 mDirtyBits.set(DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING);
1350 break;
Qin Jiajiaa98a2812017-11-30 18:12:06 +08001351 case BufferBinding::DispatchIndirect:
James Darpiniane8a93c62018-01-04 18:02:24 -08001352 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Qin Jiajiaa98a2812017-11-30 18:12:06 +08001353 mDirtyBits.set(DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
1354 break;
Corentin Wallez336129f2017-10-17 15:55:40 -04001355 case BufferBinding::ElementArray:
1356 getVertexArray()->setElementArrayBuffer(context, buffer);
1357 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1358 break;
Xinghua Cao10a4d432017-11-28 14:46:26 +08001359 case BufferBinding::ShaderStorage:
James Darpiniane8a93c62018-01-04 18:02:24 -08001360 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Xinghua Cao10a4d432017-11-28 14:46:26 +08001361 mDirtyBits.set(DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
1362 break;
Corentin Wallez336129f2017-10-17 15:55:40 -04001363 default:
James Darpiniane8a93c62018-01-04 18:02:24 -08001364 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Corentin Wallez336129f2017-10-17 15:55:40 -04001365 break;
1366 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001367}
James Darpiniane8a93c62018-01-04 18:02:24 -08001368
Corentin Wallez336129f2017-10-17 15:55:40 -04001369void State::setIndexedBufferBinding(const Context *context,
1370 BufferBinding target,
1371 GLuint index,
1372 Buffer *buffer,
1373 GLintptr offset,
1374 GLsizeiptr size)
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001375{
Corentin Wallez336129f2017-10-17 15:55:40 -04001376 setBufferBinding(context, target, buffer);
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001377
Corentin Wallez336129f2017-10-17 15:55:40 -04001378 switch (target)
1379 {
1380 case BufferBinding::TransformFeedback:
1381 mTransformFeedback->bindIndexedBuffer(context, index, buffer, offset, size);
James Darpiniane8a93c62018-01-04 18:02:24 -08001382 setBufferBinding(context, target, buffer);
Corentin Wallez336129f2017-10-17 15:55:40 -04001383 break;
1384 case BufferBinding::Uniform:
James Darpiniane8a93c62018-01-04 18:02:24 -08001385 UpdateBufferBinding(context, &mUniformBuffers[index], buffer, target, offset, size);
Jamie Madillf4141212017-12-12 15:08:07 -05001386 mDirtyBits.set(DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
Corentin Wallez336129f2017-10-17 15:55:40 -04001387 break;
1388 case BufferBinding::AtomicCounter:
James Darpiniane8a93c62018-01-04 18:02:24 -08001389 UpdateBufferBinding(context, &mAtomicCounterBuffers[index], buffer, target, offset,
1390 size);
Corentin Wallez336129f2017-10-17 15:55:40 -04001391 break;
1392 case BufferBinding::ShaderStorage:
James Darpiniane8a93c62018-01-04 18:02:24 -08001393 UpdateBufferBinding(context, &mShaderStorageBuffers[index], buffer, target, offset,
1394 size);
Corentin Wallez336129f2017-10-17 15:55:40 -04001395 break;
1396 default:
1397 UNREACHABLE();
1398 break;
1399 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001400}
1401
Geoff Lang5d124a62015-09-15 13:03:27 -04001402const OffsetBindingPointer<Buffer> &State::getIndexedUniformBuffer(size_t index) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001403{
Shannon Woodsf3acaf92014-09-23 18:07:11 -04001404 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
Geoff Lang5d124a62015-09-15 13:03:27 -04001405 return mUniformBuffers[index];
Gregoire Payen de La Garanderie68694e92015-03-24 14:03:37 +00001406}
1407
Jiajia Qin6eafb042016-12-27 17:04:07 +08001408const OffsetBindingPointer<Buffer> &State::getIndexedAtomicCounterBuffer(size_t index) const
1409{
1410 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
1411 return mAtomicCounterBuffers[index];
1412}
1413
Jiajia Qinf546e7d2017-03-27 14:12:59 +08001414const OffsetBindingPointer<Buffer> &State::getIndexedShaderStorageBuffer(size_t index) const
1415{
1416 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
1417 return mShaderStorageBuffers[index];
1418}
1419
Corentin Wallez336129f2017-10-17 15:55:40 -04001420Buffer *State::getTargetBuffer(BufferBinding target) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001421{
1422 switch (target)
1423 {
Corentin Wallez336129f2017-10-17 15:55:40 -04001424 case BufferBinding::ElementArray:
1425 return getVertexArray()->getElementArrayBuffer().get();
Corentin Wallez336129f2017-10-17 15:55:40 -04001426 default:
1427 return mBoundBuffers[target].get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001428 }
1429}
1430
James Darpinian4d9d4832018-03-13 12:43:28 -07001431void State::detachBuffer(const Context *context, const Buffer *buffer)
Yuly Novikov5807a532015-12-03 13:01:22 -05001432{
James Darpinian4d9d4832018-03-13 12:43:28 -07001433 if (!buffer->isBound())
1434 {
1435 return;
1436 }
1437 GLuint bufferName = buffer->id();
James Darpiniane8a93c62018-01-04 18:02:24 -08001438 for (auto target : angle::AllEnums<BufferBinding>())
Yuly Novikov5807a532015-12-03 13:01:22 -05001439 {
James Darpiniane8a93c62018-01-04 18:02:24 -08001440 if (mBoundBuffers[target].id() == bufferName)
Yuly Novikov5807a532015-12-03 13:01:22 -05001441 {
James Darpiniane8a93c62018-01-04 18:02:24 -08001442 UpdateBufferBinding(context, &mBoundBuffers[target], nullptr, target);
Yuly Novikov5807a532015-12-03 13:01:22 -05001443 }
1444 }
1445
1446 TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
1447 if (curTransformFeedback)
1448 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001449 curTransformFeedback->detachBuffer(context, bufferName);
Yuly Novikov5807a532015-12-03 13:01:22 -05001450 }
1451
Jamie Madill4928b7c2017-06-20 12:57:39 -04001452 getVertexArray()->detachBuffer(context, bufferName);
James Darpiniane8a93c62018-01-04 18:02:24 -08001453
1454 for (auto &buf : mUniformBuffers)
1455 {
1456 if (buf.id() == bufferName)
1457 {
1458 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::Uniform);
1459 }
1460 }
1461
1462 for (auto &buf : mAtomicCounterBuffers)
1463 {
1464 if (buf.id() == bufferName)
1465 {
1466 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::AtomicCounter);
1467 }
1468 }
1469
1470 for (auto &buf : mShaderStorageBuffers)
1471 {
1472 if (buf.id() == bufferName)
1473 {
1474 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::ShaderStorage);
1475 }
1476 }
Yuly Novikov5807a532015-12-03 13:01:22 -05001477}
1478
Shannon Woods53a94a82014-06-24 15:20:36 -04001479void State::setEnableVertexAttribArray(unsigned int attribNum, bool enabled)
1480{
1481 getVertexArray()->enableAttribute(attribNum, enabled);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001482 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001483}
1484
1485void State::setVertexAttribf(GLuint index, const GLfloat values[4])
1486{
Shannon Woods23e05002014-09-22 19:07:27 -04001487 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001488 mVertexAttribCurrentValues[index].setFloatValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001489 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1490 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001491 mCurrentValuesTypeMask.setIndex(GL_FLOAT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001492}
1493
1494void State::setVertexAttribu(GLuint index, const GLuint values[4])
1495{
Shannon Woods23e05002014-09-22 19:07:27 -04001496 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001497 mVertexAttribCurrentValues[index].setUnsignedIntValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001498 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1499 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001500 mCurrentValuesTypeMask.setIndex(GL_UNSIGNED_INT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001501}
1502
1503void State::setVertexAttribi(GLuint index, const GLint values[4])
1504{
Shannon Woods23e05002014-09-22 19:07:27 -04001505 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001506 mVertexAttribCurrentValues[index].setIntValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001507 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1508 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001509 mCurrentValuesTypeMask.setIndex(GL_INT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001510}
1511
Shaodde78e82017-05-22 14:13:27 +08001512void State::setVertexAttribPointer(const Context *context,
1513 unsigned int attribNum,
1514 Buffer *boundBuffer,
1515 GLint size,
1516 GLenum type,
1517 bool normalized,
1518 bool pureInteger,
1519 GLsizei stride,
1520 const void *pointer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001521{
Shaodde78e82017-05-22 14:13:27 +08001522 getVertexArray()->setVertexAttribPointer(context, attribNum, boundBuffer, size, type,
1523 normalized, pureInteger, stride, pointer);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001524 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Jamie Madill0b9e9032015-08-17 11:51:52 +00001525}
1526
Shaodde78e82017-05-22 14:13:27 +08001527void State::setVertexAttribDivisor(const Context *context, GLuint index, GLuint divisor)
Jamie Madill0b9e9032015-08-17 11:51:52 +00001528{
Shaodde78e82017-05-22 14:13:27 +08001529 getVertexArray()->setVertexAttribDivisor(context, index, divisor);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001530 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001531}
1532
Jamie Madill6de51852017-04-12 09:53:01 -04001533const VertexAttribCurrentValueData &State::getVertexAttribCurrentValue(size_t attribNum) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001534{
Jamie Madill6de51852017-04-12 09:53:01 -04001535 ASSERT(attribNum < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001536 return mVertexAttribCurrentValues[attribNum];
1537}
1538
Jamie Madillcac94a92017-11-10 10:09:32 -05001539const std::vector<VertexAttribCurrentValueData> &State::getVertexAttribCurrentValues() const
1540{
1541 return mVertexAttribCurrentValues;
1542}
1543
Shannon Woods53a94a82014-06-24 15:20:36 -04001544const void *State::getVertexAttribPointer(unsigned int attribNum) const
1545{
1546 return getVertexArray()->getVertexAttribute(attribNum).pointer;
1547}
1548
1549void State::setPackAlignment(GLint alignment)
1550{
1551 mPack.alignment = alignment;
Jamie Madillc67323a2017-11-02 23:11:41 -04001552 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001553}
1554
1555GLint State::getPackAlignment() const
1556{
1557 return mPack.alignment;
1558}
1559
1560void State::setPackReverseRowOrder(bool reverseRowOrder)
1561{
1562 mPack.reverseRowOrder = reverseRowOrder;
Jamie Madillc67323a2017-11-02 23:11:41 -04001563 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001564}
1565
1566bool State::getPackReverseRowOrder() const
1567{
1568 return mPack.reverseRowOrder;
1569}
1570
Minmin Gongadff67b2015-10-14 10:34:45 -04001571void State::setPackRowLength(GLint rowLength)
1572{
1573 mPack.rowLength = rowLength;
Jamie Madillc67323a2017-11-02 23:11:41 -04001574 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001575}
1576
1577GLint State::getPackRowLength() const
1578{
1579 return mPack.rowLength;
1580}
1581
1582void State::setPackSkipRows(GLint skipRows)
1583{
1584 mPack.skipRows = skipRows;
Jamie Madillc67323a2017-11-02 23:11:41 -04001585 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001586}
1587
1588GLint State::getPackSkipRows() const
1589{
1590 return mPack.skipRows;
1591}
1592
1593void State::setPackSkipPixels(GLint skipPixels)
1594{
1595 mPack.skipPixels = skipPixels;
Jamie Madillc67323a2017-11-02 23:11:41 -04001596 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001597}
1598
1599GLint State::getPackSkipPixels() const
1600{
1601 return mPack.skipPixels;
1602}
1603
Shannon Woods53a94a82014-06-24 15:20:36 -04001604const PixelPackState &State::getPackState() const
1605{
1606 return mPack;
1607}
1608
Jamie Madill87de3622015-03-16 10:41:44 -04001609PixelPackState &State::getPackState()
1610{
1611 return mPack;
1612}
1613
Shannon Woods53a94a82014-06-24 15:20:36 -04001614void State::setUnpackAlignment(GLint alignment)
1615{
1616 mUnpack.alignment = alignment;
Jamie Madillc67323a2017-11-02 23:11:41 -04001617 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001618}
1619
1620GLint State::getUnpackAlignment() const
1621{
1622 return mUnpack.alignment;
1623}
1624
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001625void State::setUnpackRowLength(GLint rowLength)
1626{
1627 mUnpack.rowLength = rowLength;
Jamie Madillc67323a2017-11-02 23:11:41 -04001628 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001629}
1630
1631GLint State::getUnpackRowLength() const
1632{
1633 return mUnpack.rowLength;
1634}
1635
Minmin Gongadff67b2015-10-14 10:34:45 -04001636void State::setUnpackImageHeight(GLint imageHeight)
1637{
1638 mUnpack.imageHeight = imageHeight;
Jamie Madillc67323a2017-11-02 23:11:41 -04001639 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001640}
1641
1642GLint State::getUnpackImageHeight() const
1643{
1644 return mUnpack.imageHeight;
1645}
1646
1647void State::setUnpackSkipImages(GLint skipImages)
1648{
1649 mUnpack.skipImages = skipImages;
Jamie Madillc67323a2017-11-02 23:11:41 -04001650 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001651}
1652
1653GLint State::getUnpackSkipImages() const
1654{
1655 return mUnpack.skipImages;
1656}
1657
1658void State::setUnpackSkipRows(GLint skipRows)
1659{
1660 mUnpack.skipRows = skipRows;
Jamie Madillc67323a2017-11-02 23:11:41 -04001661 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001662}
1663
1664GLint State::getUnpackSkipRows() const
1665{
1666 return mUnpack.skipRows;
1667}
1668
1669void State::setUnpackSkipPixels(GLint skipPixels)
1670{
1671 mUnpack.skipPixels = skipPixels;
Jamie Madillc67323a2017-11-02 23:11:41 -04001672 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001673}
1674
1675GLint State::getUnpackSkipPixels() const
1676{
1677 return mUnpack.skipPixels;
1678}
1679
Shannon Woods53a94a82014-06-24 15:20:36 -04001680const PixelUnpackState &State::getUnpackState() const
1681{
1682 return mUnpack;
1683}
1684
Jamie Madill67102f02015-03-16 10:41:42 -04001685PixelUnpackState &State::getUnpackState()
1686{
1687 return mUnpack;
1688}
1689
Geoff Lang70d0f492015-12-10 17:45:46 -05001690const Debug &State::getDebug() const
1691{
1692 return mDebug;
1693}
1694
1695Debug &State::getDebug()
1696{
1697 return mDebug;
1698}
1699
Sami Väisänena797e062016-05-12 15:23:40 +03001700void State::setCoverageModulation(GLenum components)
1701{
1702 mCoverageModulation = components;
1703 mDirtyBits.set(DIRTY_BIT_COVERAGE_MODULATION);
1704}
1705
1706GLenum State::getCoverageModulation() const
1707{
1708 return mCoverageModulation;
1709}
1710
Sami Väisänene45e53b2016-05-25 10:36:04 +03001711void State::loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix)
1712{
1713 if (matrixMode == GL_PATH_MODELVIEW_CHROMIUM)
1714 {
1715 memcpy(mPathMatrixMV, matrix, 16 * sizeof(GLfloat));
1716 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_MATRIX_MV);
1717 }
1718 else if (matrixMode == GL_PATH_PROJECTION_CHROMIUM)
1719 {
1720 memcpy(mPathMatrixProj, matrix, 16 * sizeof(GLfloat));
1721 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_MATRIX_PROJ);
1722 }
1723 else
1724 {
1725 UNREACHABLE();
1726 }
1727}
1728
1729const GLfloat *State::getPathRenderingMatrix(GLenum which) const
1730{
1731 if (which == GL_PATH_MODELVIEW_MATRIX_CHROMIUM)
1732 {
1733 return mPathMatrixMV;
1734 }
1735 else if (which == GL_PATH_PROJECTION_MATRIX_CHROMIUM)
1736 {
1737 return mPathMatrixProj;
1738 }
1739
1740 UNREACHABLE();
1741 return nullptr;
1742}
1743
1744void State::setPathStencilFunc(GLenum func, GLint ref, GLuint mask)
1745{
1746 mPathStencilFunc = func;
1747 mPathStencilRef = ref;
1748 mPathStencilMask = mask;
1749 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_STENCIL_STATE);
1750}
1751
1752GLenum State::getPathStencilFunc() const
1753{
1754 return mPathStencilFunc;
1755}
1756
1757GLint State::getPathStencilRef() const
1758{
1759 return mPathStencilRef;
1760}
1761
1762GLuint State::getPathStencilMask() const
1763{
1764 return mPathStencilMask;
1765}
1766
Geoff Lang1d2c41d2016-10-19 16:14:46 -07001767void State::setFramebufferSRGB(bool sRGB)
1768{
1769 mFramebufferSRGB = sRGB;
1770 mDirtyBits.set(DIRTY_BIT_FRAMEBUFFER_SRGB);
1771}
1772
1773bool State::getFramebufferSRGB() const
1774{
1775 return mFramebufferSRGB;
1776}
1777
Shannon Woods53a94a82014-06-24 15:20:36 -04001778void State::getBooleanv(GLenum pname, GLboolean *params)
1779{
1780 switch (pname)
1781 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001782 case GL_SAMPLE_COVERAGE_INVERT:
1783 *params = mSampleCoverageInvert;
1784 break;
1785 case GL_DEPTH_WRITEMASK:
1786 *params = mDepthStencil.depthMask;
1787 break;
1788 case GL_COLOR_WRITEMASK:
1789 params[0] = mBlend.colorMaskRed;
1790 params[1] = mBlend.colorMaskGreen;
1791 params[2] = mBlend.colorMaskBlue;
1792 params[3] = mBlend.colorMaskAlpha;
1793 break;
1794 case GL_CULL_FACE:
1795 *params = mRasterizer.cullFace;
1796 break;
1797 case GL_POLYGON_OFFSET_FILL:
1798 *params = mRasterizer.polygonOffsetFill;
1799 break;
1800 case GL_SAMPLE_ALPHA_TO_COVERAGE:
1801 *params = mBlend.sampleAlphaToCoverage;
1802 break;
1803 case GL_SAMPLE_COVERAGE:
1804 *params = mSampleCoverage;
1805 break;
1806 case GL_SAMPLE_MASK:
1807 *params = mSampleMask;
1808 break;
1809 case GL_SCISSOR_TEST:
1810 *params = mScissorTest;
1811 break;
1812 case GL_STENCIL_TEST:
1813 *params = mDepthStencil.stencilTest;
1814 break;
1815 case GL_DEPTH_TEST:
1816 *params = mDepthStencil.depthTest;
1817 break;
1818 case GL_BLEND:
1819 *params = mBlend.blend;
1820 break;
1821 case GL_DITHER:
1822 *params = mBlend.dither;
1823 break;
1824 case GL_TRANSFORM_FEEDBACK_ACTIVE:
1825 *params = getCurrentTransformFeedback()->isActive() ? GL_TRUE : GL_FALSE;
1826 break;
1827 case GL_TRANSFORM_FEEDBACK_PAUSED:
1828 *params = getCurrentTransformFeedback()->isPaused() ? GL_TRUE : GL_FALSE;
1829 break;
1830 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1831 *params = mPrimitiveRestart;
1832 break;
1833 case GL_RASTERIZER_DISCARD:
1834 *params = isRasterizerDiscardEnabled() ? GL_TRUE : GL_FALSE;
1835 break;
1836 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
1837 *params = mDebug.isOutputSynchronous() ? GL_TRUE : GL_FALSE;
1838 break;
1839 case GL_DEBUG_OUTPUT:
1840 *params = mDebug.isOutputEnabled() ? GL_TRUE : GL_FALSE;
1841 break;
1842 case GL_MULTISAMPLE_EXT:
1843 *params = mMultiSampling;
1844 break;
1845 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1846 *params = mSampleAlphaToOne;
1847 break;
1848 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
1849 *params = isBindGeneratesResourceEnabled() ? GL_TRUE : GL_FALSE;
1850 break;
1851 case GL_CLIENT_ARRAYS_ANGLE:
1852 *params = areClientArraysEnabled() ? GL_TRUE : GL_FALSE;
1853 break;
1854 case GL_FRAMEBUFFER_SRGB_EXT:
1855 *params = getFramebufferSRGB() ? GL_TRUE : GL_FALSE;
1856 break;
1857 case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
1858 *params = mRobustResourceInit ? GL_TRUE : GL_FALSE;
1859 break;
1860 case GL_PROGRAM_CACHE_ENABLED_ANGLE:
1861 *params = mProgramBinaryCacheEnabled ? GL_TRUE : GL_FALSE;
1862 break;
Jamie Madillc43be722017-07-13 16:22:14 -04001863
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001864 default:
1865 UNREACHABLE();
1866 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001867 }
1868}
1869
1870void State::getFloatv(GLenum pname, GLfloat *params)
1871{
1872 // Please note: DEPTH_CLEAR_VALUE is included in our internal getFloatv implementation
1873 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1874 // GetIntegerv as its native query function. As it would require conversion in any
1875 // case, this should make no difference to the calling application.
1876 switch (pname)
1877 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001878 case GL_LINE_WIDTH:
1879 *params = mLineWidth;
1880 break;
1881 case GL_SAMPLE_COVERAGE_VALUE:
1882 *params = mSampleCoverageValue;
1883 break;
1884 case GL_DEPTH_CLEAR_VALUE:
1885 *params = mDepthClearValue;
1886 break;
1887 case GL_POLYGON_OFFSET_FACTOR:
1888 *params = mRasterizer.polygonOffsetFactor;
1889 break;
1890 case GL_POLYGON_OFFSET_UNITS:
1891 *params = mRasterizer.polygonOffsetUnits;
1892 break;
1893 case GL_DEPTH_RANGE:
1894 params[0] = mNearZ;
1895 params[1] = mFarZ;
1896 break;
1897 case GL_COLOR_CLEAR_VALUE:
1898 params[0] = mColorClearValue.red;
1899 params[1] = mColorClearValue.green;
1900 params[2] = mColorClearValue.blue;
1901 params[3] = mColorClearValue.alpha;
1902 break;
1903 case GL_BLEND_COLOR:
1904 params[0] = mBlendColor.red;
1905 params[1] = mBlendColor.green;
1906 params[2] = mBlendColor.blue;
1907 params[3] = mBlendColor.alpha;
1908 break;
1909 case GL_MULTISAMPLE_EXT:
1910 *params = static_cast<GLfloat>(mMultiSampling);
1911 break;
1912 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1913 *params = static_cast<GLfloat>(mSampleAlphaToOne);
1914 break;
1915 case GL_COVERAGE_MODULATION_CHROMIUM:
1916 params[0] = static_cast<GLfloat>(mCoverageModulation);
1917 break;
1918 default:
1919 UNREACHABLE();
1920 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001921 }
1922}
1923
Jamie Madille98b1b52018-03-08 09:47:23 -05001924Error State::getIntegerv(const Context *context, GLenum pname, GLint *params)
Shannon Woods53a94a82014-06-24 15:20:36 -04001925{
1926 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
1927 {
1928 unsigned int colorAttachment = (pname - GL_DRAW_BUFFER0_EXT);
Shannon Woods2df6a602014-09-26 16:12:07 -04001929 ASSERT(colorAttachment < mMaxDrawBuffers);
Shannon Woods53a94a82014-06-24 15:20:36 -04001930 Framebuffer *framebuffer = mDrawFramebuffer;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001931 *params = framebuffer->getDrawBufferState(colorAttachment);
Jamie Madille98b1b52018-03-08 09:47:23 -05001932 return NoError();
Shannon Woods53a94a82014-06-24 15:20:36 -04001933 }
1934
1935 // Please note: DEPTH_CLEAR_VALUE is not included in our internal getIntegerv implementation
1936 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1937 // GetIntegerv as its native query function. As it would require conversion in any
1938 // case, this should make no difference to the calling application. You may find it in
1939 // State::getFloatv.
1940 switch (pname)
1941 {
Corentin Wallez336129f2017-10-17 15:55:40 -04001942 case GL_ARRAY_BUFFER_BINDING:
1943 *params = mBoundBuffers[BufferBinding::Array].id();
1944 break;
1945 case GL_DRAW_INDIRECT_BUFFER_BINDING:
1946 *params = mBoundBuffers[BufferBinding::DrawIndirect].id();
1947 break;
1948 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
1949 *params = getVertexArray()->getElementArrayBuffer().id();
1950 break;
Jamie Madill690c8eb2018-03-12 15:20:03 -04001951 case GL_DRAW_FRAMEBUFFER_BINDING:
1952 static_assert(GL_DRAW_FRAMEBUFFER_BINDING == GL_DRAW_FRAMEBUFFER_BINDING_ANGLE,
1953 "Enum mismatch");
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001954 *params = mDrawFramebuffer->id();
1955 break;
Jamie Madill690c8eb2018-03-12 15:20:03 -04001956 case GL_READ_FRAMEBUFFER_BINDING:
1957 static_assert(GL_READ_FRAMEBUFFER_BINDING == GL_READ_FRAMEBUFFER_BINDING_ANGLE,
1958 "Enum mismatch");
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001959 *params = mReadFramebuffer->id();
1960 break;
1961 case GL_RENDERBUFFER_BINDING:
1962 *params = mRenderbuffer.id();
1963 break;
1964 case GL_VERTEX_ARRAY_BINDING:
1965 *params = mVertexArray->id();
1966 break;
1967 case GL_CURRENT_PROGRAM:
1968 *params = mProgram ? mProgram->id() : 0;
1969 break;
1970 case GL_PACK_ALIGNMENT:
1971 *params = mPack.alignment;
1972 break;
1973 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
1974 *params = mPack.reverseRowOrder;
1975 break;
1976 case GL_PACK_ROW_LENGTH:
1977 *params = mPack.rowLength;
1978 break;
1979 case GL_PACK_SKIP_ROWS:
1980 *params = mPack.skipRows;
1981 break;
1982 case GL_PACK_SKIP_PIXELS:
1983 *params = mPack.skipPixels;
1984 break;
1985 case GL_UNPACK_ALIGNMENT:
1986 *params = mUnpack.alignment;
1987 break;
1988 case GL_UNPACK_ROW_LENGTH:
1989 *params = mUnpack.rowLength;
1990 break;
1991 case GL_UNPACK_IMAGE_HEIGHT:
1992 *params = mUnpack.imageHeight;
1993 break;
1994 case GL_UNPACK_SKIP_IMAGES:
1995 *params = mUnpack.skipImages;
1996 break;
1997 case GL_UNPACK_SKIP_ROWS:
1998 *params = mUnpack.skipRows;
1999 break;
2000 case GL_UNPACK_SKIP_PIXELS:
2001 *params = mUnpack.skipPixels;
2002 break;
2003 case GL_GENERATE_MIPMAP_HINT:
2004 *params = mGenerateMipmapHint;
2005 break;
2006 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
2007 *params = mFragmentShaderDerivativeHint;
2008 break;
2009 case GL_ACTIVE_TEXTURE:
2010 *params = (static_cast<GLint>(mActiveSampler) + GL_TEXTURE0);
2011 break;
2012 case GL_STENCIL_FUNC:
2013 *params = mDepthStencil.stencilFunc;
2014 break;
2015 case GL_STENCIL_REF:
2016 *params = mStencilRef;
2017 break;
2018 case GL_STENCIL_VALUE_MASK:
2019 *params = CastMaskValue(context, mDepthStencil.stencilMask);
2020 break;
2021 case GL_STENCIL_BACK_FUNC:
2022 *params = mDepthStencil.stencilBackFunc;
2023 break;
2024 case GL_STENCIL_BACK_REF:
2025 *params = mStencilBackRef;
2026 break;
2027 case GL_STENCIL_BACK_VALUE_MASK:
2028 *params = CastMaskValue(context, mDepthStencil.stencilBackMask);
2029 break;
2030 case GL_STENCIL_FAIL:
2031 *params = mDepthStencil.stencilFail;
2032 break;
2033 case GL_STENCIL_PASS_DEPTH_FAIL:
2034 *params = mDepthStencil.stencilPassDepthFail;
2035 break;
2036 case GL_STENCIL_PASS_DEPTH_PASS:
2037 *params = mDepthStencil.stencilPassDepthPass;
2038 break;
2039 case GL_STENCIL_BACK_FAIL:
2040 *params = mDepthStencil.stencilBackFail;
2041 break;
2042 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
2043 *params = mDepthStencil.stencilBackPassDepthFail;
2044 break;
2045 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
2046 *params = mDepthStencil.stencilBackPassDepthPass;
2047 break;
2048 case GL_DEPTH_FUNC:
2049 *params = mDepthStencil.depthFunc;
2050 break;
2051 case GL_BLEND_SRC_RGB:
2052 *params = mBlend.sourceBlendRGB;
2053 break;
2054 case GL_BLEND_SRC_ALPHA:
2055 *params = mBlend.sourceBlendAlpha;
2056 break;
2057 case GL_BLEND_DST_RGB:
2058 *params = mBlend.destBlendRGB;
2059 break;
2060 case GL_BLEND_DST_ALPHA:
2061 *params = mBlend.destBlendAlpha;
2062 break;
2063 case GL_BLEND_EQUATION_RGB:
2064 *params = mBlend.blendEquationRGB;
2065 break;
2066 case GL_BLEND_EQUATION_ALPHA:
2067 *params = mBlend.blendEquationAlpha;
2068 break;
2069 case GL_STENCIL_WRITEMASK:
2070 *params = CastMaskValue(context, mDepthStencil.stencilWritemask);
2071 break;
2072 case GL_STENCIL_BACK_WRITEMASK:
2073 *params = CastMaskValue(context, mDepthStencil.stencilBackWritemask);
2074 break;
2075 case GL_STENCIL_CLEAR_VALUE:
2076 *params = mStencilClearValue;
2077 break;
2078 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
Jamie Madill690c8eb2018-03-12 15:20:03 -04002079 ANGLE_TRY(mReadFramebuffer->getImplementationColorReadType(
2080 context, reinterpret_cast<GLenum *>(params)));
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002081 break;
2082 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
Jamie Madill690c8eb2018-03-12 15:20:03 -04002083 ANGLE_TRY(mReadFramebuffer->getImplementationColorReadFormat(
2084 context, reinterpret_cast<GLenum *>(params)));
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002085 break;
2086 case GL_SAMPLE_BUFFERS:
2087 case GL_SAMPLES:
Shannon Woods53a94a82014-06-24 15:20:36 -04002088 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002089 Framebuffer *framebuffer = mDrawFramebuffer;
Jamie Madille98b1b52018-03-08 09:47:23 -05002090 bool complete = false;
2091 ANGLE_TRY(framebuffer->isComplete(context, &complete));
2092 if (complete)
Shannon Woods53a94a82014-06-24 15:20:36 -04002093 {
Jamie Madille98b1b52018-03-08 09:47:23 -05002094 GLint samples = 0;
2095 ANGLE_TRY(framebuffer->getSamples(context, &samples));
Shannon Woods53a94a82014-06-24 15:20:36 -04002096 switch (pname)
2097 {
Jamie Madilla0016b72017-07-14 14:30:46 -04002098 case GL_SAMPLE_BUFFERS:
Jamie Madille98b1b52018-03-08 09:47:23 -05002099 if (samples != 0)
Jamie Madilla0016b72017-07-14 14:30:46 -04002100 {
2101 *params = 1;
2102 }
2103 else
2104 {
2105 *params = 0;
2106 }
2107 break;
2108 case GL_SAMPLES:
Jamie Madille98b1b52018-03-08 09:47:23 -05002109 *params = samples;
Jamie Madilla0016b72017-07-14 14:30:46 -04002110 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002111 }
2112 }
2113 else
2114 {
2115 *params = 0;
2116 }
2117 }
2118 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002119 case GL_VIEWPORT:
2120 params[0] = mViewport.x;
2121 params[1] = mViewport.y;
2122 params[2] = mViewport.width;
2123 params[3] = mViewport.height;
2124 break;
2125 case GL_SCISSOR_BOX:
2126 params[0] = mScissor.x;
2127 params[1] = mScissor.y;
2128 params[2] = mScissor.width;
2129 params[3] = mScissor.height;
2130 break;
2131 case GL_CULL_FACE_MODE:
2132 *params = ToGLenum(mRasterizer.cullMode);
2133 break;
2134 case GL_FRONT_FACE:
2135 *params = mRasterizer.frontFace;
2136 break;
2137 case GL_RED_BITS:
2138 case GL_GREEN_BITS:
2139 case GL_BLUE_BITS:
2140 case GL_ALPHA_BITS:
Shannon Woods53a94a82014-06-24 15:20:36 -04002141 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002142 Framebuffer *framebuffer = getDrawFramebuffer();
2143 const FramebufferAttachment *colorbuffer = framebuffer->getFirstColorbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04002144
2145 if (colorbuffer)
2146 {
2147 switch (pname)
2148 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002149 case GL_RED_BITS:
2150 *params = colorbuffer->getRedSize();
2151 break;
2152 case GL_GREEN_BITS:
2153 *params = colorbuffer->getGreenSize();
2154 break;
2155 case GL_BLUE_BITS:
2156 *params = colorbuffer->getBlueSize();
2157 break;
2158 case GL_ALPHA_BITS:
2159 *params = colorbuffer->getAlphaSize();
2160 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002161 }
2162 }
2163 else
2164 {
2165 *params = 0;
2166 }
2167 }
2168 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002169 case GL_DEPTH_BITS:
Shannon Woods53a94a82014-06-24 15:20:36 -04002170 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002171 const Framebuffer *framebuffer = getDrawFramebuffer();
2172 const FramebufferAttachment *depthbuffer = framebuffer->getDepthbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04002173
2174 if (depthbuffer)
2175 {
2176 *params = depthbuffer->getDepthSize();
2177 }
2178 else
2179 {
2180 *params = 0;
2181 }
2182 }
2183 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002184 case GL_STENCIL_BITS:
Shannon Woods53a94a82014-06-24 15:20:36 -04002185 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002186 const Framebuffer *framebuffer = getDrawFramebuffer();
2187 const FramebufferAttachment *stencilbuffer = framebuffer->getStencilbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04002188
2189 if (stencilbuffer)
2190 {
2191 *params = stencilbuffer->getStencilSize();
2192 }
2193 else
2194 {
2195 *params = 0;
2196 }
2197 }
2198 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002199 case GL_TEXTURE_BINDING_2D:
2200 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2201 *params =
2202 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::_2D);
2203 break;
2204 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
2205 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2206 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2207 TextureType::Rectangle);
2208 break;
2209 case GL_TEXTURE_BINDING_CUBE_MAP:
2210 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2211 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2212 TextureType::CubeMap);
2213 break;
2214 case GL_TEXTURE_BINDING_3D:
2215 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2216 *params =
2217 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::_3D);
2218 break;
2219 case GL_TEXTURE_BINDING_2D_ARRAY:
2220 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2221 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2222 TextureType::_2DArray);
2223 break;
2224 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
2225 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2226 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2227 TextureType::_2DMultisample);
2228 break;
2229 case GL_TEXTURE_BINDING_EXTERNAL_OES:
2230 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2231 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2232 TextureType::External);
2233 break;
2234 case GL_UNIFORM_BUFFER_BINDING:
2235 *params = mBoundBuffers[BufferBinding::Uniform].id();
2236 break;
2237 case GL_TRANSFORM_FEEDBACK_BINDING:
2238 *params = mTransformFeedback.id();
2239 break;
2240 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
2241 *params = mBoundBuffers[BufferBinding::TransformFeedback].id();
2242 break;
2243 case GL_COPY_READ_BUFFER_BINDING:
2244 *params = mBoundBuffers[BufferBinding::CopyRead].id();
2245 break;
2246 case GL_COPY_WRITE_BUFFER_BINDING:
2247 *params = mBoundBuffers[BufferBinding::CopyWrite].id();
2248 break;
2249 case GL_PIXEL_PACK_BUFFER_BINDING:
2250 *params = mBoundBuffers[BufferBinding::PixelPack].id();
2251 break;
2252 case GL_PIXEL_UNPACK_BUFFER_BINDING:
2253 *params = mBoundBuffers[BufferBinding::PixelUnpack].id();
2254 break;
2255 case GL_READ_BUFFER:
2256 *params = mReadFramebuffer->getReadBufferState();
2257 break;
2258 case GL_SAMPLER_BINDING:
2259 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2260 *params = getSamplerId(static_cast<GLuint>(mActiveSampler));
2261 break;
2262 case GL_DEBUG_LOGGED_MESSAGES:
2263 *params = static_cast<GLint>(mDebug.getMessageCount());
2264 break;
2265 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
2266 *params = static_cast<GLint>(mDebug.getNextMessageLength());
2267 break;
2268 case GL_DEBUG_GROUP_STACK_DEPTH:
2269 *params = static_cast<GLint>(mDebug.getGroupStackDepth());
2270 break;
2271 case GL_MULTISAMPLE_EXT:
2272 *params = static_cast<GLint>(mMultiSampling);
2273 break;
2274 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
2275 *params = static_cast<GLint>(mSampleAlphaToOne);
2276 break;
2277 case GL_COVERAGE_MODULATION_CHROMIUM:
2278 *params = static_cast<GLint>(mCoverageModulation);
2279 break;
2280 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
2281 *params = mBoundBuffers[BufferBinding::AtomicCounter].id();
2282 break;
2283 case GL_SHADER_STORAGE_BUFFER_BINDING:
2284 *params = mBoundBuffers[BufferBinding::ShaderStorage].id();
2285 break;
2286 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
2287 *params = mBoundBuffers[BufferBinding::DispatchIndirect].id();
2288 break;
2289 default:
2290 UNREACHABLE();
2291 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002292 }
Jamie Madille98b1b52018-03-08 09:47:23 -05002293
2294 return NoError();
Shannon Woods53a94a82014-06-24 15:20:36 -04002295}
2296
Geoff Lang70d0f492015-12-10 17:45:46 -05002297void State::getPointerv(GLenum pname, void **params) const
2298{
2299 switch (pname)
2300 {
2301 case GL_DEBUG_CALLBACK_FUNCTION:
2302 *params = reinterpret_cast<void *>(mDebug.getCallback());
2303 break;
2304 case GL_DEBUG_CALLBACK_USER_PARAM:
2305 *params = const_cast<void *>(mDebug.getUserParam());
2306 break;
2307 default:
2308 UNREACHABLE();
2309 break;
2310 }
2311}
2312
Martin Radev66fb8202016-07-28 11:45:20 +03002313void State::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods53a94a82014-06-24 15:20:36 -04002314{
2315 switch (target)
2316 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002317 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
2318 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2319 *data = mTransformFeedback->getIndexedBuffer(index).id();
2320 break;
2321 case GL_UNIFORM_BUFFER_BINDING:
2322 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2323 *data = mUniformBuffers[index].id();
2324 break;
2325 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
2326 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2327 *data = mAtomicCounterBuffers[index].id();
2328 break;
2329 case GL_SHADER_STORAGE_BUFFER_BINDING:
2330 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2331 *data = mShaderStorageBuffers[index].id();
2332 break;
2333 case GL_VERTEX_BINDING_BUFFER:
2334 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
2335 *data = mVertexArray->getVertexBinding(index).getBuffer().id();
2336 break;
2337 case GL_VERTEX_BINDING_DIVISOR:
2338 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
2339 *data = mVertexArray->getVertexBinding(index).getDivisor();
2340 break;
2341 case GL_VERTEX_BINDING_OFFSET:
2342 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
2343 *data = static_cast<GLuint>(mVertexArray->getVertexBinding(index).getOffset());
2344 break;
2345 case GL_VERTEX_BINDING_STRIDE:
2346 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
2347 *data = mVertexArray->getVertexBinding(index).getStride();
2348 break;
2349 case GL_SAMPLE_MASK_VALUE:
2350 ASSERT(static_cast<size_t>(index) < mSampleMaskValues.size());
2351 *data = mSampleMaskValues[index];
2352 break;
2353 case GL_IMAGE_BINDING_NAME:
2354 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2355 *data = mImageUnits[index].texture.id();
2356 break;
2357 case GL_IMAGE_BINDING_LEVEL:
2358 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2359 *data = mImageUnits[index].level;
2360 break;
2361 case GL_IMAGE_BINDING_LAYER:
2362 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2363 *data = mImageUnits[index].layer;
2364 break;
2365 case GL_IMAGE_BINDING_ACCESS:
2366 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2367 *data = mImageUnits[index].access;
2368 break;
2369 case GL_IMAGE_BINDING_FORMAT:
2370 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2371 *data = mImageUnits[index].format;
2372 break;
2373 default:
2374 UNREACHABLE();
2375 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002376 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002377}
2378
Martin Radev66fb8202016-07-28 11:45:20 +03002379void State::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods53a94a82014-06-24 15:20:36 -04002380{
2381 switch (target)
2382 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002383 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
2384 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2385 *data = mTransformFeedback->getIndexedBuffer(index).getOffset();
2386 break;
2387 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
2388 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2389 *data = mTransformFeedback->getIndexedBuffer(index).getSize();
2390 break;
2391 case GL_UNIFORM_BUFFER_START:
2392 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2393 *data = mUniformBuffers[index].getOffset();
2394 break;
2395 case GL_UNIFORM_BUFFER_SIZE:
2396 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2397 *data = mUniformBuffers[index].getSize();
2398 break;
2399 case GL_ATOMIC_COUNTER_BUFFER_START:
2400 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2401 *data = mAtomicCounterBuffers[index].getOffset();
2402 break;
2403 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
2404 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2405 *data = mAtomicCounterBuffers[index].getSize();
2406 break;
2407 case GL_SHADER_STORAGE_BUFFER_START:
2408 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2409 *data = mShaderStorageBuffers[index].getOffset();
2410 break;
2411 case GL_SHADER_STORAGE_BUFFER_SIZE:
2412 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2413 *data = mShaderStorageBuffers[index].getSize();
2414 break;
2415 default:
2416 UNREACHABLE();
2417 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002418 }
Martin Radev66fb8202016-07-28 11:45:20 +03002419}
Shannon Woods53a94a82014-06-24 15:20:36 -04002420
Martin Radev66fb8202016-07-28 11:45:20 +03002421void State::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
2422{
Xinghua Cao9c8e1a32017-12-06 17:59:58 +08002423 switch (target)
2424 {
2425 case GL_IMAGE_BINDING_LAYERED:
2426 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2427 *data = mImageUnits[index].layered;
2428 break;
2429 default:
2430 UNREACHABLE();
2431 break;
2432 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002433}
2434
Corentin Wallez336129f2017-10-17 15:55:40 -04002435bool State::hasMappedBuffer(BufferBinding target) const
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002436{
Corentin Wallez336129f2017-10-17 15:55:40 -04002437 if (target == BufferBinding::Array)
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002438 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002439 const VertexArray *vao = getVertexArray();
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002440 const auto &vertexAttribs = vao->getVertexAttributes();
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002441 const auto &vertexBindings = vao->getVertexBindings();
Jamie Madilld078c682018-01-02 11:50:24 -05002442 for (size_t attribIndex : vao->getEnabledAttributesMask())
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002443 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002444 const VertexAttribute &vertexAttrib = vertexAttribs[attribIndex];
Martin Radevdd5f27e2017-06-07 10:17:09 +03002445 auto *boundBuffer = vertexBindings[vertexAttrib.bindingIndex].getBuffer().get();
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002446 if (vertexAttrib.enabled && boundBuffer && boundBuffer->isMapped())
2447 {
2448 return true;
2449 }
2450 }
2451
2452 return false;
2453 }
2454 else
2455 {
2456 Buffer *buffer = getTargetBuffer(target);
2457 return (buffer && buffer->isMapped());
2458 }
2459}
2460
Jamie Madillbc918e72018-03-08 09:47:21 -05002461Error State::syncDirtyObjects(const Context *context)
Jamie Madillc9d442d2016-01-20 11:17:24 -05002462{
2463 if (!mDirtyObjects.any())
Jamie Madillbc918e72018-03-08 09:47:21 -05002464 return NoError();
Jamie Madillc9d442d2016-01-20 11:17:24 -05002465
Jamie Madillbc918e72018-03-08 09:47:21 -05002466 return syncDirtyObjects(context, mDirtyObjects);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002467}
2468
Jamie Madillbc918e72018-03-08 09:47:21 -05002469Error State::syncDirtyObjects(const Context *context, const DirtyObjects &bitset)
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002470{
Jiajia Qin5ae6ee42018-03-06 17:39:42 +08002471 const DirtyObjects &dirtyObjects = mDirtyObjects & bitset;
2472 for (auto dirtyObject : dirtyObjects)
Jamie Madillc9d442d2016-01-20 11:17:24 -05002473 {
2474 switch (dirtyObject)
2475 {
2476 case DIRTY_OBJECT_READ_FRAMEBUFFER:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002477 ASSERT(mReadFramebuffer);
Jamie Madill19fa1c62018-03-08 09:47:21 -05002478 ANGLE_TRY(mReadFramebuffer->syncState(context));
Jamie Madillc9d442d2016-01-20 11:17:24 -05002479 break;
2480 case DIRTY_OBJECT_DRAW_FRAMEBUFFER:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002481 ASSERT(mDrawFramebuffer);
Jamie Madill19fa1c62018-03-08 09:47:21 -05002482 ANGLE_TRY(mDrawFramebuffer->syncState(context));
Jamie Madillc9d442d2016-01-20 11:17:24 -05002483 break;
2484 case DIRTY_OBJECT_VERTEX_ARRAY:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002485 ASSERT(mVertexArray);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002486 mVertexArray->syncState(context);
Jamie Madillc9d442d2016-01-20 11:17:24 -05002487 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002488 case DIRTY_OBJECT_PROGRAM_TEXTURES:
2489 syncProgramTextures(context);
2490 break;
2491
Jamie Madillc9d442d2016-01-20 11:17:24 -05002492 default:
2493 UNREACHABLE();
2494 break;
2495 }
2496 }
2497
Jiajia Qin5ae6ee42018-03-06 17:39:42 +08002498 mDirtyObjects &= ~dirtyObjects;
Jamie Madillbc918e72018-03-08 09:47:21 -05002499 return NoError();
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002500}
2501
Jamie Madill81c2e252017-09-09 23:32:46 -04002502void State::syncProgramTextures(const Context *context)
2503{
Jamie Madill81c2e252017-09-09 23:32:46 -04002504 // TODO(jmadill): Fine-grained updates.
2505 if (!mProgram)
2506 {
2507 return;
2508 }
2509
2510 ASSERT(mDirtyObjects[DIRTY_OBJECT_PROGRAM_TEXTURES]);
2511 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
2512
Jamie Madill0f80ed82017-09-19 00:24:56 -04002513 ActiveTextureMask newActiveTextures;
2514
Geoff Lange51ba632017-11-21 11:45:25 -05002515 // Initialize to the 'Initialized' state and set to 'MayNeedInit' if any texture is not
2516 // initialized.
2517 mCachedTexturesInitState = InitState::Initialized;
2518
Jamie Madill81c2e252017-09-09 23:32:46 -04002519 for (const SamplerBinding &samplerBinding : mProgram->getSamplerBindings())
2520 {
2521 if (samplerBinding.unreferenced)
2522 continue;
2523
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002524 TextureType textureType = samplerBinding.textureType;
Jamie Madill81c2e252017-09-09 23:32:46 -04002525 for (GLuint textureUnitIndex : samplerBinding.boundTextureUnits)
2526 {
2527 Texture *texture = getSamplerTexture(textureUnitIndex, textureType);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002528 Sampler *sampler = getSampler(textureUnitIndex);
Jamie Madill0f80ed82017-09-19 00:24:56 -04002529 ASSERT(static_cast<size_t>(textureUnitIndex) < mCompleteTextureCache.size());
2530 ASSERT(static_cast<size_t>(textureUnitIndex) < newActiveTextures.size());
Jamie Madill81c2e252017-09-09 23:32:46 -04002531
Jamie Madill42975642017-10-12 12:31:51 -04002532 ASSERT(texture);
Jamie Madill81c2e252017-09-09 23:32:46 -04002533
Jamie Madill42975642017-10-12 12:31:51 -04002534 // Mark the texture binding bit as dirty if the texture completeness changes.
2535 // TODO(jmadill): Use specific dirty bit for completeness change.
2536 if (texture->isSamplerComplete(context, sampler) &&
2537 !mDrawFramebuffer->hasTextureAttachment(texture))
2538 {
2539 texture->syncState();
2540 mCompleteTextureCache[textureUnitIndex] = texture;
Jamie Madill81c2e252017-09-09 23:32:46 -04002541 }
Jamie Madill42975642017-10-12 12:31:51 -04002542 else
2543 {
2544 mCompleteTextureCache[textureUnitIndex] = nullptr;
2545 }
2546
2547 // Bind the texture unconditionally, to recieve completeness change notifications.
Jamie Madill888081d2018-02-27 00:24:46 -05002548 mCompleteTextureBindings[textureUnitIndex].bind(texture->getSubject());
Jamie Madilla59fc192017-11-02 12:57:58 -04002549 mActiveTexturesMask.set(textureUnitIndex);
Jamie Madill42975642017-10-12 12:31:51 -04002550 newActiveTextures.set(textureUnitIndex);
Jamie Madill81c2e252017-09-09 23:32:46 -04002551
Jamie Madill06ef36b2017-09-09 23:32:46 -04002552 if (sampler != nullptr)
2553 {
2554 sampler->syncState(context);
2555 }
Geoff Lange51ba632017-11-21 11:45:25 -05002556
2557 if (texture->initState() == InitState::MayNeedInit)
2558 {
2559 mCachedTexturesInitState = InitState::MayNeedInit;
2560 }
Jamie Madill81c2e252017-09-09 23:32:46 -04002561 }
2562 }
Jamie Madill0f80ed82017-09-19 00:24:56 -04002563
2564 // Unset now missing textures.
Jamie Madilla59fc192017-11-02 12:57:58 -04002565 ActiveTextureMask negativeMask = mActiveTexturesMask & ~newActiveTextures;
Jamie Madill0f80ed82017-09-19 00:24:56 -04002566 if (negativeMask.any())
2567 {
2568 for (auto textureIndex : negativeMask)
2569 {
2570 mCompleteTextureBindings[textureIndex].reset();
2571 mCompleteTextureCache[textureIndex] = nullptr;
Jamie Madilla59fc192017-11-02 12:57:58 -04002572 mActiveTexturesMask.reset(textureIndex);
Jamie Madill0f80ed82017-09-19 00:24:56 -04002573 }
2574 }
Jamie Madill81c2e252017-09-09 23:32:46 -04002575}
2576
Jamie Madillbc918e72018-03-08 09:47:21 -05002577Error State::syncDirtyObject(const Context *context, GLenum target)
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002578{
2579 DirtyObjects localSet;
2580
2581 switch (target)
2582 {
2583 case GL_READ_FRAMEBUFFER:
2584 localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2585 break;
2586 case GL_DRAW_FRAMEBUFFER:
2587 localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2588 break;
2589 case GL_FRAMEBUFFER:
2590 localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2591 localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2592 break;
2593 case GL_VERTEX_ARRAY:
2594 localSet.set(DIRTY_OBJECT_VERTEX_ARRAY);
2595 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002596 case GL_TEXTURE:
2597 case GL_SAMPLER:
2598 case GL_PROGRAM:
2599 localSet.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
2600 break;
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002601 }
2602
Jamie Madillbc918e72018-03-08 09:47:21 -05002603 return syncDirtyObjects(context, localSet);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002604}
2605
2606void State::setObjectDirty(GLenum target)
2607{
2608 switch (target)
2609 {
2610 case GL_READ_FRAMEBUFFER:
2611 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2612 break;
2613 case GL_DRAW_FRAMEBUFFER:
2614 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2615 break;
2616 case GL_FRAMEBUFFER:
2617 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2618 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2619 break;
2620 case GL_VERTEX_ARRAY:
2621 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
2622 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002623 case GL_TEXTURE:
2624 case GL_SAMPLER:
Jamie Madill81c2e252017-09-09 23:32:46 -04002625 case GL_PROGRAM:
2626 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
2627 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
2628 break;
Jamie Madilla779b612017-07-24 11:46:05 -04002629 }
2630}
2631
Jamie Madill888081d2018-02-27 00:24:46 -05002632void State::setFramebufferDirty(const Framebuffer *framebuffer) const
2633{
2634 if (framebuffer == mReadFramebuffer)
2635 {
2636 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2637 }
2638 if (framebuffer == mDrawFramebuffer)
2639 {
2640 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2641 }
2642}
2643
Jamie Madilla779b612017-07-24 11:46:05 -04002644void State::onProgramExecutableChange(Program *program)
2645{
2646 // OpenGL Spec:
2647 // "If LinkProgram or ProgramBinary successfully re-links a program object
2648 // that was already in use as a result of a previous call to UseProgram, then the
2649 // generated executable code will be installed as part of the current rendering state."
2650 if (program->isLinked() && mProgram == program)
2651 {
2652 mDirtyBits.set(DIRTY_BIT_PROGRAM_EXECUTABLE);
Jamie Madill81c2e252017-09-09 23:32:46 -04002653 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002654 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002655}
Jamie Madillc9d442d2016-01-20 11:17:24 -05002656
Xinghua Cao65ec0b22017-03-28 16:10:52 +08002657void State::setImageUnit(const Context *context,
2658 GLuint unit,
2659 Texture *texture,
2660 GLint level,
2661 GLboolean layered,
2662 GLint layer,
2663 GLenum access,
2664 GLenum format)
2665{
2666 mImageUnits[unit].texture.set(context, texture);
2667 mImageUnits[unit].level = level;
2668 mImageUnits[unit].layered = layered;
2669 mImageUnits[unit].layer = layer;
2670 mImageUnits[unit].access = access;
2671 mImageUnits[unit].format = format;
2672}
2673
2674const ImageUnit &State::getImageUnit(GLuint unit) const
2675{
2676 return mImageUnits[unit];
2677}
2678
Jamie Madill81c2e252017-09-09 23:32:46 -04002679// Handle a dirty texture event.
Jamie Madilld4442552018-02-27 22:03:47 -05002680void State::onSubjectStateChange(const Context *context,
2681 angle::SubjectIndex index,
2682 angle::SubjectMessage message)
Jamie Madill81c2e252017-09-09 23:32:46 -04002683{
2684 // Conservatively assume all textures are dirty.
2685 // TODO(jmadill): More fine-grained update.
2686 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Geoff Lange51ba632017-11-21 11:45:25 -05002687
Jamie Madilld4442552018-02-27 22:03:47 -05002688 if (!mCompleteTextureCache[index] ||
2689 mCompleteTextureCache[index]->initState() == InitState::MayNeedInit)
Geoff Lange51ba632017-11-21 11:45:25 -05002690 {
2691 mCachedTexturesInitState = InitState::MayNeedInit;
2692 }
Jamie Madill81c2e252017-09-09 23:32:46 -04002693}
2694
Jamie Madill05b35b22017-10-03 09:01:44 -04002695Error State::clearUnclearedActiveTextures(const Context *context)
2696{
Jamie Madilla59fc192017-11-02 12:57:58 -04002697 ASSERT(mRobustResourceInit);
Jamie Madill05b35b22017-10-03 09:01:44 -04002698
Geoff Lange51ba632017-11-21 11:45:25 -05002699 if (mCachedTexturesInitState == InitState::Initialized)
2700 {
2701 return NoError();
2702 }
2703
Geoff Langd4fff502017-09-22 11:28:28 -04002704 ASSERT(!mDirtyObjects.any());
2705
Jamie Madilla59fc192017-11-02 12:57:58 -04002706 for (auto textureIndex : mActiveTexturesMask)
Jamie Madill05b35b22017-10-03 09:01:44 -04002707 {
Jamie Madilla59fc192017-11-02 12:57:58 -04002708 Texture *texture = mCompleteTextureCache[textureIndex];
Jamie Madill05b35b22017-10-03 09:01:44 -04002709 if (texture)
2710 {
2711 ANGLE_TRY(texture->ensureInitialized(context));
2712 }
2713 }
Jamie Madilla59fc192017-11-02 12:57:58 -04002714
Geoff Lange51ba632017-11-21 11:45:25 -05002715 mCachedTexturesInitState = InitState::Initialized;
2716
Jamie Madill05b35b22017-10-03 09:01:44 -04002717 return NoError();
2718}
2719
Jamie Madillc67323a2017-11-02 23:11:41 -04002720AttributesMask State::getAndResetDirtyCurrentValues() const
2721{
2722 AttributesMask retVal = mDirtyCurrentValues;
2723 mDirtyCurrentValues.reset();
2724 return retVal;
2725}
2726
James Darpiniane8a93c62018-01-04 18:02:24 -08002727bool State::isCurrentTransformFeedback(const TransformFeedback *tf) const
2728{
2729 return tf == mTransformFeedback.get();
2730}
2731bool State::isCurrentVertexArray(const VertexArray *va) const
2732{
2733 return va == mVertexArray;
2734}
2735
Jamie Madillc9d442d2016-01-20 11:17:24 -05002736} // namespace gl