xref: /aosp_15_r20/external/angle/src/libANGLE/State.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2014 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker // State.h: Defines the State class, encapsulating raw GL state
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_STATE_H_
10*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_STATE_H_
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include <bitset>
13*8975f5c5SAndroid Build Coastguard Worker #include <memory>
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker #include "common/Color.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "common/bitset_utils.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/ContextMutex.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Debug.h"
20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/GLES1State.h"
21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Overlay.h"
22*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Program.h"
23*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/ProgramExecutable.h"
24*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/ProgramPipeline.h"
25*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/RefCountObject.h"
26*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Renderbuffer.h"
27*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Sampler.h"
28*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Texture.h"
29*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/TransformFeedback.h"
30*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Version.h"
31*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/VertexArray.h"
32*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/angletypes.h"
33*8975f5c5SAndroid Build Coastguard Worker 
34*8975f5c5SAndroid Build Coastguard Worker namespace egl
35*8975f5c5SAndroid Build Coastguard Worker {
36*8975f5c5SAndroid Build Coastguard Worker class ShareGroup;
37*8975f5c5SAndroid Build Coastguard Worker }  // namespace egl
38*8975f5c5SAndroid Build Coastguard Worker 
39*8975f5c5SAndroid Build Coastguard Worker namespace gl
40*8975f5c5SAndroid Build Coastguard Worker {
41*8975f5c5SAndroid Build Coastguard Worker class BufferManager;
42*8975f5c5SAndroid Build Coastguard Worker struct Caps;
43*8975f5c5SAndroid Build Coastguard Worker class Context;
44*8975f5c5SAndroid Build Coastguard Worker class FramebufferManager;
45*8975f5c5SAndroid Build Coastguard Worker class MemoryObjectManager;
46*8975f5c5SAndroid Build Coastguard Worker class ProgramPipelineManager;
47*8975f5c5SAndroid Build Coastguard Worker class Query;
48*8975f5c5SAndroid Build Coastguard Worker class RenderbufferManager;
49*8975f5c5SAndroid Build Coastguard Worker class SamplerManager;
50*8975f5c5SAndroid Build Coastguard Worker class SemaphoreManager;
51*8975f5c5SAndroid Build Coastguard Worker class ShaderProgramManager;
52*8975f5c5SAndroid Build Coastguard Worker class SyncManager;
53*8975f5c5SAndroid Build Coastguard Worker class TextureManager;
54*8975f5c5SAndroid Build Coastguard Worker class VertexArray;
55*8975f5c5SAndroid Build Coastguard Worker 
56*8975f5c5SAndroid Build Coastguard Worker static constexpr Version ES_1_0 = Version(1, 0);
57*8975f5c5SAndroid Build Coastguard Worker static constexpr Version ES_1_1 = Version(1, 1);
58*8975f5c5SAndroid Build Coastguard Worker static constexpr Version ES_2_0 = Version(2, 0);
59*8975f5c5SAndroid Build Coastguard Worker static constexpr Version ES_3_0 = Version(3, 0);
60*8975f5c5SAndroid Build Coastguard Worker static constexpr Version ES_3_1 = Version(3, 1);
61*8975f5c5SAndroid Build Coastguard Worker static constexpr Version ES_3_2 = Version(3, 2);
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker template <typename T>
64*8975f5c5SAndroid Build Coastguard Worker using BufferBindingMap     = angle::PackedEnumMap<BufferBinding, T>;
65*8975f5c5SAndroid Build Coastguard Worker using BoundBufferMap       = BufferBindingMap<BindingPointer<Buffer>>;
66*8975f5c5SAndroid Build Coastguard Worker using TextureBindingVector = std::vector<BindingPointer<Texture>>;
67*8975f5c5SAndroid Build Coastguard Worker using TextureBindingMap    = angle::PackedEnumMap<TextureType, TextureBindingVector>;
68*8975f5c5SAndroid Build Coastguard Worker using ActiveQueryMap       = angle::PackedEnumMap<QueryType, BindingPointer<Query>>;
69*8975f5c5SAndroid Build Coastguard Worker 
70*8975f5c5SAndroid Build Coastguard Worker class ActiveTexturesCache final : angle::NonCopyable
71*8975f5c5SAndroid Build Coastguard Worker {
72*8975f5c5SAndroid Build Coastguard Worker   public:
73*8975f5c5SAndroid Build Coastguard Worker     ActiveTexturesCache();
74*8975f5c5SAndroid Build Coastguard Worker     ~ActiveTexturesCache();
75*8975f5c5SAndroid Build Coastguard Worker 
76*8975f5c5SAndroid Build Coastguard Worker     Texture *operator[](size_t textureIndex) const { return mTextures[textureIndex]; }
77*8975f5c5SAndroid Build Coastguard Worker 
78*8975f5c5SAndroid Build Coastguard Worker     void clear();
79*8975f5c5SAndroid Build Coastguard Worker     void set(size_t textureIndex, Texture *texture);
80*8975f5c5SAndroid Build Coastguard Worker     void reset(size_t textureIndex);
81*8975f5c5SAndroid Build Coastguard Worker     bool empty() const;
size()82*8975f5c5SAndroid Build Coastguard Worker     size_t size() const { return mTextures.size(); }
83*8975f5c5SAndroid Build Coastguard Worker 
84*8975f5c5SAndroid Build Coastguard Worker   private:
85*8975f5c5SAndroid Build Coastguard Worker     ActiveTextureArray<Texture *> mTextures;
86*8975f5c5SAndroid Build Coastguard Worker };
87*8975f5c5SAndroid Build Coastguard Worker 
88*8975f5c5SAndroid Build Coastguard Worker namespace state
89*8975f5c5SAndroid Build Coastguard Worker {
90*8975f5c5SAndroid Build Coastguard Worker enum DirtyBitType
91*8975f5c5SAndroid Build Coastguard Worker {
92*8975f5c5SAndroid Build Coastguard Worker     // Note: process draw framebuffer binding first, so that other dirty bits whose effect
93*8975f5c5SAndroid Build Coastguard Worker     // depend on the current draw framebuffer are not processed while the old framebuffer is
94*8975f5c5SAndroid Build Coastguard Worker     // still bound.
95*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING,
96*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_READ_FRAMEBUFFER_BINDING,
97*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_SCISSOR_TEST_ENABLED,
98*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_SCISSOR,
99*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_VIEWPORT,
100*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_DEPTH_RANGE,
101*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_BLEND_ENABLED,
102*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_BLEND_COLOR,
103*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_BLEND_FUNCS,
104*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_BLEND_EQUATIONS,
105*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_COLOR_MASK,
106*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED,
107*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_SAMPLE_COVERAGE_ENABLED,
108*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_SAMPLE_COVERAGE,
109*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_SAMPLE_MASK_ENABLED,
110*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_SAMPLE_MASK,
111*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_DEPTH_TEST_ENABLED,
112*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_DEPTH_FUNC,
113*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_DEPTH_MASK,
114*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_STENCIL_TEST_ENABLED,
115*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_STENCIL_FUNCS_FRONT,
116*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_STENCIL_FUNCS_BACK,
117*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_STENCIL_OPS_FRONT,
118*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_STENCIL_OPS_BACK,
119*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_STENCIL_WRITEMASK_FRONT,
120*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_STENCIL_WRITEMASK_BACK,
121*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_CULL_FACE_ENABLED,
122*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_CULL_FACE,
123*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_FRONT_FACE,
124*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED,
125*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_POLYGON_OFFSET,
126*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_RASTERIZER_DISCARD_ENABLED,
127*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_LINE_WIDTH,
128*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_PRIMITIVE_RESTART_ENABLED,
129*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_CLEAR_COLOR,
130*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_CLEAR_DEPTH,
131*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_CLEAR_STENCIL,
132*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_UNPACK_STATE,
133*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_UNPACK_BUFFER_BINDING,
134*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_PACK_STATE,
135*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_PACK_BUFFER_BINDING,
136*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_DITHER_ENABLED,
137*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_RENDERBUFFER_BINDING,
138*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_VERTEX_ARRAY_BINDING,
139*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING,
140*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING,
141*8975f5c5SAndroid Build Coastguard Worker     // Note: Fine-grained dirty bits for each index could be an optimization.
142*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_PROGRAM_BINDING,  // Must be before DIRTY_BIT_PROGRAM_EXECUTABLE
143*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_PROGRAM_EXECUTABLE,
144*8975f5c5SAndroid Build Coastguard Worker     // Note: Fine-grained dirty bits for each texture/sampler could be an optimization.
145*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_SAMPLER_BINDINGS,
146*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_TEXTURE_BINDINGS,
147*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_IMAGE_BINDINGS,
148*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_TRANSFORM_FEEDBACK_BINDING,
149*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_UNIFORM_BUFFER_BINDINGS,
150*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING,
151*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING,
152*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_MULTISAMPLING,
153*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_SAMPLE_ALPHA_TO_ONE,
154*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_COVERAGE_MODULATION,                  // CHROMIUM_framebuffer_mixed_samples
155*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_FRAMEBUFFER_SRGB_WRITE_CONTROL_MODE,  // GL_EXT_sRGB_write_control
156*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_CURRENT_VALUES,
157*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_PROVOKING_VERTEX,
158*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_SAMPLE_SHADING,
159*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_PATCH_VERTICES,
160*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_EXTENDED,  // clip distances, mipmap generation hint, derivative hint,
161*8975f5c5SAndroid Build Coastguard Worker                          // EXT_clip_control, EXT_depth_clamp
162*8975f5c5SAndroid Build Coastguard Worker 
163*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_INVALID,
164*8975f5c5SAndroid Build Coastguard Worker     DIRTY_BIT_MAX = DIRTY_BIT_INVALID,
165*8975f5c5SAndroid Build Coastguard Worker };
166*8975f5c5SAndroid Build Coastguard Worker static_assert(DIRTY_BIT_MAX <= 64, "State dirty bits must be capped at 64");
167*8975f5c5SAndroid Build Coastguard Worker using DirtyBits = angle::BitSet<DIRTY_BIT_MAX>;
168*8975f5c5SAndroid Build Coastguard Worker 
169*8975f5c5SAndroid Build Coastguard Worker enum ExtendedDirtyBitType
170*8975f5c5SAndroid Build Coastguard Worker {
171*8975f5c5SAndroid Build Coastguard Worker     EXTENDED_DIRTY_BIT_CLIP_CONTROL,                  // EXT_clip_control
172*8975f5c5SAndroid Build Coastguard Worker     EXTENDED_DIRTY_BIT_CLIP_DISTANCES,                // clip distances
173*8975f5c5SAndroid Build Coastguard Worker     EXTENDED_DIRTY_BIT_DEPTH_CLAMP_ENABLED,           // EXT_depth_clamp
174*8975f5c5SAndroid Build Coastguard Worker     EXTENDED_DIRTY_BIT_MIPMAP_GENERATION_HINT,        // mipmap generation hint
175*8975f5c5SAndroid Build Coastguard Worker     EXTENDED_DIRTY_BIT_POLYGON_MODE,                  // NV_polygon_mode
176*8975f5c5SAndroid Build Coastguard Worker     EXTENDED_DIRTY_BIT_POLYGON_OFFSET_POINT_ENABLED,  // NV_polygon_mode
177*8975f5c5SAndroid Build Coastguard Worker     EXTENDED_DIRTY_BIT_POLYGON_OFFSET_LINE_ENABLED,   // NV_polygon_mode
178*8975f5c5SAndroid Build Coastguard Worker     EXTENDED_DIRTY_BIT_SHADER_DERIVATIVE_HINT,        // shader derivative hint
179*8975f5c5SAndroid Build Coastguard Worker     EXTENDED_DIRTY_BIT_SHADING_RATE,                  // QCOM_shading_rate
180*8975f5c5SAndroid Build Coastguard Worker     EXTENDED_DIRTY_BIT_LOGIC_OP_ENABLED,              // ANGLE_logic_op
181*8975f5c5SAndroid Build Coastguard Worker     EXTENDED_DIRTY_BIT_LOGIC_OP,                      // ANGLE_logic_op
182*8975f5c5SAndroid Build Coastguard Worker     EXTENDED_DIRTY_BIT_BLEND_ADVANCED_COHERENT,       // KHR_blend_operation_advanced_coherent
183*8975f5c5SAndroid Build Coastguard Worker 
184*8975f5c5SAndroid Build Coastguard Worker     EXTENDED_DIRTY_BIT_INVALID,
185*8975f5c5SAndroid Build Coastguard Worker     EXTENDED_DIRTY_BIT_MAX = EXTENDED_DIRTY_BIT_INVALID,
186*8975f5c5SAndroid Build Coastguard Worker };
187*8975f5c5SAndroid Build Coastguard Worker static_assert(EXTENDED_DIRTY_BIT_MAX <= 32, "State extended dirty bits must be capped at 32");
188*8975f5c5SAndroid Build Coastguard Worker using ExtendedDirtyBits = angle::BitSet32<EXTENDED_DIRTY_BIT_MAX>;
189*8975f5c5SAndroid Build Coastguard Worker 
190*8975f5c5SAndroid Build Coastguard Worker // TODO(jmadill): Consider storing dirty objects in a list instead of by binding.
191*8975f5c5SAndroid Build Coastguard Worker enum DirtyObjectType
192*8975f5c5SAndroid Build Coastguard Worker {
193*8975f5c5SAndroid Build Coastguard Worker     DIRTY_OBJECT_ACTIVE_TEXTURES,  // Top-level dirty bit. Also see mDirtyActiveTextures.
194*8975f5c5SAndroid Build Coastguard Worker     DIRTY_OBJECT_TEXTURES_INIT,
195*8975f5c5SAndroid Build Coastguard Worker     DIRTY_OBJECT_IMAGES_INIT,
196*8975f5c5SAndroid Build Coastguard Worker     DIRTY_OBJECT_READ_ATTACHMENTS,
197*8975f5c5SAndroid Build Coastguard Worker     DIRTY_OBJECT_DRAW_ATTACHMENTS,
198*8975f5c5SAndroid Build Coastguard Worker     DIRTY_OBJECT_READ_FRAMEBUFFER,
199*8975f5c5SAndroid Build Coastguard Worker     DIRTY_OBJECT_DRAW_FRAMEBUFFER,
200*8975f5c5SAndroid Build Coastguard Worker     DIRTY_OBJECT_VERTEX_ARRAY,
201*8975f5c5SAndroid Build Coastguard Worker     DIRTY_OBJECT_TEXTURES,  // Top-level dirty bit. Also see mDirtyTextures.
202*8975f5c5SAndroid Build Coastguard Worker     DIRTY_OBJECT_IMAGES,    // Top-level dirty bit. Also see mDirtyImages.
203*8975f5c5SAndroid Build Coastguard Worker     DIRTY_OBJECT_SAMPLERS,  // Top-level dirty bit. Also see mDirtySamplers.
204*8975f5c5SAndroid Build Coastguard Worker     DIRTY_OBJECT_PROGRAM_PIPELINE_OBJECT,
205*8975f5c5SAndroid Build Coastguard Worker 
206*8975f5c5SAndroid Build Coastguard Worker     DIRTY_OBJECT_INVALID,
207*8975f5c5SAndroid Build Coastguard Worker     DIRTY_OBJECT_MAX = DIRTY_OBJECT_INVALID,
208*8975f5c5SAndroid Build Coastguard Worker };
209*8975f5c5SAndroid Build Coastguard Worker using DirtyObjects = angle::BitSet<DIRTY_OBJECT_MAX>;
210*8975f5c5SAndroid Build Coastguard Worker 
211*8975f5c5SAndroid Build Coastguard Worker }  // namespace state
212*8975f5c5SAndroid Build Coastguard Worker 
213*8975f5c5SAndroid Build Coastguard Worker // This class represents the portion of the GL context's state that is purely private to the
214*8975f5c5SAndroid Build Coastguard Worker // context. Manipulating this state does not affect the other contexts in any way, nor do operations
215*8975f5c5SAndroid Build Coastguard Worker // in other contexts affect this.
216*8975f5c5SAndroid Build Coastguard Worker //
217*8975f5c5SAndroid Build Coastguard Worker // Note that "currently bound X" states do not belong here because unbinding most objects could lead
218*8975f5c5SAndroid Build Coastguard Worker // to object destruction which in turn may trigger a notification to an observer that may affect
219*8975f5c5SAndroid Build Coastguard Worker // another context.
220*8975f5c5SAndroid Build Coastguard Worker class PrivateState : angle::NonCopyable
221*8975f5c5SAndroid Build Coastguard Worker {
222*8975f5c5SAndroid Build Coastguard Worker   public:
223*8975f5c5SAndroid Build Coastguard Worker     PrivateState(const Version &clientVersion,
224*8975f5c5SAndroid Build Coastguard Worker                  bool debug,
225*8975f5c5SAndroid Build Coastguard Worker                  bool bindGeneratesResourceCHROMIUM,
226*8975f5c5SAndroid Build Coastguard Worker                  bool clientArraysEnabled,
227*8975f5c5SAndroid Build Coastguard Worker                  bool robustResourceInit,
228*8975f5c5SAndroid Build Coastguard Worker                  bool programBinaryCacheEnabled,
229*8975f5c5SAndroid Build Coastguard Worker                  bool isExternal);
230*8975f5c5SAndroid Build Coastguard Worker     ~PrivateState();
231*8975f5c5SAndroid Build Coastguard Worker 
232*8975f5c5SAndroid Build Coastguard Worker     void initialize(Context *context);
233*8975f5c5SAndroid Build Coastguard Worker     void initializeForCapture(const Context *context);
234*8975f5c5SAndroid Build Coastguard Worker 
235*8975f5c5SAndroid Build Coastguard Worker     void reset();
236*8975f5c5SAndroid Build Coastguard Worker 
getClientVersion()237*8975f5c5SAndroid Build Coastguard Worker     const Version &getClientVersion() const { return mClientVersion; }
getClientMajorVersion()238*8975f5c5SAndroid Build Coastguard Worker     GLint getClientMajorVersion() const { return mClientVersion.major; }
getClientMinorVersion()239*8975f5c5SAndroid Build Coastguard Worker     GLint getClientMinorVersion() const { return mClientVersion.minor; }
240*8975f5c5SAndroid Build Coastguard Worker 
isWebGL()241*8975f5c5SAndroid Build Coastguard Worker     bool isWebGL() const { return getExtensions().webglCompatibilityANGLE; }
isWebGL1()242*8975f5c5SAndroid Build Coastguard Worker     bool isWebGL1() const { return isWebGL() && getClientVersion().major == 2; }
isGLES1()243*8975f5c5SAndroid Build Coastguard Worker     bool isGLES1() const { return getClientVersion() < ES_2_0; }
244*8975f5c5SAndroid Build Coastguard Worker 
getCaps()245*8975f5c5SAndroid Build Coastguard Worker     const Caps &getCaps() const { return mCaps; }
getTextureCaps()246*8975f5c5SAndroid Build Coastguard Worker     const TextureCapsMap &getTextureCaps() const { return mTextureCaps; }
getExtensions()247*8975f5c5SAndroid Build Coastguard Worker     const Extensions &getExtensions() const { return mExtensions; }
getLimitations()248*8975f5c5SAndroid Build Coastguard Worker     const Limitations &getLimitations() const { return mLimitations; }
249*8975f5c5SAndroid Build Coastguard Worker 
isExternal()250*8975f5c5SAndroid Build Coastguard Worker     bool isExternal() const { return mIsExternal; }
251*8975f5c5SAndroid Build Coastguard Worker 
getMutableCaps()252*8975f5c5SAndroid Build Coastguard Worker     Caps *getMutableCaps() { return &mCaps; }
getMutableTextureCaps()253*8975f5c5SAndroid Build Coastguard Worker     TextureCapsMap *getMutableTextureCaps() { return &mTextureCaps; }
getMutableExtensions()254*8975f5c5SAndroid Build Coastguard Worker     Extensions *getMutableExtensions() { return &mExtensions; }
getMutableLimitations()255*8975f5c5SAndroid Build Coastguard Worker     Limitations *getMutableLimitations() { return &mLimitations; }
256*8975f5c5SAndroid Build Coastguard Worker 
257*8975f5c5SAndroid Build Coastguard Worker     // State chunk getters
getRasterizerState()258*8975f5c5SAndroid Build Coastguard Worker     const RasterizerState &getRasterizerState() const { return mRasterizer; }
getBlendState()259*8975f5c5SAndroid Build Coastguard Worker     const BlendState &getBlendState() const { return mBlendState; }
getBlendStateExt()260*8975f5c5SAndroid Build Coastguard Worker     const BlendStateExt &getBlendStateExt() const { return mBlendStateExt; }
getDepthStencilState()261*8975f5c5SAndroid Build Coastguard Worker     const DepthStencilState &getDepthStencilState() const { return mDepthStencil; }
262*8975f5c5SAndroid Build Coastguard Worker 
263*8975f5c5SAndroid Build Coastguard Worker     // Clear values
264*8975f5c5SAndroid Build Coastguard Worker     void setColorClearValue(float red, float green, float blue, float alpha);
265*8975f5c5SAndroid Build Coastguard Worker     void setDepthClearValue(float depth);
266*8975f5c5SAndroid Build Coastguard Worker     void setStencilClearValue(int stencil);
267*8975f5c5SAndroid Build Coastguard Worker 
getColorClearValue()268*8975f5c5SAndroid Build Coastguard Worker     const ColorF &getColorClearValue() const { return mColorClearValue; }
getDepthClearValue()269*8975f5c5SAndroid Build Coastguard Worker     float getDepthClearValue() const { return mDepthClearValue; }
getStencilClearValue()270*8975f5c5SAndroid Build Coastguard Worker     int getStencilClearValue() const { return mStencilClearValue; }
271*8975f5c5SAndroid Build Coastguard Worker 
272*8975f5c5SAndroid Build Coastguard Worker     // Write mask manipulation
273*8975f5c5SAndroid Build Coastguard Worker     void setColorMask(bool red, bool green, bool blue, bool alpha);
274*8975f5c5SAndroid Build Coastguard Worker     void setColorMaskIndexed(bool red, bool green, bool blue, bool alpha, GLuint index);
275*8975f5c5SAndroid Build Coastguard Worker     void setDepthMask(bool mask);
276*8975f5c5SAndroid Build Coastguard Worker 
277*8975f5c5SAndroid Build Coastguard Worker     // Discard toggle & query
isRasterizerDiscardEnabled()278*8975f5c5SAndroid Build Coastguard Worker     bool isRasterizerDiscardEnabled() const { return mRasterizer.rasterizerDiscard; }
279*8975f5c5SAndroid Build Coastguard Worker     void setRasterizerDiscard(bool enabled);
280*8975f5c5SAndroid Build Coastguard Worker 
281*8975f5c5SAndroid Build Coastguard Worker     // Primitive restart
isPrimitiveRestartEnabled()282*8975f5c5SAndroid Build Coastguard Worker     bool isPrimitiveRestartEnabled() const { return mPrimitiveRestart; }
283*8975f5c5SAndroid Build Coastguard Worker     void setPrimitiveRestart(bool enabled);
284*8975f5c5SAndroid Build Coastguard Worker 
285*8975f5c5SAndroid Build Coastguard Worker     // Face culling state manipulation
isCullFaceEnabled()286*8975f5c5SAndroid Build Coastguard Worker     bool isCullFaceEnabled() const { return mRasterizer.cullFace; }
287*8975f5c5SAndroid Build Coastguard Worker     void setCullFace(bool enabled);
288*8975f5c5SAndroid Build Coastguard Worker     void setCullMode(CullFaceMode mode);
289*8975f5c5SAndroid Build Coastguard Worker     void setFrontFace(GLenum front);
290*8975f5c5SAndroid Build Coastguard Worker 
291*8975f5c5SAndroid Build Coastguard Worker     // EXT_depth_clamp
isDepthClampEnabled()292*8975f5c5SAndroid Build Coastguard Worker     bool isDepthClampEnabled() const { return mRasterizer.depthClamp; }
293*8975f5c5SAndroid Build Coastguard Worker     void setDepthClamp(bool enabled);
294*8975f5c5SAndroid Build Coastguard Worker 
295*8975f5c5SAndroid Build Coastguard Worker     // Depth test state manipulation
isDepthTestEnabled()296*8975f5c5SAndroid Build Coastguard Worker     bool isDepthTestEnabled() const { return mDepthStencil.depthTest; }
isDepthWriteEnabled()297*8975f5c5SAndroid Build Coastguard Worker     bool isDepthWriteEnabled() const { return mDepthStencil.depthTest && mDepthStencil.depthMask; }
298*8975f5c5SAndroid Build Coastguard Worker     void setDepthTest(bool enabled);
299*8975f5c5SAndroid Build Coastguard Worker     void setDepthFunc(GLenum depthFunc);
300*8975f5c5SAndroid Build Coastguard Worker     void setDepthRange(float zNear, float zFar);
getNearPlane()301*8975f5c5SAndroid Build Coastguard Worker     float getNearPlane() const { return mNearZ; }
getFarPlane()302*8975f5c5SAndroid Build Coastguard Worker     float getFarPlane() const { return mFarZ; }
303*8975f5c5SAndroid Build Coastguard Worker 
304*8975f5c5SAndroid Build Coastguard Worker     // EXT_clip_control
305*8975f5c5SAndroid Build Coastguard Worker     void setClipControl(ClipOrigin origin, ClipDepthMode depth);
getClipOrigin()306*8975f5c5SAndroid Build Coastguard Worker     ClipOrigin getClipOrigin() const { return mClipOrigin; }
getClipDepthMode()307*8975f5c5SAndroid Build Coastguard Worker     ClipDepthMode getClipDepthMode() const { return mClipDepthMode; }
isClipDepthModeZeroToOne()308*8975f5c5SAndroid Build Coastguard Worker     bool isClipDepthModeZeroToOne() const { return mClipDepthMode == ClipDepthMode::ZeroToOne; }
309*8975f5c5SAndroid Build Coastguard Worker 
310*8975f5c5SAndroid Build Coastguard Worker     // Blend state manipulation
isBlendEnabled()311*8975f5c5SAndroid Build Coastguard Worker     bool isBlendEnabled() const { return mBlendStateExt.getEnabledMask().test(0); }
isBlendEnabledIndexed(GLuint index)312*8975f5c5SAndroid Build Coastguard Worker     bool isBlendEnabledIndexed(GLuint index) const
313*8975f5c5SAndroid Build Coastguard Worker     {
314*8975f5c5SAndroid Build Coastguard Worker         ASSERT(static_cast<size_t>(index) < mBlendStateExt.getDrawBufferCount());
315*8975f5c5SAndroid Build Coastguard Worker         return mBlendStateExt.getEnabledMask().test(index);
316*8975f5c5SAndroid Build Coastguard Worker     }
getBlendEnabledDrawBufferMask()317*8975f5c5SAndroid Build Coastguard Worker     DrawBufferMask getBlendEnabledDrawBufferMask() const { return mBlendStateExt.getEnabledMask(); }
318*8975f5c5SAndroid Build Coastguard Worker     void setBlend(bool enabled);
319*8975f5c5SAndroid Build Coastguard Worker     void setBlendIndexed(bool enabled, GLuint index);
320*8975f5c5SAndroid Build Coastguard Worker     void setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha);
321*8975f5c5SAndroid Build Coastguard Worker     void setBlendFactorsIndexed(GLenum sourceRGB,
322*8975f5c5SAndroid Build Coastguard Worker                                 GLenum destRGB,
323*8975f5c5SAndroid Build Coastguard Worker                                 GLenum sourceAlpha,
324*8975f5c5SAndroid Build Coastguard Worker                                 GLenum destAlpha,
325*8975f5c5SAndroid Build Coastguard Worker                                 GLuint index);
326*8975f5c5SAndroid Build Coastguard Worker     void setBlendColor(float red, float green, float blue, float alpha);
327*8975f5c5SAndroid Build Coastguard Worker     void setBlendEquation(GLenum rgbEquation, GLenum alphaEquation);
328*8975f5c5SAndroid Build Coastguard Worker     void setBlendEquationIndexed(GLenum rgbEquation, GLenum alphaEquation, GLuint index);
getBlendColor()329*8975f5c5SAndroid Build Coastguard Worker     const ColorF &getBlendColor() const { return mBlendColor; }
330*8975f5c5SAndroid Build Coastguard Worker 
331*8975f5c5SAndroid Build Coastguard Worker     // Stencil state maniupulation
isStencilTestEnabled()332*8975f5c5SAndroid Build Coastguard Worker     bool isStencilTestEnabled() const { return mDepthStencil.stencilTest; }
isStencilWriteEnabled(GLuint framebufferStencilSize)333*8975f5c5SAndroid Build Coastguard Worker     bool isStencilWriteEnabled(GLuint framebufferStencilSize) const
334*8975f5c5SAndroid Build Coastguard Worker     {
335*8975f5c5SAndroid Build Coastguard Worker         return mDepthStencil.stencilTest &&
336*8975f5c5SAndroid Build Coastguard Worker                !(mDepthStencil.isStencilNoOp(framebufferStencilSize) &&
337*8975f5c5SAndroid Build Coastguard Worker                  mDepthStencil.isStencilBackNoOp(framebufferStencilSize));
338*8975f5c5SAndroid Build Coastguard Worker     }
339*8975f5c5SAndroid Build Coastguard Worker     void setStencilTest(bool enabled);
340*8975f5c5SAndroid Build Coastguard Worker     void setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask);
341*8975f5c5SAndroid Build Coastguard Worker     void setStencilBackParams(GLenum stencilBackFunc, GLint stencilBackRef, GLuint stencilBackMask);
342*8975f5c5SAndroid Build Coastguard Worker     void setStencilWritemask(GLuint stencilWritemask);
343*8975f5c5SAndroid Build Coastguard Worker     void setStencilBackWritemask(GLuint stencilBackWritemask);
344*8975f5c5SAndroid Build Coastguard Worker     void setStencilOperations(GLenum stencilFail,
345*8975f5c5SAndroid Build Coastguard Worker                               GLenum stencilPassDepthFail,
346*8975f5c5SAndroid Build Coastguard Worker                               GLenum stencilPassDepthPass);
347*8975f5c5SAndroid Build Coastguard Worker     void setStencilBackOperations(GLenum stencilBackFail,
348*8975f5c5SAndroid Build Coastguard Worker                                   GLenum stencilBackPassDepthFail,
349*8975f5c5SAndroid Build Coastguard Worker                                   GLenum stencilBackPassDepthPass);
getStencilRef()350*8975f5c5SAndroid Build Coastguard Worker     GLint getStencilRef() const { return mStencilRef; }
getStencilBackRef()351*8975f5c5SAndroid Build Coastguard Worker     GLint getStencilBackRef() const { return mStencilBackRef; }
352*8975f5c5SAndroid Build Coastguard Worker 
getPolygonMode()353*8975f5c5SAndroid Build Coastguard Worker     PolygonMode getPolygonMode() const { return mRasterizer.polygonMode; }
354*8975f5c5SAndroid Build Coastguard Worker     void setPolygonMode(PolygonMode mode);
355*8975f5c5SAndroid Build Coastguard Worker 
356*8975f5c5SAndroid Build Coastguard Worker     // Depth bias/polygon offset state manipulation
isPolygonOffsetPointEnabled()357*8975f5c5SAndroid Build Coastguard Worker     bool isPolygonOffsetPointEnabled() const { return mRasterizer.polygonOffsetPoint; }
isPolygonOffsetLineEnabled()358*8975f5c5SAndroid Build Coastguard Worker     bool isPolygonOffsetLineEnabled() const { return mRasterizer.polygonOffsetLine; }
isPolygonOffsetFillEnabled()359*8975f5c5SAndroid Build Coastguard Worker     bool isPolygonOffsetFillEnabled() const { return mRasterizer.polygonOffsetFill; }
isPolygonOffsetEnabled()360*8975f5c5SAndroid Build Coastguard Worker     bool isPolygonOffsetEnabled() const { return mRasterizer.isPolygonOffsetEnabled(); }
361*8975f5c5SAndroid Build Coastguard Worker     void setPolygonOffsetPoint(bool enabled);
362*8975f5c5SAndroid Build Coastguard Worker     void setPolygonOffsetLine(bool enabled);
363*8975f5c5SAndroid Build Coastguard Worker     void setPolygonOffsetFill(bool enabled);
364*8975f5c5SAndroid Build Coastguard Worker     void setPolygonOffsetParams(GLfloat factor, GLfloat units, GLfloat clamp);
365*8975f5c5SAndroid Build Coastguard Worker 
366*8975f5c5SAndroid Build Coastguard Worker     // Multisample coverage state manipulation
isSampleAlphaToCoverageEnabled()367*8975f5c5SAndroid Build Coastguard Worker     bool isSampleAlphaToCoverageEnabled() const { return mSampleAlphaToCoverage; }
368*8975f5c5SAndroid Build Coastguard Worker     void setSampleAlphaToCoverage(bool enabled);
isSampleCoverageEnabled()369*8975f5c5SAndroid Build Coastguard Worker     bool isSampleCoverageEnabled() const { return mSampleCoverage; }
370*8975f5c5SAndroid Build Coastguard Worker     void setSampleCoverage(bool enabled);
371*8975f5c5SAndroid Build Coastguard Worker     void setSampleCoverageParams(GLclampf value, bool invert);
getSampleCoverageValue()372*8975f5c5SAndroid Build Coastguard Worker     GLclampf getSampleCoverageValue() const { return mSampleCoverageValue; }
getSampleCoverageInvert()373*8975f5c5SAndroid Build Coastguard Worker     bool getSampleCoverageInvert() const { return mSampleCoverageInvert; }
374*8975f5c5SAndroid Build Coastguard Worker 
375*8975f5c5SAndroid Build Coastguard Worker     // Multisample mask state manipulation.
isSampleMaskEnabled()376*8975f5c5SAndroid Build Coastguard Worker     bool isSampleMaskEnabled() const { return mSampleMask; }
377*8975f5c5SAndroid Build Coastguard Worker     void setSampleMaskEnabled(bool enabled);
378*8975f5c5SAndroid Build Coastguard Worker     void setSampleMaskParams(GLuint maskNumber, GLbitfield mask);
getSampleMaskWord(GLuint maskNumber)379*8975f5c5SAndroid Build Coastguard Worker     GLbitfield getSampleMaskWord(GLuint maskNumber) const
380*8975f5c5SAndroid Build Coastguard Worker     {
381*8975f5c5SAndroid Build Coastguard Worker         ASSERT(maskNumber < mMaxSampleMaskWords);
382*8975f5c5SAndroid Build Coastguard Worker         return mSampleMaskValues[maskNumber];
383*8975f5c5SAndroid Build Coastguard Worker     }
getSampleMaskValues()384*8975f5c5SAndroid Build Coastguard Worker     SampleMaskArray<GLbitfield> getSampleMaskValues() const { return mSampleMaskValues; }
getMaxSampleMaskWords()385*8975f5c5SAndroid Build Coastguard Worker     GLuint getMaxSampleMaskWords() const { return mMaxSampleMaskWords; }
386*8975f5c5SAndroid Build Coastguard Worker 
387*8975f5c5SAndroid Build Coastguard Worker     // Multisampling/alpha to one manipulation.
388*8975f5c5SAndroid Build Coastguard Worker     void setSampleAlphaToOne(bool enabled);
isSampleAlphaToOneEnabled()389*8975f5c5SAndroid Build Coastguard Worker     bool isSampleAlphaToOneEnabled() const { return mSampleAlphaToOne; }
390*8975f5c5SAndroid Build Coastguard Worker     void setMultisampling(bool enabled);
isMultisamplingEnabled()391*8975f5c5SAndroid Build Coastguard Worker     bool isMultisamplingEnabled() const { return mMultiSampling; }
392*8975f5c5SAndroid Build Coastguard Worker 
393*8975f5c5SAndroid Build Coastguard Worker     void setSampleShading(bool enabled);
isSampleShadingEnabled()394*8975f5c5SAndroid Build Coastguard Worker     bool isSampleShadingEnabled() const { return mIsSampleShadingEnabled; }
395*8975f5c5SAndroid Build Coastguard Worker     void setMinSampleShading(float value);
getMinSampleShading()396*8975f5c5SAndroid Build Coastguard Worker     float getMinSampleShading() const { return mMinSampleShading; }
397*8975f5c5SAndroid Build Coastguard Worker 
398*8975f5c5SAndroid Build Coastguard Worker     // Scissor test state toggle & query
isScissorTestEnabled()399*8975f5c5SAndroid Build Coastguard Worker     bool isScissorTestEnabled() const { return mScissorTest; }
400*8975f5c5SAndroid Build Coastguard Worker     void setScissorTest(bool enabled);
401*8975f5c5SAndroid Build Coastguard Worker     void setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height);
getScissor()402*8975f5c5SAndroid Build Coastguard Worker     const Rectangle &getScissor() const { return mScissor; }
403*8975f5c5SAndroid Build Coastguard Worker 
404*8975f5c5SAndroid Build Coastguard Worker     // Dither state toggle & query
isDitherEnabled()405*8975f5c5SAndroid Build Coastguard Worker     bool isDitherEnabled() const { return mRasterizer.dither; }
406*8975f5c5SAndroid Build Coastguard Worker     void setDither(bool enabled);
407*8975f5c5SAndroid Build Coastguard Worker 
408*8975f5c5SAndroid Build Coastguard Worker     // GL_KHR_blend_equation_advanced_coherent
409*8975f5c5SAndroid Build Coastguard Worker     void setBlendAdvancedCoherent(bool enabled);
isBlendAdvancedCoherentEnabled()410*8975f5c5SAndroid Build Coastguard Worker     bool isBlendAdvancedCoherentEnabled() const { return mBlendAdvancedCoherent; }
411*8975f5c5SAndroid Build Coastguard Worker 
412*8975f5c5SAndroid Build Coastguard Worker     // GL_CHROMIUM_bind_generates_resource
isBindGeneratesResourceEnabled()413*8975f5c5SAndroid Build Coastguard Worker     bool isBindGeneratesResourceEnabled() const { return mBindGeneratesResource; }
414*8975f5c5SAndroid Build Coastguard Worker 
415*8975f5c5SAndroid Build Coastguard Worker     // GL_ANGLE_client_arrays
areClientArraysEnabled()416*8975f5c5SAndroid Build Coastguard Worker     bool areClientArraysEnabled() const { return mClientArraysEnabled; }
417*8975f5c5SAndroid Build Coastguard Worker 
418*8975f5c5SAndroid Build Coastguard Worker     // GL_ANGLE_robust_resource_initialization
isRobustResourceInitEnabled()419*8975f5c5SAndroid Build Coastguard Worker     bool isRobustResourceInitEnabled() const { return mRobustResourceInit; }
420*8975f5c5SAndroid Build Coastguard Worker 
421*8975f5c5SAndroid Build Coastguard Worker     // GL_ANGLE_program_cache_control
isProgramBinaryCacheEnabled()422*8975f5c5SAndroid Build Coastguard Worker     bool isProgramBinaryCacheEnabled() const { return mProgramBinaryCacheEnabled; }
423*8975f5c5SAndroid Build Coastguard Worker 
424*8975f5c5SAndroid Build Coastguard Worker     // Viewport state setter/getter
425*8975f5c5SAndroid Build Coastguard Worker     void setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height);
getViewport()426*8975f5c5SAndroid Build Coastguard Worker     const Rectangle &getViewport() const { return mViewport; }
427*8975f5c5SAndroid Build Coastguard Worker 
428*8975f5c5SAndroid Build Coastguard Worker     // QCOM_shading_rate helpers
429*8975f5c5SAndroid Build Coastguard Worker     void setShadingRate(GLenum rate);
getShadingRate()430*8975f5c5SAndroid Build Coastguard Worker     ShadingRate getShadingRate() const { return mShadingRate; }
431*8975f5c5SAndroid Build Coastguard Worker 
432*8975f5c5SAndroid Build Coastguard Worker     // Pixel pack state manipulation
433*8975f5c5SAndroid Build Coastguard Worker     void setPackAlignment(GLint alignment);
getPackAlignment()434*8975f5c5SAndroid Build Coastguard Worker     GLint getPackAlignment() const { return mPack.alignment; }
435*8975f5c5SAndroid Build Coastguard Worker     void setPackReverseRowOrder(bool reverseRowOrder);
getPackReverseRowOrder()436*8975f5c5SAndroid Build Coastguard Worker     bool getPackReverseRowOrder() const { return mPack.reverseRowOrder; }
437*8975f5c5SAndroid Build Coastguard Worker     void setPackRowLength(GLint rowLength);
getPackRowLength()438*8975f5c5SAndroid Build Coastguard Worker     GLint getPackRowLength() const { return mPack.rowLength; }
439*8975f5c5SAndroid Build Coastguard Worker     void setPackSkipRows(GLint skipRows);
getPackSkipRows()440*8975f5c5SAndroid Build Coastguard Worker     GLint getPackSkipRows() const { return mPack.skipRows; }
441*8975f5c5SAndroid Build Coastguard Worker     void setPackSkipPixels(GLint skipPixels);
getPackSkipPixels()442*8975f5c5SAndroid Build Coastguard Worker     GLint getPackSkipPixels() const { return mPack.skipPixels; }
getPackState()443*8975f5c5SAndroid Build Coastguard Worker     const PixelPackState &getPackState() const { return mPack; }
getPackState()444*8975f5c5SAndroid Build Coastguard Worker     PixelPackState &getPackState() { return mPack; }
445*8975f5c5SAndroid Build Coastguard Worker 
446*8975f5c5SAndroid Build Coastguard Worker     // Pixel unpack state manipulation
447*8975f5c5SAndroid Build Coastguard Worker     void setUnpackAlignment(GLint alignment);
getUnpackAlignment()448*8975f5c5SAndroid Build Coastguard Worker     GLint getUnpackAlignment() const { return mUnpack.alignment; }
449*8975f5c5SAndroid Build Coastguard Worker     void setUnpackRowLength(GLint rowLength);
getUnpackRowLength()450*8975f5c5SAndroid Build Coastguard Worker     GLint getUnpackRowLength() const { return mUnpack.rowLength; }
451*8975f5c5SAndroid Build Coastguard Worker     void setUnpackImageHeight(GLint imageHeight);
getUnpackImageHeight()452*8975f5c5SAndroid Build Coastguard Worker     GLint getUnpackImageHeight() const { return mUnpack.imageHeight; }
453*8975f5c5SAndroid Build Coastguard Worker     void setUnpackSkipImages(GLint skipImages);
getUnpackSkipImages()454*8975f5c5SAndroid Build Coastguard Worker     GLint getUnpackSkipImages() const { return mUnpack.skipImages; }
455*8975f5c5SAndroid Build Coastguard Worker     void setUnpackSkipRows(GLint skipRows);
getUnpackSkipRows()456*8975f5c5SAndroid Build Coastguard Worker     GLint getUnpackSkipRows() const { return mUnpack.skipRows; }
457*8975f5c5SAndroid Build Coastguard Worker     void setUnpackSkipPixels(GLint skipPixels);
getUnpackSkipPixels()458*8975f5c5SAndroid Build Coastguard Worker     GLint getUnpackSkipPixels() const { return mUnpack.skipPixels; }
getUnpackState()459*8975f5c5SAndroid Build Coastguard Worker     const PixelUnpackState &getUnpackState() const { return mUnpack; }
getUnpackState()460*8975f5c5SAndroid Build Coastguard Worker     PixelUnpackState &getUnpackState() { return mUnpack; }
461*8975f5c5SAndroid Build Coastguard Worker 
462*8975f5c5SAndroid Build Coastguard Worker     // CHROMIUM_framebuffer_mixed_samples coverage modulation
463*8975f5c5SAndroid Build Coastguard Worker     void setCoverageModulation(GLenum components);
getCoverageModulation()464*8975f5c5SAndroid Build Coastguard Worker     GLenum getCoverageModulation() const { return mCoverageModulation; }
465*8975f5c5SAndroid Build Coastguard Worker 
466*8975f5c5SAndroid Build Coastguard Worker     // GL_EXT_sRGB_write_control
467*8975f5c5SAndroid Build Coastguard Worker     void setFramebufferSRGB(bool sRGB);
getFramebufferSRGB()468*8975f5c5SAndroid Build Coastguard Worker     bool getFramebufferSRGB() const { return mFramebufferSRGB; }
469*8975f5c5SAndroid Build Coastguard Worker 
470*8975f5c5SAndroid Build Coastguard Worker     // GL_EXT_tessellation_shader
471*8975f5c5SAndroid Build Coastguard Worker     void setPatchVertices(GLuint value);
getPatchVertices()472*8975f5c5SAndroid Build Coastguard Worker     GLuint getPatchVertices() const { return mPatchVertices; }
473*8975f5c5SAndroid Build Coastguard Worker 
474*8975f5c5SAndroid Build Coastguard Worker     // GL_ANGLE_shader_pixel_local_storage
475*8975f5c5SAndroid Build Coastguard Worker     void setPixelLocalStorageActivePlanes(GLsizei n);
getPixelLocalStorageActivePlanes()476*8975f5c5SAndroid Build Coastguard Worker     GLsizei getPixelLocalStorageActivePlanes() const { return mPixelLocalStorageActivePlanes; }
477*8975f5c5SAndroid Build Coastguard Worker     // While pixel local storage is active, some draw buffers may be reserved for internal use by
478*8975f5c5SAndroid Build Coastguard Worker     // PLS and blocked from the client. All draw buffers at or beyond 'firstActivePLSDrawBuffer' are
479*8975f5c5SAndroid Build Coastguard Worker     // overridden.
480*8975f5c5SAndroid Build Coastguard Worker     bool hasActivelyOverriddenPLSDrawBuffers(GLint *firstActivePLSDrawBuffer) const;
481*8975f5c5SAndroid Build Coastguard Worker     bool isActivelyOverriddenPLSDrawBuffer(GLint drawbuffer) const;
482*8975f5c5SAndroid Build Coastguard Worker 
483*8975f5c5SAndroid Build Coastguard Worker     // Line width state setter
484*8975f5c5SAndroid Build Coastguard Worker     void setLineWidth(GLfloat width);
getLineWidth()485*8975f5c5SAndroid Build Coastguard Worker     float getLineWidth() const { return mLineWidth; }
486*8975f5c5SAndroid Build Coastguard Worker 
487*8975f5c5SAndroid Build Coastguard Worker     void setActiveSampler(unsigned int active);
getActiveSampler()488*8975f5c5SAndroid Build Coastguard Worker     unsigned int getActiveSampler() const { return static_cast<unsigned int>(mActiveSampler); }
489*8975f5c5SAndroid Build Coastguard Worker 
490*8975f5c5SAndroid Build Coastguard Worker     // Hint setters
491*8975f5c5SAndroid Build Coastguard Worker     void setGenerateMipmapHint(GLenum hint);
getGenerateMipmapHint()492*8975f5c5SAndroid Build Coastguard Worker     GLenum getGenerateMipmapHint() const { return mGenerateMipmapHint; }
getFragmentShaderDerivativeHint()493*8975f5c5SAndroid Build Coastguard Worker     GLenum getFragmentShaderDerivativeHint() const { return mFragmentShaderDerivativeHint; }
494*8975f5c5SAndroid Build Coastguard Worker     void setFragmentShaderDerivativeHint(GLenum hint);
495*8975f5c5SAndroid Build Coastguard Worker 
getProvokingVertex()496*8975f5c5SAndroid Build Coastguard Worker     ProvokingVertexConvention getProvokingVertex() const { return mProvokingVertex; }
setProvokingVertex(ProvokingVertexConvention val)497*8975f5c5SAndroid Build Coastguard Worker     void setProvokingVertex(ProvokingVertexConvention val)
498*8975f5c5SAndroid Build Coastguard Worker     {
499*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_PROVOKING_VERTEX);
500*8975f5c5SAndroid Build Coastguard Worker         mProvokingVertex = val;
501*8975f5c5SAndroid Build Coastguard Worker     }
502*8975f5c5SAndroid Build Coastguard Worker 
getVertexAttribCurrentValue(size_t attribNum)503*8975f5c5SAndroid Build Coastguard Worker     const VertexAttribCurrentValueData &getVertexAttribCurrentValue(size_t attribNum) const
504*8975f5c5SAndroid Build Coastguard Worker     {
505*8975f5c5SAndroid Build Coastguard Worker         ASSERT(attribNum < mVertexAttribCurrentValues.size());
506*8975f5c5SAndroid Build Coastguard Worker         return mVertexAttribCurrentValues[attribNum];
507*8975f5c5SAndroid Build Coastguard Worker     }
getVertexAttribCurrentValues()508*8975f5c5SAndroid Build Coastguard Worker     const std::vector<VertexAttribCurrentValueData> &getVertexAttribCurrentValues() const
509*8975f5c5SAndroid Build Coastguard Worker     {
510*8975f5c5SAndroid Build Coastguard Worker         return mVertexAttribCurrentValues;
511*8975f5c5SAndroid Build Coastguard Worker     }
512*8975f5c5SAndroid Build Coastguard Worker     // This actually clears the current value dirty bits.
513*8975f5c5SAndroid Build Coastguard Worker     // TODO(jmadill): Pass mutable dirty bits into Impl.
514*8975f5c5SAndroid Build Coastguard Worker     AttributesMask getAndResetDirtyCurrentValues() const;
getCurrentValuesTypeMask()515*8975f5c5SAndroid Build Coastguard Worker     ComponentTypeMask getCurrentValuesTypeMask() const { return mCurrentValuesTypeMask; }
516*8975f5c5SAndroid Build Coastguard Worker 
getEnabledClipDistances()517*8975f5c5SAndroid Build Coastguard Worker     const ClipDistanceEnableBits &getEnabledClipDistances() const { return mClipDistancesEnabled; }
518*8975f5c5SAndroid Build Coastguard Worker     void setClipDistanceEnable(int idx, bool enable);
519*8975f5c5SAndroid Build Coastguard Worker 
noSimultaneousConstantColorAndAlphaBlendFunc()520*8975f5c5SAndroid Build Coastguard Worker     bool noSimultaneousConstantColorAndAlphaBlendFunc() const
521*8975f5c5SAndroid Build Coastguard Worker     {
522*8975f5c5SAndroid Build Coastguard Worker         return mNoSimultaneousConstantColorAndAlphaBlendFunc;
523*8975f5c5SAndroid Build Coastguard Worker     }
524*8975f5c5SAndroid Build Coastguard Worker 
getBoundingBoxMinX()525*8975f5c5SAndroid Build Coastguard Worker     GLfloat getBoundingBoxMinX() const { return mBoundingBoxMinX; }
getBoundingBoxMinY()526*8975f5c5SAndroid Build Coastguard Worker     GLfloat getBoundingBoxMinY() const { return mBoundingBoxMinY; }
getBoundingBoxMinZ()527*8975f5c5SAndroid Build Coastguard Worker     GLfloat getBoundingBoxMinZ() const { return mBoundingBoxMinZ; }
getBoundingBoxMinW()528*8975f5c5SAndroid Build Coastguard Worker     GLfloat getBoundingBoxMinW() const { return mBoundingBoxMinW; }
getBoundingBoxMaxX()529*8975f5c5SAndroid Build Coastguard Worker     GLfloat getBoundingBoxMaxX() const { return mBoundingBoxMaxX; }
getBoundingBoxMaxY()530*8975f5c5SAndroid Build Coastguard Worker     GLfloat getBoundingBoxMaxY() const { return mBoundingBoxMaxY; }
getBoundingBoxMaxZ()531*8975f5c5SAndroid Build Coastguard Worker     GLfloat getBoundingBoxMaxZ() const { return mBoundingBoxMaxZ; }
getBoundingBoxMaxW()532*8975f5c5SAndroid Build Coastguard Worker     GLfloat getBoundingBoxMaxW() const { return mBoundingBoxMaxW; }
533*8975f5c5SAndroid Build Coastguard Worker     void setBoundingBox(GLfloat minX,
534*8975f5c5SAndroid Build Coastguard Worker                         GLfloat minY,
535*8975f5c5SAndroid Build Coastguard Worker                         GLfloat minZ,
536*8975f5c5SAndroid Build Coastguard Worker                         GLfloat minW,
537*8975f5c5SAndroid Build Coastguard Worker                         GLfloat maxX,
538*8975f5c5SAndroid Build Coastguard Worker                         GLfloat maxY,
539*8975f5c5SAndroid Build Coastguard Worker                         GLfloat maxZ,
540*8975f5c5SAndroid Build Coastguard Worker                         GLfloat maxW);
541*8975f5c5SAndroid Build Coastguard Worker 
isTextureRectangleEnabled()542*8975f5c5SAndroid Build Coastguard Worker     bool isTextureRectangleEnabled() const { return mTextureRectangleEnabled; }
543*8975f5c5SAndroid Build Coastguard Worker 
getBlendFuncConstantAlphaDrawBuffers()544*8975f5c5SAndroid Build Coastguard Worker     DrawBufferMask getBlendFuncConstantAlphaDrawBuffers() const
545*8975f5c5SAndroid Build Coastguard Worker     {
546*8975f5c5SAndroid Build Coastguard Worker         return mBlendFuncConstantAlphaDrawBuffers;
547*8975f5c5SAndroid Build Coastguard Worker     }
548*8975f5c5SAndroid Build Coastguard Worker 
getBlendFuncConstantColorDrawBuffers()549*8975f5c5SAndroid Build Coastguard Worker     DrawBufferMask getBlendFuncConstantColorDrawBuffers() const
550*8975f5c5SAndroid Build Coastguard Worker     {
551*8975f5c5SAndroid Build Coastguard Worker         return mBlendFuncConstantColorDrawBuffers;
552*8975f5c5SAndroid Build Coastguard Worker     }
553*8975f5c5SAndroid Build Coastguard Worker 
554*8975f5c5SAndroid Build Coastguard Worker     void setLogicOpEnabled(bool enabled);
isLogicOpEnabled()555*8975f5c5SAndroid Build Coastguard Worker     bool isLogicOpEnabled() const { return mLogicOpEnabled; }
556*8975f5c5SAndroid Build Coastguard Worker 
557*8975f5c5SAndroid Build Coastguard Worker     void setLogicOp(LogicalOperation opcode);
getLogicOp()558*8975f5c5SAndroid Build Coastguard Worker     LogicalOperation getLogicOp() const { return mLogicOp; }
559*8975f5c5SAndroid Build Coastguard Worker 
560*8975f5c5SAndroid Build Coastguard Worker     // Vertex attrib manipulation
561*8975f5c5SAndroid Build Coastguard Worker     void setVertexAttribf(GLuint index, const GLfloat values[4]);
562*8975f5c5SAndroid Build Coastguard Worker     void setVertexAttribu(GLuint index, const GLuint values[4]);
563*8975f5c5SAndroid Build Coastguard Worker     void setVertexAttribi(GLuint index, const GLint values[4]);
564*8975f5c5SAndroid Build Coastguard Worker 
565*8975f5c5SAndroid Build Coastguard Worker     // QCOM_tiled_rendering
setTiledRendering(bool tiledRendering)566*8975f5c5SAndroid Build Coastguard Worker     void setTiledRendering(bool tiledRendering) { mTiledRendering = tiledRendering; }
isTiledRendering()567*8975f5c5SAndroid Build Coastguard Worker     bool isTiledRendering() const { return mTiledRendering; }
568*8975f5c5SAndroid Build Coastguard Worker 
569*8975f5c5SAndroid Build Coastguard Worker     // Debug state
getDebug()570*8975f5c5SAndroid Build Coastguard Worker     const Debug &getDebug() const { return mDebug; }
getDebug()571*8975f5c5SAndroid Build Coastguard Worker     Debug &getDebug() { return mDebug; }
572*8975f5c5SAndroid Build Coastguard Worker 
573*8975f5c5SAndroid Build Coastguard Worker     // GL_ANGLE_blob_cache
getBlobCacheCallbacks()574*8975f5c5SAndroid Build Coastguard Worker     const BlobCacheCallbacks &getBlobCacheCallbacks() const { return mBlobCacheCallbacks; }
getBlobCacheCallbacks()575*8975f5c5SAndroid Build Coastguard Worker     BlobCacheCallbacks &getBlobCacheCallbacks() { return mBlobCacheCallbacks; }
576*8975f5c5SAndroid Build Coastguard Worker 
577*8975f5c5SAndroid Build Coastguard Worker     // Generic state toggle & query
578*8975f5c5SAndroid Build Coastguard Worker     void setEnableFeature(GLenum feature, bool enabled);
579*8975f5c5SAndroid Build Coastguard Worker     void setEnableFeatureIndexed(GLenum feature, bool enabled, GLuint index);
580*8975f5c5SAndroid Build Coastguard Worker     bool getEnableFeature(GLenum feature) const;
581*8975f5c5SAndroid Build Coastguard Worker     bool getEnableFeatureIndexed(GLenum feature, GLuint index) const;
582*8975f5c5SAndroid Build Coastguard Worker 
583*8975f5c5SAndroid Build Coastguard Worker     // State query functions
584*8975f5c5SAndroid Build Coastguard Worker     void getBooleanv(GLenum pname, GLboolean *params) const;
585*8975f5c5SAndroid Build Coastguard Worker     void getFloatv(GLenum pname, GLfloat *params) const;
586*8975f5c5SAndroid Build Coastguard Worker     void getIntegerv(GLenum pname, GLint *params) const;
587*8975f5c5SAndroid Build Coastguard Worker     void getIntegeri_v(GLenum target, GLuint index, GLint *data) const;
588*8975f5c5SAndroid Build Coastguard Worker     void getBooleani_v(GLenum target, GLuint index, GLboolean *data) const;
589*8975f5c5SAndroid Build Coastguard Worker 
getMutableGLES1State()590*8975f5c5SAndroid Build Coastguard Worker     GLES1State *getMutableGLES1State() { return &mGLES1State; }
gles1()591*8975f5c5SAndroid Build Coastguard Worker     const GLES1State &gles1() const { return mGLES1State; }
592*8975f5c5SAndroid Build Coastguard Worker 
getDirtyBits()593*8975f5c5SAndroid Build Coastguard Worker     const state::DirtyBits &getDirtyBits() const { return mDirtyBits; }
clearDirtyBits()594*8975f5c5SAndroid Build Coastguard Worker     void clearDirtyBits() { mDirtyBits.reset(); }
clearDirtyBits(const state::DirtyBits & bitset)595*8975f5c5SAndroid Build Coastguard Worker     void clearDirtyBits(const state::DirtyBits &bitset) { mDirtyBits &= ~bitset; }
setAllDirtyBits()596*8975f5c5SAndroid Build Coastguard Worker     void setAllDirtyBits()
597*8975f5c5SAndroid Build Coastguard Worker     {
598*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set();
599*8975f5c5SAndroid Build Coastguard Worker         mExtendedDirtyBits.set();
600*8975f5c5SAndroid Build Coastguard Worker         mDirtyCurrentValues = mAllAttribsMask;
601*8975f5c5SAndroid Build Coastguard Worker     }
602*8975f5c5SAndroid Build Coastguard Worker 
getExtendedDirtyBits()603*8975f5c5SAndroid Build Coastguard Worker     const state::ExtendedDirtyBits &getExtendedDirtyBits() const { return mExtendedDirtyBits; }
clearExtendedDirtyBits()604*8975f5c5SAndroid Build Coastguard Worker     void clearExtendedDirtyBits() { mExtendedDirtyBits.reset(); }
clearExtendedDirtyBits(const state::ExtendedDirtyBits & bitset)605*8975f5c5SAndroid Build Coastguard Worker     void clearExtendedDirtyBits(const state::ExtendedDirtyBits &bitset)
606*8975f5c5SAndroid Build Coastguard Worker     {
607*8975f5c5SAndroid Build Coastguard Worker         mExtendedDirtyBits &= ~bitset;
608*8975f5c5SAndroid Build Coastguard Worker     }
609*8975f5c5SAndroid Build Coastguard Worker 
getDirtyObjects()610*8975f5c5SAndroid Build Coastguard Worker     const state::DirtyObjects &getDirtyObjects() const { return mDirtyObjects; }
clearDirtyObjects()611*8975f5c5SAndroid Build Coastguard Worker     void clearDirtyObjects() { mDirtyObjects.reset(); }
612*8975f5c5SAndroid Build Coastguard Worker 
setPerfMonitorActive(bool active)613*8975f5c5SAndroid Build Coastguard Worker     void setPerfMonitorActive(bool active) { mIsPerfMonitorActive = active; }
isPerfMonitorActive()614*8975f5c5SAndroid Build Coastguard Worker     bool isPerfMonitorActive() const { return mIsPerfMonitorActive; }
615*8975f5c5SAndroid Build Coastguard Worker 
616*8975f5c5SAndroid Build Coastguard Worker   private:
617*8975f5c5SAndroid Build Coastguard Worker     bool hasConstantColor(GLenum sourceRGB, GLenum destRGB) const;
618*8975f5c5SAndroid Build Coastguard Worker     bool hasConstantAlpha(GLenum sourceRGB, GLenum destRGB) const;
619*8975f5c5SAndroid Build Coastguard Worker 
620*8975f5c5SAndroid Build Coastguard Worker     const Version mClientVersion;
621*8975f5c5SAndroid Build Coastguard Worker 
622*8975f5c5SAndroid Build Coastguard Worker     // Caps to use for validation
623*8975f5c5SAndroid Build Coastguard Worker     Caps mCaps;
624*8975f5c5SAndroid Build Coastguard Worker     TextureCapsMap mTextureCaps;
625*8975f5c5SAndroid Build Coastguard Worker     Extensions mExtensions;
626*8975f5c5SAndroid Build Coastguard Worker     Limitations mLimitations;
627*8975f5c5SAndroid Build Coastguard Worker     const bool mIsExternal;
628*8975f5c5SAndroid Build Coastguard Worker 
629*8975f5c5SAndroid Build Coastguard Worker     ColorF mColorClearValue;
630*8975f5c5SAndroid Build Coastguard Worker     GLfloat mDepthClearValue;
631*8975f5c5SAndroid Build Coastguard Worker     int mStencilClearValue;
632*8975f5c5SAndroid Build Coastguard Worker 
633*8975f5c5SAndroid Build Coastguard Worker     RasterizerState mRasterizer;
634*8975f5c5SAndroid Build Coastguard Worker     bool mScissorTest;
635*8975f5c5SAndroid Build Coastguard Worker     Rectangle mScissor;
636*8975f5c5SAndroid Build Coastguard Worker 
637*8975f5c5SAndroid Build Coastguard Worker     bool mNoUnclampedBlendColor;
638*8975f5c5SAndroid Build Coastguard Worker 
639*8975f5c5SAndroid Build Coastguard Worker     BlendState mBlendState;  // Buffer zero blend state legacy struct
640*8975f5c5SAndroid Build Coastguard Worker     BlendStateExt mBlendStateExt;
641*8975f5c5SAndroid Build Coastguard Worker     ColorF mBlendColor;
642*8975f5c5SAndroid Build Coastguard Worker     bool mSampleAlphaToCoverage;
643*8975f5c5SAndroid Build Coastguard Worker     bool mSampleCoverage;
644*8975f5c5SAndroid Build Coastguard Worker     GLfloat mSampleCoverageValue;
645*8975f5c5SAndroid Build Coastguard Worker     bool mSampleCoverageInvert;
646*8975f5c5SAndroid Build Coastguard Worker     bool mSampleMask;
647*8975f5c5SAndroid Build Coastguard Worker     GLuint mMaxSampleMaskWords;
648*8975f5c5SAndroid Build Coastguard Worker     SampleMaskArray<GLbitfield> mSampleMaskValues;
649*8975f5c5SAndroid Build Coastguard Worker     bool mIsSampleShadingEnabled;
650*8975f5c5SAndroid Build Coastguard Worker     float mMinSampleShading;
651*8975f5c5SAndroid Build Coastguard Worker 
652*8975f5c5SAndroid Build Coastguard Worker     DepthStencilState mDepthStencil;
653*8975f5c5SAndroid Build Coastguard Worker     GLint mStencilRef;
654*8975f5c5SAndroid Build Coastguard Worker     GLint mStencilBackRef;
655*8975f5c5SAndroid Build Coastguard Worker 
656*8975f5c5SAndroid Build Coastguard Worker     GLfloat mLineWidth;
657*8975f5c5SAndroid Build Coastguard Worker 
658*8975f5c5SAndroid Build Coastguard Worker     GLenum mGenerateMipmapHint;
659*8975f5c5SAndroid Build Coastguard Worker     GLenum mFragmentShaderDerivativeHint;
660*8975f5c5SAndroid Build Coastguard Worker 
661*8975f5c5SAndroid Build Coastguard Worker     Rectangle mViewport;
662*8975f5c5SAndroid Build Coastguard Worker     float mNearZ;
663*8975f5c5SAndroid Build Coastguard Worker     float mFarZ;
664*8975f5c5SAndroid Build Coastguard Worker 
665*8975f5c5SAndroid Build Coastguard Worker     ClipOrigin mClipOrigin;
666*8975f5c5SAndroid Build Coastguard Worker     ClipDepthMode mClipDepthMode;
667*8975f5c5SAndroid Build Coastguard Worker 
668*8975f5c5SAndroid Build Coastguard Worker     // GL_ANGLE_provoking_vertex
669*8975f5c5SAndroid Build Coastguard Worker     ProvokingVertexConvention mProvokingVertex;
670*8975f5c5SAndroid Build Coastguard Worker 
671*8975f5c5SAndroid Build Coastguard Worker     using VertexAttribVector = std::vector<VertexAttribCurrentValueData>;
672*8975f5c5SAndroid Build Coastguard Worker     VertexAttribVector mVertexAttribCurrentValues;  // From glVertexAttrib
673*8975f5c5SAndroid Build Coastguard Worker     ComponentTypeMask mCurrentValuesTypeMask;
674*8975f5c5SAndroid Build Coastguard Worker 
675*8975f5c5SAndroid Build Coastguard Worker     // Mask of all attributes that are available to this context: [0, maxVertexAttributes)
676*8975f5c5SAndroid Build Coastguard Worker     AttributesMask mAllAttribsMask;
677*8975f5c5SAndroid Build Coastguard Worker 
678*8975f5c5SAndroid Build Coastguard Worker     // Texture and sampler bindings
679*8975f5c5SAndroid Build Coastguard Worker     GLint mActiveSampler;  // Active texture unit selector - GL_TEXTURE0
680*8975f5c5SAndroid Build Coastguard Worker 
681*8975f5c5SAndroid Build Coastguard Worker     PixelUnpackState mUnpack;
682*8975f5c5SAndroid Build Coastguard Worker     PixelPackState mPack;
683*8975f5c5SAndroid Build Coastguard Worker 
684*8975f5c5SAndroid Build Coastguard Worker     bool mPrimitiveRestart;
685*8975f5c5SAndroid Build Coastguard Worker 
686*8975f5c5SAndroid Build Coastguard Worker     bool mMultiSampling;
687*8975f5c5SAndroid Build Coastguard Worker     bool mSampleAlphaToOne;
688*8975f5c5SAndroid Build Coastguard Worker 
689*8975f5c5SAndroid Build Coastguard Worker     // GL_KHR_blend_equation_advanced_coherent
690*8975f5c5SAndroid Build Coastguard Worker     bool mBlendAdvancedCoherent;
691*8975f5c5SAndroid Build Coastguard Worker 
692*8975f5c5SAndroid Build Coastguard Worker     GLenum mCoverageModulation;
693*8975f5c5SAndroid Build Coastguard Worker 
694*8975f5c5SAndroid Build Coastguard Worker     // GL_EXT_sRGB_write_control
695*8975f5c5SAndroid Build Coastguard Worker     bool mFramebufferSRGB;
696*8975f5c5SAndroid Build Coastguard Worker 
697*8975f5c5SAndroid Build Coastguard Worker     // GL_ANGLE_webgl_compatibility
698*8975f5c5SAndroid Build Coastguard Worker     bool mTextureRectangleEnabled;
699*8975f5c5SAndroid Build Coastguard Worker 
700*8975f5c5SAndroid Build Coastguard Worker     // GL_ANGLE_logic_op
701*8975f5c5SAndroid Build Coastguard Worker     bool mLogicOpEnabled;
702*8975f5c5SAndroid Build Coastguard Worker     LogicalOperation mLogicOp;
703*8975f5c5SAndroid Build Coastguard Worker 
704*8975f5c5SAndroid Build Coastguard Worker     // GL_APPLE_clip_distance / GL_EXT_clip_cull_distance / GL_ANGLE_clip_cull_distance
705*8975f5c5SAndroid Build Coastguard Worker     ClipDistanceEnableBits mClipDistancesEnabled;
706*8975f5c5SAndroid Build Coastguard Worker 
707*8975f5c5SAndroid Build Coastguard Worker     // GL_EXT_tessellation_shader
708*8975f5c5SAndroid Build Coastguard Worker     GLuint mPatchVertices;
709*8975f5c5SAndroid Build Coastguard Worker 
710*8975f5c5SAndroid Build Coastguard Worker     // GL_ANGLE_shader_pixel_local_storage
711*8975f5c5SAndroid Build Coastguard Worker     GLsizei mPixelLocalStorageActivePlanes;
712*8975f5c5SAndroid Build Coastguard Worker 
713*8975f5c5SAndroid Build Coastguard Worker     // GLES1 emulation: state specific to GLES1
714*8975f5c5SAndroid Build Coastguard Worker     GLES1State mGLES1State;
715*8975f5c5SAndroid Build Coastguard Worker 
716*8975f5c5SAndroid Build Coastguard Worker     // OES_draw_buffers_indexed
717*8975f5c5SAndroid Build Coastguard Worker     DrawBufferMask mBlendFuncConstantAlphaDrawBuffers;
718*8975f5c5SAndroid Build Coastguard Worker     DrawBufferMask mBlendFuncConstantColorDrawBuffers;
719*8975f5c5SAndroid Build Coastguard Worker     bool mNoSimultaneousConstantColorAndAlphaBlendFunc;
720*8975f5c5SAndroid Build Coastguard Worker     // Whether the indexed variants of setBlend* have been called.  If so, the call to the
721*8975f5c5SAndroid Build Coastguard Worker     // non-indexed variants are not no-oped.
722*8975f5c5SAndroid Build Coastguard Worker     bool mSetBlendIndexedInvoked;
723*8975f5c5SAndroid Build Coastguard Worker     bool mSetBlendFactorsIndexedInvoked;
724*8975f5c5SAndroid Build Coastguard Worker     bool mSetBlendEquationsIndexedInvoked;
725*8975f5c5SAndroid Build Coastguard Worker 
726*8975f5c5SAndroid Build Coastguard Worker     // GL_EXT_primitive_bounding_box
727*8975f5c5SAndroid Build Coastguard Worker     GLfloat mBoundingBoxMinX;
728*8975f5c5SAndroid Build Coastguard Worker     GLfloat mBoundingBoxMinY;
729*8975f5c5SAndroid Build Coastguard Worker     GLfloat mBoundingBoxMinZ;
730*8975f5c5SAndroid Build Coastguard Worker     GLfloat mBoundingBoxMinW;
731*8975f5c5SAndroid Build Coastguard Worker     GLfloat mBoundingBoxMaxX;
732*8975f5c5SAndroid Build Coastguard Worker     GLfloat mBoundingBoxMaxY;
733*8975f5c5SAndroid Build Coastguard Worker     GLfloat mBoundingBoxMaxZ;
734*8975f5c5SAndroid Build Coastguard Worker     GLfloat mBoundingBoxMaxW;
735*8975f5c5SAndroid Build Coastguard Worker 
736*8975f5c5SAndroid Build Coastguard Worker     // QCOM_shading_rate
737*8975f5c5SAndroid Build Coastguard Worker     bool mShadingRatePreserveAspectRatio;
738*8975f5c5SAndroid Build Coastguard Worker     ShadingRate mShadingRate;
739*8975f5c5SAndroid Build Coastguard Worker 
740*8975f5c5SAndroid Build Coastguard Worker     // GL_ARM_shader_framebuffer_fetch
741*8975f5c5SAndroid Build Coastguard Worker     bool mFetchPerSample;
742*8975f5c5SAndroid Build Coastguard Worker 
743*8975f5c5SAndroid Build Coastguard Worker     // Whether perf monitoring is enabled through GL_AMD_performance_monitor.
744*8975f5c5SAndroid Build Coastguard Worker     bool mIsPerfMonitorActive;
745*8975f5c5SAndroid Build Coastguard Worker 
746*8975f5c5SAndroid Build Coastguard Worker     // QCOM_tiled_rendering
747*8975f5c5SAndroid Build Coastguard Worker     bool mTiledRendering;
748*8975f5c5SAndroid Build Coastguard Worker 
749*8975f5c5SAndroid Build Coastguard Worker     const bool mBindGeneratesResource;
750*8975f5c5SAndroid Build Coastguard Worker     const bool mClientArraysEnabled;
751*8975f5c5SAndroid Build Coastguard Worker     const bool mRobustResourceInit;
752*8975f5c5SAndroid Build Coastguard Worker     const bool mProgramBinaryCacheEnabled;
753*8975f5c5SAndroid Build Coastguard Worker 
754*8975f5c5SAndroid Build Coastguard Worker     Debug mDebug;
755*8975f5c5SAndroid Build Coastguard Worker 
756*8975f5c5SAndroid Build Coastguard Worker     // ANGLE_blob_cache
757*8975f5c5SAndroid Build Coastguard Worker     BlobCacheCallbacks mBlobCacheCallbacks;
758*8975f5c5SAndroid Build Coastguard Worker 
759*8975f5c5SAndroid Build Coastguard Worker     state::DirtyBits mDirtyBits;
760*8975f5c5SAndroid Build Coastguard Worker     state::ExtendedDirtyBits mExtendedDirtyBits;
761*8975f5c5SAndroid Build Coastguard Worker     state::DirtyObjects mDirtyObjects;
762*8975f5c5SAndroid Build Coastguard Worker     mutable AttributesMask mDirtyCurrentValues;
763*8975f5c5SAndroid Build Coastguard Worker };
764*8975f5c5SAndroid Build Coastguard Worker 
765*8975f5c5SAndroid Build Coastguard Worker // This class represents all of the GL context's state.
766*8975f5c5SAndroid Build Coastguard Worker class State : angle::NonCopyable
767*8975f5c5SAndroid Build Coastguard Worker {
768*8975f5c5SAndroid Build Coastguard Worker   public:
769*8975f5c5SAndroid Build Coastguard Worker     State(const State *shareContextState,
770*8975f5c5SAndroid Build Coastguard Worker           egl::ShareGroup *shareGroup,
771*8975f5c5SAndroid Build Coastguard Worker           TextureManager *shareTextures,
772*8975f5c5SAndroid Build Coastguard Worker           SemaphoreManager *shareSemaphores,
773*8975f5c5SAndroid Build Coastguard Worker           egl::ContextMutex *contextMutex,
774*8975f5c5SAndroid Build Coastguard Worker           const OverlayType *overlay,
775*8975f5c5SAndroid Build Coastguard Worker           const Version &clientVersion,
776*8975f5c5SAndroid Build Coastguard Worker           bool debug,
777*8975f5c5SAndroid Build Coastguard Worker           bool bindGeneratesResourceCHROMIUM,
778*8975f5c5SAndroid Build Coastguard Worker           bool clientArraysEnabled,
779*8975f5c5SAndroid Build Coastguard Worker           bool robustResourceInit,
780*8975f5c5SAndroid Build Coastguard Worker           bool programBinaryCacheEnabled,
781*8975f5c5SAndroid Build Coastguard Worker           EGLenum contextPriority,
782*8975f5c5SAndroid Build Coastguard Worker           bool hasRobustAccess,
783*8975f5c5SAndroid Build Coastguard Worker           bool hasProtectedContent,
784*8975f5c5SAndroid Build Coastguard Worker           bool isExternal);
785*8975f5c5SAndroid Build Coastguard Worker     ~State();
786*8975f5c5SAndroid Build Coastguard Worker 
787*8975f5c5SAndroid Build Coastguard Worker     void initialize(Context *context);
788*8975f5c5SAndroid Build Coastguard Worker     void reset(const Context *context);
789*8975f5c5SAndroid Build Coastguard Worker 
790*8975f5c5SAndroid Build Coastguard Worker     // Getters
getContextID()791*8975f5c5SAndroid Build Coastguard Worker     ContextID getContextID() const { return mID; }
getContextPriority()792*8975f5c5SAndroid Build Coastguard Worker     EGLenum getContextPriority() const { return mContextPriority; }
hasRobustAccess()793*8975f5c5SAndroid Build Coastguard Worker     bool hasRobustAccess() const { return mHasRobustAccess; }
hasProtectedContent()794*8975f5c5SAndroid Build Coastguard Worker     bool hasProtectedContent() const { return mHasProtectedContent; }
isDebugContext()795*8975f5c5SAndroid Build Coastguard Worker     bool isDebugContext() const { return mIsDebugContext; }
getClientMajorVersion()796*8975f5c5SAndroid Build Coastguard Worker     GLint getClientMajorVersion() const { return mPrivateState.getClientMajorVersion(); }
getClientMinorVersion()797*8975f5c5SAndroid Build Coastguard Worker     GLint getClientMinorVersion() const { return mPrivateState.getClientMinorVersion(); }
getClientVersion()798*8975f5c5SAndroid Build Coastguard Worker     const Version &getClientVersion() const { return mPrivateState.getClientVersion(); }
getShareGroup()799*8975f5c5SAndroid Build Coastguard Worker     egl::ShareGroup *getShareGroup() const { return mShareGroup; }
800*8975f5c5SAndroid Build Coastguard Worker 
isWebGL()801*8975f5c5SAndroid Build Coastguard Worker     bool isWebGL() const { return mPrivateState.isWebGL(); }
isWebGL1()802*8975f5c5SAndroid Build Coastguard Worker     bool isWebGL1() const { return mPrivateState.isWebGL1(); }
isGLES1()803*8975f5c5SAndroid Build Coastguard Worker     bool isGLES1() const { return mPrivateState.isGLES1(); }
804*8975f5c5SAndroid Build Coastguard Worker 
getCaps()805*8975f5c5SAndroid Build Coastguard Worker     const Caps &getCaps() const { return mPrivateState.getCaps(); }
getTextureCaps()806*8975f5c5SAndroid Build Coastguard Worker     const TextureCapsMap &getTextureCaps() const { return mPrivateState.getTextureCaps(); }
getExtensions()807*8975f5c5SAndroid Build Coastguard Worker     const Extensions &getExtensions() const { return mPrivateState.getExtensions(); }
getLimitations()808*8975f5c5SAndroid Build Coastguard Worker     const Limitations &getLimitations() const { return mPrivateState.getLimitations(); }
809*8975f5c5SAndroid Build Coastguard Worker 
isExternal()810*8975f5c5SAndroid Build Coastguard Worker     bool isExternal() const { return mPrivateState.isExternal(); }
811*8975f5c5SAndroid Build Coastguard Worker 
getMutableCaps()812*8975f5c5SAndroid Build Coastguard Worker     Caps *getMutableCaps() { return mPrivateState.getMutableCaps(); }
getMutableTextureCaps()813*8975f5c5SAndroid Build Coastguard Worker     TextureCapsMap *getMutableTextureCaps() { return mPrivateState.getMutableTextureCaps(); }
getMutableExtensions()814*8975f5c5SAndroid Build Coastguard Worker     Extensions *getMutableExtensions() { return mPrivateState.getMutableExtensions(); }
getMutableLimitations()815*8975f5c5SAndroid Build Coastguard Worker     Limitations *getMutableLimitations() { return mPrivateState.getMutableLimitations(); }
816*8975f5c5SAndroid Build Coastguard Worker 
getTextureCap(GLenum internalFormat)817*8975f5c5SAndroid Build Coastguard Worker     const TextureCaps &getTextureCap(GLenum internalFormat) const
818*8975f5c5SAndroid Build Coastguard Worker     {
819*8975f5c5SAndroid Build Coastguard Worker         return getTextureCaps().get(internalFormat);
820*8975f5c5SAndroid Build Coastguard Worker     }
821*8975f5c5SAndroid Build Coastguard Worker 
822*8975f5c5SAndroid Build Coastguard Worker     bool allActiveDrawBufferChannelsMasked() const;
823*8975f5c5SAndroid Build Coastguard Worker     bool anyActiveDrawBufferChannelMasked() const;
824*8975f5c5SAndroid Build Coastguard Worker 
825*8975f5c5SAndroid Build Coastguard Worker     // Texture binding & active texture unit manipulation
826*8975f5c5SAndroid Build Coastguard Worker     void setSamplerTexture(const Context *context, TextureType type, Texture *texture);
827*8975f5c5SAndroid Build Coastguard Worker     Texture *getTargetTexture(TextureType type) const;
828*8975f5c5SAndroid Build Coastguard Worker 
getSamplerTexture(unsigned int sampler,TextureType type)829*8975f5c5SAndroid Build Coastguard Worker     Texture *getSamplerTexture(unsigned int sampler, TextureType type) const
830*8975f5c5SAndroid Build Coastguard Worker     {
831*8975f5c5SAndroid Build Coastguard Worker         ASSERT(sampler < mSamplerTextures[type].size());
832*8975f5c5SAndroid Build Coastguard Worker         return mSamplerTextures[type][sampler].get();
833*8975f5c5SAndroid Build Coastguard Worker     }
834*8975f5c5SAndroid Build Coastguard Worker 
835*8975f5c5SAndroid Build Coastguard Worker     TextureID getSamplerTextureId(unsigned int sampler, TextureType type) const;
836*8975f5c5SAndroid Build Coastguard Worker     void detachTexture(Context *context, const TextureMap &zeroTextures, TextureID texture);
837*8975f5c5SAndroid Build Coastguard Worker     void initializeZeroTextures(const Context *context, const TextureMap &zeroTextures);
838*8975f5c5SAndroid Build Coastguard Worker 
839*8975f5c5SAndroid Build Coastguard Worker     void invalidateTextureBindings(TextureType type);
840*8975f5c5SAndroid Build Coastguard Worker 
841*8975f5c5SAndroid Build Coastguard Worker     // Sampler object binding manipulation
842*8975f5c5SAndroid Build Coastguard Worker     void setSamplerBinding(const Context *context, GLuint textureUnit, Sampler *sampler);
getSamplerId(GLuint textureUnit)843*8975f5c5SAndroid Build Coastguard Worker     SamplerID getSamplerId(GLuint textureUnit) const
844*8975f5c5SAndroid Build Coastguard Worker     {
845*8975f5c5SAndroid Build Coastguard Worker         ASSERT(textureUnit < mSamplers.size());
846*8975f5c5SAndroid Build Coastguard Worker         return mSamplers[textureUnit].id();
847*8975f5c5SAndroid Build Coastguard Worker     }
848*8975f5c5SAndroid Build Coastguard Worker 
getSampler(GLuint textureUnit)849*8975f5c5SAndroid Build Coastguard Worker     Sampler *getSampler(GLuint textureUnit) const { return mSamplers[textureUnit].get(); }
850*8975f5c5SAndroid Build Coastguard Worker 
getSamplers()851*8975f5c5SAndroid Build Coastguard Worker     const SamplerBindingVector &getSamplers() const { return mSamplers; }
852*8975f5c5SAndroid Build Coastguard Worker 
853*8975f5c5SAndroid Build Coastguard Worker     void detachSampler(const Context *context, SamplerID sampler);
854*8975f5c5SAndroid Build Coastguard Worker 
855*8975f5c5SAndroid Build Coastguard Worker     // Renderbuffer binding manipulation
856*8975f5c5SAndroid Build Coastguard Worker     void setRenderbufferBinding(const Context *context, Renderbuffer *renderbuffer);
getRenderbufferId()857*8975f5c5SAndroid Build Coastguard Worker     RenderbufferID getRenderbufferId() const { return mRenderbuffer.id(); }
getCurrentRenderbuffer()858*8975f5c5SAndroid Build Coastguard Worker     Renderbuffer *getCurrentRenderbuffer() const { return mRenderbuffer.get(); }
859*8975f5c5SAndroid Build Coastguard Worker     void detachRenderbuffer(Context *context, RenderbufferID renderbuffer);
860*8975f5c5SAndroid Build Coastguard Worker 
861*8975f5c5SAndroid Build Coastguard Worker     // Framebuffer binding manipulation
862*8975f5c5SAndroid Build Coastguard Worker     void setReadFramebufferBinding(Framebuffer *framebuffer);
863*8975f5c5SAndroid Build Coastguard Worker     void setDrawFramebufferBinding(Framebuffer *framebuffer);
864*8975f5c5SAndroid Build Coastguard Worker     Framebuffer *getTargetFramebuffer(GLenum target) const;
getReadFramebuffer()865*8975f5c5SAndroid Build Coastguard Worker     Framebuffer *getReadFramebuffer() const { return mReadFramebuffer; }
getDrawFramebuffer()866*8975f5c5SAndroid Build Coastguard Worker     Framebuffer *getDrawFramebuffer() const { return mDrawFramebuffer; }
867*8975f5c5SAndroid Build Coastguard Worker     Framebuffer *getDefaultFramebuffer() const;
868*8975f5c5SAndroid Build Coastguard Worker 
869*8975f5c5SAndroid Build Coastguard Worker     bool removeReadFramebufferBinding(FramebufferID framebuffer);
870*8975f5c5SAndroid Build Coastguard Worker     bool removeDrawFramebufferBinding(FramebufferID framebuffer);
871*8975f5c5SAndroid Build Coastguard Worker 
872*8975f5c5SAndroid Build Coastguard Worker     // Vertex array object binding manipulation
873*8975f5c5SAndroid Build Coastguard Worker     void setVertexArrayBinding(const Context *context, VertexArray *vertexArray);
874*8975f5c5SAndroid Build Coastguard Worker     bool removeVertexArrayBinding(const Context *context, VertexArrayID vertexArray);
875*8975f5c5SAndroid Build Coastguard Worker     VertexArrayID getVertexArrayId() const;
876*8975f5c5SAndroid Build Coastguard Worker 
getVertexArray()877*8975f5c5SAndroid Build Coastguard Worker     VertexArray *getVertexArray() const
878*8975f5c5SAndroid Build Coastguard Worker     {
879*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mVertexArray != nullptr);
880*8975f5c5SAndroid Build Coastguard Worker         return mVertexArray;
881*8975f5c5SAndroid Build Coastguard Worker     }
882*8975f5c5SAndroid Build Coastguard Worker 
883*8975f5c5SAndroid Build Coastguard Worker     // If both a Program and a ProgramPipeline are bound, the Program will
884*8975f5c5SAndroid Build Coastguard Worker     // always override the ProgramPipeline.
getProgramExecutable()885*8975f5c5SAndroid Build Coastguard Worker     ProgramExecutable *getProgramExecutable() const { return mExecutable.get(); }
ensureNoPendingLink(const Context * context)886*8975f5c5SAndroid Build Coastguard Worker     void ensureNoPendingLink(const Context *context) const
887*8975f5c5SAndroid Build Coastguard Worker     {
888*8975f5c5SAndroid Build Coastguard Worker         if (mProgram)
889*8975f5c5SAndroid Build Coastguard Worker         {
890*8975f5c5SAndroid Build Coastguard Worker             mProgram->resolveLink(context);
891*8975f5c5SAndroid Build Coastguard Worker         }
892*8975f5c5SAndroid Build Coastguard Worker         else if (mProgramPipeline.get())
893*8975f5c5SAndroid Build Coastguard Worker         {
894*8975f5c5SAndroid Build Coastguard Worker             mProgramPipeline->resolveLink(context);
895*8975f5c5SAndroid Build Coastguard Worker         }
896*8975f5c5SAndroid Build Coastguard Worker     }
getLinkedProgramExecutable(const Context * context)897*8975f5c5SAndroid Build Coastguard Worker     ProgramExecutable *getLinkedProgramExecutable(const Context *context) const
898*8975f5c5SAndroid Build Coastguard Worker     {
899*8975f5c5SAndroid Build Coastguard Worker         ensureNoPendingLink(context);
900*8975f5c5SAndroid Build Coastguard Worker         return mExecutable.get();
901*8975f5c5SAndroid Build Coastguard Worker     }
902*8975f5c5SAndroid Build Coastguard Worker 
903*8975f5c5SAndroid Build Coastguard Worker     // Program binding manipulation
904*8975f5c5SAndroid Build Coastguard Worker     angle::Result setProgram(const Context *context, Program *newProgram);
905*8975f5c5SAndroid Build Coastguard Worker 
getProgram()906*8975f5c5SAndroid Build Coastguard Worker     Program *getProgram() const
907*8975f5c5SAndroid Build Coastguard Worker     {
908*8975f5c5SAndroid Build Coastguard Worker         ASSERT(!mProgram || !mProgram->isLinking());
909*8975f5c5SAndroid Build Coastguard Worker         return mProgram;
910*8975f5c5SAndroid Build Coastguard Worker     }
911*8975f5c5SAndroid Build Coastguard Worker 
getLinkedProgram(const Context * context)912*8975f5c5SAndroid Build Coastguard Worker     Program *getLinkedProgram(const Context *context) const
913*8975f5c5SAndroid Build Coastguard Worker     {
914*8975f5c5SAndroid Build Coastguard Worker         if (mProgram)
915*8975f5c5SAndroid Build Coastguard Worker         {
916*8975f5c5SAndroid Build Coastguard Worker             mProgram->resolveLink(context);
917*8975f5c5SAndroid Build Coastguard Worker         }
918*8975f5c5SAndroid Build Coastguard Worker         return mProgram;
919*8975f5c5SAndroid Build Coastguard Worker     }
920*8975f5c5SAndroid Build Coastguard Worker 
getProgramPipeline()921*8975f5c5SAndroid Build Coastguard Worker     ProgramPipeline *getProgramPipeline() const { return mProgramPipeline.get(); }
922*8975f5c5SAndroid Build Coastguard Worker 
getLinkedProgramPipeline(const Context * context)923*8975f5c5SAndroid Build Coastguard Worker     ProgramPipeline *getLinkedProgramPipeline(const Context *context) const
924*8975f5c5SAndroid Build Coastguard Worker     {
925*8975f5c5SAndroid Build Coastguard Worker         if (mProgramPipeline.get())
926*8975f5c5SAndroid Build Coastguard Worker         {
927*8975f5c5SAndroid Build Coastguard Worker             mProgramPipeline->resolveLink(context);
928*8975f5c5SAndroid Build Coastguard Worker         }
929*8975f5c5SAndroid Build Coastguard Worker         return mProgramPipeline.get();
930*8975f5c5SAndroid Build Coastguard Worker     }
931*8975f5c5SAndroid Build Coastguard Worker 
932*8975f5c5SAndroid Build Coastguard Worker     // Transform feedback object (not buffer) binding manipulation
933*8975f5c5SAndroid Build Coastguard Worker     void setTransformFeedbackBinding(const Context *context, TransformFeedback *transformFeedback);
getCurrentTransformFeedback()934*8975f5c5SAndroid Build Coastguard Worker     TransformFeedback *getCurrentTransformFeedback() const { return mTransformFeedback.get(); }
935*8975f5c5SAndroid Build Coastguard Worker 
isTransformFeedbackActive()936*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE bool isTransformFeedbackActive() const
937*8975f5c5SAndroid Build Coastguard Worker     {
938*8975f5c5SAndroid Build Coastguard Worker         TransformFeedback *curTransformFeedback = mTransformFeedback.get();
939*8975f5c5SAndroid Build Coastguard Worker         return curTransformFeedback && curTransformFeedback->isActive();
940*8975f5c5SAndroid Build Coastguard Worker     }
isTransformFeedbackActiveUnpaused()941*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE bool isTransformFeedbackActiveUnpaused() const
942*8975f5c5SAndroid Build Coastguard Worker     {
943*8975f5c5SAndroid Build Coastguard Worker         TransformFeedback *curTransformFeedback = mTransformFeedback.get();
944*8975f5c5SAndroid Build Coastguard Worker         return curTransformFeedback && curTransformFeedback->isActive() &&
945*8975f5c5SAndroid Build Coastguard Worker                !curTransformFeedback->isPaused();
946*8975f5c5SAndroid Build Coastguard Worker     }
947*8975f5c5SAndroid Build Coastguard Worker 
948*8975f5c5SAndroid Build Coastguard Worker     bool removeTransformFeedbackBinding(const Context *context,
949*8975f5c5SAndroid Build Coastguard Worker                                         TransformFeedbackID transformFeedback);
950*8975f5c5SAndroid Build Coastguard Worker 
951*8975f5c5SAndroid Build Coastguard Worker     // Query binding manipulation
952*8975f5c5SAndroid Build Coastguard Worker     bool isQueryActive(QueryType type) const;
953*8975f5c5SAndroid Build Coastguard Worker     bool isQueryActive(Query *query) const;
954*8975f5c5SAndroid Build Coastguard Worker     void setActiveQuery(const Context *context, QueryType type, Query *query);
955*8975f5c5SAndroid Build Coastguard Worker     QueryID getActiveQueryId(QueryType type) const;
956*8975f5c5SAndroid Build Coastguard Worker     Query *getActiveQuery(QueryType type) const;
957*8975f5c5SAndroid Build Coastguard Worker 
958*8975f5c5SAndroid Build Coastguard Worker     // Program Pipeline binding manipulation
959*8975f5c5SAndroid Build Coastguard Worker     angle::Result setProgramPipelineBinding(const Context *context, ProgramPipeline *pipeline);
960*8975f5c5SAndroid Build Coastguard Worker     void detachProgramPipeline(const Context *context, ProgramPipelineID pipeline);
961*8975f5c5SAndroid Build Coastguard Worker 
962*8975f5c5SAndroid Build Coastguard Worker     //// Typed buffer binding point manipulation ////
setBufferBinding(const Context * context,BufferBinding target,Buffer * buffer)963*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE void setBufferBinding(const Context *context, BufferBinding target, Buffer *buffer)
964*8975f5c5SAndroid Build Coastguard Worker     {
965*8975f5c5SAndroid Build Coastguard Worker         (this->*(kBufferSetters[target]))(context, buffer);
966*8975f5c5SAndroid Build Coastguard Worker     }
967*8975f5c5SAndroid Build Coastguard Worker 
getTargetBuffer(BufferBinding target)968*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE Buffer *getTargetBuffer(BufferBinding target) const
969*8975f5c5SAndroid Build Coastguard Worker     {
970*8975f5c5SAndroid Build Coastguard Worker         switch (target)
971*8975f5c5SAndroid Build Coastguard Worker         {
972*8975f5c5SAndroid Build Coastguard Worker             case BufferBinding::ElementArray:
973*8975f5c5SAndroid Build Coastguard Worker                 return getVertexArray()->getElementArrayBuffer();
974*8975f5c5SAndroid Build Coastguard Worker             default:
975*8975f5c5SAndroid Build Coastguard Worker                 return mBoundBuffers[target].get();
976*8975f5c5SAndroid Build Coastguard Worker         }
977*8975f5c5SAndroid Build Coastguard Worker     }
978*8975f5c5SAndroid Build Coastguard Worker 
getArrayBuffer()979*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE Buffer *getArrayBuffer() const { return getTargetBuffer(BufferBinding::Array); }
980*8975f5c5SAndroid Build Coastguard Worker 
981*8975f5c5SAndroid Build Coastguard Worker     angle::Result setIndexedBufferBinding(const Context *context,
982*8975f5c5SAndroid Build Coastguard Worker                                           BufferBinding target,
983*8975f5c5SAndroid Build Coastguard Worker                                           GLuint index,
984*8975f5c5SAndroid Build Coastguard Worker                                           Buffer *buffer,
985*8975f5c5SAndroid Build Coastguard Worker                                           GLintptr offset,
986*8975f5c5SAndroid Build Coastguard Worker                                           GLsizeiptr size);
987*8975f5c5SAndroid Build Coastguard Worker 
getAtomicCounterBufferCount()988*8975f5c5SAndroid Build Coastguard Worker     size_t getAtomicCounterBufferCount() const { return mAtomicCounterBuffers.size(); }
989*8975f5c5SAndroid Build Coastguard Worker 
hasValidAtomicCounterBuffer()990*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE bool hasValidAtomicCounterBuffer() const
991*8975f5c5SAndroid Build Coastguard Worker     {
992*8975f5c5SAndroid Build Coastguard Worker         return mBoundAtomicCounterBuffersMask.any();
993*8975f5c5SAndroid Build Coastguard Worker     }
994*8975f5c5SAndroid Build Coastguard Worker 
995*8975f5c5SAndroid Build Coastguard Worker     const OffsetBindingPointer<Buffer> &getIndexedUniformBuffer(size_t index) const;
996*8975f5c5SAndroid Build Coastguard Worker     const OffsetBindingPointer<Buffer> &getIndexedAtomicCounterBuffer(size_t index) const;
997*8975f5c5SAndroid Build Coastguard Worker     const OffsetBindingPointer<Buffer> &getIndexedShaderStorageBuffer(size_t index) const;
998*8975f5c5SAndroid Build Coastguard Worker 
getUniformBuffersMask()999*8975f5c5SAndroid Build Coastguard Worker     const angle::BitSet<gl::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS> &getUniformBuffersMask()
1000*8975f5c5SAndroid Build Coastguard Worker         const
1001*8975f5c5SAndroid Build Coastguard Worker     {
1002*8975f5c5SAndroid Build Coastguard Worker         return mBoundUniformBuffersMask;
1003*8975f5c5SAndroid Build Coastguard Worker     }
1004*8975f5c5SAndroid Build Coastguard Worker     const angle::BitSet<gl::IMPLEMENTATION_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS> &
getAtomicCounterBuffersMask()1005*8975f5c5SAndroid Build Coastguard Worker     getAtomicCounterBuffersMask() const
1006*8975f5c5SAndroid Build Coastguard Worker     {
1007*8975f5c5SAndroid Build Coastguard Worker         return mBoundAtomicCounterBuffersMask;
1008*8975f5c5SAndroid Build Coastguard Worker     }
1009*8975f5c5SAndroid Build Coastguard Worker     const angle::BitSet<gl::IMPLEMENTATION_MAX_SHADER_STORAGE_BUFFER_BINDINGS> &
getShaderStorageBuffersMask()1010*8975f5c5SAndroid Build Coastguard Worker     getShaderStorageBuffersMask() const
1011*8975f5c5SAndroid Build Coastguard Worker     {
1012*8975f5c5SAndroid Build Coastguard Worker         return mBoundShaderStorageBuffersMask;
1013*8975f5c5SAndroid Build Coastguard Worker     }
1014*8975f5c5SAndroid Build Coastguard Worker 
1015*8975f5c5SAndroid Build Coastguard Worker     // Detach a buffer from all bindings
1016*8975f5c5SAndroid Build Coastguard Worker     angle::Result detachBuffer(Context *context, const Buffer *buffer);
1017*8975f5c5SAndroid Build Coastguard Worker 
1018*8975f5c5SAndroid Build Coastguard Worker     // Vertex attrib manipulation
1019*8975f5c5SAndroid Build Coastguard Worker     void setEnableVertexAttribArray(unsigned int attribNum, bool enabled);
1020*8975f5c5SAndroid Build Coastguard Worker 
setVertexAttribPointer(const Context * context,unsigned int attribNum,Buffer * boundBuffer,GLint size,VertexAttribType type,bool normalized,GLsizei stride,const void * pointer)1021*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE void setVertexAttribPointer(const Context *context,
1022*8975f5c5SAndroid Build Coastguard Worker                                              unsigned int attribNum,
1023*8975f5c5SAndroid Build Coastguard Worker                                              Buffer *boundBuffer,
1024*8975f5c5SAndroid Build Coastguard Worker                                              GLint size,
1025*8975f5c5SAndroid Build Coastguard Worker                                              VertexAttribType type,
1026*8975f5c5SAndroid Build Coastguard Worker                                              bool normalized,
1027*8975f5c5SAndroid Build Coastguard Worker                                              GLsizei stride,
1028*8975f5c5SAndroid Build Coastguard Worker                                              const void *pointer)
1029*8975f5c5SAndroid Build Coastguard Worker     {
1030*8975f5c5SAndroid Build Coastguard Worker         mVertexArray->setVertexAttribPointer(context, attribNum, boundBuffer, size, type,
1031*8975f5c5SAndroid Build Coastguard Worker                                              normalized, stride, pointer);
1032*8975f5c5SAndroid Build Coastguard Worker         mDirtyObjects.set(state::DIRTY_OBJECT_VERTEX_ARRAY);
1033*8975f5c5SAndroid Build Coastguard Worker     }
1034*8975f5c5SAndroid Build Coastguard Worker 
setVertexAttribIPointer(const Context * context,unsigned int attribNum,Buffer * boundBuffer,GLint size,VertexAttribType type,GLsizei stride,const void * pointer)1035*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE void setVertexAttribIPointer(const Context *context,
1036*8975f5c5SAndroid Build Coastguard Worker                                               unsigned int attribNum,
1037*8975f5c5SAndroid Build Coastguard Worker                                               Buffer *boundBuffer,
1038*8975f5c5SAndroid Build Coastguard Worker                                               GLint size,
1039*8975f5c5SAndroid Build Coastguard Worker                                               VertexAttribType type,
1040*8975f5c5SAndroid Build Coastguard Worker                                               GLsizei stride,
1041*8975f5c5SAndroid Build Coastguard Worker                                               const void *pointer)
1042*8975f5c5SAndroid Build Coastguard Worker     {
1043*8975f5c5SAndroid Build Coastguard Worker         mVertexArray->setVertexAttribIPointer(context, attribNum, boundBuffer, size, type, stride,
1044*8975f5c5SAndroid Build Coastguard Worker                                               pointer);
1045*8975f5c5SAndroid Build Coastguard Worker         mDirtyObjects.set(state::DIRTY_OBJECT_VERTEX_ARRAY);
1046*8975f5c5SAndroid Build Coastguard Worker     }
1047*8975f5c5SAndroid Build Coastguard Worker 
1048*8975f5c5SAndroid Build Coastguard Worker     void setVertexAttribDivisor(const Context *context, GLuint index, GLuint divisor);
1049*8975f5c5SAndroid Build Coastguard Worker     const void *getVertexAttribPointer(unsigned int attribNum) const;
1050*8975f5c5SAndroid Build Coastguard Worker 
1051*8975f5c5SAndroid Build Coastguard Worker     void bindVertexBuffer(const Context *context,
1052*8975f5c5SAndroid Build Coastguard Worker                           GLuint bindingIndex,
1053*8975f5c5SAndroid Build Coastguard Worker                           Buffer *boundBuffer,
1054*8975f5c5SAndroid Build Coastguard Worker                           GLintptr offset,
1055*8975f5c5SAndroid Build Coastguard Worker                           GLsizei stride);
1056*8975f5c5SAndroid Build Coastguard Worker     void setVertexAttribFormat(GLuint attribIndex,
1057*8975f5c5SAndroid Build Coastguard Worker                                GLint size,
1058*8975f5c5SAndroid Build Coastguard Worker                                VertexAttribType type,
1059*8975f5c5SAndroid Build Coastguard Worker                                bool normalized,
1060*8975f5c5SAndroid Build Coastguard Worker                                bool pureInteger,
1061*8975f5c5SAndroid Build Coastguard Worker                                GLuint relativeOffset);
1062*8975f5c5SAndroid Build Coastguard Worker 
setVertexAttribBinding(const Context * context,GLuint attribIndex,GLuint bindingIndex)1063*8975f5c5SAndroid Build Coastguard Worker     void setVertexAttribBinding(const Context *context, GLuint attribIndex, GLuint bindingIndex)
1064*8975f5c5SAndroid Build Coastguard Worker     {
1065*8975f5c5SAndroid Build Coastguard Worker         mVertexArray->setVertexAttribBinding(context, attribIndex, bindingIndex);
1066*8975f5c5SAndroid Build Coastguard Worker         mDirtyObjects.set(state::DIRTY_OBJECT_VERTEX_ARRAY);
1067*8975f5c5SAndroid Build Coastguard Worker     }
1068*8975f5c5SAndroid Build Coastguard Worker 
1069*8975f5c5SAndroid Build Coastguard Worker     void setVertexBindingDivisor(const Context *context, GLuint bindingIndex, GLuint divisor);
1070*8975f5c5SAndroid Build Coastguard Worker 
1071*8975f5c5SAndroid Build Coastguard Worker     // State query functions
1072*8975f5c5SAndroid Build Coastguard Worker     void getBooleanv(GLenum pname, GLboolean *params) const;
getFloatv(GLenum pname,GLfloat * params)1073*8975f5c5SAndroid Build Coastguard Worker     void getFloatv(GLenum pname, GLfloat *params) const { mPrivateState.getFloatv(pname, params); }
1074*8975f5c5SAndroid Build Coastguard Worker     angle::Result getIntegerv(const Context *context, GLenum pname, GLint *params) const;
1075*8975f5c5SAndroid Build Coastguard Worker     void getPointerv(const Context *context, GLenum pname, void **params) const;
1076*8975f5c5SAndroid Build Coastguard Worker     void getIntegeri_v(const Context *context, GLenum target, GLuint index, GLint *data) const;
1077*8975f5c5SAndroid Build Coastguard Worker     void getInteger64i_v(GLenum target, GLuint index, GLint64 *data) const;
1078*8975f5c5SAndroid Build Coastguard Worker     void getBooleani_v(GLenum target, GLuint index, GLboolean *data) const;
1079*8975f5c5SAndroid Build Coastguard Worker 
isDrawFramebufferBindingDirty()1080*8975f5c5SAndroid Build Coastguard Worker     bool isDrawFramebufferBindingDirty() const
1081*8975f5c5SAndroid Build Coastguard Worker     {
1082*8975f5c5SAndroid Build Coastguard Worker         return mDirtyBits.test(state::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
1083*8975f5c5SAndroid Build Coastguard Worker     }
1084*8975f5c5SAndroid Build Coastguard Worker 
1085*8975f5c5SAndroid Build Coastguard Worker     // Sets the dirty bit for the program executable.
1086*8975f5c5SAndroid Build Coastguard Worker     angle::Result installProgramExecutable(const Context *context);
1087*8975f5c5SAndroid Build Coastguard Worker     // Sets the dirty bit for the program pipeline executable.
1088*8975f5c5SAndroid Build Coastguard Worker     angle::Result installProgramPipelineExecutable(const Context *context);
1089*8975f5c5SAndroid Build Coastguard Worker 
getDirtyBits()1090*8975f5c5SAndroid Build Coastguard Worker     const state::DirtyBits getDirtyBits() const
1091*8975f5c5SAndroid Build Coastguard Worker     {
1092*8975f5c5SAndroid Build Coastguard Worker         return mDirtyBits | mPrivateState.getDirtyBits();
1093*8975f5c5SAndroid Build Coastguard Worker     }
clearDirtyBits()1094*8975f5c5SAndroid Build Coastguard Worker     void clearDirtyBits()
1095*8975f5c5SAndroid Build Coastguard Worker     {
1096*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.reset();
1097*8975f5c5SAndroid Build Coastguard Worker         mPrivateState.clearDirtyBits();
1098*8975f5c5SAndroid Build Coastguard Worker     }
clearDirtyBits(const state::DirtyBits & bitset)1099*8975f5c5SAndroid Build Coastguard Worker     void clearDirtyBits(const state::DirtyBits &bitset)
1100*8975f5c5SAndroid Build Coastguard Worker     {
1101*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits &= ~bitset;
1102*8975f5c5SAndroid Build Coastguard Worker         mPrivateState.clearDirtyBits(bitset);
1103*8975f5c5SAndroid Build Coastguard Worker     }
setAllDirtyBits()1104*8975f5c5SAndroid Build Coastguard Worker     void setAllDirtyBits()
1105*8975f5c5SAndroid Build Coastguard Worker     {
1106*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set();
1107*8975f5c5SAndroid Build Coastguard Worker         mExtendedDirtyBits.set();
1108*8975f5c5SAndroid Build Coastguard Worker         mPrivateState.setAllDirtyBits();
1109*8975f5c5SAndroid Build Coastguard Worker     }
1110*8975f5c5SAndroid Build Coastguard Worker 
getExtendedDirtyBits()1111*8975f5c5SAndroid Build Coastguard Worker     const state::ExtendedDirtyBits getExtendedDirtyBits() const
1112*8975f5c5SAndroid Build Coastguard Worker     {
1113*8975f5c5SAndroid Build Coastguard Worker         return mExtendedDirtyBits | mPrivateState.getExtendedDirtyBits();
1114*8975f5c5SAndroid Build Coastguard Worker     }
clearExtendedDirtyBits()1115*8975f5c5SAndroid Build Coastguard Worker     void clearExtendedDirtyBits()
1116*8975f5c5SAndroid Build Coastguard Worker     {
1117*8975f5c5SAndroid Build Coastguard Worker         mExtendedDirtyBits.reset();
1118*8975f5c5SAndroid Build Coastguard Worker         mPrivateState.clearExtendedDirtyBits();
1119*8975f5c5SAndroid Build Coastguard Worker     }
clearExtendedDirtyBits(const state::ExtendedDirtyBits & bitset)1120*8975f5c5SAndroid Build Coastguard Worker     void clearExtendedDirtyBits(const state::ExtendedDirtyBits &bitset)
1121*8975f5c5SAndroid Build Coastguard Worker     {
1122*8975f5c5SAndroid Build Coastguard Worker         mExtendedDirtyBits &= ~bitset;
1123*8975f5c5SAndroid Build Coastguard Worker         mPrivateState.clearExtendedDirtyBits(bitset);
1124*8975f5c5SAndroid Build Coastguard Worker     }
1125*8975f5c5SAndroid Build Coastguard Worker 
clearDirtyObjects()1126*8975f5c5SAndroid Build Coastguard Worker     void clearDirtyObjects()
1127*8975f5c5SAndroid Build Coastguard Worker     {
1128*8975f5c5SAndroid Build Coastguard Worker         mDirtyObjects.reset();
1129*8975f5c5SAndroid Build Coastguard Worker         mPrivateState.clearDirtyObjects();
1130*8975f5c5SAndroid Build Coastguard Worker     }
setAllDirtyObjects()1131*8975f5c5SAndroid Build Coastguard Worker     void setAllDirtyObjects() { mDirtyObjects.set(); }
1132*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncDirtyObjects(const Context *context,
1133*8975f5c5SAndroid Build Coastguard Worker                                    const state::DirtyObjects &bitset,
1134*8975f5c5SAndroid Build Coastguard Worker                                    Command command);
1135*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncDirtyObject(const Context *context, GLenum target);
1136*8975f5c5SAndroid Build Coastguard Worker     void setObjectDirty(GLenum target);
1137*8975f5c5SAndroid Build Coastguard Worker     void setTextureDirty(size_t textureUnitIndex);
1138*8975f5c5SAndroid Build Coastguard Worker     void setSamplerDirty(size_t samplerIndex);
1139*8975f5c5SAndroid Build Coastguard Worker 
setReadFramebufferDirty()1140*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE void setReadFramebufferDirty()
1141*8975f5c5SAndroid Build Coastguard Worker     {
1142*8975f5c5SAndroid Build Coastguard Worker         mDirtyObjects.set(state::DIRTY_OBJECT_READ_FRAMEBUFFER);
1143*8975f5c5SAndroid Build Coastguard Worker         mDirtyObjects.set(state::DIRTY_OBJECT_READ_ATTACHMENTS);
1144*8975f5c5SAndroid Build Coastguard Worker     }
1145*8975f5c5SAndroid Build Coastguard Worker 
setDrawFramebufferDirty()1146*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE void setDrawFramebufferDirty()
1147*8975f5c5SAndroid Build Coastguard Worker     {
1148*8975f5c5SAndroid Build Coastguard Worker         mDirtyObjects.set(state::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
1149*8975f5c5SAndroid Build Coastguard Worker         mDirtyObjects.set(state::DIRTY_OBJECT_DRAW_ATTACHMENTS);
1150*8975f5c5SAndroid Build Coastguard Worker     }
1151*8975f5c5SAndroid Build Coastguard Worker 
1152*8975f5c5SAndroid Build Coastguard Worker     void setImageUnit(const Context *context,
1153*8975f5c5SAndroid Build Coastguard Worker                       size_t unit,
1154*8975f5c5SAndroid Build Coastguard Worker                       Texture *texture,
1155*8975f5c5SAndroid Build Coastguard Worker                       GLint level,
1156*8975f5c5SAndroid Build Coastguard Worker                       GLboolean layered,
1157*8975f5c5SAndroid Build Coastguard Worker                       GLint layer,
1158*8975f5c5SAndroid Build Coastguard Worker                       GLenum access,
1159*8975f5c5SAndroid Build Coastguard Worker                       GLenum format);
1160*8975f5c5SAndroid Build Coastguard Worker 
getImageUnit(size_t unit)1161*8975f5c5SAndroid Build Coastguard Worker     const ImageUnit &getImageUnit(size_t unit) const { return mImageUnits[unit]; }
getActiveTexturesCache()1162*8975f5c5SAndroid Build Coastguard Worker     const ActiveTexturesCache &getActiveTexturesCache() const { return mActiveTexturesCache; }
1163*8975f5c5SAndroid Build Coastguard Worker 
1164*8975f5c5SAndroid Build Coastguard Worker     // "onActiveTextureChange" is called when a texture binding changes.
1165*8975f5c5SAndroid Build Coastguard Worker     void onActiveTextureChange(const Context *context, size_t textureUnit);
1166*8975f5c5SAndroid Build Coastguard Worker 
1167*8975f5c5SAndroid Build Coastguard Worker     // "onActiveTextureStateChange" is called when the Texture changed but the binding did not.
1168*8975f5c5SAndroid Build Coastguard Worker     void onActiveTextureStateChange(const Context *context, size_t textureUnit);
1169*8975f5c5SAndroid Build Coastguard Worker 
1170*8975f5c5SAndroid Build Coastguard Worker     void onImageStateChange(const Context *context, size_t unit);
1171*8975f5c5SAndroid Build Coastguard Worker 
1172*8975f5c5SAndroid Build Coastguard Worker     void onUniformBufferStateChange(size_t uniformBufferIndex);
1173*8975f5c5SAndroid Build Coastguard Worker     void onAtomicCounterBufferStateChange(size_t atomicCounterBufferIndex);
1174*8975f5c5SAndroid Build Coastguard Worker     void onShaderStorageBufferStateChange(size_t shaderStorageBufferIndex);
1175*8975f5c5SAndroid Build Coastguard Worker 
isCurrentTransformFeedback(const TransformFeedback * tf)1176*8975f5c5SAndroid Build Coastguard Worker     bool isCurrentTransformFeedback(const TransformFeedback *tf) const
1177*8975f5c5SAndroid Build Coastguard Worker     {
1178*8975f5c5SAndroid Build Coastguard Worker         return tf == mTransformFeedback.get();
1179*8975f5c5SAndroid Build Coastguard Worker     }
isCurrentVertexArray(const VertexArray * va)1180*8975f5c5SAndroid Build Coastguard Worker     bool isCurrentVertexArray(const VertexArray *va) const { return va == mVertexArray; }
1181*8975f5c5SAndroid Build Coastguard Worker 
1182*8975f5c5SAndroid Build Coastguard Worker     // Helpers for setting bound buffers. They should all have the same signature.
1183*8975f5c5SAndroid Build Coastguard Worker     // Not meant to be called externally. Used for local helpers in State.cpp.
1184*8975f5c5SAndroid Build Coastguard Worker     template <BufferBinding Target>
1185*8975f5c5SAndroid Build Coastguard Worker     void setGenericBufferBindingWithBit(const Context *context, Buffer *buffer);
1186*8975f5c5SAndroid Build Coastguard Worker 
1187*8975f5c5SAndroid Build Coastguard Worker     template <BufferBinding Target>
1188*8975f5c5SAndroid Build Coastguard Worker     void setGenericBufferBinding(const Context *context, Buffer *buffer);
1189*8975f5c5SAndroid Build Coastguard Worker 
1190*8975f5c5SAndroid Build Coastguard Worker     using BufferBindingSetter = void (State::*)(const Context *, Buffer *);
1191*8975f5c5SAndroid Build Coastguard Worker 
validateSamplerFormats()1192*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE bool validateSamplerFormats() const
1193*8975f5c5SAndroid Build Coastguard Worker     {
1194*8975f5c5SAndroid Build Coastguard Worker         return (!mExecutable || !(mTexturesIncompatibleWithSamplers.intersects(
1195*8975f5c5SAndroid Build Coastguard Worker                                     mExecutable->getActiveSamplersMask())));
1196*8975f5c5SAndroid Build Coastguard Worker     }
1197*8975f5c5SAndroid Build Coastguard Worker 
setReadFramebufferBindingDirty()1198*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE void setReadFramebufferBindingDirty()
1199*8975f5c5SAndroid Build Coastguard Worker     {
1200*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
1201*8975f5c5SAndroid Build Coastguard Worker     }
1202*8975f5c5SAndroid Build Coastguard Worker 
setDrawFramebufferBindingDirty()1203*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE void setDrawFramebufferBindingDirty()
1204*8975f5c5SAndroid Build Coastguard Worker     {
1205*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
1206*8975f5c5SAndroid Build Coastguard Worker     }
1207*8975f5c5SAndroid Build Coastguard Worker 
getOverlay()1208*8975f5c5SAndroid Build Coastguard Worker     const OverlayType *getOverlay() const { return mOverlay; }
1209*8975f5c5SAndroid Build Coastguard Worker 
1210*8975f5c5SAndroid Build Coastguard Worker     // Not for general use.
getBufferManagerForCapture()1211*8975f5c5SAndroid Build Coastguard Worker     const BufferManager &getBufferManagerForCapture() const { return *mBufferManager; }
getBoundBuffersForCapture()1212*8975f5c5SAndroid Build Coastguard Worker     const BoundBufferMap &getBoundBuffersForCapture() const { return mBoundBuffers; }
getTextureManagerForCapture()1213*8975f5c5SAndroid Build Coastguard Worker     const TextureManager &getTextureManagerForCapture() const { return *mTextureManager; }
getBoundTexturesForCapture()1214*8975f5c5SAndroid Build Coastguard Worker     const TextureBindingMap &getBoundTexturesForCapture() const { return mSamplerTextures; }
getRenderbufferManagerForCapture()1215*8975f5c5SAndroid Build Coastguard Worker     const RenderbufferManager &getRenderbufferManagerForCapture() const
1216*8975f5c5SAndroid Build Coastguard Worker     {
1217*8975f5c5SAndroid Build Coastguard Worker         return *mRenderbufferManager;
1218*8975f5c5SAndroid Build Coastguard Worker     }
getFramebufferManagerForCapture()1219*8975f5c5SAndroid Build Coastguard Worker     const FramebufferManager &getFramebufferManagerForCapture() const
1220*8975f5c5SAndroid Build Coastguard Worker     {
1221*8975f5c5SAndroid Build Coastguard Worker         return *mFramebufferManager;
1222*8975f5c5SAndroid Build Coastguard Worker     }
getShaderProgramManagerForCapture()1223*8975f5c5SAndroid Build Coastguard Worker     const ShaderProgramManager &getShaderProgramManagerForCapture() const
1224*8975f5c5SAndroid Build Coastguard Worker     {
1225*8975f5c5SAndroid Build Coastguard Worker         return *mShaderProgramManager;
1226*8975f5c5SAndroid Build Coastguard Worker     }
getSyncManagerForCapture()1227*8975f5c5SAndroid Build Coastguard Worker     const SyncManager &getSyncManagerForCapture() const { return *mSyncManager; }
getSamplerManagerForCapture()1228*8975f5c5SAndroid Build Coastguard Worker     const SamplerManager &getSamplerManagerForCapture() const { return *mSamplerManager; }
getProgramPipelineManagerForCapture()1229*8975f5c5SAndroid Build Coastguard Worker     const ProgramPipelineManager *getProgramPipelineManagerForCapture() const
1230*8975f5c5SAndroid Build Coastguard Worker     {
1231*8975f5c5SAndroid Build Coastguard Worker         return mProgramPipelineManager;
1232*8975f5c5SAndroid Build Coastguard Worker     }
getSamplerBindingsForCapture()1233*8975f5c5SAndroid Build Coastguard Worker     const SamplerBindingVector &getSamplerBindingsForCapture() const { return mSamplers; }
getActiveQueriesForCapture()1234*8975f5c5SAndroid Build Coastguard Worker     const ActiveQueryMap &getActiveQueriesForCapture() const { return mActiveQueries; }
1235*8975f5c5SAndroid Build Coastguard Worker     void initializeForCapture(const Context *context);
1236*8975f5c5SAndroid Build Coastguard Worker 
hasConstantAlphaBlendFunc()1237*8975f5c5SAndroid Build Coastguard Worker     bool hasConstantAlphaBlendFunc() const
1238*8975f5c5SAndroid Build Coastguard Worker     {
1239*8975f5c5SAndroid Build Coastguard Worker         return (getBlendFuncConstantAlphaDrawBuffers() & getBlendStateExt().getEnabledMask()).any();
1240*8975f5c5SAndroid Build Coastguard Worker     }
1241*8975f5c5SAndroid Build Coastguard Worker 
hasSimultaneousConstantColorAndAlphaBlendFunc()1242*8975f5c5SAndroid Build Coastguard Worker     bool hasSimultaneousConstantColorAndAlphaBlendFunc() const
1243*8975f5c5SAndroid Build Coastguard Worker     {
1244*8975f5c5SAndroid Build Coastguard Worker         return (getBlendFuncConstantColorDrawBuffers() & getBlendStateExt().getEnabledMask())
1245*8975f5c5SAndroid Build Coastguard Worker                    .any() &&
1246*8975f5c5SAndroid Build Coastguard Worker                hasConstantAlphaBlendFunc();
1247*8975f5c5SAndroid Build Coastguard Worker     }
1248*8975f5c5SAndroid Build Coastguard Worker 
getOffsetBindingPointerUniformBuffers()1249*8975f5c5SAndroid Build Coastguard Worker     const BufferVector &getOffsetBindingPointerUniformBuffers() const { return mUniformBuffers; }
1250*8975f5c5SAndroid Build Coastguard Worker 
getOffsetBindingPointerAtomicCounterBuffers()1251*8975f5c5SAndroid Build Coastguard Worker     const BufferVector &getOffsetBindingPointerAtomicCounterBuffers() const
1252*8975f5c5SAndroid Build Coastguard Worker     {
1253*8975f5c5SAndroid Build Coastguard Worker         return mAtomicCounterBuffers;
1254*8975f5c5SAndroid Build Coastguard Worker     }
1255*8975f5c5SAndroid Build Coastguard Worker 
getOffsetBindingPointerShaderStorageBuffers()1256*8975f5c5SAndroid Build Coastguard Worker     const BufferVector &getOffsetBindingPointerShaderStorageBuffers() const
1257*8975f5c5SAndroid Build Coastguard Worker     {
1258*8975f5c5SAndroid Build Coastguard Worker         return mShaderStorageBuffers;
1259*8975f5c5SAndroid Build Coastguard Worker     }
1260*8975f5c5SAndroid Build Coastguard Worker 
getTexturesIncompatibleWithSamplers()1261*8975f5c5SAndroid Build Coastguard Worker     ActiveTextureMask getTexturesIncompatibleWithSamplers() const
1262*8975f5c5SAndroid Build Coastguard Worker     {
1263*8975f5c5SAndroid Build Coastguard Worker         return mTexturesIncompatibleWithSamplers;
1264*8975f5c5SAndroid Build Coastguard Worker     }
1265*8975f5c5SAndroid Build Coastguard Worker 
getImageUnits()1266*8975f5c5SAndroid Build Coastguard Worker     const std::vector<ImageUnit> &getImageUnits() const { return mImageUnits; }
1267*8975f5c5SAndroid Build Coastguard Worker 
hasDisplayTextureShareGroup()1268*8975f5c5SAndroid Build Coastguard Worker     bool hasDisplayTextureShareGroup() const { return mDisplayTextureShareGroup; }
1269*8975f5c5SAndroid Build Coastguard Worker 
1270*8975f5c5SAndroid Build Coastguard Worker     // GL_KHR_parallel_shader_compile
1271*8975f5c5SAndroid Build Coastguard Worker     void setMaxShaderCompilerThreads(GLuint count);
getMaxShaderCompilerThreads()1272*8975f5c5SAndroid Build Coastguard Worker     GLuint getMaxShaderCompilerThreads() const { return mMaxShaderCompilerThreads; }
1273*8975f5c5SAndroid Build Coastguard Worker 
1274*8975f5c5SAndroid Build Coastguard Worker     // Convenience functions that forward to context-private state.
getRasterizerState()1275*8975f5c5SAndroid Build Coastguard Worker     const RasterizerState &getRasterizerState() const { return mPrivateState.getRasterizerState(); }
getBlendState()1276*8975f5c5SAndroid Build Coastguard Worker     const BlendState &getBlendState() const { return mPrivateState.getBlendState(); }
getBlendStateExt()1277*8975f5c5SAndroid Build Coastguard Worker     const BlendStateExt &getBlendStateExt() const { return mPrivateState.getBlendStateExt(); }
getDepthStencilState()1278*8975f5c5SAndroid Build Coastguard Worker     const DepthStencilState &getDepthStencilState() const
1279*8975f5c5SAndroid Build Coastguard Worker     {
1280*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.getDepthStencilState();
1281*8975f5c5SAndroid Build Coastguard Worker     }
getColorClearValue()1282*8975f5c5SAndroid Build Coastguard Worker     const ColorF &getColorClearValue() const { return mPrivateState.getColorClearValue(); }
getDepthClearValue()1283*8975f5c5SAndroid Build Coastguard Worker     float getDepthClearValue() const { return mPrivateState.getDepthClearValue(); }
getStencilClearValue()1284*8975f5c5SAndroid Build Coastguard Worker     int getStencilClearValue() const { return mPrivateState.getStencilClearValue(); }
isRasterizerDiscardEnabled()1285*8975f5c5SAndroid Build Coastguard Worker     bool isRasterizerDiscardEnabled() const { return mPrivateState.isRasterizerDiscardEnabled(); }
isPrimitiveRestartEnabled()1286*8975f5c5SAndroid Build Coastguard Worker     bool isPrimitiveRestartEnabled() const { return mPrivateState.isPrimitiveRestartEnabled(); }
isCullFaceEnabled()1287*8975f5c5SAndroid Build Coastguard Worker     bool isCullFaceEnabled() const { return mPrivateState.isCullFaceEnabled(); }
isDepthClampEnabled()1288*8975f5c5SAndroid Build Coastguard Worker     bool isDepthClampEnabled() const { return mPrivateState.isDepthClampEnabled(); }
isDepthTestEnabled()1289*8975f5c5SAndroid Build Coastguard Worker     bool isDepthTestEnabled() const { return mPrivateState.isDepthTestEnabled(); }
isDepthWriteEnabled()1290*8975f5c5SAndroid Build Coastguard Worker     bool isDepthWriteEnabled() const { return mPrivateState.isDepthWriteEnabled(); }
getNearPlane()1291*8975f5c5SAndroid Build Coastguard Worker     float getNearPlane() const { return mPrivateState.getNearPlane(); }
getFarPlane()1292*8975f5c5SAndroid Build Coastguard Worker     float getFarPlane() const { return mPrivateState.getFarPlane(); }
getClipOrigin()1293*8975f5c5SAndroid Build Coastguard Worker     ClipOrigin getClipOrigin() const { return mPrivateState.getClipOrigin(); }
getClipDepthMode()1294*8975f5c5SAndroid Build Coastguard Worker     ClipDepthMode getClipDepthMode() const { return mPrivateState.getClipDepthMode(); }
isClipDepthModeZeroToOne()1295*8975f5c5SAndroid Build Coastguard Worker     bool isClipDepthModeZeroToOne() const { return mPrivateState.isClipDepthModeZeroToOne(); }
isBlendEnabled()1296*8975f5c5SAndroid Build Coastguard Worker     bool isBlendEnabled() const { return mPrivateState.isBlendEnabled(); }
isBlendEnabledIndexed(GLuint index)1297*8975f5c5SAndroid Build Coastguard Worker     bool isBlendEnabledIndexed(GLuint index) const
1298*8975f5c5SAndroid Build Coastguard Worker     {
1299*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.isBlendEnabledIndexed(index);
1300*8975f5c5SAndroid Build Coastguard Worker     }
getBlendEnabledDrawBufferMask()1301*8975f5c5SAndroid Build Coastguard Worker     DrawBufferMask getBlendEnabledDrawBufferMask() const
1302*8975f5c5SAndroid Build Coastguard Worker     {
1303*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.getBlendEnabledDrawBufferMask();
1304*8975f5c5SAndroid Build Coastguard Worker     }
getBlendColor()1305*8975f5c5SAndroid Build Coastguard Worker     const ColorF &getBlendColor() const { return mPrivateState.getBlendColor(); }
isStencilTestEnabled()1306*8975f5c5SAndroid Build Coastguard Worker     bool isStencilTestEnabled() const { return mPrivateState.isStencilTestEnabled(); }
isBlendAdvancedCoherentEnabled()1307*8975f5c5SAndroid Build Coastguard Worker     bool isBlendAdvancedCoherentEnabled() const
1308*8975f5c5SAndroid Build Coastguard Worker     {
1309*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.isBlendAdvancedCoherentEnabled();
1310*8975f5c5SAndroid Build Coastguard Worker     }
isStencilWriteEnabled(GLuint framebufferStencilSize)1311*8975f5c5SAndroid Build Coastguard Worker     bool isStencilWriteEnabled(GLuint framebufferStencilSize) const
1312*8975f5c5SAndroid Build Coastguard Worker     {
1313*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.isStencilWriteEnabled(framebufferStencilSize);
1314*8975f5c5SAndroid Build Coastguard Worker     }
getStencilRef()1315*8975f5c5SAndroid Build Coastguard Worker     GLint getStencilRef() const { return mPrivateState.getStencilRef(); }
getStencilBackRef()1316*8975f5c5SAndroid Build Coastguard Worker     GLint getStencilBackRef() const { return mPrivateState.getStencilBackRef(); }
getPolygonMode()1317*8975f5c5SAndroid Build Coastguard Worker     PolygonMode getPolygonMode() const { return mPrivateState.getPolygonMode(); }
isPolygonOffsetPointEnabled()1318*8975f5c5SAndroid Build Coastguard Worker     bool isPolygonOffsetPointEnabled() const { return mPrivateState.isPolygonOffsetPointEnabled(); }
isPolygonOffsetLineEnabled()1319*8975f5c5SAndroid Build Coastguard Worker     bool isPolygonOffsetLineEnabled() const { return mPrivateState.isPolygonOffsetLineEnabled(); }
isPolygonOffsetFillEnabled()1320*8975f5c5SAndroid Build Coastguard Worker     bool isPolygonOffsetFillEnabled() const { return mPrivateState.isPolygonOffsetFillEnabled(); }
isPolygonOffsetEnabled()1321*8975f5c5SAndroid Build Coastguard Worker     bool isPolygonOffsetEnabled() const { return mPrivateState.isPolygonOffsetEnabled(); }
isSampleAlphaToCoverageEnabled()1322*8975f5c5SAndroid Build Coastguard Worker     bool isSampleAlphaToCoverageEnabled() const
1323*8975f5c5SAndroid Build Coastguard Worker     {
1324*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.isSampleAlphaToCoverageEnabled();
1325*8975f5c5SAndroid Build Coastguard Worker     }
isSampleCoverageEnabled()1326*8975f5c5SAndroid Build Coastguard Worker     bool isSampleCoverageEnabled() const { return mPrivateState.isSampleCoverageEnabled(); }
getSampleCoverageValue()1327*8975f5c5SAndroid Build Coastguard Worker     GLclampf getSampleCoverageValue() const { return mPrivateState.getSampleCoverageValue(); }
getSampleCoverageInvert()1328*8975f5c5SAndroid Build Coastguard Worker     bool getSampleCoverageInvert() const { return mPrivateState.getSampleCoverageInvert(); }
isSampleMaskEnabled()1329*8975f5c5SAndroid Build Coastguard Worker     bool isSampleMaskEnabled() const { return mPrivateState.isSampleMaskEnabled(); }
getSampleMaskWord(GLuint maskNumber)1330*8975f5c5SAndroid Build Coastguard Worker     GLbitfield getSampleMaskWord(GLuint maskNumber) const
1331*8975f5c5SAndroid Build Coastguard Worker     {
1332*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.getSampleMaskWord(maskNumber);
1333*8975f5c5SAndroid Build Coastguard Worker     }
getSampleMaskValues()1334*8975f5c5SAndroid Build Coastguard Worker     SampleMaskArray<GLbitfield> getSampleMaskValues() const
1335*8975f5c5SAndroid Build Coastguard Worker     {
1336*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.getSampleMaskValues();
1337*8975f5c5SAndroid Build Coastguard Worker     }
getMaxSampleMaskWords()1338*8975f5c5SAndroid Build Coastguard Worker     GLuint getMaxSampleMaskWords() const { return mPrivateState.getMaxSampleMaskWords(); }
isSampleAlphaToOneEnabled()1339*8975f5c5SAndroid Build Coastguard Worker     bool isSampleAlphaToOneEnabled() const { return mPrivateState.isSampleAlphaToOneEnabled(); }
isMultisamplingEnabled()1340*8975f5c5SAndroid Build Coastguard Worker     bool isMultisamplingEnabled() const { return mPrivateState.isMultisamplingEnabled(); }
isSampleShadingEnabled()1341*8975f5c5SAndroid Build Coastguard Worker     bool isSampleShadingEnabled() const { return mPrivateState.isSampleShadingEnabled(); }
getMinSampleShading()1342*8975f5c5SAndroid Build Coastguard Worker     float getMinSampleShading() const { return mPrivateState.getMinSampleShading(); }
isScissorTestEnabled()1343*8975f5c5SAndroid Build Coastguard Worker     bool isScissorTestEnabled() const { return mPrivateState.isScissorTestEnabled(); }
getScissor()1344*8975f5c5SAndroid Build Coastguard Worker     const Rectangle &getScissor() const { return mPrivateState.getScissor(); }
isDitherEnabled()1345*8975f5c5SAndroid Build Coastguard Worker     bool isDitherEnabled() const { return mPrivateState.isDitherEnabled(); }
isBindGeneratesResourceEnabled()1346*8975f5c5SAndroid Build Coastguard Worker     bool isBindGeneratesResourceEnabled() const
1347*8975f5c5SAndroid Build Coastguard Worker     {
1348*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.isBindGeneratesResourceEnabled();
1349*8975f5c5SAndroid Build Coastguard Worker     }
areClientArraysEnabled()1350*8975f5c5SAndroid Build Coastguard Worker     bool areClientArraysEnabled() const { return mPrivateState.areClientArraysEnabled(); }
isRobustResourceInitEnabled()1351*8975f5c5SAndroid Build Coastguard Worker     bool isRobustResourceInitEnabled() const { return mPrivateState.isRobustResourceInitEnabled(); }
isProgramBinaryCacheEnabled()1352*8975f5c5SAndroid Build Coastguard Worker     bool isProgramBinaryCacheEnabled() const { return mPrivateState.isProgramBinaryCacheEnabled(); }
getViewport()1353*8975f5c5SAndroid Build Coastguard Worker     const Rectangle &getViewport() const { return mPrivateState.getViewport(); }
getShadingRate()1354*8975f5c5SAndroid Build Coastguard Worker     ShadingRate getShadingRate() const { return mPrivateState.getShadingRate(); }
getPackAlignment()1355*8975f5c5SAndroid Build Coastguard Worker     GLint getPackAlignment() const { return mPrivateState.getPackAlignment(); }
getPackReverseRowOrder()1356*8975f5c5SAndroid Build Coastguard Worker     bool getPackReverseRowOrder() const { return mPrivateState.getPackReverseRowOrder(); }
getPackRowLength()1357*8975f5c5SAndroid Build Coastguard Worker     GLint getPackRowLength() const { return mPrivateState.getPackRowLength(); }
getPackSkipRows()1358*8975f5c5SAndroid Build Coastguard Worker     GLint getPackSkipRows() const { return mPrivateState.getPackSkipRows(); }
getPackSkipPixels()1359*8975f5c5SAndroid Build Coastguard Worker     GLint getPackSkipPixels() const { return mPrivateState.getPackSkipPixels(); }
getPackState()1360*8975f5c5SAndroid Build Coastguard Worker     const PixelPackState &getPackState() const { return mPrivateState.getPackState(); }
getPackState()1361*8975f5c5SAndroid Build Coastguard Worker     PixelPackState &getPackState() { return mPrivateState.getPackState(); }
getUnpackAlignment()1362*8975f5c5SAndroid Build Coastguard Worker     GLint getUnpackAlignment() const { return mPrivateState.getUnpackAlignment(); }
getUnpackRowLength()1363*8975f5c5SAndroid Build Coastguard Worker     GLint getUnpackRowLength() const { return mPrivateState.getUnpackRowLength(); }
getUnpackImageHeight()1364*8975f5c5SAndroid Build Coastguard Worker     GLint getUnpackImageHeight() const { return mPrivateState.getUnpackImageHeight(); }
getUnpackSkipImages()1365*8975f5c5SAndroid Build Coastguard Worker     GLint getUnpackSkipImages() const { return mPrivateState.getUnpackSkipImages(); }
getUnpackSkipRows()1366*8975f5c5SAndroid Build Coastguard Worker     GLint getUnpackSkipRows() const { return mPrivateState.getUnpackSkipRows(); }
getUnpackSkipPixels()1367*8975f5c5SAndroid Build Coastguard Worker     GLint getUnpackSkipPixels() const { return mPrivateState.getUnpackSkipPixels(); }
getUnpackState()1368*8975f5c5SAndroid Build Coastguard Worker     const PixelUnpackState &getUnpackState() const { return mPrivateState.getUnpackState(); }
getUnpackState()1369*8975f5c5SAndroid Build Coastguard Worker     PixelUnpackState &getUnpackState() { return mPrivateState.getUnpackState(); }
getCoverageModulation()1370*8975f5c5SAndroid Build Coastguard Worker     GLenum getCoverageModulation() const { return mPrivateState.getCoverageModulation(); }
getFramebufferSRGB()1371*8975f5c5SAndroid Build Coastguard Worker     bool getFramebufferSRGB() const { return mPrivateState.getFramebufferSRGB(); }
getPatchVertices()1372*8975f5c5SAndroid Build Coastguard Worker     GLuint getPatchVertices() const { return mPrivateState.getPatchVertices(); }
setPixelLocalStorageActivePlanes(GLsizei n)1373*8975f5c5SAndroid Build Coastguard Worker     void setPixelLocalStorageActivePlanes(GLsizei n)
1374*8975f5c5SAndroid Build Coastguard Worker     {
1375*8975f5c5SAndroid Build Coastguard Worker         mPrivateState.setPixelLocalStorageActivePlanes(n);
1376*8975f5c5SAndroid Build Coastguard Worker     }
getPixelLocalStorageActivePlanes()1377*8975f5c5SAndroid Build Coastguard Worker     GLsizei getPixelLocalStorageActivePlanes() const
1378*8975f5c5SAndroid Build Coastguard Worker     {
1379*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.getPixelLocalStorageActivePlanes();
1380*8975f5c5SAndroid Build Coastguard Worker     }
getLineWidth()1381*8975f5c5SAndroid Build Coastguard Worker     float getLineWidth() const { return mPrivateState.getLineWidth(); }
getActiveSampler()1382*8975f5c5SAndroid Build Coastguard Worker     unsigned int getActiveSampler() const { return mPrivateState.getActiveSampler(); }
getGenerateMipmapHint()1383*8975f5c5SAndroid Build Coastguard Worker     GLenum getGenerateMipmapHint() const { return mPrivateState.getGenerateMipmapHint(); }
getFragmentShaderDerivativeHint()1384*8975f5c5SAndroid Build Coastguard Worker     GLenum getFragmentShaderDerivativeHint() const
1385*8975f5c5SAndroid Build Coastguard Worker     {
1386*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.getFragmentShaderDerivativeHint();
1387*8975f5c5SAndroid Build Coastguard Worker     }
getProvokingVertex()1388*8975f5c5SAndroid Build Coastguard Worker     ProvokingVertexConvention getProvokingVertex() const
1389*8975f5c5SAndroid Build Coastguard Worker     {
1390*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.getProvokingVertex();
1391*8975f5c5SAndroid Build Coastguard Worker     }
getVertexAttribCurrentValue(size_t attribNum)1392*8975f5c5SAndroid Build Coastguard Worker     const VertexAttribCurrentValueData &getVertexAttribCurrentValue(size_t attribNum) const
1393*8975f5c5SAndroid Build Coastguard Worker     {
1394*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.getVertexAttribCurrentValue(attribNum);
1395*8975f5c5SAndroid Build Coastguard Worker     }
getVertexAttribCurrentValues()1396*8975f5c5SAndroid Build Coastguard Worker     const std::vector<VertexAttribCurrentValueData> &getVertexAttribCurrentValues() const
1397*8975f5c5SAndroid Build Coastguard Worker     {
1398*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.getVertexAttribCurrentValues();
1399*8975f5c5SAndroid Build Coastguard Worker     }
getAndResetDirtyCurrentValues()1400*8975f5c5SAndroid Build Coastguard Worker     AttributesMask getAndResetDirtyCurrentValues() const
1401*8975f5c5SAndroid Build Coastguard Worker     {
1402*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.getAndResetDirtyCurrentValues();
1403*8975f5c5SAndroid Build Coastguard Worker     }
getCurrentValuesTypeMask()1404*8975f5c5SAndroid Build Coastguard Worker     ComponentTypeMask getCurrentValuesTypeMask() const
1405*8975f5c5SAndroid Build Coastguard Worker     {
1406*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.getCurrentValuesTypeMask();
1407*8975f5c5SAndroid Build Coastguard Worker     }
getEnabledClipDistances()1408*8975f5c5SAndroid Build Coastguard Worker     const ClipDistanceEnableBits &getEnabledClipDistances() const
1409*8975f5c5SAndroid Build Coastguard Worker     {
1410*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.getEnabledClipDistances();
1411*8975f5c5SAndroid Build Coastguard Worker     }
noSimultaneousConstantColorAndAlphaBlendFunc()1412*8975f5c5SAndroid Build Coastguard Worker     bool noSimultaneousConstantColorAndAlphaBlendFunc() const
1413*8975f5c5SAndroid Build Coastguard Worker     {
1414*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.noSimultaneousConstantColorAndAlphaBlendFunc();
1415*8975f5c5SAndroid Build Coastguard Worker     }
getBoundingBoxMinX()1416*8975f5c5SAndroid Build Coastguard Worker     GLfloat getBoundingBoxMinX() const { return mPrivateState.getBoundingBoxMinX(); }
getBoundingBoxMinY()1417*8975f5c5SAndroid Build Coastguard Worker     GLfloat getBoundingBoxMinY() const { return mPrivateState.getBoundingBoxMinY(); }
getBoundingBoxMinZ()1418*8975f5c5SAndroid Build Coastguard Worker     GLfloat getBoundingBoxMinZ() const { return mPrivateState.getBoundingBoxMinZ(); }
getBoundingBoxMinW()1419*8975f5c5SAndroid Build Coastguard Worker     GLfloat getBoundingBoxMinW() const { return mPrivateState.getBoundingBoxMinW(); }
getBoundingBoxMaxX()1420*8975f5c5SAndroid Build Coastguard Worker     GLfloat getBoundingBoxMaxX() const { return mPrivateState.getBoundingBoxMaxX(); }
getBoundingBoxMaxY()1421*8975f5c5SAndroid Build Coastguard Worker     GLfloat getBoundingBoxMaxY() const { return mPrivateState.getBoundingBoxMaxY(); }
getBoundingBoxMaxZ()1422*8975f5c5SAndroid Build Coastguard Worker     GLfloat getBoundingBoxMaxZ() const { return mPrivateState.getBoundingBoxMaxZ(); }
getBoundingBoxMaxW()1423*8975f5c5SAndroid Build Coastguard Worker     GLfloat getBoundingBoxMaxW() const { return mPrivateState.getBoundingBoxMaxW(); }
isTextureRectangleEnabled()1424*8975f5c5SAndroid Build Coastguard Worker     bool isTextureRectangleEnabled() const { return mPrivateState.isTextureRectangleEnabled(); }
getBlendFuncConstantAlphaDrawBuffers()1425*8975f5c5SAndroid Build Coastguard Worker     DrawBufferMask getBlendFuncConstantAlphaDrawBuffers() const
1426*8975f5c5SAndroid Build Coastguard Worker     {
1427*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.getBlendFuncConstantAlphaDrawBuffers();
1428*8975f5c5SAndroid Build Coastguard Worker     }
getBlendFuncConstantColorDrawBuffers()1429*8975f5c5SAndroid Build Coastguard Worker     DrawBufferMask getBlendFuncConstantColorDrawBuffers() const
1430*8975f5c5SAndroid Build Coastguard Worker     {
1431*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.getBlendFuncConstantColorDrawBuffers();
1432*8975f5c5SAndroid Build Coastguard Worker     }
isLogicOpEnabled()1433*8975f5c5SAndroid Build Coastguard Worker     bool isLogicOpEnabled() const { return mPrivateState.isLogicOpEnabled(); }
getLogicOp()1434*8975f5c5SAndroid Build Coastguard Worker     LogicalOperation getLogicOp() const { return mPrivateState.getLogicOp(); }
isPerfMonitorActive()1435*8975f5c5SAndroid Build Coastguard Worker     bool isPerfMonitorActive() const { return mPrivateState.isPerfMonitorActive(); }
getDebug()1436*8975f5c5SAndroid Build Coastguard Worker     const Debug &getDebug() const { return mPrivateState.getDebug(); }
getDebug()1437*8975f5c5SAndroid Build Coastguard Worker     Debug &getDebug() { return mPrivateState.getDebug(); }
getBlobCacheCallbacks()1438*8975f5c5SAndroid Build Coastguard Worker     const BlobCacheCallbacks &getBlobCacheCallbacks() const
1439*8975f5c5SAndroid Build Coastguard Worker     {
1440*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.getBlobCacheCallbacks();
1441*8975f5c5SAndroid Build Coastguard Worker     }
getBlobCacheCallbacks()1442*8975f5c5SAndroid Build Coastguard Worker     BlobCacheCallbacks &getBlobCacheCallbacks() { return mPrivateState.getBlobCacheCallbacks(); }
getEnableFeature(GLenum feature)1443*8975f5c5SAndroid Build Coastguard Worker     bool getEnableFeature(GLenum feature) const { return mPrivateState.getEnableFeature(feature); }
getEnableFeatureIndexed(GLenum feature,GLuint index)1444*8975f5c5SAndroid Build Coastguard Worker     bool getEnableFeatureIndexed(GLenum feature, GLuint index) const
1445*8975f5c5SAndroid Build Coastguard Worker     {
1446*8975f5c5SAndroid Build Coastguard Worker         return mPrivateState.getEnableFeatureIndexed(feature, index);
1447*8975f5c5SAndroid Build Coastguard Worker     }
getAndResetDirtyUniformBlocks()1448*8975f5c5SAndroid Build Coastguard Worker     ProgramUniformBlockMask getAndResetDirtyUniformBlocks() const
1449*8975f5c5SAndroid Build Coastguard Worker     {
1450*8975f5c5SAndroid Build Coastguard Worker         ProgramUniformBlockMask dirtyBits = mDirtyUniformBlocks;
1451*8975f5c5SAndroid Build Coastguard Worker         mDirtyUniformBlocks.reset();
1452*8975f5c5SAndroid Build Coastguard Worker         return dirtyBits;
1453*8975f5c5SAndroid Build Coastguard Worker     }
privateState()1454*8975f5c5SAndroid Build Coastguard Worker     const PrivateState &privateState() const { return mPrivateState; }
gles1()1455*8975f5c5SAndroid Build Coastguard Worker     const GLES1State &gles1() const { return mPrivateState.gles1(); }
1456*8975f5c5SAndroid Build Coastguard Worker 
1457*8975f5c5SAndroid Build Coastguard Worker     // Used by the capture/replay tool to create state.
getMutablePrivateStateForCapture()1458*8975f5c5SAndroid Build Coastguard Worker     PrivateState *getMutablePrivateStateForCapture() { return &mPrivateState; }
1459*8975f5c5SAndroid Build Coastguard Worker 
1460*8975f5c5SAndroid Build Coastguard Worker   private:
1461*8975f5c5SAndroid Build Coastguard Worker     friend class Context;
1462*8975f5c5SAndroid Build Coastguard Worker 
1463*8975f5c5SAndroid Build Coastguard Worker     // Used only by the entry points to set private state without holding the share group lock.
getMutablePrivateState()1464*8975f5c5SAndroid Build Coastguard Worker     PrivateState *getMutablePrivateState() { return &mPrivateState; }
getMutableGLES1State()1465*8975f5c5SAndroid Build Coastguard Worker     GLES1State *getMutableGLES1State() { return mPrivateState.getMutableGLES1State(); }
1466*8975f5c5SAndroid Build Coastguard Worker 
1467*8975f5c5SAndroid Build Coastguard Worker     angle::Result installProgramPipelineExecutableIfNotAlready(const Context *context);
1468*8975f5c5SAndroid Build Coastguard Worker     angle::Result onExecutableChange(const Context *context);
1469*8975f5c5SAndroid Build Coastguard Worker 
1470*8975f5c5SAndroid Build Coastguard Worker     void unsetActiveTextures(const ActiveTextureMask &textureMask);
1471*8975f5c5SAndroid Build Coastguard Worker     void setActiveTextureDirty(size_t textureIndex, Texture *texture);
1472*8975f5c5SAndroid Build Coastguard Worker     void updateTextureBinding(const Context *context, size_t textureIndex, Texture *texture);
1473*8975f5c5SAndroid Build Coastguard Worker     void updateActiveTextureStateOnSync(const Context *context,
1474*8975f5c5SAndroid Build Coastguard Worker                                         size_t textureIndex,
1475*8975f5c5SAndroid Build Coastguard Worker                                         const Sampler *sampler,
1476*8975f5c5SAndroid Build Coastguard Worker                                         Texture *texture);
1477*8975f5c5SAndroid Build Coastguard Worker     Texture *getTextureForActiveSampler(TextureType type, size_t index);
1478*8975f5c5SAndroid Build Coastguard Worker 
1479*8975f5c5SAndroid Build Coastguard Worker     // Functions to synchronize dirty states
1480*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncActiveTextures(const Context *context, Command command);
1481*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncTexturesInit(const Context *context, Command command);
1482*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncImagesInit(const Context *context, Command command);
1483*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncReadAttachments(const Context *context, Command command);
1484*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncDrawAttachments(const Context *context, Command command);
1485*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncReadFramebuffer(const Context *context, Command command);
1486*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncDrawFramebuffer(const Context *context, Command command);
1487*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncVertexArray(const Context *context, Command command);
1488*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncTextures(const Context *context, Command command);
1489*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncImages(const Context *context, Command command);
1490*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncSamplers(const Context *context, Command command);
1491*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncProgramPipelineObject(const Context *context, Command command);
1492*8975f5c5SAndroid Build Coastguard Worker 
1493*8975f5c5SAndroid Build Coastguard Worker     using DirtyObjectHandler = angle::Result (State::*)(const Context *context, Command command);
1494*8975f5c5SAndroid Build Coastguard Worker     using DirtyObjectHandlerArray = std::array<DirtyObjectHandler, state::DIRTY_OBJECT_MAX>;
1495*8975f5c5SAndroid Build Coastguard Worker 
MakeDirtyObjectHandlers()1496*8975f5c5SAndroid Build Coastguard Worker     static constexpr DirtyObjectHandlerArray MakeDirtyObjectHandlers()
1497*8975f5c5SAndroid Build Coastguard Worker     {
1498*8975f5c5SAndroid Build Coastguard Worker         // Work around C++'s lack of array element support in designated initializers
1499*8975f5c5SAndroid Build Coastguard Worker         // This function cannot be a lambda due to MSVC C++17 limitations b/330910097#comment5
1500*8975f5c5SAndroid Build Coastguard Worker         DirtyObjectHandlerArray handlers{};
1501*8975f5c5SAndroid Build Coastguard Worker 
1502*8975f5c5SAndroid Build Coastguard Worker         handlers[state::DIRTY_OBJECT_ACTIVE_TEXTURES]         = &State::syncActiveTextures;
1503*8975f5c5SAndroid Build Coastguard Worker         handlers[state::DIRTY_OBJECT_TEXTURES_INIT]           = &State::syncTexturesInit;
1504*8975f5c5SAndroid Build Coastguard Worker         handlers[state::DIRTY_OBJECT_IMAGES_INIT]             = &State::syncImagesInit;
1505*8975f5c5SAndroid Build Coastguard Worker         handlers[state::DIRTY_OBJECT_READ_ATTACHMENTS]        = &State::syncReadAttachments;
1506*8975f5c5SAndroid Build Coastguard Worker         handlers[state::DIRTY_OBJECT_DRAW_ATTACHMENTS]        = &State::syncDrawAttachments;
1507*8975f5c5SAndroid Build Coastguard Worker         handlers[state::DIRTY_OBJECT_READ_FRAMEBUFFER]        = &State::syncReadFramebuffer;
1508*8975f5c5SAndroid Build Coastguard Worker         handlers[state::DIRTY_OBJECT_DRAW_FRAMEBUFFER]        = &State::syncDrawFramebuffer;
1509*8975f5c5SAndroid Build Coastguard Worker         handlers[state::DIRTY_OBJECT_VERTEX_ARRAY]            = &State::syncVertexArray;
1510*8975f5c5SAndroid Build Coastguard Worker         handlers[state::DIRTY_OBJECT_TEXTURES]                = &State::syncTextures;
1511*8975f5c5SAndroid Build Coastguard Worker         handlers[state::DIRTY_OBJECT_IMAGES]                  = &State::syncImages;
1512*8975f5c5SAndroid Build Coastguard Worker         handlers[state::DIRTY_OBJECT_SAMPLERS]                = &State::syncSamplers;
1513*8975f5c5SAndroid Build Coastguard Worker         handlers[state::DIRTY_OBJECT_PROGRAM_PIPELINE_OBJECT] = &State::syncProgramPipelineObject;
1514*8975f5c5SAndroid Build Coastguard Worker 
1515*8975f5c5SAndroid Build Coastguard Worker         // If a handler is missing, reset everything for ease of static_assert
1516*8975f5c5SAndroid Build Coastguard Worker         for (auto handler : handlers)
1517*8975f5c5SAndroid Build Coastguard Worker         {
1518*8975f5c5SAndroid Build Coastguard Worker             if (handler == nullptr)
1519*8975f5c5SAndroid Build Coastguard Worker             {
1520*8975f5c5SAndroid Build Coastguard Worker                 return DirtyObjectHandlerArray();
1521*8975f5c5SAndroid Build Coastguard Worker             }
1522*8975f5c5SAndroid Build Coastguard Worker         }
1523*8975f5c5SAndroid Build Coastguard Worker 
1524*8975f5c5SAndroid Build Coastguard Worker         return handlers;
1525*8975f5c5SAndroid Build Coastguard Worker     }
1526*8975f5c5SAndroid Build Coastguard Worker 
dirtyObjectHandler(size_t dirtyObject,const Context * context,Command command)1527*8975f5c5SAndroid Build Coastguard Worker     angle::Result dirtyObjectHandler(size_t dirtyObject, const Context *context, Command command)
1528*8975f5c5SAndroid Build Coastguard Worker     {
1529*8975f5c5SAndroid Build Coastguard Worker         static constexpr DirtyObjectHandlerArray handlers = MakeDirtyObjectHandlers();
1530*8975f5c5SAndroid Build Coastguard Worker         static_assert(handlers[0] != nullptr, "MakeDirtyObjectHandlers missing a handler");
1531*8975f5c5SAndroid Build Coastguard Worker 
1532*8975f5c5SAndroid Build Coastguard Worker         return (this->*handlers[dirtyObject])(context, command);
1533*8975f5c5SAndroid Build Coastguard Worker     }
1534*8975f5c5SAndroid Build Coastguard Worker 
1535*8975f5c5SAndroid Build Coastguard Worker     // Robust init must happen before Framebuffer init for the Vulkan back-end.
1536*8975f5c5SAndroid Build Coastguard Worker     static_assert(state::DIRTY_OBJECT_ACTIVE_TEXTURES < state::DIRTY_OBJECT_TEXTURES_INIT,
1537*8975f5c5SAndroid Build Coastguard Worker                   "init order");
1538*8975f5c5SAndroid Build Coastguard Worker     static_assert(state::DIRTY_OBJECT_TEXTURES_INIT < state::DIRTY_OBJECT_DRAW_FRAMEBUFFER,
1539*8975f5c5SAndroid Build Coastguard Worker                   "init order");
1540*8975f5c5SAndroid Build Coastguard Worker     static_assert(state::DIRTY_OBJECT_IMAGES_INIT < state::DIRTY_OBJECT_DRAW_FRAMEBUFFER,
1541*8975f5c5SAndroid Build Coastguard Worker                   "init order");
1542*8975f5c5SAndroid Build Coastguard Worker     static_assert(state::DIRTY_OBJECT_DRAW_ATTACHMENTS < state::DIRTY_OBJECT_DRAW_FRAMEBUFFER,
1543*8975f5c5SAndroid Build Coastguard Worker                   "init order");
1544*8975f5c5SAndroid Build Coastguard Worker     static_assert(state::DIRTY_OBJECT_READ_ATTACHMENTS < state::DIRTY_OBJECT_READ_FRAMEBUFFER,
1545*8975f5c5SAndroid Build Coastguard Worker                   "init order");
1546*8975f5c5SAndroid Build Coastguard Worker 
1547*8975f5c5SAndroid Build Coastguard Worker     // Dispatch table for buffer update functions.
1548*8975f5c5SAndroid Build Coastguard Worker     static const angle::PackedEnumMap<BufferBinding, BufferBindingSetter> kBufferSetters;
1549*8975f5c5SAndroid Build Coastguard Worker 
1550*8975f5c5SAndroid Build Coastguard Worker     ContextID mID;
1551*8975f5c5SAndroid Build Coastguard Worker 
1552*8975f5c5SAndroid Build Coastguard Worker     EGLenum mContextPriority;
1553*8975f5c5SAndroid Build Coastguard Worker     bool mHasRobustAccess;
1554*8975f5c5SAndroid Build Coastguard Worker     bool mHasProtectedContent;
1555*8975f5c5SAndroid Build Coastguard Worker     bool mIsDebugContext;
1556*8975f5c5SAndroid Build Coastguard Worker 
1557*8975f5c5SAndroid Build Coastguard Worker     egl::ShareGroup *mShareGroup;
1558*8975f5c5SAndroid Build Coastguard Worker     mutable egl::ContextMutex mContextMutex;
1559*8975f5c5SAndroid Build Coastguard Worker 
1560*8975f5c5SAndroid Build Coastguard Worker     // Resource managers.
1561*8975f5c5SAndroid Build Coastguard Worker     BufferManager *mBufferManager;
1562*8975f5c5SAndroid Build Coastguard Worker     ShaderProgramManager *mShaderProgramManager;
1563*8975f5c5SAndroid Build Coastguard Worker     TextureManager *mTextureManager;
1564*8975f5c5SAndroid Build Coastguard Worker     RenderbufferManager *mRenderbufferManager;
1565*8975f5c5SAndroid Build Coastguard Worker     SamplerManager *mSamplerManager;
1566*8975f5c5SAndroid Build Coastguard Worker     SyncManager *mSyncManager;
1567*8975f5c5SAndroid Build Coastguard Worker     FramebufferManager *mFramebufferManager;
1568*8975f5c5SAndroid Build Coastguard Worker     ProgramPipelineManager *mProgramPipelineManager;
1569*8975f5c5SAndroid Build Coastguard Worker     MemoryObjectManager *mMemoryObjectManager;
1570*8975f5c5SAndroid Build Coastguard Worker     SemaphoreManager *mSemaphoreManager;
1571*8975f5c5SAndroid Build Coastguard Worker 
1572*8975f5c5SAndroid Build Coastguard Worker     Framebuffer *mReadFramebuffer;
1573*8975f5c5SAndroid Build Coastguard Worker     Framebuffer *mDrawFramebuffer;
1574*8975f5c5SAndroid Build Coastguard Worker     BindingPointer<Renderbuffer> mRenderbuffer;
1575*8975f5c5SAndroid Build Coastguard Worker     Program *mProgram;
1576*8975f5c5SAndroid Build Coastguard Worker     BindingPointer<ProgramPipeline> mProgramPipeline;
1577*8975f5c5SAndroid Build Coastguard Worker     // The _installed_ executable.  Note that this may be different from the program's (or the
1578*8975f5c5SAndroid Build Coastguard Worker     // program pipeline's) executable, as they may have been unsuccessfully relinked.
1579*8975f5c5SAndroid Build Coastguard Worker     SharedProgramExecutable mExecutable;
1580*8975f5c5SAndroid Build Coastguard Worker 
1581*8975f5c5SAndroid Build Coastguard Worker     VertexArray *mVertexArray;
1582*8975f5c5SAndroid Build Coastguard Worker 
1583*8975f5c5SAndroid Build Coastguard Worker     TextureBindingMap mSamplerTextures;
1584*8975f5c5SAndroid Build Coastguard Worker 
1585*8975f5c5SAndroid Build Coastguard Worker     // Active Textures Cache
1586*8975f5c5SAndroid Build Coastguard Worker     // ---------------------
1587*8975f5c5SAndroid Build Coastguard Worker     // The active textures cache gives ANGLE components access to a complete array of textures
1588*8975f5c5SAndroid Build Coastguard Worker     // on a draw call. gl::State implements angle::Observer and watches gl::Texture for state
1589*8975f5c5SAndroid Build Coastguard Worker     // changes via the onSubjectStateChange method above. We update the cache before draws.
1590*8975f5c5SAndroid Build Coastguard Worker     // See Observer.h and the design doc linked there for more info on Subject/Observer events.
1591*8975f5c5SAndroid Build Coastguard Worker     //
1592*8975f5c5SAndroid Build Coastguard Worker     // On state change events (re-binding textures, samplers, programs etc) we clear the cache
1593*8975f5c5SAndroid Build Coastguard Worker     // and flag dirty bits. nullptr indicates unbound or incomplete.
1594*8975f5c5SAndroid Build Coastguard Worker     ActiveTexturesCache mActiveTexturesCache;
1595*8975f5c5SAndroid Build Coastguard Worker     std::vector<angle::ObserverBinding> mCompleteTextureBindings;
1596*8975f5c5SAndroid Build Coastguard Worker 
1597*8975f5c5SAndroid Build Coastguard Worker     ActiveTextureMask mTexturesIncompatibleWithSamplers;
1598*8975f5c5SAndroid Build Coastguard Worker 
1599*8975f5c5SAndroid Build Coastguard Worker     SamplerBindingVector mSamplers;
1600*8975f5c5SAndroid Build Coastguard Worker 
1601*8975f5c5SAndroid Build Coastguard Worker     // It would be nice to merge the image and observer binding. Same for textures.
1602*8975f5c5SAndroid Build Coastguard Worker     std::vector<ImageUnit> mImageUnits;
1603*8975f5c5SAndroid Build Coastguard Worker 
1604*8975f5c5SAndroid Build Coastguard Worker     ActiveQueryMap mActiveQueries;
1605*8975f5c5SAndroid Build Coastguard Worker 
1606*8975f5c5SAndroid Build Coastguard Worker     // Stores the currently bound buffer for each binding point. It has an entry for the element
1607*8975f5c5SAndroid Build Coastguard Worker     // array buffer but it should not be used. Instead this bind point is owned by the current
1608*8975f5c5SAndroid Build Coastguard Worker     // vertex array object.
1609*8975f5c5SAndroid Build Coastguard Worker     BoundBufferMap mBoundBuffers;
1610*8975f5c5SAndroid Build Coastguard Worker 
1611*8975f5c5SAndroid Build Coastguard Worker     BufferVector mUniformBuffers;
1612*8975f5c5SAndroid Build Coastguard Worker     BufferVector mAtomicCounterBuffers;
1613*8975f5c5SAndroid Build Coastguard Worker     BufferVector mShaderStorageBuffers;
1614*8975f5c5SAndroid Build Coastguard Worker 
1615*8975f5c5SAndroid Build Coastguard Worker     angle::BitSet<gl::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS> mBoundUniformBuffersMask;
1616*8975f5c5SAndroid Build Coastguard Worker     angle::BitSet<gl::IMPLEMENTATION_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS>
1617*8975f5c5SAndroid Build Coastguard Worker         mBoundAtomicCounterBuffersMask;
1618*8975f5c5SAndroid Build Coastguard Worker     angle::BitSet<gl::IMPLEMENTATION_MAX_SHADER_STORAGE_BUFFER_BINDINGS>
1619*8975f5c5SAndroid Build Coastguard Worker         mBoundShaderStorageBuffersMask;
1620*8975f5c5SAndroid Build Coastguard Worker 
1621*8975f5c5SAndroid Build Coastguard Worker     BindingPointer<TransformFeedback> mTransformFeedback;
1622*8975f5c5SAndroid Build Coastguard Worker 
1623*8975f5c5SAndroid Build Coastguard Worker     bool mDisplayTextureShareGroup;
1624*8975f5c5SAndroid Build Coastguard Worker 
1625*8975f5c5SAndroid Build Coastguard Worker     // GL_KHR_parallel_shader_compile
1626*8975f5c5SAndroid Build Coastguard Worker     GLuint mMaxShaderCompilerThreads;
1627*8975f5c5SAndroid Build Coastguard Worker 
1628*8975f5c5SAndroid Build Coastguard Worker     // The Overlay object, used by the backend to render the overlay.
1629*8975f5c5SAndroid Build Coastguard Worker     const OverlayType *mOverlay;
1630*8975f5c5SAndroid Build Coastguard Worker 
1631*8975f5c5SAndroid Build Coastguard Worker     state::DirtyBits mDirtyBits;
1632*8975f5c5SAndroid Build Coastguard Worker     state::ExtendedDirtyBits mExtendedDirtyBits;
1633*8975f5c5SAndroid Build Coastguard Worker     state::DirtyObjects mDirtyObjects;
1634*8975f5c5SAndroid Build Coastguard Worker     ActiveTextureMask mDirtyActiveTextures;
1635*8975f5c5SAndroid Build Coastguard Worker     ActiveTextureMask mDirtyTextures;
1636*8975f5c5SAndroid Build Coastguard Worker     ActiveTextureMask mDirtySamplers;
1637*8975f5c5SAndroid Build Coastguard Worker     ImageUnitMask mDirtyImages;
1638*8975f5c5SAndroid Build Coastguard Worker     // Tracks uniform blocks that need reprocessing, for example because their mapped bindings have
1639*8975f5c5SAndroid Build Coastguard Worker     // changed, or buffers in their mapped bindings have changed.  This is in State because every
1640*8975f5c5SAndroid Build Coastguard Worker     // context needs to react to such changes.
1641*8975f5c5SAndroid Build Coastguard Worker     mutable ProgramUniformBlockMask mDirtyUniformBlocks;
1642*8975f5c5SAndroid Build Coastguard Worker 
1643*8975f5c5SAndroid Build Coastguard Worker     PrivateState mPrivateState;
1644*8975f5c5SAndroid Build Coastguard Worker };
1645*8975f5c5SAndroid Build Coastguard Worker 
syncDirtyObjects(const Context * context,const state::DirtyObjects & bitset,Command command)1646*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE angle::Result State::syncDirtyObjects(const Context *context,
1647*8975f5c5SAndroid Build Coastguard Worker                                                    const state::DirtyObjects &bitset,
1648*8975f5c5SAndroid Build Coastguard Worker                                                    Command command)
1649*8975f5c5SAndroid Build Coastguard Worker {
1650*8975f5c5SAndroid Build Coastguard Worker     // Accumulate any dirty objects that might have been set due to context-private state changes.
1651*8975f5c5SAndroid Build Coastguard Worker     mDirtyObjects |= mPrivateState.getDirtyObjects();
1652*8975f5c5SAndroid Build Coastguard Worker     mPrivateState.clearDirtyObjects();
1653*8975f5c5SAndroid Build Coastguard Worker 
1654*8975f5c5SAndroid Build Coastguard Worker     const state::DirtyObjects &dirtyObjects = mDirtyObjects & bitset;
1655*8975f5c5SAndroid Build Coastguard Worker 
1656*8975f5c5SAndroid Build Coastguard Worker     for (size_t dirtyObject : dirtyObjects)
1657*8975f5c5SAndroid Build Coastguard Worker     {
1658*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(dirtyObjectHandler(dirtyObject, context, command));
1659*8975f5c5SAndroid Build Coastguard Worker     }
1660*8975f5c5SAndroid Build Coastguard Worker 
1661*8975f5c5SAndroid Build Coastguard Worker     mDirtyObjects &= ~dirtyObjects;
1662*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
1663*8975f5c5SAndroid Build Coastguard Worker }
1664*8975f5c5SAndroid Build Coastguard Worker 
1665*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
1666*8975f5c5SAndroid Build Coastguard Worker 
1667*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_STATE_H_
1668