blob: 914fc6656b99cde4a2fc8ca01d587d0a6d47cfb9 [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 Yang13b708f2018-03-21 12:14:10 -0700101State::~State()
102{
103}
Geoff Lang76b10c92014-09-05 16:28:14 -0400104
Jamie Madill4928b7c2017-06-20 12:57:39 -0400105void State::initialize(const Context *context,
Geoff Langf41a7152016-09-19 15:11:17 -0400106 bool debug,
Geoff Langfeb8c682017-02-13 16:07:35 -0500107 bool bindGeneratesResource,
Jamie Madille08a1d32017-03-07 17:24:06 -0500108 bool clientArraysEnabled,
Jamie Madillc43be722017-07-13 16:22:14 -0400109 bool robustResourceInit,
110 bool programBinaryCacheEnabled)
Geoff Lang76b10c92014-09-05 16:28:14 -0400111{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700112 const Caps &caps = context->getCaps();
113 const Extensions &extensions = context->getExtensions();
Geoff Lang4751aab2017-10-30 15:14:52 -0400114 const Extensions &nativeExtensions = context->getImplementation()->getNativeExtensions();
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700115 const Version &clientVersion = context->getClientVersion();
Jamie Madill4928b7c2017-06-20 12:57:39 -0400116
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700117 mMaxDrawBuffers = caps.maxDrawBuffers;
Shannon Woods2df6a602014-09-26 16:12:07 -0400118 mMaxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits;
Shannon Woods53a94a82014-06-24 15:20:36 -0400119
Jamie Madillf75ab352015-03-16 10:46:52 -0400120 setColorClearValue(0.0f, 0.0f, 0.0f, 0.0f);
Shannon Woods53a94a82014-06-24 15:20:36 -0400121
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700122 mDepthClearValue = 1.0f;
Shannon Woods53a94a82014-06-24 15:20:36 -0400123 mStencilClearValue = 0;
124
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700125 mScissorTest = false;
126 mScissor.x = 0;
127 mScissor.y = 0;
128 mScissor.width = 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400129 mScissor.height = 0;
130
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700131 mBlendColor.red = 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400132 mBlendColor.green = 0;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700133 mBlendColor.blue = 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400134 mBlendColor.alpha = 0;
135
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700136 mStencilRef = 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400137 mStencilBackRef = 0;
138
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700139 mSampleCoverage = false;
140 mSampleCoverageValue = 1.0f;
Shannon Woods53a94a82014-06-24 15:20:36 -0400141 mSampleCoverageInvert = false;
Jiawei Shaodb342272017-09-27 10:21:45 +0800142
143 mMaxSampleMaskWords = caps.maxSampleMaskWords;
144 mSampleMask = false;
145 mSampleMaskValues.fill(~GLbitfield(0));
146
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700147 mGenerateMipmapHint = GL_DONT_CARE;
Shannon Woods53a94a82014-06-24 15:20:36 -0400148 mFragmentShaderDerivativeHint = GL_DONT_CARE;
149
Geoff Langf41a7152016-09-19 15:11:17 -0400150 mBindGeneratesResource = bindGeneratesResource;
Geoff Langfeb8c682017-02-13 16:07:35 -0500151 mClientArraysEnabled = clientArraysEnabled;
Geoff Langf41a7152016-09-19 15:11:17 -0400152
Shannon Woods53a94a82014-06-24 15:20:36 -0400153 mLineWidth = 1.0f;
154
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700155 mViewport.x = 0;
156 mViewport.y = 0;
157 mViewport.width = 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400158 mViewport.height = 0;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700159 mNearZ = 0.0f;
160 mFarZ = 1.0f;
Shannon Woods53a94a82014-06-24 15:20:36 -0400161
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700162 mBlend.colorMaskRed = true;
Shannon Woods53a94a82014-06-24 15:20:36 -0400163 mBlend.colorMaskGreen = true;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700164 mBlend.colorMaskBlue = true;
Shannon Woods53a94a82014-06-24 15:20:36 -0400165 mBlend.colorMaskAlpha = true;
166
Geoff Lang76b10c92014-09-05 16:28:14 -0400167 mActiveSampler = 0;
168
Shannon Woods23e05002014-09-22 19:07:27 -0400169 mVertexAttribCurrentValues.resize(caps.maxVertexAttributes);
Shannon Woods53a94a82014-06-24 15:20:36 -0400170
Brandon Jonesc405ae72017-12-06 14:15:03 -0800171 // Set all indexes in state attributes type mask to float (default)
172 for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++)
173 {
174 mCurrentValuesTypeMask.setIndex(GL_FLOAT, i);
175 }
176
Geoff Lang4dc3af02016-11-18 14:09:27 -0500177 mUniformBuffers.resize(caps.maxUniformBufferBindings);
Shannon Woodsf3acaf92014-09-23 18:07:11 -0400178
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800179 mSamplerTextures[TextureType::_2D].resize(caps.maxCombinedTextureImageUnits);
180 mSamplerTextures[TextureType::CubeMap].resize(caps.maxCombinedTextureImageUnits);
Geoff Langeb66a6e2016-10-31 13:06:12 -0400181 if (clientVersion >= Version(3, 0))
Shannon Woods53a94a82014-06-24 15:20:36 -0400182 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400183 // TODO: These could also be enabled via extension
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800184 mSamplerTextures[TextureType::_2DArray].resize(caps.maxCombinedTextureImageUnits);
185 mSamplerTextures[TextureType::_3D].resize(caps.maxCombinedTextureImageUnits);
Shannon Woods53a94a82014-06-24 15:20:36 -0400186 }
Geoff Lang3b573612016-10-31 14:08:10 -0400187 if (clientVersion >= Version(3, 1))
188 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800189 mSamplerTextures[TextureType::_2DMultisample].resize(caps.maxCombinedTextureImageUnits);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800190
191 mAtomicCounterBuffers.resize(caps.maxAtomicCounterBufferBindings);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800192 mShaderStorageBuffers.resize(caps.maxShaderStorageBufferBindings);
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800193 mImageUnits.resize(caps.maxImageUnits);
Geoff Lang3b573612016-10-31 14:08:10 -0400194 }
Geoff Lang4751aab2017-10-30 15:14:52 -0400195 if (nativeExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400196 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800197 mSamplerTextures[TextureType::Rectangle].resize(caps.maxCombinedTextureImageUnits);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400198 }
Geoff Lang4751aab2017-10-30 15:14:52 -0400199 if (nativeExtensions.eglImageExternal || nativeExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400200 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800201 mSamplerTextures[TextureType::External].resize(caps.maxCombinedTextureImageUnits);
Ian Ewellbda75592016-04-18 17:25:54 -0400202 }
Jamie Madill81c2e252017-09-09 23:32:46 -0400203 mCompleteTextureCache.resize(caps.maxCombinedTextureImageUnits, nullptr);
204 mCompleteTextureBindings.reserve(caps.maxCombinedTextureImageUnits);
Geoff Lange51ba632017-11-21 11:45:25 -0500205 mCachedTexturesInitState = InitState::MayNeedInit;
Jamie Madill81c2e252017-09-09 23:32:46 -0400206 for (uint32_t textureIndex = 0; textureIndex < caps.maxCombinedTextureImageUnits;
207 ++textureIndex)
208 {
Jamie Madilld4442552018-02-27 22:03:47 -0500209 mCompleteTextureBindings.emplace_back(this, textureIndex);
Jamie Madill81c2e252017-09-09 23:32:46 -0400210 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400211
Geoff Lang76b10c92014-09-05 16:28:14 -0400212 mSamplers.resize(caps.maxCombinedTextureImageUnits);
Shannon Woods53a94a82014-06-24 15:20:36 -0400213
Jamie Madill4928b7c2017-06-20 12:57:39 -0400214 mActiveQueries[GL_ANY_SAMPLES_PASSED].set(context, nullptr);
215 mActiveQueries[GL_ANY_SAMPLES_PASSED_CONSERVATIVE].set(context, nullptr);
216 mActiveQueries[GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN].set(context, nullptr);
217 mActiveQueries[GL_TIME_ELAPSED_EXT].set(context, nullptr);
218 mActiveQueries[GL_COMMANDS_COMPLETED_CHROMIUM].set(context, nullptr);
Jiawei Shaod2fa07e2018-03-15 09:20:25 +0800219 mActiveQueries[GL_PRIMITIVES_GENERATED_EXT].set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400220
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500221 mProgram = nullptr;
Shannon Woods53a94a82014-06-24 15:20:36 -0400222
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500223 mReadFramebuffer = nullptr;
224 mDrawFramebuffer = nullptr;
Jamie Madillb4b53c52015-02-03 15:22:48 -0500225
226 mPrimitiveRestart = false;
Geoff Lang70d0f492015-12-10 17:45:46 -0500227
228 mDebug.setOutputEnabled(debug);
229 mDebug.setMaxLoggedMessages(extensions.maxDebugLoggedMessages);
Sami Väisänen74c23472016-05-09 17:30:30 +0300230
Geoff Lang488130e2017-09-27 13:53:11 -0400231 mMultiSampling = true;
232 mSampleAlphaToOne = false;
Sami Väisänena797e062016-05-12 15:23:40 +0300233
234 mCoverageModulation = GL_NONE;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300235
236 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixProj);
237 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixMV);
238 mPathStencilFunc = GL_ALWAYS;
239 mPathStencilRef = 0;
240 mPathStencilMask = std::numeric_limits<GLuint>::max();
Jamie Madille08a1d32017-03-07 17:24:06 -0500241
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700242 mRobustResourceInit = robustResourceInit;
Jamie Madillc43be722017-07-13 16:22:14 -0400243 mProgramBinaryCacheEnabled = programBinaryCacheEnabled;
Lingfeng Yangdbb9c532018-02-25 19:58:24 -0800244
245 // GLES1 emulation: Initialize state for GLES1 if version
246 // applies
247 if (clientVersion < Version(2, 0))
248 {
249 mGLES1State.initialize(context);
250 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400251}
252
Jamie Madill6c1f6712017-02-14 19:08:04 -0500253void State::reset(const Context *context)
Shannon Woods53a94a82014-06-24 15:20:36 -0400254{
Jamie Madill8693bdb2017-09-02 15:32:14 -0400255 for (auto &bindingVec : mSamplerTextures)
Shannon Woods53a94a82014-06-24 15:20:36 -0400256 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800257 for (size_t textureIdx = 0; textureIdx < bindingVec.size(); textureIdx++)
Shannon Woods53a94a82014-06-24 15:20:36 -0400258 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800259 bindingVec[textureIdx].set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400260 }
261 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400262 for (size_t samplerIdx = 0; samplerIdx < mSamplers.size(); samplerIdx++)
263 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400264 mSamplers[samplerIdx].set(context, nullptr);
Geoff Lang76b10c92014-09-05 16:28:14 -0400265 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400266
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800267 for (auto &imageUnit : mImageUnits)
268 {
269 imageUnit.texture.set(context, nullptr);
270 imageUnit.level = 0;
271 imageUnit.layered = false;
272 imageUnit.layer = 0;
273 imageUnit.access = GL_READ_ONLY;
274 imageUnit.format = GL_R32UI;
275 }
276
Jamie Madill4928b7c2017-06-20 12:57:39 -0400277 mRenderbuffer.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400278
Corentin Wallez336129f2017-10-17 15:55:40 -0400279 for (auto type : angle::AllEnums<BufferBinding>())
280 {
James Darpiniane8a93c62018-01-04 18:02:24 -0800281 UpdateBufferBinding(context, &mBoundBuffers[type], nullptr, type);
Corentin Wallez336129f2017-10-17 15:55:40 -0400282 }
283
Geoff Lang7dd2e102014-11-10 15:19:26 -0500284 if (mProgram)
285 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500286 mProgram->release(context);
Geoff Lang7dd2e102014-11-10 15:19:26 -0500287 }
Yunchao Hed7297bf2017-04-19 15:27:10 +0800288 mProgram = nullptr;
Geoff Lang7dd2e102014-11-10 15:19:26 -0500289
Yunchao Hea336b902017-08-02 16:05:21 +0800290 mProgramPipeline.set(context, nullptr);
291
James Darpiniane8a93c62018-01-04 18:02:24 -0800292 if (mTransformFeedback.get())
293 mTransformFeedback->onBindingChanged(false);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400294 mTransformFeedback.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400295
296 for (State::ActiveQueryMap::iterator i = mActiveQueries.begin(); i != mActiveQueries.end(); i++)
297 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400298 i->second.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400299 }
300
Corentin Wallez336129f2017-10-17 15:55:40 -0400301 for (auto &buf : mUniformBuffers)
Shannon Woods53a94a82014-06-24 15:20:36 -0400302 {
James Darpiniane8a93c62018-01-04 18:02:24 -0800303 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::Uniform);
Shannon Woods53a94a82014-06-24 15:20:36 -0400304 }
305
Jiajia Qin6eafb042016-12-27 17:04:07 +0800306 for (auto &buf : mAtomicCounterBuffers)
307 {
James Darpiniane8a93c62018-01-04 18:02:24 -0800308 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::AtomicCounter);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800309 }
310
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800311 for (auto &buf : mShaderStorageBuffers)
312 {
James Darpiniane8a93c62018-01-04 18:02:24 -0800313 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::ShaderStorage);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800314 }
315
Sami Väisänene45e53b2016-05-25 10:36:04 +0300316 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixProj);
317 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixMV);
318 mPathStencilFunc = GL_ALWAYS;
319 mPathStencilRef = 0;
320 mPathStencilMask = std::numeric_limits<GLuint>::max();
321
Jamie Madill1b94d432015-08-07 13:23:23 -0400322 // TODO(jmadill): Is this necessary?
323 setAllDirtyBits();
Shannon Woods53a94a82014-06-24 15:20:36 -0400324}
325
326const RasterizerState &State::getRasterizerState() const
327{
328 return mRasterizer;
329}
330
331const BlendState &State::getBlendState() const
332{
333 return mBlend;
334}
335
336const DepthStencilState &State::getDepthStencilState() const
337{
338 return mDepthStencil;
339}
340
Jamie Madillf75ab352015-03-16 10:46:52 -0400341void State::setColorClearValue(float red, float green, float blue, float alpha)
Shannon Woods53a94a82014-06-24 15:20:36 -0400342{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700343 mColorClearValue.red = red;
Shannon Woods53a94a82014-06-24 15:20:36 -0400344 mColorClearValue.green = green;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700345 mColorClearValue.blue = blue;
Shannon Woods53a94a82014-06-24 15:20:36 -0400346 mColorClearValue.alpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400347 mDirtyBits.set(DIRTY_BIT_CLEAR_COLOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400348}
349
Jamie Madillf75ab352015-03-16 10:46:52 -0400350void State::setDepthClearValue(float depth)
Shannon Woods53a94a82014-06-24 15:20:36 -0400351{
352 mDepthClearValue = depth;
Jamie Madill1b94d432015-08-07 13:23:23 -0400353 mDirtyBits.set(DIRTY_BIT_CLEAR_DEPTH);
Shannon Woods53a94a82014-06-24 15:20:36 -0400354}
355
Jamie Madillf75ab352015-03-16 10:46:52 -0400356void State::setStencilClearValue(int stencil)
Shannon Woods53a94a82014-06-24 15:20:36 -0400357{
358 mStencilClearValue = stencil;
Jamie Madill1b94d432015-08-07 13:23:23 -0400359 mDirtyBits.set(DIRTY_BIT_CLEAR_STENCIL);
Shannon Woods53a94a82014-06-24 15:20:36 -0400360}
361
Shannon Woods53a94a82014-06-24 15:20:36 -0400362void State::setColorMask(bool red, bool green, bool blue, bool alpha)
363{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700364 mBlend.colorMaskRed = red;
Shannon Woods53a94a82014-06-24 15:20:36 -0400365 mBlend.colorMaskGreen = green;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700366 mBlend.colorMaskBlue = blue;
Shannon Woods53a94a82014-06-24 15:20:36 -0400367 mBlend.colorMaskAlpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400368 mDirtyBits.set(DIRTY_BIT_COLOR_MASK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400369}
370
371void State::setDepthMask(bool mask)
372{
373 mDepthStencil.depthMask = mask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400374 mDirtyBits.set(DIRTY_BIT_DEPTH_MASK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400375}
376
377bool State::isRasterizerDiscardEnabled() const
378{
379 return mRasterizer.rasterizerDiscard;
380}
381
382void State::setRasterizerDiscard(bool enabled)
383{
384 mRasterizer.rasterizerDiscard = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400385 mDirtyBits.set(DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400386}
387
388bool State::isCullFaceEnabled() const
389{
390 return mRasterizer.cullFace;
391}
392
393void State::setCullFace(bool enabled)
394{
395 mRasterizer.cullFace = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400396 mDirtyBits.set(DIRTY_BIT_CULL_FACE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400397}
398
Corentin Wallez2e568cf2017-09-18 17:05:22 -0400399void State::setCullMode(CullFaceMode mode)
Shannon Woods53a94a82014-06-24 15:20:36 -0400400{
401 mRasterizer.cullMode = mode;
Jamie Madill1b94d432015-08-07 13:23:23 -0400402 mDirtyBits.set(DIRTY_BIT_CULL_FACE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400403}
404
405void State::setFrontFace(GLenum front)
406{
407 mRasterizer.frontFace = front;
Jamie Madill1b94d432015-08-07 13:23:23 -0400408 mDirtyBits.set(DIRTY_BIT_FRONT_FACE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400409}
410
411bool State::isDepthTestEnabled() const
412{
413 return mDepthStencil.depthTest;
414}
415
416void State::setDepthTest(bool enabled)
417{
418 mDepthStencil.depthTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400419 mDirtyBits.set(DIRTY_BIT_DEPTH_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400420}
421
422void State::setDepthFunc(GLenum depthFunc)
423{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700424 mDepthStencil.depthFunc = depthFunc;
425 mDirtyBits.set(DIRTY_BIT_DEPTH_FUNC);
Shannon Woods53a94a82014-06-24 15:20:36 -0400426}
427
428void State::setDepthRange(float zNear, float zFar)
429{
430 mNearZ = zNear;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700431 mFarZ = zFar;
Jamie Madill1b94d432015-08-07 13:23:23 -0400432 mDirtyBits.set(DIRTY_BIT_DEPTH_RANGE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400433}
434
Geoff Langd42f5b82015-04-16 14:03:29 -0400435float State::getNearPlane() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400436{
Geoff Langd42f5b82015-04-16 14:03:29 -0400437 return mNearZ;
438}
439
440float State::getFarPlane() const
441{
442 return mFarZ;
Shannon Woods53a94a82014-06-24 15:20:36 -0400443}
444
445bool State::isBlendEnabled() const
446{
447 return mBlend.blend;
448}
449
450void State::setBlend(bool enabled)
451{
452 mBlend.blend = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400453 mDirtyBits.set(DIRTY_BIT_BLEND_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400454}
455
456void State::setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha)
457{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700458 mBlend.sourceBlendRGB = sourceRGB;
459 mBlend.destBlendRGB = destRGB;
Shannon Woods53a94a82014-06-24 15:20:36 -0400460 mBlend.sourceBlendAlpha = sourceAlpha;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700461 mBlend.destBlendAlpha = destAlpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400462 mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400463}
464
465void State::setBlendColor(float red, float green, float blue, float alpha)
466{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700467 mBlendColor.red = red;
Shannon Woods53a94a82014-06-24 15:20:36 -0400468 mBlendColor.green = green;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700469 mBlendColor.blue = blue;
Shannon Woods53a94a82014-06-24 15:20:36 -0400470 mBlendColor.alpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400471 mDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400472}
473
474void State::setBlendEquation(GLenum rgbEquation, GLenum alphaEquation)
475{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700476 mBlend.blendEquationRGB = rgbEquation;
Shannon Woods53a94a82014-06-24 15:20:36 -0400477 mBlend.blendEquationAlpha = alphaEquation;
Jamie Madill1b94d432015-08-07 13:23:23 -0400478 mDirtyBits.set(DIRTY_BIT_BLEND_EQUATIONS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400479}
480
481const ColorF &State::getBlendColor() const
482{
483 return mBlendColor;
484}
485
486bool State::isStencilTestEnabled() const
487{
488 return mDepthStencil.stencilTest;
489}
490
491void State::setStencilTest(bool enabled)
492{
493 mDepthStencil.stencilTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400494 mDirtyBits.set(DIRTY_BIT_STENCIL_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400495}
496
497void State::setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask)
498{
499 mDepthStencil.stencilFunc = stencilFunc;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700500 mStencilRef = (stencilRef > 0) ? stencilRef : 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400501 mDepthStencil.stencilMask = stencilMask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400502 mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400503}
504
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700505void State::setStencilBackParams(GLenum stencilBackFunc,
506 GLint stencilBackRef,
507 GLuint stencilBackMask)
Shannon Woods53a94a82014-06-24 15:20:36 -0400508{
509 mDepthStencil.stencilBackFunc = stencilBackFunc;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700510 mStencilBackRef = (stencilBackRef > 0) ? stencilBackRef : 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400511 mDepthStencil.stencilBackMask = stencilBackMask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400512 mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400513}
514
515void State::setStencilWritemask(GLuint stencilWritemask)
516{
517 mDepthStencil.stencilWritemask = stencilWritemask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400518 mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400519}
520
521void State::setStencilBackWritemask(GLuint stencilBackWritemask)
522{
523 mDepthStencil.stencilBackWritemask = stencilBackWritemask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400524 mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400525}
526
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700527void State::setStencilOperations(GLenum stencilFail,
528 GLenum stencilPassDepthFail,
529 GLenum stencilPassDepthPass)
Shannon Woods53a94a82014-06-24 15:20:36 -0400530{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700531 mDepthStencil.stencilFail = stencilFail;
Shannon Woods53a94a82014-06-24 15:20:36 -0400532 mDepthStencil.stencilPassDepthFail = stencilPassDepthFail;
533 mDepthStencil.stencilPassDepthPass = stencilPassDepthPass;
Jamie Madill1b94d432015-08-07 13:23:23 -0400534 mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400535}
536
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700537void State::setStencilBackOperations(GLenum stencilBackFail,
538 GLenum stencilBackPassDepthFail,
539 GLenum stencilBackPassDepthPass)
Shannon Woods53a94a82014-06-24 15:20:36 -0400540{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700541 mDepthStencil.stencilBackFail = stencilBackFail;
Shannon Woods53a94a82014-06-24 15:20:36 -0400542 mDepthStencil.stencilBackPassDepthFail = stencilBackPassDepthFail;
543 mDepthStencil.stencilBackPassDepthPass = stencilBackPassDepthPass;
Jamie Madill1b94d432015-08-07 13:23:23 -0400544 mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400545}
546
547GLint State::getStencilRef() const
548{
549 return mStencilRef;
550}
551
552GLint State::getStencilBackRef() const
553{
554 return mStencilBackRef;
555}
556
557bool State::isPolygonOffsetFillEnabled() const
558{
559 return mRasterizer.polygonOffsetFill;
560}
561
562void State::setPolygonOffsetFill(bool enabled)
563{
Jamie Madill1b94d432015-08-07 13:23:23 -0400564 mRasterizer.polygonOffsetFill = enabled;
565 mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400566}
567
568void State::setPolygonOffsetParams(GLfloat factor, GLfloat units)
569{
570 // An application can pass NaN values here, so handle this gracefully
571 mRasterizer.polygonOffsetFactor = factor != factor ? 0.0f : factor;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700572 mRasterizer.polygonOffsetUnits = units != units ? 0.0f : units;
Jamie Madill1b94d432015-08-07 13:23:23 -0400573 mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET);
Shannon Woods53a94a82014-06-24 15:20:36 -0400574}
575
576bool State::isSampleAlphaToCoverageEnabled() const
577{
578 return mBlend.sampleAlphaToCoverage;
579}
580
581void State::setSampleAlphaToCoverage(bool enabled)
582{
583 mBlend.sampleAlphaToCoverage = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400584 mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400585}
586
587bool State::isSampleCoverageEnabled() const
588{
589 return mSampleCoverage;
590}
591
592void State::setSampleCoverage(bool enabled)
593{
594 mSampleCoverage = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400595 mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400596}
597
598void State::setSampleCoverageParams(GLclampf value, bool invert)
599{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700600 mSampleCoverageValue = value;
Shannon Woods53a94a82014-06-24 15:20:36 -0400601 mSampleCoverageInvert = invert;
Jamie Madill1b94d432015-08-07 13:23:23 -0400602 mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400603}
604
Geoff Lang0fbb6002015-04-16 11:11:53 -0400605GLclampf State::getSampleCoverageValue() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400606{
Geoff Lang0fbb6002015-04-16 11:11:53 -0400607 return mSampleCoverageValue;
608}
Shannon Woods53a94a82014-06-24 15:20:36 -0400609
Geoff Lang0fbb6002015-04-16 11:11:53 -0400610bool State::getSampleCoverageInvert() const
611{
612 return mSampleCoverageInvert;
Shannon Woods53a94a82014-06-24 15:20:36 -0400613}
614
Jiawei Shaodb342272017-09-27 10:21:45 +0800615bool State::isSampleMaskEnabled() const
616{
617 return mSampleMask;
618}
619
620void State::setSampleMaskEnabled(bool enabled)
621{
622 mSampleMask = enabled;
623 mDirtyBits.set(DIRTY_BIT_SAMPLE_MASK_ENABLED);
624}
625
626void State::setSampleMaskParams(GLuint maskNumber, GLbitfield mask)
627{
628 ASSERT(maskNumber < mMaxSampleMaskWords);
629 mSampleMaskValues[maskNumber] = mask;
Jamie Madillc67323a2017-11-02 23:11:41 -0400630 // TODO(jmadill): Use a child dirty bit if we ever use more than two words.
631 mDirtyBits.set(DIRTY_BIT_SAMPLE_MASK);
Jiawei Shaodb342272017-09-27 10:21:45 +0800632}
633
634GLbitfield State::getSampleMaskWord(GLuint maskNumber) const
635{
636 ASSERT(maskNumber < mMaxSampleMaskWords);
637 return mSampleMaskValues[maskNumber];
638}
639
640GLuint State::getMaxSampleMaskWords() const
641{
642 return mMaxSampleMaskWords;
643}
644
Sami Väisänen74c23472016-05-09 17:30:30 +0300645void State::setSampleAlphaToOne(bool enabled)
646{
647 mSampleAlphaToOne = enabled;
648 mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_ONE);
649}
650
651bool State::isSampleAlphaToOneEnabled() const
652{
653 return mSampleAlphaToOne;
654}
655
656void State::setMultisampling(bool enabled)
657{
658 mMultiSampling = enabled;
659 mDirtyBits.set(DIRTY_BIT_MULTISAMPLING);
660}
661
662bool State::isMultisamplingEnabled() const
663{
664 return mMultiSampling;
665}
666
Shannon Woods53a94a82014-06-24 15:20:36 -0400667bool State::isScissorTestEnabled() const
668{
669 return mScissorTest;
670}
671
672void State::setScissorTest(bool enabled)
673{
674 mScissorTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400675 mDirtyBits.set(DIRTY_BIT_SCISSOR_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400676}
677
678void State::setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height)
679{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700680 mScissor.x = x;
681 mScissor.y = y;
682 mScissor.width = width;
Shannon Woods53a94a82014-06-24 15:20:36 -0400683 mScissor.height = height;
Jamie Madill1b94d432015-08-07 13:23:23 -0400684 mDirtyBits.set(DIRTY_BIT_SCISSOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400685}
686
687const Rectangle &State::getScissor() const
688{
689 return mScissor;
690}
691
692bool State::isDitherEnabled() const
693{
694 return mBlend.dither;
695}
696
697void State::setDither(bool enabled)
698{
699 mBlend.dither = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400700 mDirtyBits.set(DIRTY_BIT_DITHER_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400701}
702
Jamie Madillb4b53c52015-02-03 15:22:48 -0500703bool State::isPrimitiveRestartEnabled() const
704{
705 return mPrimitiveRestart;
706}
707
708void State::setPrimitiveRestart(bool enabled)
709{
710 mPrimitiveRestart = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400711 mDirtyBits.set(DIRTY_BIT_PRIMITIVE_RESTART_ENABLED);
Jamie Madillb4b53c52015-02-03 15:22:48 -0500712}
713
Shannon Woods53a94a82014-06-24 15:20:36 -0400714void State::setEnableFeature(GLenum feature, bool enabled)
715{
716 switch (feature)
717 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700718 case GL_MULTISAMPLE_EXT:
719 setMultisampling(enabled);
720 break;
721 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
722 setSampleAlphaToOne(enabled);
723 break;
724 case GL_CULL_FACE:
725 setCullFace(enabled);
726 break;
727 case GL_POLYGON_OFFSET_FILL:
728 setPolygonOffsetFill(enabled);
729 break;
730 case GL_SAMPLE_ALPHA_TO_COVERAGE:
731 setSampleAlphaToCoverage(enabled);
732 break;
733 case GL_SAMPLE_COVERAGE:
734 setSampleCoverage(enabled);
735 break;
736 case GL_SCISSOR_TEST:
737 setScissorTest(enabled);
738 break;
739 case GL_STENCIL_TEST:
740 setStencilTest(enabled);
741 break;
742 case GL_DEPTH_TEST:
743 setDepthTest(enabled);
744 break;
745 case GL_BLEND:
746 setBlend(enabled);
747 break;
748 case GL_DITHER:
749 setDither(enabled);
750 break;
751 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
752 setPrimitiveRestart(enabled);
753 break;
754 case GL_RASTERIZER_DISCARD:
755 setRasterizerDiscard(enabled);
756 break;
757 case GL_SAMPLE_MASK:
758 setSampleMaskEnabled(enabled);
759 break;
760 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
761 mDebug.setOutputSynchronous(enabled);
762 break;
763 case GL_DEBUG_OUTPUT:
764 mDebug.setOutputEnabled(enabled);
765 break;
766 case GL_FRAMEBUFFER_SRGB_EXT:
767 setFramebufferSRGB(enabled);
768 break;
Lingfeng Yang13b708f2018-03-21 12:14:10 -0700769
770 // GLES1 emulation
771 case GL_ALPHA_TEST:
772 mGLES1State.mAlphaTestEnabled = enabled;
773 break;
774
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700775 default:
776 UNREACHABLE();
Shannon Woods53a94a82014-06-24 15:20:36 -0400777 }
778}
779
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700780bool State::getEnableFeature(GLenum feature) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400781{
782 switch (feature)
783 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700784 case GL_MULTISAMPLE_EXT:
785 return isMultisamplingEnabled();
786 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
787 return isSampleAlphaToOneEnabled();
788 case GL_CULL_FACE:
789 return isCullFaceEnabled();
790 case GL_POLYGON_OFFSET_FILL:
791 return isPolygonOffsetFillEnabled();
792 case GL_SAMPLE_ALPHA_TO_COVERAGE:
793 return isSampleAlphaToCoverageEnabled();
794 case GL_SAMPLE_COVERAGE:
795 return isSampleCoverageEnabled();
796 case GL_SCISSOR_TEST:
797 return isScissorTestEnabled();
798 case GL_STENCIL_TEST:
799 return isStencilTestEnabled();
800 case GL_DEPTH_TEST:
801 return isDepthTestEnabled();
802 case GL_BLEND:
803 return isBlendEnabled();
804 case GL_DITHER:
805 return isDitherEnabled();
806 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
807 return isPrimitiveRestartEnabled();
808 case GL_RASTERIZER_DISCARD:
809 return isRasterizerDiscardEnabled();
810 case GL_SAMPLE_MASK:
811 return isSampleMaskEnabled();
812 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
813 return mDebug.isOutputSynchronous();
814 case GL_DEBUG_OUTPUT:
815 return mDebug.isOutputEnabled();
816 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
817 return isBindGeneratesResourceEnabled();
818 case GL_CLIENT_ARRAYS_ANGLE:
819 return areClientArraysEnabled();
820 case GL_FRAMEBUFFER_SRGB_EXT:
821 return getFramebufferSRGB();
822 case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
823 return mRobustResourceInit;
824 case GL_PROGRAM_CACHE_ENABLED_ANGLE:
825 return mProgramBinaryCacheEnabled;
Jamie Madillc43be722017-07-13 16:22:14 -0400826
Lingfeng Yang13b708f2018-03-21 12:14:10 -0700827 // GLES1 emulation
828 case GL_ALPHA_TEST:
829 return mGLES1State.mAlphaTestEnabled;
830
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700831 default:
832 UNREACHABLE();
833 return false;
Shannon Woods53a94a82014-06-24 15:20:36 -0400834 }
835}
836
837void State::setLineWidth(GLfloat width)
838{
839 mLineWidth = width;
Jamie Madill1b94d432015-08-07 13:23:23 -0400840 mDirtyBits.set(DIRTY_BIT_LINE_WIDTH);
Shannon Woods53a94a82014-06-24 15:20:36 -0400841}
842
Geoff Lang4b3f4162015-04-16 13:22:05 -0400843float State::getLineWidth() const
844{
845 return mLineWidth;
846}
847
Shannon Woods53a94a82014-06-24 15:20:36 -0400848void State::setGenerateMipmapHint(GLenum hint)
849{
850 mGenerateMipmapHint = hint;
Jamie Madill1b94d432015-08-07 13:23:23 -0400851 mDirtyBits.set(DIRTY_BIT_GENERATE_MIPMAP_HINT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400852}
853
854void State::setFragmentShaderDerivativeHint(GLenum hint)
855{
856 mFragmentShaderDerivativeHint = hint;
Jamie Madill1b94d432015-08-07 13:23:23 -0400857 mDirtyBits.set(DIRTY_BIT_SHADER_DERIVATIVE_HINT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400858 // TODO: Propagate the hint to shader translator so we can write
859 // ddx, ddx_coarse, or ddx_fine depending on the hint.
860 // Ignore for now. It is valid for implementations to ignore hint.
861}
862
Geoff Langf41a7152016-09-19 15:11:17 -0400863bool State::isBindGeneratesResourceEnabled() const
864{
865 return mBindGeneratesResource;
866}
867
Geoff Langfeb8c682017-02-13 16:07:35 -0500868bool State::areClientArraysEnabled() const
869{
870 return mClientArraysEnabled;
871}
872
Shannon Woods53a94a82014-06-24 15:20:36 -0400873void State::setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height)
874{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700875 mViewport.x = x;
876 mViewport.y = y;
877 mViewport.width = width;
Shannon Woods53a94a82014-06-24 15:20:36 -0400878 mViewport.height = height;
Jamie Madill1b94d432015-08-07 13:23:23 -0400879 mDirtyBits.set(DIRTY_BIT_VIEWPORT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400880}
881
882const Rectangle &State::getViewport() const
883{
884 return mViewport;
885}
886
887void State::setActiveSampler(unsigned int active)
888{
889 mActiveSampler = active;
890}
891
892unsigned int State::getActiveSampler() const
893{
Cooper Partin4d61f7e2015-08-12 10:56:50 -0700894 return static_cast<unsigned int>(mActiveSampler);
Shannon Woods53a94a82014-06-24 15:20:36 -0400895}
896
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800897void State::setSamplerTexture(const Context *context, TextureType type, Texture *texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400898{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400899 mSamplerTextures[type][mActiveSampler].set(context, texture);
Jamie Madill81c2e252017-09-09 23:32:46 -0400900 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
901 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Shannon Woods53a94a82014-06-24 15:20:36 -0400902}
903
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800904Texture *State::getTargetTexture(TextureType type) const
Jamie Madillc29968b2016-01-20 11:17:23 -0500905{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800906 return getSamplerTexture(static_cast<unsigned int>(mActiveSampler), type);
Jamie Madillc29968b2016-01-20 11:17:23 -0500907}
908
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800909Texture *State::getSamplerTexture(unsigned int sampler, TextureType type) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400910{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800911 ASSERT(sampler < mSamplerTextures[type].size());
912 return mSamplerTextures[type][sampler].get();
Shannon Woods53a94a82014-06-24 15:20:36 -0400913}
914
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800915GLuint State::getSamplerTextureId(unsigned int sampler, TextureType type) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400916{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800917 ASSERT(sampler < mSamplerTextures[type].size());
918 return mSamplerTextures[type][sampler].id();
Shannon Woods53a94a82014-06-24 15:20:36 -0400919}
920
Jamie Madilla02315b2017-02-23 14:14:47 -0500921void State::detachTexture(const Context *context, const TextureMap &zeroTextures, GLuint texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400922{
923 // Textures have a detach method on State rather than a simple
924 // removeBinding, because the zero/null texture objects are managed
925 // separately, and don't have to go through the Context's maps or
926 // the ResourceManager.
927
928 // [OpenGL ES 2.0.24] section 3.8 page 84:
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700929 // If a texture object is deleted, it is as if all texture units which are bound to that texture
930 // object are rebound to texture object zero
Shannon Woods53a94a82014-06-24 15:20:36 -0400931
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800932 for (TextureType type : angle::AllEnums<TextureType>())
Shannon Woods53a94a82014-06-24 15:20:36 -0400933 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800934 TextureBindingVector &textureVector = mSamplerTextures[type];
Jamie Madill81c2e252017-09-09 23:32:46 -0400935 for (BindingPointer<Texture> &binding : textureVector)
Shannon Woods53a94a82014-06-24 15:20:36 -0400936 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400937 if (binding.id() == texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400938 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800939 Texture *zeroTexture = zeroTextures[type].get();
940 ASSERT(zeroTexture != nullptr);
Jamie Madille6382c32014-11-07 15:05:26 -0500941 // Zero textures are the "default" textures instead of NULL
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800942 binding.set(context, zeroTexture);
Jamie Madill81c2e252017-09-09 23:32:46 -0400943 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400944 }
945 }
946 }
947
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800948 for (auto &bindingImageUnit : mImageUnits)
949 {
950 if (bindingImageUnit.texture.id() == texture)
951 {
952 bindingImageUnit.texture.set(context, nullptr);
953 bindingImageUnit.level = 0;
954 bindingImageUnit.layered = false;
955 bindingImageUnit.layer = 0;
956 bindingImageUnit.access = GL_READ_ONLY;
957 bindingImageUnit.format = GL_R32UI;
958 break;
959 }
960 }
961
Shannon Woods53a94a82014-06-24 15:20:36 -0400962 // [OpenGL ES 2.0.24] section 4.4 page 112:
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700963 // If a texture object is deleted while its image is attached to the currently bound
964 // framebuffer, then it is as if Texture2DAttachment had been called, with a texture of 0, for
965 // each attachment point to which this image was attached in the currently bound framebuffer.
Shannon Woods53a94a82014-06-24 15:20:36 -0400966
Jamie Madill8693bdb2017-09-02 15:32:14 -0400967 if (mReadFramebuffer && mReadFramebuffer->detachTexture(context, texture))
Shannon Woods53a94a82014-06-24 15:20:36 -0400968 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400969 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -0400970 }
971
Jamie Madill8693bdb2017-09-02 15:32:14 -0400972 if (mDrawFramebuffer && mDrawFramebuffer->detachTexture(context, texture))
Shannon Woods53a94a82014-06-24 15:20:36 -0400973 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400974 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -0400975 }
976}
977
Jamie Madill4928b7c2017-06-20 12:57:39 -0400978void State::initializeZeroTextures(const Context *context, const TextureMap &zeroTextures)
Jamie Madille6382c32014-11-07 15:05:26 -0500979{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800980 for (TextureType type : angle::AllEnums<TextureType>())
Jamie Madille6382c32014-11-07 15:05:26 -0500981 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800982 for (size_t textureUnit = 0; textureUnit < mSamplerTextures[type].size(); ++textureUnit)
Jamie Madille6382c32014-11-07 15:05:26 -0500983 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800984 mSamplerTextures[type][textureUnit].set(context, zeroTextures[type].get());
Jamie Madille6382c32014-11-07 15:05:26 -0500985 }
986 }
987}
988
Jamie Madill4928b7c2017-06-20 12:57:39 -0400989void State::setSamplerBinding(const Context *context, GLuint textureUnit, Sampler *sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -0400990{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400991 mSamplers[textureUnit].set(context, sampler);
Jamie Madill81c2e252017-09-09 23:32:46 -0400992 mDirtyBits.set(DIRTY_BIT_SAMPLER_BINDINGS);
993 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Shannon Woods53a94a82014-06-24 15:20:36 -0400994}
995
996GLuint State::getSamplerId(GLuint textureUnit) const
997{
Geoff Lang76b10c92014-09-05 16:28:14 -0400998 ASSERT(textureUnit < mSamplers.size());
Shannon Woods53a94a82014-06-24 15:20:36 -0400999 return mSamplers[textureUnit].id();
1000}
1001
1002Sampler *State::getSampler(GLuint textureUnit) const
1003{
1004 return mSamplers[textureUnit].get();
1005}
1006
Jamie Madill4928b7c2017-06-20 12:57:39 -04001007void State::detachSampler(const Context *context, GLuint sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -04001008{
1009 // [OpenGL ES 3.0.2] section 3.8.2 pages 123-124:
1010 // If a sampler object that is currently bound to one or more texture units is
1011 // deleted, it is as though BindSampler is called once for each texture unit to
1012 // which the sampler is bound, with unit set to the texture unit and sampler set to zero.
Jamie Madill81c2e252017-09-09 23:32:46 -04001013 for (BindingPointer<Sampler> &samplerBinding : mSamplers)
Shannon Woods53a94a82014-06-24 15:20:36 -04001014 {
Geoff Lang76b10c92014-09-05 16:28:14 -04001015 if (samplerBinding.id() == sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -04001016 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001017 samplerBinding.set(context, nullptr);
Jamie Madill81c2e252017-09-09 23:32:46 -04001018 mDirtyBits.set(DIRTY_BIT_SAMPLER_BINDINGS);
Shannon Woods53a94a82014-06-24 15:20:36 -04001019 }
1020 }
1021}
1022
Jamie Madill4928b7c2017-06-20 12:57:39 -04001023void State::setRenderbufferBinding(const Context *context, Renderbuffer *renderbuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001024{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001025 mRenderbuffer.set(context, renderbuffer);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001026 mDirtyBits.set(DIRTY_BIT_RENDERBUFFER_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001027}
1028
1029GLuint State::getRenderbufferId() const
1030{
1031 return mRenderbuffer.id();
1032}
1033
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001034Renderbuffer *State::getCurrentRenderbuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001035{
1036 return mRenderbuffer.get();
1037}
1038
Jamie Madilla02315b2017-02-23 14:14:47 -05001039void State::detachRenderbuffer(const Context *context, GLuint renderbuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001040{
1041 // [OpenGL ES 2.0.24] section 4.4 page 109:
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001042 // If a renderbuffer that is currently bound to RENDERBUFFER is deleted, it is as though
1043 // BindRenderbuffer had been executed with the target RENDERBUFFER and name of zero.
Shannon Woods53a94a82014-06-24 15:20:36 -04001044
1045 if (mRenderbuffer.id() == renderbuffer)
1046 {
Jamie Madill8693bdb2017-09-02 15:32:14 -04001047 setRenderbufferBinding(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001048 }
1049
1050 // [OpenGL ES 2.0.24] section 4.4 page 111:
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001051 // If a renderbuffer object is deleted while its image is attached to the currently bound
1052 // framebuffer, then it is as if FramebufferRenderbuffer had been called, with a renderbuffer of
1053 // 0, for each attachment point to which this image was attached in the currently bound
1054 // framebuffer.
Shannon Woods53a94a82014-06-24 15:20:36 -04001055
1056 Framebuffer *readFramebuffer = mReadFramebuffer;
1057 Framebuffer *drawFramebuffer = mDrawFramebuffer;
1058
Jamie Madill8693bdb2017-09-02 15:32:14 -04001059 if (readFramebuffer && readFramebuffer->detachRenderbuffer(context, renderbuffer))
Shannon Woods53a94a82014-06-24 15:20:36 -04001060 {
Jamie Madill8693bdb2017-09-02 15:32:14 -04001061 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -04001062 }
1063
1064 if (drawFramebuffer && drawFramebuffer != readFramebuffer)
1065 {
Jamie Madill8693bdb2017-09-02 15:32:14 -04001066 if (drawFramebuffer->detachRenderbuffer(context, renderbuffer))
1067 {
1068 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
1069 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001070 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001071}
1072
1073void State::setReadFramebufferBinding(Framebuffer *framebuffer)
1074{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001075 if (mReadFramebuffer == framebuffer)
1076 return;
1077
Shannon Woods53a94a82014-06-24 15:20:36 -04001078 mReadFramebuffer = framebuffer;
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001079 mDirtyBits.set(DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
1080
1081 if (mReadFramebuffer && mReadFramebuffer->hasAnyDirtyBit())
1082 {
1083 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
1084 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001085}
1086
1087void State::setDrawFramebufferBinding(Framebuffer *framebuffer)
1088{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001089 if (mDrawFramebuffer == framebuffer)
1090 return;
1091
Shannon Woods53a94a82014-06-24 15:20:36 -04001092 mDrawFramebuffer = framebuffer;
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001093 mDirtyBits.set(DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
1094
1095 if (mDrawFramebuffer && mDrawFramebuffer->hasAnyDirtyBit())
1096 {
1097 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
1098 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001099}
1100
1101Framebuffer *State::getTargetFramebuffer(GLenum target) const
1102{
1103 switch (target)
1104 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001105 case GL_READ_FRAMEBUFFER_ANGLE:
1106 return mReadFramebuffer;
1107 case GL_DRAW_FRAMEBUFFER_ANGLE:
1108 case GL_FRAMEBUFFER:
1109 return mDrawFramebuffer;
1110 default:
1111 UNREACHABLE();
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001112 return nullptr;
Shannon Woods53a94a82014-06-24 15:20:36 -04001113 }
1114}
1115
Jamie Madill51f40ec2016-06-15 14:06:00 -04001116Framebuffer *State::getReadFramebuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001117{
1118 return mReadFramebuffer;
1119}
1120
Jamie Madill51f40ec2016-06-15 14:06:00 -04001121Framebuffer *State::getDrawFramebuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001122{
1123 return mDrawFramebuffer;
1124}
1125
1126bool State::removeReadFramebufferBinding(GLuint framebuffer)
1127{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001128 if (mReadFramebuffer != nullptr && mReadFramebuffer->id() == framebuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001129 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001130 setReadFramebufferBinding(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001131 return true;
1132 }
1133
1134 return false;
1135}
1136
1137bool State::removeDrawFramebufferBinding(GLuint framebuffer)
1138{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001139 if (mReadFramebuffer != nullptr && mDrawFramebuffer->id() == framebuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001140 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001141 setDrawFramebufferBinding(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001142 return true;
1143 }
1144
1145 return false;
1146}
1147
1148void State::setVertexArrayBinding(VertexArray *vertexArray)
1149{
James Darpiniane8a93c62018-01-04 18:02:24 -08001150 if (mVertexArray == vertexArray)
1151 return;
1152 if (mVertexArray)
1153 mVertexArray->onBindingChanged(false);
Shannon Woods53a94a82014-06-24 15:20:36 -04001154 mVertexArray = vertexArray;
James Darpiniane8a93c62018-01-04 18:02:24 -08001155 if (vertexArray)
1156 vertexArray->onBindingChanged(true);
Jamie Madill0b9e9032015-08-17 11:51:52 +00001157 mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001158
1159 if (mVertexArray && mVertexArray->hasAnyDirtyBit())
1160 {
1161 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1162 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001163}
1164
1165GLuint State::getVertexArrayId() const
1166{
Yunchao He4f285442017-04-21 12:15:49 +08001167 ASSERT(mVertexArray != nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001168 return mVertexArray->id();
1169}
1170
1171VertexArray *State::getVertexArray() const
1172{
Yunchao He4f285442017-04-21 12:15:49 +08001173 ASSERT(mVertexArray != nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001174 return mVertexArray;
1175}
1176
1177bool State::removeVertexArrayBinding(GLuint vertexArray)
1178{
James Darpiniane8a93c62018-01-04 18:02:24 -08001179 if (mVertexArray && mVertexArray->id() == vertexArray)
Shannon Woods53a94a82014-06-24 15:20:36 -04001180 {
James Darpiniane8a93c62018-01-04 18:02:24 -08001181 mVertexArray->onBindingChanged(false);
Yunchao Hed7297bf2017-04-19 15:27:10 +08001182 mVertexArray = nullptr;
Jamie Madill0b9e9032015-08-17 11:51:52 +00001183 mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001184 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001185 return true;
1186 }
1187
1188 return false;
1189}
1190
Jamie Madill4928b7c2017-06-20 12:57:39 -04001191void State::bindVertexBuffer(const Context *context,
1192 GLuint bindingIndex,
Shao80957d92017-02-20 21:25:59 +08001193 Buffer *boundBuffer,
1194 GLintptr offset,
1195 GLsizei stride)
1196{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001197 getVertexArray()->bindVertexBuffer(context, bindingIndex, boundBuffer, offset, stride);
Shao80957d92017-02-20 21:25:59 +08001198 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1199}
1200
Shaodde78e82017-05-22 14:13:27 +08001201void State::setVertexAttribBinding(const Context *context, GLuint attribIndex, GLuint bindingIndex)
Shao80957d92017-02-20 21:25:59 +08001202{
Shaodde78e82017-05-22 14:13:27 +08001203 getVertexArray()->setVertexAttribBinding(context, attribIndex, bindingIndex);
Shao80957d92017-02-20 21:25:59 +08001204 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1205}
1206
1207void State::setVertexAttribFormat(GLuint attribIndex,
1208 GLint size,
1209 GLenum type,
1210 bool normalized,
1211 bool pureInteger,
1212 GLuint relativeOffset)
1213{
1214 getVertexArray()->setVertexAttribFormat(attribIndex, size, type, normalized, pureInteger,
1215 relativeOffset);
1216 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1217}
1218
1219void State::setVertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
1220{
1221 getVertexArray()->setVertexBindingDivisor(bindingIndex, divisor);
1222 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1223}
1224
Jamie Madill6c1f6712017-02-14 19:08:04 -05001225void State::setProgram(const Context *context, Program *newProgram)
Shannon Woods53a94a82014-06-24 15:20:36 -04001226{
Geoff Lang7dd2e102014-11-10 15:19:26 -05001227 if (mProgram != newProgram)
Shannon Woods53a94a82014-06-24 15:20:36 -04001228 {
Geoff Lang7dd2e102014-11-10 15:19:26 -05001229 if (mProgram)
1230 {
Jamie Madill6c1f6712017-02-14 19:08:04 -05001231 mProgram->release(context);
Geoff Lang7dd2e102014-11-10 15:19:26 -05001232 }
1233
1234 mProgram = newProgram;
1235
1236 if (mProgram)
1237 {
1238 newProgram->addRef();
Jamie Madill81c2e252017-09-09 23:32:46 -04001239 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Geoff Lang7dd2e102014-11-10 15:19:26 -05001240 }
Jamie Madilla779b612017-07-24 11:46:05 -04001241 mDirtyBits.set(DIRTY_BIT_PROGRAM_EXECUTABLE);
1242 mDirtyBits.set(DIRTY_BIT_PROGRAM_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001243 }
1244}
1245
Geoff Lang7dd2e102014-11-10 15:19:26 -05001246Program *State::getProgram() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001247{
Geoff Lang7dd2e102014-11-10 15:19:26 -05001248 return mProgram;
Shannon Woods53a94a82014-06-24 15:20:36 -04001249}
1250
Jamie Madill4928b7c2017-06-20 12:57:39 -04001251void State::setTransformFeedbackBinding(const Context *context,
1252 TransformFeedback *transformFeedback)
Shannon Woods53a94a82014-06-24 15:20:36 -04001253{
James Darpiniane8a93c62018-01-04 18:02:24 -08001254 if (transformFeedback == mTransformFeedback.get())
1255 return;
1256 if (mTransformFeedback.get())
1257 mTransformFeedback->onBindingChanged(false);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001258 mTransformFeedback.set(context, transformFeedback);
James Darpiniane8a93c62018-01-04 18:02:24 -08001259 if (mTransformFeedback.get())
1260 mTransformFeedback->onBindingChanged(true);
Geoff Langded79232017-11-28 15:21:11 -05001261 mDirtyBits.set(DIRTY_BIT_TRANSFORM_FEEDBACK_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001262}
1263
1264TransformFeedback *State::getCurrentTransformFeedback() const
1265{
1266 return mTransformFeedback.get();
1267}
1268
Gregoire Payen de La Garanderie52742022015-02-04 14:55:39 +00001269bool State::isTransformFeedbackActiveUnpaused() const
1270{
Jamie Madill81c2e252017-09-09 23:32:46 -04001271 TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001272 return curTransformFeedback && curTransformFeedback->isActive() &&
1273 !curTransformFeedback->isPaused();
Gregoire Payen de La Garanderie52742022015-02-04 14:55:39 +00001274}
1275
Jamie Madill4928b7c2017-06-20 12:57:39 -04001276bool State::removeTransformFeedbackBinding(const Context *context, GLuint transformFeedback)
Shannon Woods53a94a82014-06-24 15:20:36 -04001277{
1278 if (mTransformFeedback.id() == transformFeedback)
1279 {
James Darpiniane8a93c62018-01-04 18:02:24 -08001280 if (mTransformFeedback.get())
1281 mTransformFeedback->onBindingChanged(false);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001282 mTransformFeedback.set(context, nullptr);
Corentin Walleza2257da2016-04-19 16:43:12 -04001283 return true;
Shannon Woods53a94a82014-06-24 15:20:36 -04001284 }
Corentin Walleza2257da2016-04-19 16:43:12 -04001285
1286 return false;
Shannon Woods53a94a82014-06-24 15:20:36 -04001287}
1288
Yunchao Hea336b902017-08-02 16:05:21 +08001289void State::setProgramPipelineBinding(const Context *context, ProgramPipeline *pipeline)
1290{
1291 mProgramPipeline.set(context, pipeline);
1292}
1293
1294void State::detachProgramPipeline(const Context *context, GLuint pipeline)
1295{
1296 mProgramPipeline.set(context, nullptr);
1297}
1298
Olli Etuahobbf1c102016-06-28 13:31:33 +03001299bool State::isQueryActive(const GLenum type) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001300{
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001301 for (auto &iter : mActiveQueries)
Shannon Woods53a94a82014-06-24 15:20:36 -04001302 {
Olli Etuahobbf1c102016-06-28 13:31:33 +03001303 const Query *query = iter.second.get();
1304 if (query != nullptr && ActiveQueryType(query->getType()) == ActiveQueryType(type))
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001305 {
1306 return true;
1307 }
1308 }
1309
1310 return false;
1311}
1312
1313bool State::isQueryActive(Query *query) const
1314{
1315 for (auto &iter : mActiveQueries)
1316 {
1317 if (iter.second.get() == query)
Shannon Woods53a94a82014-06-24 15:20:36 -04001318 {
1319 return true;
1320 }
1321 }
1322
1323 return false;
1324}
1325
Jamie Madill4928b7c2017-06-20 12:57:39 -04001326void State::setActiveQuery(const Context *context, GLenum target, Query *query)
Shannon Woods53a94a82014-06-24 15:20:36 -04001327{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001328 mActiveQueries[target].set(context, query);
Shannon Woods53a94a82014-06-24 15:20:36 -04001329}
1330
1331GLuint State::getActiveQueryId(GLenum target) const
1332{
1333 const Query *query = getActiveQuery(target);
1334 return (query ? query->id() : 0u);
1335}
1336
1337Query *State::getActiveQuery(GLenum target) const
1338{
Jamie Madill5864ac22015-01-12 14:43:07 -05001339 const auto it = mActiveQueries.find(target);
Shannon Woods53a94a82014-06-24 15:20:36 -04001340
Jamie Madill5864ac22015-01-12 14:43:07 -05001341 // All query types should already exist in the activeQueries map
1342 ASSERT(it != mActiveQueries.end());
1343
1344 return it->second.get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001345}
1346
Corentin Wallez336129f2017-10-17 15:55:40 -04001347void State::setBufferBinding(const Context *context, BufferBinding target, Buffer *buffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001348{
Corentin Wallez336129f2017-10-17 15:55:40 -04001349 switch (target)
1350 {
1351 case BufferBinding::PixelPack:
James Darpiniane8a93c62018-01-04 18:02:24 -08001352 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Corentin Wallez336129f2017-10-17 15:55:40 -04001353 mDirtyBits.set(DIRTY_BIT_PACK_BUFFER_BINDING);
1354 break;
1355 case BufferBinding::PixelUnpack:
James Darpiniane8a93c62018-01-04 18:02:24 -08001356 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Corentin Wallez336129f2017-10-17 15:55:40 -04001357 mDirtyBits.set(DIRTY_BIT_UNPACK_BUFFER_BINDING);
1358 break;
1359 case BufferBinding::DrawIndirect:
James Darpiniane8a93c62018-01-04 18:02:24 -08001360 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Corentin Wallez336129f2017-10-17 15:55:40 -04001361 mDirtyBits.set(DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING);
1362 break;
Qin Jiajiaa98a2812017-11-30 18:12:06 +08001363 case BufferBinding::DispatchIndirect:
James Darpiniane8a93c62018-01-04 18:02:24 -08001364 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Qin Jiajiaa98a2812017-11-30 18:12:06 +08001365 mDirtyBits.set(DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
1366 break;
Corentin Wallez336129f2017-10-17 15:55:40 -04001367 case BufferBinding::ElementArray:
1368 getVertexArray()->setElementArrayBuffer(context, buffer);
1369 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1370 break;
Xinghua Cao10a4d432017-11-28 14:46:26 +08001371 case BufferBinding::ShaderStorage:
James Darpiniane8a93c62018-01-04 18:02:24 -08001372 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Xinghua Cao10a4d432017-11-28 14:46:26 +08001373 mDirtyBits.set(DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
1374 break;
Corentin Wallez336129f2017-10-17 15:55:40 -04001375 default:
James Darpiniane8a93c62018-01-04 18:02:24 -08001376 UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
Corentin Wallez336129f2017-10-17 15:55:40 -04001377 break;
1378 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001379}
James Darpiniane8a93c62018-01-04 18:02:24 -08001380
Corentin Wallez336129f2017-10-17 15:55:40 -04001381void State::setIndexedBufferBinding(const Context *context,
1382 BufferBinding target,
1383 GLuint index,
1384 Buffer *buffer,
1385 GLintptr offset,
1386 GLsizeiptr size)
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001387{
Corentin Wallez336129f2017-10-17 15:55:40 -04001388 setBufferBinding(context, target, buffer);
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001389
Corentin Wallez336129f2017-10-17 15:55:40 -04001390 switch (target)
1391 {
1392 case BufferBinding::TransformFeedback:
1393 mTransformFeedback->bindIndexedBuffer(context, index, buffer, offset, size);
James Darpiniane8a93c62018-01-04 18:02:24 -08001394 setBufferBinding(context, target, buffer);
Corentin Wallez336129f2017-10-17 15:55:40 -04001395 break;
1396 case BufferBinding::Uniform:
James Darpiniane8a93c62018-01-04 18:02:24 -08001397 UpdateBufferBinding(context, &mUniformBuffers[index], buffer, target, offset, size);
Jamie Madillf4141212017-12-12 15:08:07 -05001398 mDirtyBits.set(DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
Corentin Wallez336129f2017-10-17 15:55:40 -04001399 break;
1400 case BufferBinding::AtomicCounter:
James Darpiniane8a93c62018-01-04 18:02:24 -08001401 UpdateBufferBinding(context, &mAtomicCounterBuffers[index], buffer, target, offset,
1402 size);
Corentin Wallez336129f2017-10-17 15:55:40 -04001403 break;
1404 case BufferBinding::ShaderStorage:
James Darpiniane8a93c62018-01-04 18:02:24 -08001405 UpdateBufferBinding(context, &mShaderStorageBuffers[index], buffer, target, offset,
1406 size);
Corentin Wallez336129f2017-10-17 15:55:40 -04001407 break;
1408 default:
1409 UNREACHABLE();
1410 break;
1411 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001412}
1413
Geoff Lang5d124a62015-09-15 13:03:27 -04001414const OffsetBindingPointer<Buffer> &State::getIndexedUniformBuffer(size_t index) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001415{
Shannon Woodsf3acaf92014-09-23 18:07:11 -04001416 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
Geoff Lang5d124a62015-09-15 13:03:27 -04001417 return mUniformBuffers[index];
Gregoire Payen de La Garanderie68694e92015-03-24 14:03:37 +00001418}
1419
Jiajia Qin6eafb042016-12-27 17:04:07 +08001420const OffsetBindingPointer<Buffer> &State::getIndexedAtomicCounterBuffer(size_t index) const
1421{
1422 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
1423 return mAtomicCounterBuffers[index];
1424}
1425
Jiajia Qinf546e7d2017-03-27 14:12:59 +08001426const OffsetBindingPointer<Buffer> &State::getIndexedShaderStorageBuffer(size_t index) const
1427{
1428 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
1429 return mShaderStorageBuffers[index];
1430}
1431
Corentin Wallez336129f2017-10-17 15:55:40 -04001432Buffer *State::getTargetBuffer(BufferBinding target) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001433{
1434 switch (target)
1435 {
Corentin Wallez336129f2017-10-17 15:55:40 -04001436 case BufferBinding::ElementArray:
1437 return getVertexArray()->getElementArrayBuffer().get();
Corentin Wallez336129f2017-10-17 15:55:40 -04001438 default:
1439 return mBoundBuffers[target].get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001440 }
1441}
1442
James Darpinian4d9d4832018-03-13 12:43:28 -07001443void State::detachBuffer(const Context *context, const Buffer *buffer)
Yuly Novikov5807a532015-12-03 13:01:22 -05001444{
James Darpinian4d9d4832018-03-13 12:43:28 -07001445 if (!buffer->isBound())
1446 {
1447 return;
1448 }
1449 GLuint bufferName = buffer->id();
James Darpiniane8a93c62018-01-04 18:02:24 -08001450 for (auto target : angle::AllEnums<BufferBinding>())
Yuly Novikov5807a532015-12-03 13:01:22 -05001451 {
James Darpiniane8a93c62018-01-04 18:02:24 -08001452 if (mBoundBuffers[target].id() == bufferName)
Yuly Novikov5807a532015-12-03 13:01:22 -05001453 {
James Darpiniane8a93c62018-01-04 18:02:24 -08001454 UpdateBufferBinding(context, &mBoundBuffers[target], nullptr, target);
Yuly Novikov5807a532015-12-03 13:01:22 -05001455 }
1456 }
1457
1458 TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
1459 if (curTransformFeedback)
1460 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001461 curTransformFeedback->detachBuffer(context, bufferName);
Yuly Novikov5807a532015-12-03 13:01:22 -05001462 }
1463
Jamie Madill4928b7c2017-06-20 12:57:39 -04001464 getVertexArray()->detachBuffer(context, bufferName);
James Darpiniane8a93c62018-01-04 18:02:24 -08001465
1466 for (auto &buf : mUniformBuffers)
1467 {
1468 if (buf.id() == bufferName)
1469 {
1470 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::Uniform);
1471 }
1472 }
1473
1474 for (auto &buf : mAtomicCounterBuffers)
1475 {
1476 if (buf.id() == bufferName)
1477 {
1478 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::AtomicCounter);
1479 }
1480 }
1481
1482 for (auto &buf : mShaderStorageBuffers)
1483 {
1484 if (buf.id() == bufferName)
1485 {
1486 UpdateBufferBinding(context, &buf, nullptr, BufferBinding::ShaderStorage);
1487 }
1488 }
Yuly Novikov5807a532015-12-03 13:01:22 -05001489}
1490
Shannon Woods53a94a82014-06-24 15:20:36 -04001491void State::setEnableVertexAttribArray(unsigned int attribNum, bool enabled)
1492{
1493 getVertexArray()->enableAttribute(attribNum, enabled);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001494 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001495}
1496
1497void State::setVertexAttribf(GLuint index, const GLfloat values[4])
1498{
Shannon Woods23e05002014-09-22 19:07:27 -04001499 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001500 mVertexAttribCurrentValues[index].setFloatValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001501 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1502 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001503 mCurrentValuesTypeMask.setIndex(GL_FLOAT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001504}
1505
1506void State::setVertexAttribu(GLuint index, const GLuint values[4])
1507{
Shannon Woods23e05002014-09-22 19:07:27 -04001508 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001509 mVertexAttribCurrentValues[index].setUnsignedIntValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001510 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1511 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001512 mCurrentValuesTypeMask.setIndex(GL_UNSIGNED_INT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001513}
1514
1515void State::setVertexAttribi(GLuint index, const GLint values[4])
1516{
Shannon Woods23e05002014-09-22 19:07:27 -04001517 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001518 mVertexAttribCurrentValues[index].setIntValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001519 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1520 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001521 mCurrentValuesTypeMask.setIndex(GL_INT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001522}
1523
Shaodde78e82017-05-22 14:13:27 +08001524void State::setVertexAttribPointer(const Context *context,
1525 unsigned int attribNum,
1526 Buffer *boundBuffer,
1527 GLint size,
1528 GLenum type,
1529 bool normalized,
1530 bool pureInteger,
1531 GLsizei stride,
1532 const void *pointer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001533{
Shaodde78e82017-05-22 14:13:27 +08001534 getVertexArray()->setVertexAttribPointer(context, attribNum, boundBuffer, size, type,
1535 normalized, pureInteger, stride, pointer);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001536 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Jamie Madill0b9e9032015-08-17 11:51:52 +00001537}
1538
Shaodde78e82017-05-22 14:13:27 +08001539void State::setVertexAttribDivisor(const Context *context, GLuint index, GLuint divisor)
Jamie Madill0b9e9032015-08-17 11:51:52 +00001540{
Shaodde78e82017-05-22 14:13:27 +08001541 getVertexArray()->setVertexAttribDivisor(context, index, divisor);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001542 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001543}
1544
Jamie Madill6de51852017-04-12 09:53:01 -04001545const VertexAttribCurrentValueData &State::getVertexAttribCurrentValue(size_t attribNum) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001546{
Jamie Madill6de51852017-04-12 09:53:01 -04001547 ASSERT(attribNum < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001548 return mVertexAttribCurrentValues[attribNum];
1549}
1550
Jamie Madillcac94a92017-11-10 10:09:32 -05001551const std::vector<VertexAttribCurrentValueData> &State::getVertexAttribCurrentValues() const
1552{
1553 return mVertexAttribCurrentValues;
1554}
1555
Shannon Woods53a94a82014-06-24 15:20:36 -04001556const void *State::getVertexAttribPointer(unsigned int attribNum) const
1557{
1558 return getVertexArray()->getVertexAttribute(attribNum).pointer;
1559}
1560
1561void State::setPackAlignment(GLint alignment)
1562{
1563 mPack.alignment = alignment;
Jamie Madillc67323a2017-11-02 23:11:41 -04001564 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001565}
1566
1567GLint State::getPackAlignment() const
1568{
1569 return mPack.alignment;
1570}
1571
1572void State::setPackReverseRowOrder(bool reverseRowOrder)
1573{
1574 mPack.reverseRowOrder = reverseRowOrder;
Jamie Madillc67323a2017-11-02 23:11:41 -04001575 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001576}
1577
1578bool State::getPackReverseRowOrder() const
1579{
1580 return mPack.reverseRowOrder;
1581}
1582
Minmin Gongadff67b2015-10-14 10:34:45 -04001583void State::setPackRowLength(GLint rowLength)
1584{
1585 mPack.rowLength = rowLength;
Jamie Madillc67323a2017-11-02 23:11:41 -04001586 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001587}
1588
1589GLint State::getPackRowLength() const
1590{
1591 return mPack.rowLength;
1592}
1593
1594void State::setPackSkipRows(GLint skipRows)
1595{
1596 mPack.skipRows = skipRows;
Jamie Madillc67323a2017-11-02 23:11:41 -04001597 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001598}
1599
1600GLint State::getPackSkipRows() const
1601{
1602 return mPack.skipRows;
1603}
1604
1605void State::setPackSkipPixels(GLint skipPixels)
1606{
1607 mPack.skipPixels = skipPixels;
Jamie Madillc67323a2017-11-02 23:11:41 -04001608 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001609}
1610
1611GLint State::getPackSkipPixels() const
1612{
1613 return mPack.skipPixels;
1614}
1615
Shannon Woods53a94a82014-06-24 15:20:36 -04001616const PixelPackState &State::getPackState() const
1617{
1618 return mPack;
1619}
1620
Jamie Madill87de3622015-03-16 10:41:44 -04001621PixelPackState &State::getPackState()
1622{
1623 return mPack;
1624}
1625
Shannon Woods53a94a82014-06-24 15:20:36 -04001626void State::setUnpackAlignment(GLint alignment)
1627{
1628 mUnpack.alignment = alignment;
Jamie Madillc67323a2017-11-02 23:11:41 -04001629 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001630}
1631
1632GLint State::getUnpackAlignment() const
1633{
1634 return mUnpack.alignment;
1635}
1636
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001637void State::setUnpackRowLength(GLint rowLength)
1638{
1639 mUnpack.rowLength = rowLength;
Jamie Madillc67323a2017-11-02 23:11:41 -04001640 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001641}
1642
1643GLint State::getUnpackRowLength() const
1644{
1645 return mUnpack.rowLength;
1646}
1647
Minmin Gongadff67b2015-10-14 10:34:45 -04001648void State::setUnpackImageHeight(GLint imageHeight)
1649{
1650 mUnpack.imageHeight = imageHeight;
Jamie Madillc67323a2017-11-02 23:11:41 -04001651 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001652}
1653
1654GLint State::getUnpackImageHeight() const
1655{
1656 return mUnpack.imageHeight;
1657}
1658
1659void State::setUnpackSkipImages(GLint skipImages)
1660{
1661 mUnpack.skipImages = skipImages;
Jamie Madillc67323a2017-11-02 23:11:41 -04001662 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001663}
1664
1665GLint State::getUnpackSkipImages() const
1666{
1667 return mUnpack.skipImages;
1668}
1669
1670void State::setUnpackSkipRows(GLint skipRows)
1671{
1672 mUnpack.skipRows = skipRows;
Jamie Madillc67323a2017-11-02 23:11:41 -04001673 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001674}
1675
1676GLint State::getUnpackSkipRows() const
1677{
1678 return mUnpack.skipRows;
1679}
1680
1681void State::setUnpackSkipPixels(GLint skipPixels)
1682{
1683 mUnpack.skipPixels = skipPixels;
Jamie Madillc67323a2017-11-02 23:11:41 -04001684 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001685}
1686
1687GLint State::getUnpackSkipPixels() const
1688{
1689 return mUnpack.skipPixels;
1690}
1691
Shannon Woods53a94a82014-06-24 15:20:36 -04001692const PixelUnpackState &State::getUnpackState() const
1693{
1694 return mUnpack;
1695}
1696
Jamie Madill67102f02015-03-16 10:41:42 -04001697PixelUnpackState &State::getUnpackState()
1698{
1699 return mUnpack;
1700}
1701
Geoff Lang70d0f492015-12-10 17:45:46 -05001702const Debug &State::getDebug() const
1703{
1704 return mDebug;
1705}
1706
1707Debug &State::getDebug()
1708{
1709 return mDebug;
1710}
1711
Sami Väisänena797e062016-05-12 15:23:40 +03001712void State::setCoverageModulation(GLenum components)
1713{
1714 mCoverageModulation = components;
1715 mDirtyBits.set(DIRTY_BIT_COVERAGE_MODULATION);
1716}
1717
1718GLenum State::getCoverageModulation() const
1719{
1720 return mCoverageModulation;
1721}
1722
Sami Väisänene45e53b2016-05-25 10:36:04 +03001723void State::loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix)
1724{
1725 if (matrixMode == GL_PATH_MODELVIEW_CHROMIUM)
1726 {
1727 memcpy(mPathMatrixMV, matrix, 16 * sizeof(GLfloat));
1728 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_MATRIX_MV);
1729 }
1730 else if (matrixMode == GL_PATH_PROJECTION_CHROMIUM)
1731 {
1732 memcpy(mPathMatrixProj, matrix, 16 * sizeof(GLfloat));
1733 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_MATRIX_PROJ);
1734 }
1735 else
1736 {
1737 UNREACHABLE();
1738 }
1739}
1740
1741const GLfloat *State::getPathRenderingMatrix(GLenum which) const
1742{
1743 if (which == GL_PATH_MODELVIEW_MATRIX_CHROMIUM)
1744 {
1745 return mPathMatrixMV;
1746 }
1747 else if (which == GL_PATH_PROJECTION_MATRIX_CHROMIUM)
1748 {
1749 return mPathMatrixProj;
1750 }
1751
1752 UNREACHABLE();
1753 return nullptr;
1754}
1755
1756void State::setPathStencilFunc(GLenum func, GLint ref, GLuint mask)
1757{
1758 mPathStencilFunc = func;
1759 mPathStencilRef = ref;
1760 mPathStencilMask = mask;
1761 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_STENCIL_STATE);
1762}
1763
1764GLenum State::getPathStencilFunc() const
1765{
1766 return mPathStencilFunc;
1767}
1768
1769GLint State::getPathStencilRef() const
1770{
1771 return mPathStencilRef;
1772}
1773
1774GLuint State::getPathStencilMask() const
1775{
1776 return mPathStencilMask;
1777}
1778
Geoff Lang1d2c41d2016-10-19 16:14:46 -07001779void State::setFramebufferSRGB(bool sRGB)
1780{
1781 mFramebufferSRGB = sRGB;
1782 mDirtyBits.set(DIRTY_BIT_FRAMEBUFFER_SRGB);
1783}
1784
1785bool State::getFramebufferSRGB() const
1786{
1787 return mFramebufferSRGB;
1788}
1789
Shannon Woods53a94a82014-06-24 15:20:36 -04001790void State::getBooleanv(GLenum pname, GLboolean *params)
1791{
1792 switch (pname)
1793 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001794 case GL_SAMPLE_COVERAGE_INVERT:
1795 *params = mSampleCoverageInvert;
1796 break;
1797 case GL_DEPTH_WRITEMASK:
1798 *params = mDepthStencil.depthMask;
1799 break;
1800 case GL_COLOR_WRITEMASK:
1801 params[0] = mBlend.colorMaskRed;
1802 params[1] = mBlend.colorMaskGreen;
1803 params[2] = mBlend.colorMaskBlue;
1804 params[3] = mBlend.colorMaskAlpha;
1805 break;
1806 case GL_CULL_FACE:
1807 *params = mRasterizer.cullFace;
1808 break;
1809 case GL_POLYGON_OFFSET_FILL:
1810 *params = mRasterizer.polygonOffsetFill;
1811 break;
1812 case GL_SAMPLE_ALPHA_TO_COVERAGE:
1813 *params = mBlend.sampleAlphaToCoverage;
1814 break;
1815 case GL_SAMPLE_COVERAGE:
1816 *params = mSampleCoverage;
1817 break;
1818 case GL_SAMPLE_MASK:
1819 *params = mSampleMask;
1820 break;
1821 case GL_SCISSOR_TEST:
1822 *params = mScissorTest;
1823 break;
1824 case GL_STENCIL_TEST:
1825 *params = mDepthStencil.stencilTest;
1826 break;
1827 case GL_DEPTH_TEST:
1828 *params = mDepthStencil.depthTest;
1829 break;
1830 case GL_BLEND:
1831 *params = mBlend.blend;
1832 break;
1833 case GL_DITHER:
1834 *params = mBlend.dither;
1835 break;
1836 case GL_TRANSFORM_FEEDBACK_ACTIVE:
1837 *params = getCurrentTransformFeedback()->isActive() ? GL_TRUE : GL_FALSE;
1838 break;
1839 case GL_TRANSFORM_FEEDBACK_PAUSED:
1840 *params = getCurrentTransformFeedback()->isPaused() ? GL_TRUE : GL_FALSE;
1841 break;
1842 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1843 *params = mPrimitiveRestart;
1844 break;
1845 case GL_RASTERIZER_DISCARD:
1846 *params = isRasterizerDiscardEnabled() ? GL_TRUE : GL_FALSE;
1847 break;
1848 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
1849 *params = mDebug.isOutputSynchronous() ? GL_TRUE : GL_FALSE;
1850 break;
1851 case GL_DEBUG_OUTPUT:
1852 *params = mDebug.isOutputEnabled() ? GL_TRUE : GL_FALSE;
1853 break;
1854 case GL_MULTISAMPLE_EXT:
1855 *params = mMultiSampling;
1856 break;
1857 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1858 *params = mSampleAlphaToOne;
1859 break;
1860 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
1861 *params = isBindGeneratesResourceEnabled() ? GL_TRUE : GL_FALSE;
1862 break;
1863 case GL_CLIENT_ARRAYS_ANGLE:
1864 *params = areClientArraysEnabled() ? GL_TRUE : GL_FALSE;
1865 break;
1866 case GL_FRAMEBUFFER_SRGB_EXT:
1867 *params = getFramebufferSRGB() ? GL_TRUE : GL_FALSE;
1868 break;
1869 case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
1870 *params = mRobustResourceInit ? GL_TRUE : GL_FALSE;
1871 break;
1872 case GL_PROGRAM_CACHE_ENABLED_ANGLE:
1873 *params = mProgramBinaryCacheEnabled ? GL_TRUE : GL_FALSE;
1874 break;
Jamie Madillc43be722017-07-13 16:22:14 -04001875
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001876 default:
1877 UNREACHABLE();
1878 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001879 }
1880}
1881
1882void State::getFloatv(GLenum pname, GLfloat *params)
1883{
1884 // Please note: DEPTH_CLEAR_VALUE is included in our internal getFloatv implementation
1885 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1886 // GetIntegerv as its native query function. As it would require conversion in any
1887 // case, this should make no difference to the calling application.
1888 switch (pname)
1889 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001890 case GL_LINE_WIDTH:
1891 *params = mLineWidth;
1892 break;
1893 case GL_SAMPLE_COVERAGE_VALUE:
1894 *params = mSampleCoverageValue;
1895 break;
1896 case GL_DEPTH_CLEAR_VALUE:
1897 *params = mDepthClearValue;
1898 break;
1899 case GL_POLYGON_OFFSET_FACTOR:
1900 *params = mRasterizer.polygonOffsetFactor;
1901 break;
1902 case GL_POLYGON_OFFSET_UNITS:
1903 *params = mRasterizer.polygonOffsetUnits;
1904 break;
1905 case GL_DEPTH_RANGE:
1906 params[0] = mNearZ;
1907 params[1] = mFarZ;
1908 break;
1909 case GL_COLOR_CLEAR_VALUE:
1910 params[0] = mColorClearValue.red;
1911 params[1] = mColorClearValue.green;
1912 params[2] = mColorClearValue.blue;
1913 params[3] = mColorClearValue.alpha;
1914 break;
1915 case GL_BLEND_COLOR:
1916 params[0] = mBlendColor.red;
1917 params[1] = mBlendColor.green;
1918 params[2] = mBlendColor.blue;
1919 params[3] = mBlendColor.alpha;
1920 break;
1921 case GL_MULTISAMPLE_EXT:
1922 *params = static_cast<GLfloat>(mMultiSampling);
1923 break;
1924 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1925 *params = static_cast<GLfloat>(mSampleAlphaToOne);
1926 break;
1927 case GL_COVERAGE_MODULATION_CHROMIUM:
1928 params[0] = static_cast<GLfloat>(mCoverageModulation);
1929 break;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07001930 case GL_ALPHA_TEST_REF:
1931 *params = mGLES1State.mAlphaTestRef;
1932 break;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07001933 case GL_CURRENT_COLOR:
1934 {
1935 const auto &color = mGLES1State.mCurrentColor;
1936 params[0] = color.red;
1937 params[1] = color.green;
1938 params[2] = color.blue;
1939 params[3] = color.alpha;
1940 break;
1941 }
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07001942 case GL_CURRENT_NORMAL:
1943 {
1944 const auto &normal = mGLES1State.mCurrentNormal;
1945 params[0] = normal[0];
1946 params[1] = normal[1];
1947 params[2] = normal[2];
1948 break;
1949 }
Lingfeng Yang038dd532018-03-29 17:31:52 -07001950 case GL_CURRENT_TEXTURE_COORDS:
1951 {
1952 const auto &texcoord = mGLES1State.mCurrentTextureCoords[mActiveSampler];
1953 params[0] = texcoord.s;
1954 params[1] = texcoord.t;
1955 params[2] = texcoord.r;
1956 params[3] = texcoord.q;
1957 break;
1958 }
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001959 default:
1960 UNREACHABLE();
1961 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001962 }
1963}
1964
Jamie Madille98b1b52018-03-08 09:47:23 -05001965Error State::getIntegerv(const Context *context, GLenum pname, GLint *params)
Shannon Woods53a94a82014-06-24 15:20:36 -04001966{
1967 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
1968 {
1969 unsigned int colorAttachment = (pname - GL_DRAW_BUFFER0_EXT);
Shannon Woods2df6a602014-09-26 16:12:07 -04001970 ASSERT(colorAttachment < mMaxDrawBuffers);
Shannon Woods53a94a82014-06-24 15:20:36 -04001971 Framebuffer *framebuffer = mDrawFramebuffer;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001972 *params = framebuffer->getDrawBufferState(colorAttachment);
Jamie Madille98b1b52018-03-08 09:47:23 -05001973 return NoError();
Shannon Woods53a94a82014-06-24 15:20:36 -04001974 }
1975
1976 // Please note: DEPTH_CLEAR_VALUE is not included in our internal getIntegerv implementation
1977 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1978 // GetIntegerv as its native query function. As it would require conversion in any
1979 // case, this should make no difference to the calling application. You may find it in
1980 // State::getFloatv.
1981 switch (pname)
1982 {
Corentin Wallez336129f2017-10-17 15:55:40 -04001983 case GL_ARRAY_BUFFER_BINDING:
1984 *params = mBoundBuffers[BufferBinding::Array].id();
1985 break;
1986 case GL_DRAW_INDIRECT_BUFFER_BINDING:
1987 *params = mBoundBuffers[BufferBinding::DrawIndirect].id();
1988 break;
1989 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
1990 *params = getVertexArray()->getElementArrayBuffer().id();
1991 break;
Jamie Madill690c8eb2018-03-12 15:20:03 -04001992 case GL_DRAW_FRAMEBUFFER_BINDING:
1993 static_assert(GL_DRAW_FRAMEBUFFER_BINDING == GL_DRAW_FRAMEBUFFER_BINDING_ANGLE,
1994 "Enum mismatch");
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001995 *params = mDrawFramebuffer->id();
1996 break;
Jamie Madill690c8eb2018-03-12 15:20:03 -04001997 case GL_READ_FRAMEBUFFER_BINDING:
1998 static_assert(GL_READ_FRAMEBUFFER_BINDING == GL_READ_FRAMEBUFFER_BINDING_ANGLE,
1999 "Enum mismatch");
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002000 *params = mReadFramebuffer->id();
2001 break;
2002 case GL_RENDERBUFFER_BINDING:
2003 *params = mRenderbuffer.id();
2004 break;
2005 case GL_VERTEX_ARRAY_BINDING:
2006 *params = mVertexArray->id();
2007 break;
2008 case GL_CURRENT_PROGRAM:
2009 *params = mProgram ? mProgram->id() : 0;
2010 break;
2011 case GL_PACK_ALIGNMENT:
2012 *params = mPack.alignment;
2013 break;
2014 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
2015 *params = mPack.reverseRowOrder;
2016 break;
2017 case GL_PACK_ROW_LENGTH:
2018 *params = mPack.rowLength;
2019 break;
2020 case GL_PACK_SKIP_ROWS:
2021 *params = mPack.skipRows;
2022 break;
2023 case GL_PACK_SKIP_PIXELS:
2024 *params = mPack.skipPixels;
2025 break;
2026 case GL_UNPACK_ALIGNMENT:
2027 *params = mUnpack.alignment;
2028 break;
2029 case GL_UNPACK_ROW_LENGTH:
2030 *params = mUnpack.rowLength;
2031 break;
2032 case GL_UNPACK_IMAGE_HEIGHT:
2033 *params = mUnpack.imageHeight;
2034 break;
2035 case GL_UNPACK_SKIP_IMAGES:
2036 *params = mUnpack.skipImages;
2037 break;
2038 case GL_UNPACK_SKIP_ROWS:
2039 *params = mUnpack.skipRows;
2040 break;
2041 case GL_UNPACK_SKIP_PIXELS:
2042 *params = mUnpack.skipPixels;
2043 break;
2044 case GL_GENERATE_MIPMAP_HINT:
2045 *params = mGenerateMipmapHint;
2046 break;
2047 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
2048 *params = mFragmentShaderDerivativeHint;
2049 break;
2050 case GL_ACTIVE_TEXTURE:
2051 *params = (static_cast<GLint>(mActiveSampler) + GL_TEXTURE0);
2052 break;
2053 case GL_STENCIL_FUNC:
2054 *params = mDepthStencil.stencilFunc;
2055 break;
2056 case GL_STENCIL_REF:
2057 *params = mStencilRef;
2058 break;
2059 case GL_STENCIL_VALUE_MASK:
2060 *params = CastMaskValue(context, mDepthStencil.stencilMask);
2061 break;
2062 case GL_STENCIL_BACK_FUNC:
2063 *params = mDepthStencil.stencilBackFunc;
2064 break;
2065 case GL_STENCIL_BACK_REF:
2066 *params = mStencilBackRef;
2067 break;
2068 case GL_STENCIL_BACK_VALUE_MASK:
2069 *params = CastMaskValue(context, mDepthStencil.stencilBackMask);
2070 break;
2071 case GL_STENCIL_FAIL:
2072 *params = mDepthStencil.stencilFail;
2073 break;
2074 case GL_STENCIL_PASS_DEPTH_FAIL:
2075 *params = mDepthStencil.stencilPassDepthFail;
2076 break;
2077 case GL_STENCIL_PASS_DEPTH_PASS:
2078 *params = mDepthStencil.stencilPassDepthPass;
2079 break;
2080 case GL_STENCIL_BACK_FAIL:
2081 *params = mDepthStencil.stencilBackFail;
2082 break;
2083 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
2084 *params = mDepthStencil.stencilBackPassDepthFail;
2085 break;
2086 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
2087 *params = mDepthStencil.stencilBackPassDepthPass;
2088 break;
2089 case GL_DEPTH_FUNC:
2090 *params = mDepthStencil.depthFunc;
2091 break;
2092 case GL_BLEND_SRC_RGB:
2093 *params = mBlend.sourceBlendRGB;
2094 break;
2095 case GL_BLEND_SRC_ALPHA:
2096 *params = mBlend.sourceBlendAlpha;
2097 break;
2098 case GL_BLEND_DST_RGB:
2099 *params = mBlend.destBlendRGB;
2100 break;
2101 case GL_BLEND_DST_ALPHA:
2102 *params = mBlend.destBlendAlpha;
2103 break;
2104 case GL_BLEND_EQUATION_RGB:
2105 *params = mBlend.blendEquationRGB;
2106 break;
2107 case GL_BLEND_EQUATION_ALPHA:
2108 *params = mBlend.blendEquationAlpha;
2109 break;
2110 case GL_STENCIL_WRITEMASK:
2111 *params = CastMaskValue(context, mDepthStencil.stencilWritemask);
2112 break;
2113 case GL_STENCIL_BACK_WRITEMASK:
2114 *params = CastMaskValue(context, mDepthStencil.stencilBackWritemask);
2115 break;
2116 case GL_STENCIL_CLEAR_VALUE:
2117 *params = mStencilClearValue;
2118 break;
2119 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
Jamie Madill690c8eb2018-03-12 15:20:03 -04002120 ANGLE_TRY(mReadFramebuffer->getImplementationColorReadType(
2121 context, reinterpret_cast<GLenum *>(params)));
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002122 break;
2123 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
Jamie Madill690c8eb2018-03-12 15:20:03 -04002124 ANGLE_TRY(mReadFramebuffer->getImplementationColorReadFormat(
2125 context, reinterpret_cast<GLenum *>(params)));
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002126 break;
2127 case GL_SAMPLE_BUFFERS:
2128 case GL_SAMPLES:
Shannon Woods53a94a82014-06-24 15:20:36 -04002129 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002130 Framebuffer *framebuffer = mDrawFramebuffer;
Jamie Madille98b1b52018-03-08 09:47:23 -05002131 bool complete = false;
2132 ANGLE_TRY(framebuffer->isComplete(context, &complete));
2133 if (complete)
Shannon Woods53a94a82014-06-24 15:20:36 -04002134 {
Jamie Madille98b1b52018-03-08 09:47:23 -05002135 GLint samples = 0;
2136 ANGLE_TRY(framebuffer->getSamples(context, &samples));
Shannon Woods53a94a82014-06-24 15:20:36 -04002137 switch (pname)
2138 {
Jamie Madilla0016b72017-07-14 14:30:46 -04002139 case GL_SAMPLE_BUFFERS:
Jamie Madille98b1b52018-03-08 09:47:23 -05002140 if (samples != 0)
Jamie Madilla0016b72017-07-14 14:30:46 -04002141 {
2142 *params = 1;
2143 }
2144 else
2145 {
2146 *params = 0;
2147 }
2148 break;
2149 case GL_SAMPLES:
Jamie Madille98b1b52018-03-08 09:47:23 -05002150 *params = samples;
Jamie Madilla0016b72017-07-14 14:30:46 -04002151 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002152 }
2153 }
2154 else
2155 {
2156 *params = 0;
2157 }
2158 }
2159 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002160 case GL_VIEWPORT:
2161 params[0] = mViewport.x;
2162 params[1] = mViewport.y;
2163 params[2] = mViewport.width;
2164 params[3] = mViewport.height;
2165 break;
2166 case GL_SCISSOR_BOX:
2167 params[0] = mScissor.x;
2168 params[1] = mScissor.y;
2169 params[2] = mScissor.width;
2170 params[3] = mScissor.height;
2171 break;
2172 case GL_CULL_FACE_MODE:
2173 *params = ToGLenum(mRasterizer.cullMode);
2174 break;
2175 case GL_FRONT_FACE:
2176 *params = mRasterizer.frontFace;
2177 break;
2178 case GL_RED_BITS:
2179 case GL_GREEN_BITS:
2180 case GL_BLUE_BITS:
2181 case GL_ALPHA_BITS:
Shannon Woods53a94a82014-06-24 15:20:36 -04002182 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002183 Framebuffer *framebuffer = getDrawFramebuffer();
2184 const FramebufferAttachment *colorbuffer = framebuffer->getFirstColorbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04002185
2186 if (colorbuffer)
2187 {
2188 switch (pname)
2189 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002190 case GL_RED_BITS:
2191 *params = colorbuffer->getRedSize();
2192 break;
2193 case GL_GREEN_BITS:
2194 *params = colorbuffer->getGreenSize();
2195 break;
2196 case GL_BLUE_BITS:
2197 *params = colorbuffer->getBlueSize();
2198 break;
2199 case GL_ALPHA_BITS:
2200 *params = colorbuffer->getAlphaSize();
2201 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002202 }
2203 }
2204 else
2205 {
2206 *params = 0;
2207 }
2208 }
2209 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002210 case GL_DEPTH_BITS:
Shannon Woods53a94a82014-06-24 15:20:36 -04002211 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002212 const Framebuffer *framebuffer = getDrawFramebuffer();
2213 const FramebufferAttachment *depthbuffer = framebuffer->getDepthbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04002214
2215 if (depthbuffer)
2216 {
2217 *params = depthbuffer->getDepthSize();
2218 }
2219 else
2220 {
2221 *params = 0;
2222 }
2223 }
2224 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002225 case GL_STENCIL_BITS:
Shannon Woods53a94a82014-06-24 15:20:36 -04002226 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002227 const Framebuffer *framebuffer = getDrawFramebuffer();
2228 const FramebufferAttachment *stencilbuffer = framebuffer->getStencilbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04002229
2230 if (stencilbuffer)
2231 {
2232 *params = stencilbuffer->getStencilSize();
2233 }
2234 else
2235 {
2236 *params = 0;
2237 }
2238 }
2239 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002240 case GL_TEXTURE_BINDING_2D:
2241 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2242 *params =
2243 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::_2D);
2244 break;
2245 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
2246 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2247 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2248 TextureType::Rectangle);
2249 break;
2250 case GL_TEXTURE_BINDING_CUBE_MAP:
2251 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2252 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2253 TextureType::CubeMap);
2254 break;
2255 case GL_TEXTURE_BINDING_3D:
2256 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2257 *params =
2258 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::_3D);
2259 break;
2260 case GL_TEXTURE_BINDING_2D_ARRAY:
2261 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2262 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2263 TextureType::_2DArray);
2264 break;
2265 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
2266 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2267 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2268 TextureType::_2DMultisample);
2269 break;
2270 case GL_TEXTURE_BINDING_EXTERNAL_OES:
2271 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2272 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2273 TextureType::External);
2274 break;
2275 case GL_UNIFORM_BUFFER_BINDING:
2276 *params = mBoundBuffers[BufferBinding::Uniform].id();
2277 break;
2278 case GL_TRANSFORM_FEEDBACK_BINDING:
2279 *params = mTransformFeedback.id();
2280 break;
2281 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
2282 *params = mBoundBuffers[BufferBinding::TransformFeedback].id();
2283 break;
2284 case GL_COPY_READ_BUFFER_BINDING:
2285 *params = mBoundBuffers[BufferBinding::CopyRead].id();
2286 break;
2287 case GL_COPY_WRITE_BUFFER_BINDING:
2288 *params = mBoundBuffers[BufferBinding::CopyWrite].id();
2289 break;
2290 case GL_PIXEL_PACK_BUFFER_BINDING:
2291 *params = mBoundBuffers[BufferBinding::PixelPack].id();
2292 break;
2293 case GL_PIXEL_UNPACK_BUFFER_BINDING:
2294 *params = mBoundBuffers[BufferBinding::PixelUnpack].id();
2295 break;
2296 case GL_READ_BUFFER:
2297 *params = mReadFramebuffer->getReadBufferState();
2298 break;
2299 case GL_SAMPLER_BINDING:
2300 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2301 *params = getSamplerId(static_cast<GLuint>(mActiveSampler));
2302 break;
2303 case GL_DEBUG_LOGGED_MESSAGES:
2304 *params = static_cast<GLint>(mDebug.getMessageCount());
2305 break;
2306 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
2307 *params = static_cast<GLint>(mDebug.getNextMessageLength());
2308 break;
2309 case GL_DEBUG_GROUP_STACK_DEPTH:
2310 *params = static_cast<GLint>(mDebug.getGroupStackDepth());
2311 break;
2312 case GL_MULTISAMPLE_EXT:
2313 *params = static_cast<GLint>(mMultiSampling);
2314 break;
2315 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
2316 *params = static_cast<GLint>(mSampleAlphaToOne);
2317 break;
2318 case GL_COVERAGE_MODULATION_CHROMIUM:
2319 *params = static_cast<GLint>(mCoverageModulation);
2320 break;
2321 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
2322 *params = mBoundBuffers[BufferBinding::AtomicCounter].id();
2323 break;
2324 case GL_SHADER_STORAGE_BUFFER_BINDING:
2325 *params = mBoundBuffers[BufferBinding::ShaderStorage].id();
2326 break;
2327 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
2328 *params = mBoundBuffers[BufferBinding::DispatchIndirect].id();
2329 break;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07002330 case GL_ALPHA_TEST_FUNC:
2331 *params = ToGLenum(mGLES1State.mAlphaTestFunc);
2332 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07002333 case GL_CLIENT_ACTIVE_TEXTURE:
2334 *params = mGLES1State.mClientActiveTexture + GL_TEXTURE0;
2335 break;
Lingfeng Yangd2488ab2018-04-04 09:25:48 -07002336 case GL_MATRIX_MODE:
2337 *params = ToGLenum(mGLES1State.mMatrixMode);
2338 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002339 default:
2340 UNREACHABLE();
2341 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002342 }
Jamie Madille98b1b52018-03-08 09:47:23 -05002343
2344 return NoError();
Shannon Woods53a94a82014-06-24 15:20:36 -04002345}
2346
Geoff Lang70d0f492015-12-10 17:45:46 -05002347void State::getPointerv(GLenum pname, void **params) const
2348{
2349 switch (pname)
2350 {
2351 case GL_DEBUG_CALLBACK_FUNCTION:
2352 *params = reinterpret_cast<void *>(mDebug.getCallback());
2353 break;
2354 case GL_DEBUG_CALLBACK_USER_PARAM:
2355 *params = const_cast<void *>(mDebug.getUserParam());
2356 break;
2357 default:
2358 UNREACHABLE();
2359 break;
2360 }
2361}
2362
Martin Radev66fb8202016-07-28 11:45:20 +03002363void State::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods53a94a82014-06-24 15:20:36 -04002364{
2365 switch (target)
2366 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002367 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
2368 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2369 *data = mTransformFeedback->getIndexedBuffer(index).id();
2370 break;
2371 case GL_UNIFORM_BUFFER_BINDING:
2372 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2373 *data = mUniformBuffers[index].id();
2374 break;
2375 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
2376 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2377 *data = mAtomicCounterBuffers[index].id();
2378 break;
2379 case GL_SHADER_STORAGE_BUFFER_BINDING:
2380 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2381 *data = mShaderStorageBuffers[index].id();
2382 break;
2383 case GL_VERTEX_BINDING_BUFFER:
2384 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
2385 *data = mVertexArray->getVertexBinding(index).getBuffer().id();
2386 break;
2387 case GL_VERTEX_BINDING_DIVISOR:
2388 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
2389 *data = mVertexArray->getVertexBinding(index).getDivisor();
2390 break;
2391 case GL_VERTEX_BINDING_OFFSET:
2392 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
2393 *data = static_cast<GLuint>(mVertexArray->getVertexBinding(index).getOffset());
2394 break;
2395 case GL_VERTEX_BINDING_STRIDE:
2396 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
2397 *data = mVertexArray->getVertexBinding(index).getStride();
2398 break;
2399 case GL_SAMPLE_MASK_VALUE:
2400 ASSERT(static_cast<size_t>(index) < mSampleMaskValues.size());
2401 *data = mSampleMaskValues[index];
2402 break;
2403 case GL_IMAGE_BINDING_NAME:
2404 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2405 *data = mImageUnits[index].texture.id();
2406 break;
2407 case GL_IMAGE_BINDING_LEVEL:
2408 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2409 *data = mImageUnits[index].level;
2410 break;
2411 case GL_IMAGE_BINDING_LAYER:
2412 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2413 *data = mImageUnits[index].layer;
2414 break;
2415 case GL_IMAGE_BINDING_ACCESS:
2416 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2417 *data = mImageUnits[index].access;
2418 break;
2419 case GL_IMAGE_BINDING_FORMAT:
2420 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2421 *data = mImageUnits[index].format;
2422 break;
2423 default:
2424 UNREACHABLE();
2425 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002426 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002427}
2428
Martin Radev66fb8202016-07-28 11:45:20 +03002429void State::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods53a94a82014-06-24 15:20:36 -04002430{
2431 switch (target)
2432 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002433 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
2434 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2435 *data = mTransformFeedback->getIndexedBuffer(index).getOffset();
2436 break;
2437 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
2438 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2439 *data = mTransformFeedback->getIndexedBuffer(index).getSize();
2440 break;
2441 case GL_UNIFORM_BUFFER_START:
2442 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2443 *data = mUniformBuffers[index].getOffset();
2444 break;
2445 case GL_UNIFORM_BUFFER_SIZE:
2446 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2447 *data = mUniformBuffers[index].getSize();
2448 break;
2449 case GL_ATOMIC_COUNTER_BUFFER_START:
2450 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2451 *data = mAtomicCounterBuffers[index].getOffset();
2452 break;
2453 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
2454 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2455 *data = mAtomicCounterBuffers[index].getSize();
2456 break;
2457 case GL_SHADER_STORAGE_BUFFER_START:
2458 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2459 *data = mShaderStorageBuffers[index].getOffset();
2460 break;
2461 case GL_SHADER_STORAGE_BUFFER_SIZE:
2462 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2463 *data = mShaderStorageBuffers[index].getSize();
2464 break;
2465 default:
2466 UNREACHABLE();
2467 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002468 }
Martin Radev66fb8202016-07-28 11:45:20 +03002469}
Shannon Woods53a94a82014-06-24 15:20:36 -04002470
Martin Radev66fb8202016-07-28 11:45:20 +03002471void State::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
2472{
Xinghua Cao9c8e1a32017-12-06 17:59:58 +08002473 switch (target)
2474 {
2475 case GL_IMAGE_BINDING_LAYERED:
2476 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2477 *data = mImageUnits[index].layered;
2478 break;
2479 default:
2480 UNREACHABLE();
2481 break;
2482 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002483}
2484
Corentin Wallez336129f2017-10-17 15:55:40 -04002485bool State::hasMappedBuffer(BufferBinding target) const
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002486{
Corentin Wallez336129f2017-10-17 15:55:40 -04002487 if (target == BufferBinding::Array)
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002488 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002489 const VertexArray *vao = getVertexArray();
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002490 const auto &vertexAttribs = vao->getVertexAttributes();
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002491 const auto &vertexBindings = vao->getVertexBindings();
Jamie Madilld078c682018-01-02 11:50:24 -05002492 for (size_t attribIndex : vao->getEnabledAttributesMask())
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002493 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002494 const VertexAttribute &vertexAttrib = vertexAttribs[attribIndex];
Martin Radevdd5f27e2017-06-07 10:17:09 +03002495 auto *boundBuffer = vertexBindings[vertexAttrib.bindingIndex].getBuffer().get();
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002496 if (vertexAttrib.enabled && boundBuffer && boundBuffer->isMapped())
2497 {
2498 return true;
2499 }
2500 }
2501
2502 return false;
2503 }
2504 else
2505 {
2506 Buffer *buffer = getTargetBuffer(target);
2507 return (buffer && buffer->isMapped());
2508 }
2509}
2510
Jamie Madillbc918e72018-03-08 09:47:21 -05002511Error State::syncDirtyObjects(const Context *context)
Jamie Madillc9d442d2016-01-20 11:17:24 -05002512{
2513 if (!mDirtyObjects.any())
Jamie Madillbc918e72018-03-08 09:47:21 -05002514 return NoError();
Jamie Madillc9d442d2016-01-20 11:17:24 -05002515
Jamie Madillbc918e72018-03-08 09:47:21 -05002516 return syncDirtyObjects(context, mDirtyObjects);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002517}
2518
Jamie Madillbc918e72018-03-08 09:47:21 -05002519Error State::syncDirtyObjects(const Context *context, const DirtyObjects &bitset)
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002520{
Jiajia Qin5ae6ee42018-03-06 17:39:42 +08002521 const DirtyObjects &dirtyObjects = mDirtyObjects & bitset;
2522 for (auto dirtyObject : dirtyObjects)
Jamie Madillc9d442d2016-01-20 11:17:24 -05002523 {
2524 switch (dirtyObject)
2525 {
2526 case DIRTY_OBJECT_READ_FRAMEBUFFER:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002527 ASSERT(mReadFramebuffer);
Jamie Madill19fa1c62018-03-08 09:47:21 -05002528 ANGLE_TRY(mReadFramebuffer->syncState(context));
Jamie Madillc9d442d2016-01-20 11:17:24 -05002529 break;
2530 case DIRTY_OBJECT_DRAW_FRAMEBUFFER:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002531 ASSERT(mDrawFramebuffer);
Jamie Madill19fa1c62018-03-08 09:47:21 -05002532 ANGLE_TRY(mDrawFramebuffer->syncState(context));
Jamie Madillc9d442d2016-01-20 11:17:24 -05002533 break;
2534 case DIRTY_OBJECT_VERTEX_ARRAY:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002535 ASSERT(mVertexArray);
Frank Henigman0af5b862018-03-27 20:19:33 -04002536 ANGLE_TRY(mVertexArray->syncState(context));
Jamie Madillc9d442d2016-01-20 11:17:24 -05002537 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002538 case DIRTY_OBJECT_PROGRAM_TEXTURES:
2539 syncProgramTextures(context);
2540 break;
2541
Jamie Madillc9d442d2016-01-20 11:17:24 -05002542 default:
2543 UNREACHABLE();
2544 break;
2545 }
2546 }
2547
Jiajia Qin5ae6ee42018-03-06 17:39:42 +08002548 mDirtyObjects &= ~dirtyObjects;
Jamie Madillbc918e72018-03-08 09:47:21 -05002549 return NoError();
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002550}
2551
Jamie Madill81c2e252017-09-09 23:32:46 -04002552void State::syncProgramTextures(const Context *context)
2553{
Jamie Madill81c2e252017-09-09 23:32:46 -04002554 // TODO(jmadill): Fine-grained updates.
2555 if (!mProgram)
2556 {
2557 return;
2558 }
2559
2560 ASSERT(mDirtyObjects[DIRTY_OBJECT_PROGRAM_TEXTURES]);
2561 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
2562
Jamie Madill0f80ed82017-09-19 00:24:56 -04002563 ActiveTextureMask newActiveTextures;
2564
Geoff Lange51ba632017-11-21 11:45:25 -05002565 // Initialize to the 'Initialized' state and set to 'MayNeedInit' if any texture is not
2566 // initialized.
2567 mCachedTexturesInitState = InitState::Initialized;
2568
Jamie Madill81c2e252017-09-09 23:32:46 -04002569 for (const SamplerBinding &samplerBinding : mProgram->getSamplerBindings())
2570 {
2571 if (samplerBinding.unreferenced)
2572 continue;
2573
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002574 TextureType textureType = samplerBinding.textureType;
Jamie Madill81c2e252017-09-09 23:32:46 -04002575 for (GLuint textureUnitIndex : samplerBinding.boundTextureUnits)
2576 {
2577 Texture *texture = getSamplerTexture(textureUnitIndex, textureType);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002578 Sampler *sampler = getSampler(textureUnitIndex);
Jamie Madill0f80ed82017-09-19 00:24:56 -04002579 ASSERT(static_cast<size_t>(textureUnitIndex) < mCompleteTextureCache.size());
2580 ASSERT(static_cast<size_t>(textureUnitIndex) < newActiveTextures.size());
Jamie Madill81c2e252017-09-09 23:32:46 -04002581
Jamie Madill42975642017-10-12 12:31:51 -04002582 ASSERT(texture);
Jamie Madill81c2e252017-09-09 23:32:46 -04002583
Jamie Madill42975642017-10-12 12:31:51 -04002584 // Mark the texture binding bit as dirty if the texture completeness changes.
2585 // TODO(jmadill): Use specific dirty bit for completeness change.
2586 if (texture->isSamplerComplete(context, sampler) &&
2587 !mDrawFramebuffer->hasTextureAttachment(texture))
2588 {
2589 texture->syncState();
2590 mCompleteTextureCache[textureUnitIndex] = texture;
Jamie Madill81c2e252017-09-09 23:32:46 -04002591 }
Jamie Madill42975642017-10-12 12:31:51 -04002592 else
2593 {
2594 mCompleteTextureCache[textureUnitIndex] = nullptr;
2595 }
2596
2597 // Bind the texture unconditionally, to recieve completeness change notifications.
Jamie Madill888081d2018-02-27 00:24:46 -05002598 mCompleteTextureBindings[textureUnitIndex].bind(texture->getSubject());
Jamie Madilla59fc192017-11-02 12:57:58 -04002599 mActiveTexturesMask.set(textureUnitIndex);
Jamie Madill42975642017-10-12 12:31:51 -04002600 newActiveTextures.set(textureUnitIndex);
Jamie Madill81c2e252017-09-09 23:32:46 -04002601
Jamie Madill06ef36b2017-09-09 23:32:46 -04002602 if (sampler != nullptr)
2603 {
2604 sampler->syncState(context);
2605 }
Geoff Lange51ba632017-11-21 11:45:25 -05002606
2607 if (texture->initState() == InitState::MayNeedInit)
2608 {
2609 mCachedTexturesInitState = InitState::MayNeedInit;
2610 }
Jamie Madill81c2e252017-09-09 23:32:46 -04002611 }
2612 }
Jamie Madill0f80ed82017-09-19 00:24:56 -04002613
2614 // Unset now missing textures.
Jamie Madilla59fc192017-11-02 12:57:58 -04002615 ActiveTextureMask negativeMask = mActiveTexturesMask & ~newActiveTextures;
Jamie Madill0f80ed82017-09-19 00:24:56 -04002616 if (negativeMask.any())
2617 {
2618 for (auto textureIndex : negativeMask)
2619 {
2620 mCompleteTextureBindings[textureIndex].reset();
2621 mCompleteTextureCache[textureIndex] = nullptr;
Jamie Madilla59fc192017-11-02 12:57:58 -04002622 mActiveTexturesMask.reset(textureIndex);
Jamie Madill0f80ed82017-09-19 00:24:56 -04002623 }
2624 }
Jamie Madill81c2e252017-09-09 23:32:46 -04002625}
2626
Jamie Madillbc918e72018-03-08 09:47:21 -05002627Error State::syncDirtyObject(const Context *context, GLenum target)
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002628{
2629 DirtyObjects localSet;
2630
2631 switch (target)
2632 {
2633 case GL_READ_FRAMEBUFFER:
2634 localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2635 break;
2636 case GL_DRAW_FRAMEBUFFER:
2637 localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2638 break;
2639 case GL_FRAMEBUFFER:
2640 localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2641 localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2642 break;
2643 case GL_VERTEX_ARRAY:
2644 localSet.set(DIRTY_OBJECT_VERTEX_ARRAY);
2645 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002646 case GL_TEXTURE:
2647 case GL_SAMPLER:
2648 case GL_PROGRAM:
2649 localSet.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
2650 break;
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002651 }
2652
Jamie Madillbc918e72018-03-08 09:47:21 -05002653 return syncDirtyObjects(context, localSet);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002654}
2655
2656void State::setObjectDirty(GLenum target)
2657{
2658 switch (target)
2659 {
2660 case GL_READ_FRAMEBUFFER:
2661 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2662 break;
2663 case GL_DRAW_FRAMEBUFFER:
2664 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2665 break;
2666 case GL_FRAMEBUFFER:
2667 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2668 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2669 break;
2670 case GL_VERTEX_ARRAY:
2671 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
2672 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002673 case GL_TEXTURE:
2674 case GL_SAMPLER:
Jamie Madill81c2e252017-09-09 23:32:46 -04002675 case GL_PROGRAM:
2676 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
2677 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
2678 break;
Jamie Madilla779b612017-07-24 11:46:05 -04002679 }
2680}
2681
Jamie Madill888081d2018-02-27 00:24:46 -05002682void State::setFramebufferDirty(const Framebuffer *framebuffer) const
2683{
2684 if (framebuffer == mReadFramebuffer)
2685 {
2686 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2687 }
2688 if (framebuffer == mDrawFramebuffer)
2689 {
2690 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2691 }
2692}
2693
Jamie Madill09463932018-04-04 05:26:59 -04002694void State::setVertexArrayDirty(const VertexArray *vertexArray) const
2695{
2696 if (vertexArray == mVertexArray)
2697 {
2698 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
2699 }
2700}
2701
Jamie Madilla779b612017-07-24 11:46:05 -04002702void State::onProgramExecutableChange(Program *program)
2703{
2704 // OpenGL Spec:
2705 // "If LinkProgram or ProgramBinary successfully re-links a program object
2706 // that was already in use as a result of a previous call to UseProgram, then the
2707 // generated executable code will be installed as part of the current rendering state."
2708 if (program->isLinked() && mProgram == program)
2709 {
2710 mDirtyBits.set(DIRTY_BIT_PROGRAM_EXECUTABLE);
Jamie Madill81c2e252017-09-09 23:32:46 -04002711 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002712 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002713}
Jamie Madillc9d442d2016-01-20 11:17:24 -05002714
Xinghua Cao65ec0b22017-03-28 16:10:52 +08002715void State::setImageUnit(const Context *context,
2716 GLuint unit,
2717 Texture *texture,
2718 GLint level,
2719 GLboolean layered,
2720 GLint layer,
2721 GLenum access,
2722 GLenum format)
2723{
2724 mImageUnits[unit].texture.set(context, texture);
2725 mImageUnits[unit].level = level;
2726 mImageUnits[unit].layered = layered;
2727 mImageUnits[unit].layer = layer;
2728 mImageUnits[unit].access = access;
2729 mImageUnits[unit].format = format;
2730}
2731
2732const ImageUnit &State::getImageUnit(GLuint unit) const
2733{
2734 return mImageUnits[unit];
2735}
2736
Jamie Madill81c2e252017-09-09 23:32:46 -04002737// Handle a dirty texture event.
Jamie Madilld4442552018-02-27 22:03:47 -05002738void State::onSubjectStateChange(const Context *context,
2739 angle::SubjectIndex index,
2740 angle::SubjectMessage message)
Jamie Madill81c2e252017-09-09 23:32:46 -04002741{
2742 // Conservatively assume all textures are dirty.
2743 // TODO(jmadill): More fine-grained update.
2744 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Geoff Lange51ba632017-11-21 11:45:25 -05002745
Jamie Madilld4442552018-02-27 22:03:47 -05002746 if (!mCompleteTextureCache[index] ||
2747 mCompleteTextureCache[index]->initState() == InitState::MayNeedInit)
Geoff Lange51ba632017-11-21 11:45:25 -05002748 {
2749 mCachedTexturesInitState = InitState::MayNeedInit;
2750 }
Jamie Madill81c2e252017-09-09 23:32:46 -04002751}
2752
Jamie Madill05b35b22017-10-03 09:01:44 -04002753Error State::clearUnclearedActiveTextures(const Context *context)
2754{
Jamie Madilla59fc192017-11-02 12:57:58 -04002755 ASSERT(mRobustResourceInit);
Jamie Madill05b35b22017-10-03 09:01:44 -04002756
Geoff Lange51ba632017-11-21 11:45:25 -05002757 if (mCachedTexturesInitState == InitState::Initialized)
2758 {
2759 return NoError();
2760 }
2761
Geoff Langd4fff502017-09-22 11:28:28 -04002762 ASSERT(!mDirtyObjects.any());
2763
Jamie Madilla59fc192017-11-02 12:57:58 -04002764 for (auto textureIndex : mActiveTexturesMask)
Jamie Madill05b35b22017-10-03 09:01:44 -04002765 {
Jamie Madilla59fc192017-11-02 12:57:58 -04002766 Texture *texture = mCompleteTextureCache[textureIndex];
Jamie Madill05b35b22017-10-03 09:01:44 -04002767 if (texture)
2768 {
2769 ANGLE_TRY(texture->ensureInitialized(context));
2770 }
2771 }
Jamie Madilla59fc192017-11-02 12:57:58 -04002772
Geoff Lange51ba632017-11-21 11:45:25 -05002773 mCachedTexturesInitState = InitState::Initialized;
2774
Jamie Madill05b35b22017-10-03 09:01:44 -04002775 return NoError();
2776}
2777
Jamie Madillc67323a2017-11-02 23:11:41 -04002778AttributesMask State::getAndResetDirtyCurrentValues() const
2779{
2780 AttributesMask retVal = mDirtyCurrentValues;
2781 mDirtyCurrentValues.reset();
2782 return retVal;
2783}
2784
James Darpiniane8a93c62018-01-04 18:02:24 -08002785bool State::isCurrentTransformFeedback(const TransformFeedback *tf) const
2786{
2787 return tf == mTransformFeedback.get();
2788}
2789bool State::isCurrentVertexArray(const VertexArray *va) const
2790{
2791 return va == mVertexArray;
2792}
2793
Jamie Madillc9d442d2016-01-20 11:17:24 -05002794} // namespace gl