xref: /aosp_15_r20/external/angle/src/libANGLE/Context.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker //
3*8975f5c5SAndroid Build Coastguard Worker // Copyright 2002 The ANGLE Project Authors. All rights reserved.
4*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
5*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
6*8975f5c5SAndroid Build Coastguard Worker //
7*8975f5c5SAndroid Build Coastguard Worker 
8*8975f5c5SAndroid Build Coastguard Worker // Context.h: Defines the gl::Context class, managing all GL state and performing
9*8975f5c5SAndroid Build Coastguard Worker // rendering operations. It is the GLES2 specific implementation of EGLContext.
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_CONTEXT_H_
12*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_CONTEXT_H_
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker #include <mutex>
15*8975f5c5SAndroid Build Coastguard Worker #include <set>
16*8975f5c5SAndroid Build Coastguard Worker #include <string>
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker #include "angle_gl.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "common/MemoryBuffer.h"
20*8975f5c5SAndroid Build Coastguard Worker #include "common/PackedEnums.h"
21*8975f5c5SAndroid Build Coastguard Worker #include "common/SimpleMutex.h"
22*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h"
23*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Caps.h"
24*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Constants.h"
25*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context_gles_1_0_autogen.h"
26*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context_gles_2_0_autogen.h"
27*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context_gles_3_0_autogen.h"
28*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context_gles_3_1_autogen.h"
29*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context_gles_3_2_autogen.h"
30*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context_gles_ext_autogen.h"
31*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Error.h"
32*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Framebuffer.h"
33*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/HandleAllocator.h"
34*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/RefCountObject.h"
35*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/ResourceManager.h"
36*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/ResourceMap.h"
37*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/State.h"
38*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/VertexAttribute.h"
39*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/angletypes.h"
40*8975f5c5SAndroid Build Coastguard Worker 
41*8975f5c5SAndroid Build Coastguard Worker namespace angle
42*8975f5c5SAndroid Build Coastguard Worker {
43*8975f5c5SAndroid Build Coastguard Worker class Closure;
44*8975f5c5SAndroid Build Coastguard Worker class FrameCapture;
45*8975f5c5SAndroid Build Coastguard Worker class FrameCaptureShared;
46*8975f5c5SAndroid Build Coastguard Worker struct FrontendFeatures;
47*8975f5c5SAndroid Build Coastguard Worker class WaitableEvent;
48*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
49*8975f5c5SAndroid Build Coastguard Worker 
50*8975f5c5SAndroid Build Coastguard Worker namespace rx
51*8975f5c5SAndroid Build Coastguard Worker {
52*8975f5c5SAndroid Build Coastguard Worker class ContextImpl;
53*8975f5c5SAndroid Build Coastguard Worker class EGLImplFactory;
54*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
55*8975f5c5SAndroid Build Coastguard Worker 
56*8975f5c5SAndroid Build Coastguard Worker namespace egl
57*8975f5c5SAndroid Build Coastguard Worker {
58*8975f5c5SAndroid Build Coastguard Worker class AttributeMap;
59*8975f5c5SAndroid Build Coastguard Worker class Surface;
60*8975f5c5SAndroid Build Coastguard Worker struct Config;
61*8975f5c5SAndroid Build Coastguard Worker class Thread;
62*8975f5c5SAndroid Build Coastguard Worker }  // namespace egl
63*8975f5c5SAndroid Build Coastguard Worker 
64*8975f5c5SAndroid Build Coastguard Worker namespace gl
65*8975f5c5SAndroid Build Coastguard Worker {
66*8975f5c5SAndroid Build Coastguard Worker class Buffer;
67*8975f5c5SAndroid Build Coastguard Worker class Compiler;
68*8975f5c5SAndroid Build Coastguard Worker class FenceNV;
69*8975f5c5SAndroid Build Coastguard Worker class GLES1Renderer;
70*8975f5c5SAndroid Build Coastguard Worker class MemoryProgramCache;
71*8975f5c5SAndroid Build Coastguard Worker class MemoryShaderCache;
72*8975f5c5SAndroid Build Coastguard Worker class MemoryObject;
73*8975f5c5SAndroid Build Coastguard Worker class PixelLocalStoragePlane;
74*8975f5c5SAndroid Build Coastguard Worker class Program;
75*8975f5c5SAndroid Build Coastguard Worker class ProgramPipeline;
76*8975f5c5SAndroid Build Coastguard Worker class Query;
77*8975f5c5SAndroid Build Coastguard Worker class Renderbuffer;
78*8975f5c5SAndroid Build Coastguard Worker class Sampler;
79*8975f5c5SAndroid Build Coastguard Worker class Semaphore;
80*8975f5c5SAndroid Build Coastguard Worker class Shader;
81*8975f5c5SAndroid Build Coastguard Worker class Sync;
82*8975f5c5SAndroid Build Coastguard Worker class Texture;
83*8975f5c5SAndroid Build Coastguard Worker class TransformFeedback;
84*8975f5c5SAndroid Build Coastguard Worker class VertexArray;
85*8975f5c5SAndroid Build Coastguard Worker struct VertexAttribute;
86*8975f5c5SAndroid Build Coastguard Worker 
87*8975f5c5SAndroid Build Coastguard Worker class ErrorSet : angle::NonCopyable
88*8975f5c5SAndroid Build Coastguard Worker {
89*8975f5c5SAndroid Build Coastguard Worker   public:
90*8975f5c5SAndroid Build Coastguard Worker     explicit ErrorSet(Debug *debug,
91*8975f5c5SAndroid Build Coastguard Worker                       const angle::FrontendFeatures &frontendFeatures,
92*8975f5c5SAndroid Build Coastguard Worker                       const egl::AttributeMap &attribs);
93*8975f5c5SAndroid Build Coastguard Worker     ~ErrorSet();
94*8975f5c5SAndroid Build Coastguard Worker 
empty()95*8975f5c5SAndroid Build Coastguard Worker     bool empty() const { return mHasAnyErrors.load(std::memory_order_relaxed) == 0; }
96*8975f5c5SAndroid Build Coastguard Worker     GLenum popError();
97*8975f5c5SAndroid Build Coastguard Worker 
98*8975f5c5SAndroid Build Coastguard Worker     void handleError(GLenum errorCode,
99*8975f5c5SAndroid Build Coastguard Worker                      const char *message,
100*8975f5c5SAndroid Build Coastguard Worker                      const char *file,
101*8975f5c5SAndroid Build Coastguard Worker                      const char *function,
102*8975f5c5SAndroid Build Coastguard Worker                      unsigned int line);
103*8975f5c5SAndroid Build Coastguard Worker 
104*8975f5c5SAndroid Build Coastguard Worker     void validationError(angle::EntryPoint entryPoint, GLenum errorCode, const char *message);
105*8975f5c5SAndroid Build Coastguard Worker     ANGLE_FORMAT_PRINTF(4, 5)
106*8975f5c5SAndroid Build Coastguard Worker     void validationErrorF(angle::EntryPoint entryPoint, GLenum errorCode, const char *format, ...);
107*8975f5c5SAndroid Build Coastguard Worker 
skipValidation()108*8975f5c5SAndroid Build Coastguard Worker     bool skipValidation() const
109*8975f5c5SAndroid Build Coastguard Worker     {
110*8975f5c5SAndroid Build Coastguard Worker         // Ensure we don't skip validation when context becomes lost, since implementations
111*8975f5c5SAndroid Build Coastguard Worker         // generally assume a non-lost context, non-null objects, etc.
112*8975f5c5SAndroid Build Coastguard Worker         ASSERT(!isContextLost() || !mSkipValidation);
113*8975f5c5SAndroid Build Coastguard Worker         return mSkipValidation.load(std::memory_order_relaxed) != 0;
114*8975f5c5SAndroid Build Coastguard Worker     }
forceValidation()115*8975f5c5SAndroid Build Coastguard Worker     void forceValidation() { mSkipValidation = 0; }
116*8975f5c5SAndroid Build Coastguard Worker 
117*8975f5c5SAndroid Build Coastguard Worker     void markContextLost(GraphicsResetStatus status);
isContextLost()118*8975f5c5SAndroid Build Coastguard Worker     bool isContextLost() const { return mContextLost.load(std::memory_order_relaxed) != 0; }
119*8975f5c5SAndroid Build Coastguard Worker     GLenum getGraphicsResetStatus(rx::ContextImpl *contextImpl);
getResetStrategy()120*8975f5c5SAndroid Build Coastguard Worker     GLenum getResetStrategy() const { return mResetStrategy; }
121*8975f5c5SAndroid Build Coastguard Worker     GLenum getErrorForCapture() const;
122*8975f5c5SAndroid Build Coastguard Worker 
123*8975f5c5SAndroid Build Coastguard Worker   private:
124*8975f5c5SAndroid Build Coastguard Worker     void setContextLost();
125*8975f5c5SAndroid Build Coastguard Worker     void pushError(GLenum errorCode);
126*8975f5c5SAndroid Build Coastguard Worker     std::unique_lock<std::mutex> getLockIfNotAlready();
127*8975f5c5SAndroid Build Coastguard Worker 
128*8975f5c5SAndroid Build Coastguard Worker     // Non-atomic members of this class are protected by a mutex.  This is to allow errors to be
129*8975f5c5SAndroid Build Coastguard Worker     // safely set by entry points that don't hold a lock.  Note that other contexts may end up
130*8975f5c5SAndroid Build Coastguard Worker     // triggering an error on this context (through making failable calls on other contexts in the
131*8975f5c5SAndroid Build Coastguard Worker     // share group).
132*8975f5c5SAndroid Build Coastguard Worker     //
133*8975f5c5SAndroid Build Coastguard Worker     // Note also that the functionality used through the Debug class is thread-safe.
134*8975f5c5SAndroid Build Coastguard Worker     std::mutex mMutex;
135*8975f5c5SAndroid Build Coastguard Worker 
136*8975f5c5SAndroid Build Coastguard Worker     // Error handling and reporting
137*8975f5c5SAndroid Build Coastguard Worker     Debug *mDebug;
138*8975f5c5SAndroid Build Coastguard Worker     std::set<GLenum> mErrors;
139*8975f5c5SAndroid Build Coastguard Worker 
140*8975f5c5SAndroid Build Coastguard Worker     const GLenum mResetStrategy;
141*8975f5c5SAndroid Build Coastguard Worker     const bool mLoseContextOnOutOfMemory;
142*8975f5c5SAndroid Build Coastguard Worker 
143*8975f5c5SAndroid Build Coastguard Worker     // Context-loss handling
144*8975f5c5SAndroid Build Coastguard Worker     bool mContextLostForced;
145*8975f5c5SAndroid Build Coastguard Worker     GraphicsResetStatus mResetStatus;
146*8975f5c5SAndroid Build Coastguard Worker 
147*8975f5c5SAndroid Build Coastguard Worker     // The following are atomic and lockless as they are very frequently accessed.
148*8975f5c5SAndroid Build Coastguard Worker     std::atomic_int mSkipValidation;
149*8975f5c5SAndroid Build Coastguard Worker     std::atomic_int mContextLost;
150*8975f5c5SAndroid Build Coastguard Worker     std::atomic_int mHasAnyErrors;
151*8975f5c5SAndroid Build Coastguard Worker };
152*8975f5c5SAndroid Build Coastguard Worker 
153*8975f5c5SAndroid Build Coastguard Worker enum class VertexAttribTypeCase
154*8975f5c5SAndroid Build Coastguard Worker {
155*8975f5c5SAndroid Build Coastguard Worker     Invalid        = 0,
156*8975f5c5SAndroid Build Coastguard Worker     Valid          = 1,
157*8975f5c5SAndroid Build Coastguard Worker     ValidSize4Only = 2,
158*8975f5c5SAndroid Build Coastguard Worker     ValidSize3or4  = 3,
159*8975f5c5SAndroid Build Coastguard Worker };
160*8975f5c5SAndroid Build Coastguard Worker 
161*8975f5c5SAndroid Build Coastguard Worker // Part of StateCache (see below) that is private to the context and is inaccessible to other
162*8975f5c5SAndroid Build Coastguard Worker // contexts.
163*8975f5c5SAndroid Build Coastguard Worker class PrivateStateCache final : angle::NonCopyable
164*8975f5c5SAndroid Build Coastguard Worker {
165*8975f5c5SAndroid Build Coastguard Worker   public:
166*8975f5c5SAndroid Build Coastguard Worker     PrivateStateCache();
167*8975f5c5SAndroid Build Coastguard Worker     ~PrivateStateCache();
168*8975f5c5SAndroid Build Coastguard Worker 
onCapChange()169*8975f5c5SAndroid Build Coastguard Worker     void onCapChange() { mIsCachedBasicDrawStatesErrorValid = false; }
onColorMaskChange()170*8975f5c5SAndroid Build Coastguard Worker     void onColorMaskChange() { mIsCachedBasicDrawStatesErrorValid = false; }
onDefaultVertexAttributeChange()171*8975f5c5SAndroid Build Coastguard Worker     void onDefaultVertexAttributeChange() { mIsCachedBasicDrawStatesErrorValid = false; }
172*8975f5c5SAndroid Build Coastguard Worker 
173*8975f5c5SAndroid Build Coastguard Worker     // Blending updates invalidate draw
174*8975f5c5SAndroid Build Coastguard Worker     // state in the following cases:
175*8975f5c5SAndroid Build Coastguard Worker     //
176*8975f5c5SAndroid Build Coastguard Worker     // * Blend equations have been changed and the context
177*8975f5c5SAndroid Build Coastguard Worker     //   supports KHR_blend_equation_advanced. The number
178*8975f5c5SAndroid Build Coastguard Worker     //   of enabled draw buffers may need to be checked
179*8975f5c5SAndroid Build Coastguard Worker     //   to not be greater than 1.
180*8975f5c5SAndroid Build Coastguard Worker     //
181*8975f5c5SAndroid Build Coastguard Worker     // * Blend funcs have been changed with indexed
182*8975f5c5SAndroid Build Coastguard Worker     //   commands. The D3D11 backend cannot support
183*8975f5c5SAndroid Build Coastguard Worker     //   constant color and alpha blend funcs together
184*8975f5c5SAndroid Build Coastguard Worker     //   so a check is needed across all draw buffers.
185*8975f5c5SAndroid Build Coastguard Worker     //
186*8975f5c5SAndroid Build Coastguard Worker     // * Blend funcs have been changed and the context
187*8975f5c5SAndroid Build Coastguard Worker     //   supports EXT_blend_func_extended. The number
188*8975f5c5SAndroid Build Coastguard Worker     //   of enabled draw buffers may need to be checked
189*8975f5c5SAndroid Build Coastguard Worker     //   against MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT limit.
onBlendEquationOrFuncChange()190*8975f5c5SAndroid Build Coastguard Worker     void onBlendEquationOrFuncChange() { mIsCachedBasicDrawStatesErrorValid = false; }
191*8975f5c5SAndroid Build Coastguard Worker 
onStencilStateChange()192*8975f5c5SAndroid Build Coastguard Worker     void onStencilStateChange() { mIsCachedBasicDrawStatesErrorValid = false; }
193*8975f5c5SAndroid Build Coastguard Worker 
isCachedBasicDrawStatesErrorValid()194*8975f5c5SAndroid Build Coastguard Worker     bool isCachedBasicDrawStatesErrorValid() const { return mIsCachedBasicDrawStatesErrorValid; }
setCachedBasicDrawStatesErrorValid()195*8975f5c5SAndroid Build Coastguard Worker     void setCachedBasicDrawStatesErrorValid() const { mIsCachedBasicDrawStatesErrorValid = true; }
196*8975f5c5SAndroid Build Coastguard Worker 
197*8975f5c5SAndroid Build Coastguard Worker   private:
198*8975f5c5SAndroid Build Coastguard Worker     // StateCache::mCachedBasicDrawStatesError* may be invalidated through numerous calls (see the
199*8975f5c5SAndroid Build Coastguard Worker     // comment on getBasicDrawStatesErrorString), some of which may originate from other contexts
200*8975f5c5SAndroid Build Coastguard Worker     // (through the observer interface).  However, ContextPrivate* helpers may also need to
201*8975f5c5SAndroid Build Coastguard Worker     // invalidate the draw states, but they are called without holding the share group lock.  The
202*8975f5c5SAndroid Build Coastguard Worker     // following tracks whether StateCache::mCachedBasicDrawStatesError* values are valid and is
203*8975f5c5SAndroid Build Coastguard Worker     // accessed only by the context itself.
204*8975f5c5SAndroid Build Coastguard Worker     mutable bool mIsCachedBasicDrawStatesErrorValid;
205*8975f5c5SAndroid Build Coastguard Worker };
206*8975f5c5SAndroid Build Coastguard Worker 
207*8975f5c5SAndroid Build Coastguard Worker // Helper class for managing cache variables and state changes.
208*8975f5c5SAndroid Build Coastguard Worker class StateCache final : angle::NonCopyable
209*8975f5c5SAndroid Build Coastguard Worker {
210*8975f5c5SAndroid Build Coastguard Worker   public:
211*8975f5c5SAndroid Build Coastguard Worker     StateCache();
212*8975f5c5SAndroid Build Coastguard Worker     ~StateCache();
213*8975f5c5SAndroid Build Coastguard Worker 
214*8975f5c5SAndroid Build Coastguard Worker     void initialize(Context *context);
215*8975f5c5SAndroid Build Coastguard Worker 
216*8975f5c5SAndroid Build Coastguard Worker     // Places that can trigger updateActiveAttribsMask:
217*8975f5c5SAndroid Build Coastguard Worker     // 1. onVertexArrayBindingChange.
218*8975f5c5SAndroid Build Coastguard Worker     // 2. onProgramExecutableChange.
219*8975f5c5SAndroid Build Coastguard Worker     // 3. onVertexArrayStateChange.
220*8975f5c5SAndroid Build Coastguard Worker     // 4. onGLES1ClientStateChange.
221*8975f5c5SAndroid Build Coastguard Worker     // 5. onGLES1TextureStateChange.
getActiveBufferedAttribsMask()222*8975f5c5SAndroid Build Coastguard Worker     AttributesMask getActiveBufferedAttribsMask() const { return mCachedActiveBufferedAttribsMask; }
getActiveClientAttribsMask()223*8975f5c5SAndroid Build Coastguard Worker     AttributesMask getActiveClientAttribsMask() const { return mCachedActiveClientAttribsMask; }
getActiveDefaultAttribsMask()224*8975f5c5SAndroid Build Coastguard Worker     AttributesMask getActiveDefaultAttribsMask() const { return mCachedActiveDefaultAttribsMask; }
hasAnyEnabledClientAttrib()225*8975f5c5SAndroid Build Coastguard Worker     bool hasAnyEnabledClientAttrib() const { return mCachedHasAnyEnabledClientAttrib; }
hasAnyActiveClientAttrib()226*8975f5c5SAndroid Build Coastguard Worker     bool hasAnyActiveClientAttrib() const { return mCachedActiveClientAttribsMask.any(); }
227*8975f5c5SAndroid Build Coastguard Worker 
228*8975f5c5SAndroid Build Coastguard Worker     // Places that can trigger updateVertexElementLimits:
229*8975f5c5SAndroid Build Coastguard Worker     // 1. onVertexArrayBindingChange.
230*8975f5c5SAndroid Build Coastguard Worker     // 2. onProgramExecutableChange.
231*8975f5c5SAndroid Build Coastguard Worker     // 3. onVertexArrayFormatChange.
232*8975f5c5SAndroid Build Coastguard Worker     // 4. onVertexArrayBufferChange.
233*8975f5c5SAndroid Build Coastguard Worker     // 5. onVertexArrayStateChange.
getNonInstancedVertexElementLimit()234*8975f5c5SAndroid Build Coastguard Worker     GLint64 getNonInstancedVertexElementLimit() const
235*8975f5c5SAndroid Build Coastguard Worker     {
236*8975f5c5SAndroid Build Coastguard Worker         return mCachedNonInstancedVertexElementLimit;
237*8975f5c5SAndroid Build Coastguard Worker     }
getInstancedVertexElementLimit()238*8975f5c5SAndroid Build Coastguard Worker     GLint64 getInstancedVertexElementLimit() const { return mCachedInstancedVertexElementLimit; }
239*8975f5c5SAndroid Build Coastguard Worker 
240*8975f5c5SAndroid Build Coastguard Worker     // Places that can trigger updateBasicDrawStatesError:
241*8975f5c5SAndroid Build Coastguard Worker     // 1. onVertexArrayBindingChange.
242*8975f5c5SAndroid Build Coastguard Worker     // 2. onProgramExecutableChange.
243*8975f5c5SAndroid Build Coastguard Worker     // 3. onVertexArrayBufferContentsChange.
244*8975f5c5SAndroid Build Coastguard Worker     // 4. onVertexArrayStateChange.
245*8975f5c5SAndroid Build Coastguard Worker     // 5. onVertexArrayBufferStateChange.
246*8975f5c5SAndroid Build Coastguard Worker     // 6. onDrawFramebufferChange.
247*8975f5c5SAndroid Build Coastguard Worker     // 7. onActiveTextureChange.
248*8975f5c5SAndroid Build Coastguard Worker     // 8. onQueryChange.
249*8975f5c5SAndroid Build Coastguard Worker     // 9. onActiveTransformFeedbackChange.
250*8975f5c5SAndroid Build Coastguard Worker     // 10. onUniformBufferStateChange.
251*8975f5c5SAndroid Build Coastguard Worker     // 11. onBufferBindingChange.
252*8975f5c5SAndroid Build Coastguard Worker     //
253*8975f5c5SAndroid Build Coastguard Worker     // Additionally, the following in PrivateStateCache can lead to updateBasicDrawStatesError:
254*8975f5c5SAndroid Build Coastguard Worker     // 1. onCapChange.
255*8975f5c5SAndroid Build Coastguard Worker     // 2. onStencilStateChange.
256*8975f5c5SAndroid Build Coastguard Worker     // 3. onDefaultVertexAttributeChange.
257*8975f5c5SAndroid Build Coastguard Worker     // 4. onColorMaskChange.
258*8975f5c5SAndroid Build Coastguard Worker     // 5. onBlendEquationOrFuncChange.
getBasicDrawStatesErrorString(const Context * context,const PrivateStateCache * privateStateCache)259*8975f5c5SAndroid Build Coastguard Worker     intptr_t getBasicDrawStatesErrorString(const Context *context,
260*8975f5c5SAndroid Build Coastguard Worker                                            const PrivateStateCache *privateStateCache) const
261*8975f5c5SAndroid Build Coastguard Worker     {
262*8975f5c5SAndroid Build Coastguard Worker         // This is only ever called with the context that owns this state cache
263*8975f5c5SAndroid Build Coastguard Worker         ASSERT(isCurrentContext(context, privateStateCache));
264*8975f5c5SAndroid Build Coastguard Worker         if (privateStateCache->isCachedBasicDrawStatesErrorValid() &&
265*8975f5c5SAndroid Build Coastguard Worker             mCachedBasicDrawStatesErrorString != kInvalidPointer)
266*8975f5c5SAndroid Build Coastguard Worker         {
267*8975f5c5SAndroid Build Coastguard Worker             return mCachedBasicDrawStatesErrorString;
268*8975f5c5SAndroid Build Coastguard Worker         }
269*8975f5c5SAndroid Build Coastguard Worker 
270*8975f5c5SAndroid Build Coastguard Worker         return getBasicDrawStatesErrorImpl(context, privateStateCache);
271*8975f5c5SAndroid Build Coastguard Worker     }
272*8975f5c5SAndroid Build Coastguard Worker 
273*8975f5c5SAndroid Build Coastguard Worker     // The GL error enum to use when generating errors due to failed draw states. Only valid if
274*8975f5c5SAndroid Build Coastguard Worker     // getBasicDrawStatesErrorString returns non-zero.
getBasicDrawElementsErrorCode()275*8975f5c5SAndroid Build Coastguard Worker     GLenum getBasicDrawElementsErrorCode() const
276*8975f5c5SAndroid Build Coastguard Worker     {
277*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mCachedBasicDrawStatesErrorString != kInvalidPointer);
278*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mCachedBasicDrawStatesErrorCode != GL_NO_ERROR);
279*8975f5c5SAndroid Build Coastguard Worker         return mCachedBasicDrawStatesErrorCode;
280*8975f5c5SAndroid Build Coastguard Worker     }
281*8975f5c5SAndroid Build Coastguard Worker 
282*8975f5c5SAndroid Build Coastguard Worker     // Places that can trigger updateProgramPipelineError:
283*8975f5c5SAndroid Build Coastguard Worker     // 1. onProgramExecutableChange.
getProgramPipelineError(const Context * context)284*8975f5c5SAndroid Build Coastguard Worker     intptr_t getProgramPipelineError(const Context *context) const
285*8975f5c5SAndroid Build Coastguard Worker     {
286*8975f5c5SAndroid Build Coastguard Worker         if (mCachedProgramPipelineError != kInvalidPointer)
287*8975f5c5SAndroid Build Coastguard Worker         {
288*8975f5c5SAndroid Build Coastguard Worker             return mCachedProgramPipelineError;
289*8975f5c5SAndroid Build Coastguard Worker         }
290*8975f5c5SAndroid Build Coastguard Worker 
291*8975f5c5SAndroid Build Coastguard Worker         return getProgramPipelineErrorImpl(context);
292*8975f5c5SAndroid Build Coastguard Worker     }
293*8975f5c5SAndroid Build Coastguard Worker 
294*8975f5c5SAndroid Build Coastguard Worker     // Places that can trigger updateBasicDrawElementsError:
295*8975f5c5SAndroid Build Coastguard Worker     // 1. onActiveTransformFeedbackChange.
296*8975f5c5SAndroid Build Coastguard Worker     // 2. onVertexArrayBufferStateChange.
297*8975f5c5SAndroid Build Coastguard Worker     // 3. onBufferBindingChange.
298*8975f5c5SAndroid Build Coastguard Worker     // 4. onVertexArrayStateChange.
299*8975f5c5SAndroid Build Coastguard Worker     // 5. onVertexArrayBindingStateChange.
getBasicDrawElementsError(const Context * context)300*8975f5c5SAndroid Build Coastguard Worker     intptr_t getBasicDrawElementsError(const Context *context) const
301*8975f5c5SAndroid Build Coastguard Worker     {
302*8975f5c5SAndroid Build Coastguard Worker         if (mCachedBasicDrawElementsError != kInvalidPointer)
303*8975f5c5SAndroid Build Coastguard Worker         {
304*8975f5c5SAndroid Build Coastguard Worker             return mCachedBasicDrawElementsError;
305*8975f5c5SAndroid Build Coastguard Worker         }
306*8975f5c5SAndroid Build Coastguard Worker 
307*8975f5c5SAndroid Build Coastguard Worker         return getBasicDrawElementsErrorImpl(context);
308*8975f5c5SAndroid Build Coastguard Worker     }
309*8975f5c5SAndroid Build Coastguard Worker 
310*8975f5c5SAndroid Build Coastguard Worker     // Places that can trigger updateValidDrawModes:
311*8975f5c5SAndroid Build Coastguard Worker     // 1. onProgramExecutableChange.
312*8975f5c5SAndroid Build Coastguard Worker     // 2. onActiveTransformFeedbackChange.
isValidDrawMode(PrimitiveMode primitiveMode)313*8975f5c5SAndroid Build Coastguard Worker     bool isValidDrawMode(PrimitiveMode primitiveMode) const
314*8975f5c5SAndroid Build Coastguard Worker     {
315*8975f5c5SAndroid Build Coastguard Worker         return mCachedValidDrawModes[primitiveMode];
316*8975f5c5SAndroid Build Coastguard Worker     }
317*8975f5c5SAndroid Build Coastguard Worker 
318*8975f5c5SAndroid Build Coastguard Worker     // Cannot change except on Context/Extension init.
isValidBindTextureType(TextureType type)319*8975f5c5SAndroid Build Coastguard Worker     bool isValidBindTextureType(TextureType type) const
320*8975f5c5SAndroid Build Coastguard Worker     {
321*8975f5c5SAndroid Build Coastguard Worker         return mCachedValidBindTextureTypes[type];
322*8975f5c5SAndroid Build Coastguard Worker     }
323*8975f5c5SAndroid Build Coastguard Worker 
324*8975f5c5SAndroid Build Coastguard Worker     // Cannot change except on Context/Extension init.
isValidDrawElementsType(DrawElementsType type)325*8975f5c5SAndroid Build Coastguard Worker     bool isValidDrawElementsType(DrawElementsType type) const
326*8975f5c5SAndroid Build Coastguard Worker     {
327*8975f5c5SAndroid Build Coastguard Worker         return mCachedValidDrawElementsTypes[type];
328*8975f5c5SAndroid Build Coastguard Worker     }
329*8975f5c5SAndroid Build Coastguard Worker 
330*8975f5c5SAndroid Build Coastguard Worker     // Places that can trigger updateTransformFeedbackActiveUnpaused:
331*8975f5c5SAndroid Build Coastguard Worker     // 1. onActiveTransformFeedbackChange.
isTransformFeedbackActiveUnpaused()332*8975f5c5SAndroid Build Coastguard Worker     bool isTransformFeedbackActiveUnpaused() const
333*8975f5c5SAndroid Build Coastguard Worker     {
334*8975f5c5SAndroid Build Coastguard Worker         return mCachedTransformFeedbackActiveUnpaused;
335*8975f5c5SAndroid Build Coastguard Worker     }
336*8975f5c5SAndroid Build Coastguard Worker 
337*8975f5c5SAndroid Build Coastguard Worker     // Cannot change except on Context/Extension init.
getVertexAttribTypeValidation(VertexAttribType type)338*8975f5c5SAndroid Build Coastguard Worker     VertexAttribTypeCase getVertexAttribTypeValidation(VertexAttribType type) const
339*8975f5c5SAndroid Build Coastguard Worker     {
340*8975f5c5SAndroid Build Coastguard Worker         return mCachedVertexAttribTypesValidation[type];
341*8975f5c5SAndroid Build Coastguard Worker     }
342*8975f5c5SAndroid Build Coastguard Worker 
getIntegerVertexAttribTypeValidation(VertexAttribType type)343*8975f5c5SAndroid Build Coastguard Worker     VertexAttribTypeCase getIntegerVertexAttribTypeValidation(VertexAttribType type) const
344*8975f5c5SAndroid Build Coastguard Worker     {
345*8975f5c5SAndroid Build Coastguard Worker         return mCachedIntegerVertexAttribTypesValidation[type];
346*8975f5c5SAndroid Build Coastguard Worker     }
347*8975f5c5SAndroid Build Coastguard Worker 
348*8975f5c5SAndroid Build Coastguard Worker     // Places that can trigger updateActiveShaderStorageBufferIndices:
349*8975f5c5SAndroid Build Coastguard Worker     // 1. onProgramExecutableChange.
getActiveShaderStorageBufferIndices()350*8975f5c5SAndroid Build Coastguard Worker     StorageBuffersMask getActiveShaderStorageBufferIndices() const
351*8975f5c5SAndroid Build Coastguard Worker     {
352*8975f5c5SAndroid Build Coastguard Worker         return mCachedActiveShaderStorageBufferIndices;
353*8975f5c5SAndroid Build Coastguard Worker     }
354*8975f5c5SAndroid Build Coastguard Worker 
355*8975f5c5SAndroid Build Coastguard Worker     // Places that can trigger updateActiveImageUnitIndices:
356*8975f5c5SAndroid Build Coastguard Worker     // 1. onProgramExecutableChange.
getActiveImageUnitIndices()357*8975f5c5SAndroid Build Coastguard Worker     const ImageUnitMask &getActiveImageUnitIndices() const { return mCachedActiveImageUnitIndices; }
358*8975f5c5SAndroid Build Coastguard Worker 
359*8975f5c5SAndroid Build Coastguard Worker     // Places that can trigger updateCanDraw:
360*8975f5c5SAndroid Build Coastguard Worker     // 1. onProgramExecutableChange.
getCanDraw()361*8975f5c5SAndroid Build Coastguard Worker     bool getCanDraw() const { return mCachedCanDraw; }
362*8975f5c5SAndroid Build Coastguard Worker 
363*8975f5c5SAndroid Build Coastguard Worker     // State change notifications.
364*8975f5c5SAndroid Build Coastguard Worker     void onVertexArrayBindingChange(Context *context);
365*8975f5c5SAndroid Build Coastguard Worker     void onProgramExecutableChange(Context *context);
366*8975f5c5SAndroid Build Coastguard Worker     void onVertexArrayFormatChange(Context *context);
367*8975f5c5SAndroid Build Coastguard Worker     void onVertexArrayBufferContentsChange(Context *context);
368*8975f5c5SAndroid Build Coastguard Worker     void onVertexArrayStateChange(Context *context);
369*8975f5c5SAndroid Build Coastguard Worker     void onVertexArrayBufferStateChange(Context *context);
370*8975f5c5SAndroid Build Coastguard Worker     void onGLES1TextureStateChange(Context *context);
371*8975f5c5SAndroid Build Coastguard Worker     void onGLES1ClientStateChange(Context *context);
372*8975f5c5SAndroid Build Coastguard Worker     void onDrawFramebufferChange(Context *context);
373*8975f5c5SAndroid Build Coastguard Worker     void onActiveTextureChange(Context *context);
374*8975f5c5SAndroid Build Coastguard Worker     void onQueryChange(Context *context);
375*8975f5c5SAndroid Build Coastguard Worker     void onActiveTransformFeedbackChange(Context *context);
376*8975f5c5SAndroid Build Coastguard Worker     void onUniformBufferStateChange(Context *context);
377*8975f5c5SAndroid Build Coastguard Worker     void onAtomicCounterBufferStateChange(Context *context);
378*8975f5c5SAndroid Build Coastguard Worker     void onShaderStorageBufferStateChange(Context *context);
379*8975f5c5SAndroid Build Coastguard Worker     void onBufferBindingChange(Context *context);
380*8975f5c5SAndroid Build Coastguard Worker 
381*8975f5c5SAndroid Build Coastguard Worker   private:
382*8975f5c5SAndroid Build Coastguard Worker     bool isCurrentContext(const Context *context, const PrivateStateCache *privateStateCache) const;
383*8975f5c5SAndroid Build Coastguard Worker 
384*8975f5c5SAndroid Build Coastguard Worker     // Cache update functions.
385*8975f5c5SAndroid Build Coastguard Worker     void updateActiveAttribsMask(Context *context);
386*8975f5c5SAndroid Build Coastguard Worker     void updateVertexElementLimits(Context *context);
387*8975f5c5SAndroid Build Coastguard Worker     void updateVertexElementLimitsImpl(Context *context);
388*8975f5c5SAndroid Build Coastguard Worker     void updateValidDrawModes(Context *context);
389*8975f5c5SAndroid Build Coastguard Worker     void updateValidBindTextureTypes(Context *context);
390*8975f5c5SAndroid Build Coastguard Worker     void updateValidDrawElementsTypes(Context *context);
391*8975f5c5SAndroid Build Coastguard Worker     void updateBasicDrawStatesError();
392*8975f5c5SAndroid Build Coastguard Worker     void updateProgramPipelineError();
393*8975f5c5SAndroid Build Coastguard Worker     void updateBasicDrawElementsError();
394*8975f5c5SAndroid Build Coastguard Worker     void updateTransformFeedbackActiveUnpaused(Context *context);
395*8975f5c5SAndroid Build Coastguard Worker     void updateVertexAttribTypesValidation(Context *context);
396*8975f5c5SAndroid Build Coastguard Worker     void updateActiveShaderStorageBufferIndices(Context *context);
397*8975f5c5SAndroid Build Coastguard Worker     void updateActiveImageUnitIndices(Context *context);
398*8975f5c5SAndroid Build Coastguard Worker     void updateCanDraw(Context *context);
399*8975f5c5SAndroid Build Coastguard Worker 
400*8975f5c5SAndroid Build Coastguard Worker     void setValidDrawModes(bool pointsOK,
401*8975f5c5SAndroid Build Coastguard Worker                            bool linesOK,
402*8975f5c5SAndroid Build Coastguard Worker                            bool trisOK,
403*8975f5c5SAndroid Build Coastguard Worker                            bool lineAdjOK,
404*8975f5c5SAndroid Build Coastguard Worker                            bool triAdjOK,
405*8975f5c5SAndroid Build Coastguard Worker                            bool patchOK);
406*8975f5c5SAndroid Build Coastguard Worker 
407*8975f5c5SAndroid Build Coastguard Worker     intptr_t getBasicDrawStatesErrorImpl(const Context *context,
408*8975f5c5SAndroid Build Coastguard Worker                                          const PrivateStateCache *privateStateCache) const;
409*8975f5c5SAndroid Build Coastguard Worker     intptr_t getProgramPipelineErrorImpl(const Context *context) const;
410*8975f5c5SAndroid Build Coastguard Worker     intptr_t getBasicDrawElementsErrorImpl(const Context *context) const;
411*8975f5c5SAndroid Build Coastguard Worker 
412*8975f5c5SAndroid Build Coastguard Worker     static constexpr intptr_t kInvalidPointer = 1;
413*8975f5c5SAndroid Build Coastguard Worker 
414*8975f5c5SAndroid Build Coastguard Worker     AttributesMask mCachedActiveBufferedAttribsMask;
415*8975f5c5SAndroid Build Coastguard Worker     AttributesMask mCachedActiveClientAttribsMask;
416*8975f5c5SAndroid Build Coastguard Worker     AttributesMask mCachedActiveDefaultAttribsMask;
417*8975f5c5SAndroid Build Coastguard Worker 
418*8975f5c5SAndroid Build Coastguard Worker     // Given a vertex attribute's stride, the corresponding vertex buffer can fit a number of such
419*8975f5c5SAndroid Build Coastguard Worker     // attributes.  A draw call that attempts to use more vertex attributes thus needs to fail (when
420*8975f5c5SAndroid Build Coastguard Worker     // robust access is enabled).  The following variables help implement this limit given the
421*8975f5c5SAndroid Build Coastguard Worker     // following situations:
422*8975f5c5SAndroid Build Coastguard Worker     //
423*8975f5c5SAndroid Build Coastguard Worker     // Assume:
424*8975f5c5SAndroid Build Coastguard Worker     //
425*8975f5c5SAndroid Build Coastguard Worker     // Ni = Number of vertex attributes that can fit in buffer bound to attribute i.
426*8975f5c5SAndroid Build Coastguard Worker     // Di = Vertex attribute divisor set for attribute i.
427*8975f5c5SAndroid Build Coastguard Worker     // F = Draw calls "first" vertex index
428*8975f5c5SAndroid Build Coastguard Worker     // C = Draw calls vertex "count"
429*8975f5c5SAndroid Build Coastguard Worker     // B = Instanced draw calls "baseinstance"
430*8975f5c5SAndroid Build Coastguard Worker     // P = Instanced draw calls "primcount"
431*8975f5c5SAndroid Build Coastguard Worker     //
432*8975f5c5SAndroid Build Coastguard Worker     // Then, for each attribute i:
433*8975f5c5SAndroid Build Coastguard Worker     //
434*8975f5c5SAndroid Build Coastguard Worker     //   If Di == 0 (i.e. non-instanced)
435*8975f5c5SAndroid Build Coastguard Worker     //     Vertices [F, F+C) are accessed
436*8975f5c5SAndroid Build Coastguard Worker     //     Draw call should fail if F+C > Ni
437*8975f5c5SAndroid Build Coastguard Worker     //
438*8975f5c5SAndroid Build Coastguard Worker     //   If Di != 0 (i.e. instanced), in a non-instanced draw call:
439*8975f5c5SAndroid Build Coastguard Worker     //     Only vertex 0 is accessed - note that a non-zero divisor in a non-instanced draw call
440*8975f5c5SAndroid Build Coastguard Worker     //       implies that F is ignored and the vertex index is not incremented.
441*8975f5c5SAndroid Build Coastguard Worker     //     Draw call should fail if Ni < 1
442*8975f5c5SAndroid Build Coastguard Worker     //
443*8975f5c5SAndroid Build Coastguard Worker     //   If Di != 0, in an instanced draw call:
444*8975f5c5SAndroid Build Coastguard Worker     //     Vertices [B, B+ceil(P/Di)) are accessed
445*8975f5c5SAndroid Build Coastguard Worker     //     Draw call should fail if B+ceil(P/Di) > Ni
446*8975f5c5SAndroid Build Coastguard Worker     //
447*8975f5c5SAndroid Build Coastguard Worker     // To avoid needing to iterate over all attributes in the hot paths, the following is
448*8975f5c5SAndroid Build Coastguard Worker     // calculated:
449*8975f5c5SAndroid Build Coastguard Worker     //
450*8975f5c5SAndroid Build Coastguard Worker     // Non-instanced limit: min(Ni) for all non-instanced attributes.  At draw time F+C <= min(Ni)
451*8975f5c5SAndroid Build Coastguard Worker     // is validated.
452*8975f5c5SAndroid Build Coastguard Worker     // Instanced limit: min(Ni*Di) for all instanced attributes.  At draw time, B+P <= min(Ni*Di) is
453*8975f5c5SAndroid Build Coastguard Worker     // validated (the math works out, try with an example!)
454*8975f5c5SAndroid Build Coastguard Worker     //
455*8975f5c5SAndroid Build Coastguard Worker     // For instanced attributes in a non-instanced draw call, need to check that min(Ni) > 0.
456*8975f5c5SAndroid Build Coastguard Worker     // Evaluating min(Ni*DI) > 0 produces the same result though, so the instanced limit is used
457*8975f5c5SAndroid Build Coastguard Worker     // there too.
458*8975f5c5SAndroid Build Coastguard Worker     //
459*8975f5c5SAndroid Build Coastguard Worker     // If there are no instanced attributes, the non-instanced limit is set to infinity.  If there
460*8975f5c5SAndroid Build Coastguard Worker     // are no instanced attributes, the instanced limits are set to infinity.
461*8975f5c5SAndroid Build Coastguard Worker     GLint64 mCachedNonInstancedVertexElementLimit;
462*8975f5c5SAndroid Build Coastguard Worker     GLint64 mCachedInstancedVertexElementLimit;
463*8975f5c5SAndroid Build Coastguard Worker 
464*8975f5c5SAndroid Build Coastguard Worker     mutable intptr_t mCachedBasicDrawStatesErrorString;
465*8975f5c5SAndroid Build Coastguard Worker     mutable GLenum mCachedBasicDrawStatesErrorCode;
466*8975f5c5SAndroid Build Coastguard Worker     mutable intptr_t mCachedBasicDrawElementsError;
467*8975f5c5SAndroid Build Coastguard Worker     // mCachedProgramPipelineError checks only the
468*8975f5c5SAndroid Build Coastguard Worker     // current-program-exists subset of mCachedBasicDrawStatesError.
469*8975f5c5SAndroid Build Coastguard Worker     // Therefore, mCachedProgramPipelineError follows
470*8975f5c5SAndroid Build Coastguard Worker     // mCachedBasicDrawStatesError in that if mCachedBasicDrawStatesError is
471*8975f5c5SAndroid Build Coastguard Worker     // no-error, so is mCachedProgramPipelineError.  Otherwise, if
472*8975f5c5SAndroid Build Coastguard Worker     // mCachedBasicDrawStatesError is in error, the state of
473*8975f5c5SAndroid Build Coastguard Worker     // mCachedProgramPipelineError can be no-error or also in error, or
474*8975f5c5SAndroid Build Coastguard Worker     // unknown due to early exiting.
475*8975f5c5SAndroid Build Coastguard Worker     mutable intptr_t mCachedProgramPipelineError;
476*8975f5c5SAndroid Build Coastguard Worker     bool mCachedHasAnyEnabledClientAttrib;
477*8975f5c5SAndroid Build Coastguard Worker     bool mCachedTransformFeedbackActiveUnpaused;
478*8975f5c5SAndroid Build Coastguard Worker     StorageBuffersMask mCachedActiveShaderStorageBufferIndices;
479*8975f5c5SAndroid Build Coastguard Worker     ImageUnitMask mCachedActiveImageUnitIndices;
480*8975f5c5SAndroid Build Coastguard Worker 
481*8975f5c5SAndroid Build Coastguard Worker     // Reserve an extra slot at the end of these maps for invalid enum.
482*8975f5c5SAndroid Build Coastguard Worker     angle::PackedEnumMap<PrimitiveMode, bool, angle::EnumSize<PrimitiveMode>() + 1>
483*8975f5c5SAndroid Build Coastguard Worker         mCachedValidDrawModes;
484*8975f5c5SAndroid Build Coastguard Worker     angle::PackedEnumMap<TextureType, bool, angle::EnumSize<TextureType>() + 1>
485*8975f5c5SAndroid Build Coastguard Worker         mCachedValidBindTextureTypes;
486*8975f5c5SAndroid Build Coastguard Worker     angle::PackedEnumMap<DrawElementsType, bool, angle::EnumSize<DrawElementsType>() + 1>
487*8975f5c5SAndroid Build Coastguard Worker         mCachedValidDrawElementsTypes;
488*8975f5c5SAndroid Build Coastguard Worker     angle::PackedEnumMap<VertexAttribType,
489*8975f5c5SAndroid Build Coastguard Worker                          VertexAttribTypeCase,
490*8975f5c5SAndroid Build Coastguard Worker                          angle::EnumSize<VertexAttribType>() + 1>
491*8975f5c5SAndroid Build Coastguard Worker         mCachedVertexAttribTypesValidation;
492*8975f5c5SAndroid Build Coastguard Worker     angle::PackedEnumMap<VertexAttribType,
493*8975f5c5SAndroid Build Coastguard Worker                          VertexAttribTypeCase,
494*8975f5c5SAndroid Build Coastguard Worker                          angle::EnumSize<VertexAttribType>() + 1>
495*8975f5c5SAndroid Build Coastguard Worker         mCachedIntegerVertexAttribTypesValidation;
496*8975f5c5SAndroid Build Coastguard Worker 
497*8975f5c5SAndroid Build Coastguard Worker     bool mCachedCanDraw;
498*8975f5c5SAndroid Build Coastguard Worker };
499*8975f5c5SAndroid Build Coastguard Worker 
500*8975f5c5SAndroid Build Coastguard Worker using VertexArrayMap       = ResourceMap<VertexArray, VertexArrayID>;
501*8975f5c5SAndroid Build Coastguard Worker using QueryMap             = ResourceMap<Query, QueryID>;
502*8975f5c5SAndroid Build Coastguard Worker using TransformFeedbackMap = ResourceMap<TransformFeedback, TransformFeedbackID>;
503*8975f5c5SAndroid Build Coastguard Worker 
504*8975f5c5SAndroid Build Coastguard Worker class Context final : public egl::LabeledObject, angle::NonCopyable, public angle::ObserverInterface
505*8975f5c5SAndroid Build Coastguard Worker {
506*8975f5c5SAndroid Build Coastguard Worker   public:
507*8975f5c5SAndroid Build Coastguard Worker     Context(egl::Display *display,
508*8975f5c5SAndroid Build Coastguard Worker             const egl::Config *config,
509*8975f5c5SAndroid Build Coastguard Worker             const Context *shareContext,
510*8975f5c5SAndroid Build Coastguard Worker             TextureManager *shareTextures,
511*8975f5c5SAndroid Build Coastguard Worker             SemaphoreManager *shareSemaphores,
512*8975f5c5SAndroid Build Coastguard Worker             egl::ContextMutex *sharedContextMutex,
513*8975f5c5SAndroid Build Coastguard Worker             MemoryProgramCache *memoryProgramCache,
514*8975f5c5SAndroid Build Coastguard Worker             MemoryShaderCache *memoryShaderCache,
515*8975f5c5SAndroid Build Coastguard Worker             const egl::AttributeMap &attribs,
516*8975f5c5SAndroid Build Coastguard Worker             const egl::DisplayExtensions &displayExtensions,
517*8975f5c5SAndroid Build Coastguard Worker             const egl::ClientExtensions &clientExtensions);
518*8975f5c5SAndroid Build Coastguard Worker 
519*8975f5c5SAndroid Build Coastguard Worker     // Use for debugging.
id()520*8975f5c5SAndroid Build Coastguard Worker     ContextID id() const { return mState.getContextID(); }
521*8975f5c5SAndroid Build Coastguard Worker 
522*8975f5c5SAndroid Build Coastguard Worker     egl::Error initialize();
523*8975f5c5SAndroid Build Coastguard Worker 
524*8975f5c5SAndroid Build Coastguard Worker     egl::Error onDestroy(const egl::Display *display);
525*8975f5c5SAndroid Build Coastguard Worker     ~Context() override;
526*8975f5c5SAndroid Build Coastguard Worker 
527*8975f5c5SAndroid Build Coastguard Worker     void setLabel(EGLLabelKHR label) override;
528*8975f5c5SAndroid Build Coastguard Worker     EGLLabelKHR getLabel() const override;
529*8975f5c5SAndroid Build Coastguard Worker 
530*8975f5c5SAndroid Build Coastguard Worker     egl::Error makeCurrent(egl::Display *display,
531*8975f5c5SAndroid Build Coastguard Worker                            egl::Surface *drawSurface,
532*8975f5c5SAndroid Build Coastguard Worker                            egl::Surface *readSurface);
533*8975f5c5SAndroid Build Coastguard Worker     egl::Error unMakeCurrent(const egl::Display *display);
534*8975f5c5SAndroid Build Coastguard Worker 
535*8975f5c5SAndroid Build Coastguard Worker     // These create and destroy methods pass through to ResourceManager, which owns these objects.
536*8975f5c5SAndroid Build Coastguard Worker     BufferID createBuffer();
537*8975f5c5SAndroid Build Coastguard Worker     TextureID createTexture();
538*8975f5c5SAndroid Build Coastguard Worker     RenderbufferID createRenderbuffer();
539*8975f5c5SAndroid Build Coastguard Worker     ProgramPipelineID createProgramPipeline();
540*8975f5c5SAndroid Build Coastguard Worker     MemoryObjectID createMemoryObject();
541*8975f5c5SAndroid Build Coastguard Worker     SemaphoreID createSemaphore();
542*8975f5c5SAndroid Build Coastguard Worker 
543*8975f5c5SAndroid Build Coastguard Worker     void deleteBuffer(BufferID buffer);
544*8975f5c5SAndroid Build Coastguard Worker     void deleteTexture(TextureID texture);
545*8975f5c5SAndroid Build Coastguard Worker     void deleteRenderbuffer(RenderbufferID renderbuffer);
546*8975f5c5SAndroid Build Coastguard Worker     void deleteProgramPipeline(ProgramPipelineID pipeline);
547*8975f5c5SAndroid Build Coastguard Worker     void deleteMemoryObject(MemoryObjectID memoryObject);
548*8975f5c5SAndroid Build Coastguard Worker     void deleteSemaphore(SemaphoreID semaphore);
549*8975f5c5SAndroid Build Coastguard Worker 
550*8975f5c5SAndroid Build Coastguard Worker     void bindReadFramebuffer(FramebufferID framebufferHandle);
551*8975f5c5SAndroid Build Coastguard Worker     void bindDrawFramebuffer(FramebufferID framebufferHandle);
552*8975f5c5SAndroid Build Coastguard Worker 
553*8975f5c5SAndroid Build Coastguard Worker     Buffer *getBuffer(BufferID handle) const;
554*8975f5c5SAndroid Build Coastguard Worker     FenceNV *getFenceNV(FenceNVID handle) const;
555*8975f5c5SAndroid Build Coastguard Worker     Sync *getSync(SyncID syncPacked) const;
getTexture(TextureID handle)556*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE Texture *getTexture(TextureID handle) const
557*8975f5c5SAndroid Build Coastguard Worker     {
558*8975f5c5SAndroid Build Coastguard Worker         return mState.mTextureManager->getTexture(handle);
559*8975f5c5SAndroid Build Coastguard Worker     }
560*8975f5c5SAndroid Build Coastguard Worker 
561*8975f5c5SAndroid Build Coastguard Worker     Framebuffer *getFramebuffer(FramebufferID handle) const;
562*8975f5c5SAndroid Build Coastguard Worker     Renderbuffer *getRenderbuffer(RenderbufferID handle) const;
563*8975f5c5SAndroid Build Coastguard Worker     VertexArray *getVertexArray(VertexArrayID handle) const;
564*8975f5c5SAndroid Build Coastguard Worker     Sampler *getSampler(SamplerID handle) const;
565*8975f5c5SAndroid Build Coastguard Worker     Query *getOrCreateQuery(QueryID handle, QueryType type);
566*8975f5c5SAndroid Build Coastguard Worker     Query *getQuery(QueryID handle) const;
567*8975f5c5SAndroid Build Coastguard Worker     TransformFeedback *getTransformFeedback(TransformFeedbackID handle) const;
568*8975f5c5SAndroid Build Coastguard Worker     ProgramPipeline *getProgramPipeline(ProgramPipelineID handle) const;
569*8975f5c5SAndroid Build Coastguard Worker     MemoryObject *getMemoryObject(MemoryObjectID handle) const;
570*8975f5c5SAndroid Build Coastguard Worker     Semaphore *getSemaphore(SemaphoreID handle) const;
571*8975f5c5SAndroid Build Coastguard Worker 
572*8975f5c5SAndroid Build Coastguard Worker     Texture *getTextureByType(TextureType type) const;
573*8975f5c5SAndroid Build Coastguard Worker     Texture *getTextureByTarget(TextureTarget target) const;
574*8975f5c5SAndroid Build Coastguard Worker     Texture *getSamplerTexture(unsigned int sampler, TextureType type) const;
575*8975f5c5SAndroid Build Coastguard Worker 
576*8975f5c5SAndroid Build Coastguard Worker     Compiler *getCompiler() const;
577*8975f5c5SAndroid Build Coastguard Worker 
578*8975f5c5SAndroid Build Coastguard Worker     bool isVertexArrayGenerated(VertexArrayID vertexArray) const;
579*8975f5c5SAndroid Build Coastguard Worker     bool isTransformFeedbackGenerated(TransformFeedbackID transformFeedback) const;
580*8975f5c5SAndroid Build Coastguard Worker 
isExternal()581*8975f5c5SAndroid Build Coastguard Worker     bool isExternal() const { return mState.isExternal(); }
582*8975f5c5SAndroid Build Coastguard Worker 
583*8975f5c5SAndroid Build Coastguard Worker     void getBooleanvImpl(GLenum pname, GLboolean *params) const;
584*8975f5c5SAndroid Build Coastguard Worker     void getFloatvImpl(GLenum pname, GLfloat *params) const;
585*8975f5c5SAndroid Build Coastguard Worker     void getIntegervImpl(GLenum pname, GLint *params) const;
586*8975f5c5SAndroid Build Coastguard Worker     void getInteger64vImpl(GLenum pname, GLint64 *params) const;
587*8975f5c5SAndroid Build Coastguard Worker     void getIntegerVertexAttribImpl(GLenum pname, GLenum attribpname, GLint *params) const;
588*8975f5c5SAndroid Build Coastguard Worker     void getVertexAttribivImpl(GLuint index, GLenum pname, GLint *params) const;
589*8975f5c5SAndroid Build Coastguard Worker 
590*8975f5c5SAndroid Build Coastguard Worker     // Framebuffers are owned by the Context, so these methods do not pass through
591*8975f5c5SAndroid Build Coastguard Worker     FramebufferID createFramebuffer();
592*8975f5c5SAndroid Build Coastguard Worker     void deleteFramebuffer(FramebufferID framebuffer);
593*8975f5c5SAndroid Build Coastguard Worker 
594*8975f5c5SAndroid Build Coastguard Worker     bool hasActiveTransformFeedback(ShaderProgramID program) const;
595*8975f5c5SAndroid Build Coastguard Worker 
596*8975f5c5SAndroid Build Coastguard Worker     // GLES entry point interface
597*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GLES_1_0_CONTEXT_API
598*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GLES_2_0_CONTEXT_API
599*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GLES_3_0_CONTEXT_API
600*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GLES_3_1_CONTEXT_API
601*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GLES_3_2_CONTEXT_API
602*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GLES_EXT_CONTEXT_API
603*8975f5c5SAndroid Build Coastguard Worker 
604*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleNoopDrawEvent();
605*8975f5c5SAndroid Build Coastguard Worker 
606*8975f5c5SAndroid Build Coastguard Worker     // Consumes an error.
607*8975f5c5SAndroid Build Coastguard Worker     void handleError(GLenum errorCode,
608*8975f5c5SAndroid Build Coastguard Worker                      const char *message,
609*8975f5c5SAndroid Build Coastguard Worker                      const char *file,
610*8975f5c5SAndroid Build Coastguard Worker                      const char *function,
611*8975f5c5SAndroid Build Coastguard Worker                      unsigned int line);
612*8975f5c5SAndroid Build Coastguard Worker 
613*8975f5c5SAndroid Build Coastguard Worker     bool isResetNotificationEnabled() const;
614*8975f5c5SAndroid Build Coastguard Worker 
isRobustnessEnabled()615*8975f5c5SAndroid Build Coastguard Worker     bool isRobustnessEnabled() const { return mState.hasRobustAccess(); }
616*8975f5c5SAndroid Build Coastguard Worker 
getConfig()617*8975f5c5SAndroid Build Coastguard Worker     const egl::Config *getConfig() const { return mConfig; }
618*8975f5c5SAndroid Build Coastguard Worker     EGLenum getRenderBuffer() const;
619*8975f5c5SAndroid Build Coastguard Worker     EGLenum getContextPriority() const;
620*8975f5c5SAndroid Build Coastguard Worker 
621*8975f5c5SAndroid Build Coastguard Worker     const GLubyte *getString(GLenum name) const;
622*8975f5c5SAndroid Build Coastguard Worker     const GLubyte *getStringi(GLenum name, GLuint index) const;
623*8975f5c5SAndroid Build Coastguard Worker 
624*8975f5c5SAndroid Build Coastguard Worker     size_t getExtensionStringCount() const;
625*8975f5c5SAndroid Build Coastguard Worker 
626*8975f5c5SAndroid Build Coastguard Worker     bool isExtensionRequestable(const char *name) const;
627*8975f5c5SAndroid Build Coastguard Worker     bool isExtensionDisablable(const char *name) const;
628*8975f5c5SAndroid Build Coastguard Worker     size_t getRequestableExtensionStringCount() const;
629*8975f5c5SAndroid Build Coastguard Worker     void setExtensionEnabled(const char *name, bool enabled);
630*8975f5c5SAndroid Build Coastguard Worker     void reinitializeAfterExtensionsChanged();
631*8975f5c5SAndroid Build Coastguard Worker 
getImplementation()632*8975f5c5SAndroid Build Coastguard Worker     rx::ContextImpl *getImplementation() const { return mImplementation.get(); }
633*8975f5c5SAndroid Build Coastguard Worker 
634*8975f5c5SAndroid Build Coastguard Worker     [[nodiscard]] bool getScratchBuffer(size_t requestedSizeBytes,
635*8975f5c5SAndroid Build Coastguard Worker                                         angle::MemoryBuffer **scratchBufferOut) const;
636*8975f5c5SAndroid Build Coastguard Worker     [[nodiscard]] bool getZeroFilledBuffer(size_t requstedSizeBytes,
637*8975f5c5SAndroid Build Coastguard Worker                                            angle::MemoryBuffer **zeroBufferOut) const;
638*8975f5c5SAndroid Build Coastguard Worker     angle::ScratchBuffer *getScratchBuffer() const;
639*8975f5c5SAndroid Build Coastguard Worker 
640*8975f5c5SAndroid Build Coastguard Worker     angle::Result prepareForCopyImage();
641*8975f5c5SAndroid Build Coastguard Worker     angle::Result prepareForDispatch();
642*8975f5c5SAndroid Build Coastguard Worker     angle::Result prepareForInvalidate(GLenum target);
643*8975f5c5SAndroid Build Coastguard Worker 
getMemoryProgramCache()644*8975f5c5SAndroid Build Coastguard Worker     MemoryProgramCache *getMemoryProgramCache() const { return mMemoryProgramCache; }
getMemoryShaderCache()645*8975f5c5SAndroid Build Coastguard Worker     MemoryShaderCache *getMemoryShaderCache() const { return mMemoryShaderCache; }
646*8975f5c5SAndroid Build Coastguard Worker 
647*8975f5c5SAndroid Build Coastguard Worker     angle::SimpleMutex &getProgramCacheMutex() const;
648*8975f5c5SAndroid Build Coastguard Worker 
hasBeenCurrent()649*8975f5c5SAndroid Build Coastguard Worker     bool hasBeenCurrent() const { return mHasBeenCurrent; }
getDisplay()650*8975f5c5SAndroid Build Coastguard Worker     egl::Display *getDisplay() const { return mDisplay; }
getCurrentDrawSurface()651*8975f5c5SAndroid Build Coastguard Worker     egl::Surface *getCurrentDrawSurface() const { return mCurrentDrawSurface; }
getCurrentReadSurface()652*8975f5c5SAndroid Build Coastguard Worker     egl::Surface *getCurrentReadSurface() const { return mCurrentReadSurface; }
653*8975f5c5SAndroid Build Coastguard Worker 
isRobustResourceInitEnabled()654*8975f5c5SAndroid Build Coastguard Worker     bool isRobustResourceInitEnabled() const { return mState.isRobustResourceInitEnabled(); }
655*8975f5c5SAndroid Build Coastguard Worker 
656*8975f5c5SAndroid Build Coastguard Worker     bool isCurrentTransformFeedback(const TransformFeedback *tf) const;
657*8975f5c5SAndroid Build Coastguard Worker 
isCurrentVertexArray(const VertexArray * va)658*8975f5c5SAndroid Build Coastguard Worker     bool isCurrentVertexArray(const VertexArray *va) const
659*8975f5c5SAndroid Build Coastguard Worker     {
660*8975f5c5SAndroid Build Coastguard Worker         return mState.isCurrentVertexArray(va);
661*8975f5c5SAndroid Build Coastguard Worker     }
662*8975f5c5SAndroid Build Coastguard Worker 
isShared()663*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE bool isShared() const { return mShared; }
664*8975f5c5SAndroid Build Coastguard Worker     // Once a context is setShared() it cannot be undone
setShared()665*8975f5c5SAndroid Build Coastguard Worker     void setShared() { mShared = true; }
666*8975f5c5SAndroid Build Coastguard Worker 
getState()667*8975f5c5SAndroid Build Coastguard Worker     const State &getState() const { return mState; }
getPrivateState()668*8975f5c5SAndroid Build Coastguard Worker     const PrivateState &getPrivateState() const { return mState.privateState(); }
getClientMajorVersion()669*8975f5c5SAndroid Build Coastguard Worker     GLint getClientMajorVersion() const { return mState.getClientMajorVersion(); }
getClientMinorVersion()670*8975f5c5SAndroid Build Coastguard Worker     GLint getClientMinorVersion() const { return mState.getClientMinorVersion(); }
getClientVersion()671*8975f5c5SAndroid Build Coastguard Worker     const Version &getClientVersion() const { return mState.getClientVersion(); }
getCaps()672*8975f5c5SAndroid Build Coastguard Worker     const Caps &getCaps() const { return mState.getCaps(); }
getTextureCaps()673*8975f5c5SAndroid Build Coastguard Worker     const TextureCapsMap &getTextureCaps() const { return mState.getTextureCaps(); }
getExtensions()674*8975f5c5SAndroid Build Coastguard Worker     const Extensions &getExtensions() const { return mState.getExtensions(); }
getLimitations()675*8975f5c5SAndroid Build Coastguard Worker     const Limitations &getLimitations() const { return mState.getLimitations(); }
676*8975f5c5SAndroid Build Coastguard Worker     bool isGLES1() const;
677*8975f5c5SAndroid Build Coastguard Worker 
678*8975f5c5SAndroid Build Coastguard Worker     // To be used **only** directly by the entry points.
getMutablePrivateState()679*8975f5c5SAndroid Build Coastguard Worker     PrivateState *getMutablePrivateState() { return mState.getMutablePrivateState(); }
getMutableGLES1State()680*8975f5c5SAndroid Build Coastguard Worker     GLES1State *getMutableGLES1State() { return mState.getMutableGLES1State(); }
681*8975f5c5SAndroid Build Coastguard Worker 
skipValidation()682*8975f5c5SAndroid Build Coastguard Worker     bool skipValidation() const { return mErrors.skipValidation(); }
markContextLost(GraphicsResetStatus status)683*8975f5c5SAndroid Build Coastguard Worker     void markContextLost(GraphicsResetStatus status) { mErrors.markContextLost(status); }
isContextLost()684*8975f5c5SAndroid Build Coastguard Worker     bool isContextLost() const { return mErrors.isContextLost(); }
685*8975f5c5SAndroid Build Coastguard Worker 
getMutableErrorSetForValidation()686*8975f5c5SAndroid Build Coastguard Worker     ErrorSet *getMutableErrorSetForValidation() const { return &mErrors; }
687*8975f5c5SAndroid Build Coastguard Worker 
688*8975f5c5SAndroid Build Coastguard Worker     // Specific methods needed for validation.
689*8975f5c5SAndroid Build Coastguard Worker     bool getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams) const;
690*8975f5c5SAndroid Build Coastguard Worker     bool getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams) const;
691*8975f5c5SAndroid Build Coastguard Worker 
getProgramResolveLink(ShaderProgramID handle)692*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE Program *getProgramResolveLink(ShaderProgramID handle) const
693*8975f5c5SAndroid Build Coastguard Worker     {
694*8975f5c5SAndroid Build Coastguard Worker         Program *program = mState.mShaderProgramManager->getProgram(handle);
695*8975f5c5SAndroid Build Coastguard Worker         if (program)
696*8975f5c5SAndroid Build Coastguard Worker         {
697*8975f5c5SAndroid Build Coastguard Worker             program->resolveLink(this);
698*8975f5c5SAndroid Build Coastguard Worker         }
699*8975f5c5SAndroid Build Coastguard Worker         return program;
700*8975f5c5SAndroid Build Coastguard Worker     }
701*8975f5c5SAndroid Build Coastguard Worker 
702*8975f5c5SAndroid Build Coastguard Worker     Program *getProgramNoResolveLink(ShaderProgramID handle) const;
703*8975f5c5SAndroid Build Coastguard Worker     Shader *getShaderResolveCompile(ShaderProgramID handle) const;
704*8975f5c5SAndroid Build Coastguard Worker     Shader *getShaderNoResolveCompile(ShaderProgramID handle) const;
705*8975f5c5SAndroid Build Coastguard Worker 
isTextureGenerated(TextureID texture)706*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE bool isTextureGenerated(TextureID texture) const
707*8975f5c5SAndroid Build Coastguard Worker     {
708*8975f5c5SAndroid Build Coastguard Worker         return mState.mTextureManager->isHandleGenerated(texture);
709*8975f5c5SAndroid Build Coastguard Worker     }
710*8975f5c5SAndroid Build Coastguard Worker 
isBufferGenerated(BufferID buffer)711*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE bool isBufferGenerated(BufferID buffer) const
712*8975f5c5SAndroid Build Coastguard Worker     {
713*8975f5c5SAndroid Build Coastguard Worker         return mState.mBufferManager->isHandleGenerated(buffer);
714*8975f5c5SAndroid Build Coastguard Worker     }
715*8975f5c5SAndroid Build Coastguard Worker 
716*8975f5c5SAndroid Build Coastguard Worker     bool isRenderbufferGenerated(RenderbufferID renderbuffer) const;
717*8975f5c5SAndroid Build Coastguard Worker     bool isFramebufferGenerated(FramebufferID framebuffer) const;
718*8975f5c5SAndroid Build Coastguard Worker     bool isProgramPipelineGenerated(ProgramPipelineID pipeline) const;
719*8975f5c5SAndroid Build Coastguard Worker     bool isQueryGenerated(QueryID query) const;
720*8975f5c5SAndroid Build Coastguard Worker 
721*8975f5c5SAndroid Build Coastguard Worker     bool usingDisplayTextureShareGroup() const;
722*8975f5c5SAndroid Build Coastguard Worker     bool usingDisplaySemaphoreShareGroup() const;
723*8975f5c5SAndroid Build Coastguard Worker 
724*8975f5c5SAndroid Build Coastguard Worker     // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
725*8975f5c5SAndroid Build Coastguard Worker     GLenum getConvertedRenderbufferFormat(GLenum internalformat) const;
726*8975f5c5SAndroid Build Coastguard Worker 
isWebGL()727*8975f5c5SAndroid Build Coastguard Worker     bool isWebGL() const { return mState.isWebGL(); }
isWebGL1()728*8975f5c5SAndroid Build Coastguard Worker     bool isWebGL1() const { return mState.isWebGL1(); }
getRendererString()729*8975f5c5SAndroid Build Coastguard Worker     const char *getRendererString() const { return mRendererString; }
730*8975f5c5SAndroid Build Coastguard Worker 
isValidBufferBinding(BufferBinding binding)731*8975f5c5SAndroid Build Coastguard Worker     bool isValidBufferBinding(BufferBinding binding) const { return mValidBufferBindings[binding]; }
732*8975f5c5SAndroid Build Coastguard Worker 
733*8975f5c5SAndroid Build Coastguard Worker     // GLES1 emulation: Renderer level (for validation)
734*8975f5c5SAndroid Build Coastguard Worker     int vertexArrayIndex(ClientVertexArrayType type) const;
735*8975f5c5SAndroid Build Coastguard Worker     static int TexCoordArrayIndex(unsigned int unit);
736*8975f5c5SAndroid Build Coastguard Worker 
737*8975f5c5SAndroid Build Coastguard Worker     // GL_KHR_parallel_shader_compile
738*8975f5c5SAndroid Build Coastguard Worker     std::shared_ptr<angle::WorkerThreadPool> getShaderCompileThreadPool() const;
739*8975f5c5SAndroid Build Coastguard Worker     std::shared_ptr<angle::WorkerThreadPool> getLinkSubTaskThreadPool() const;
740*8975f5c5SAndroid Build Coastguard Worker     std::shared_ptr<angle::WaitableEvent> postCompileLinkTask(
741*8975f5c5SAndroid Build Coastguard Worker         const std::shared_ptr<angle::Closure> &task,
742*8975f5c5SAndroid Build Coastguard Worker         angle::JobThreadSafety safety,
743*8975f5c5SAndroid Build Coastguard Worker         angle::JobResultExpectancy resultExpectancy) const;
744*8975f5c5SAndroid Build Coastguard Worker 
745*8975f5c5SAndroid Build Coastguard Worker     // Single-threaded pool; runs everything instantly
746*8975f5c5SAndroid Build Coastguard Worker     std::shared_ptr<angle::WorkerThreadPool> getSingleThreadPool() const;
747*8975f5c5SAndroid Build Coastguard Worker 
748*8975f5c5SAndroid Build Coastguard Worker     // Generic multithread pool.
749*8975f5c5SAndroid Build Coastguard Worker     std::shared_ptr<angle::WorkerThreadPool> getWorkerThreadPool() const;
750*8975f5c5SAndroid Build Coastguard Worker 
getStateCache()751*8975f5c5SAndroid Build Coastguard Worker     const StateCache &getStateCache() const { return mStateCache; }
getStateCache()752*8975f5c5SAndroid Build Coastguard Worker     StateCache &getStateCache() { return mStateCache; }
753*8975f5c5SAndroid Build Coastguard Worker 
getPrivateStateCache()754*8975f5c5SAndroid Build Coastguard Worker     const PrivateStateCache &getPrivateStateCache() const { return mPrivateStateCache; }
getMutablePrivateStateCache()755*8975f5c5SAndroid Build Coastguard Worker     PrivateStateCache *getMutablePrivateStateCache() { return &mPrivateStateCache; }
756*8975f5c5SAndroid Build Coastguard Worker 
757*8975f5c5SAndroid Build Coastguard Worker     void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override;
758*8975f5c5SAndroid Build Coastguard Worker 
759*8975f5c5SAndroid Build Coastguard Worker     void onSamplerUniformChange(size_t textureUnitIndex);
760*8975f5c5SAndroid Build Coastguard Worker 
isBufferAccessValidationEnabled()761*8975f5c5SAndroid Build Coastguard Worker     bool isBufferAccessValidationEnabled() const { return mBufferAccessValidationEnabled; }
762*8975f5c5SAndroid Build Coastguard Worker 
763*8975f5c5SAndroid Build Coastguard Worker     const angle::FrontendFeatures &getFrontendFeatures() const;
764*8975f5c5SAndroid Build Coastguard Worker 
getFrameCapture()765*8975f5c5SAndroid Build Coastguard Worker     angle::FrameCapture *getFrameCapture() const { return mFrameCapture.get(); }
766*8975f5c5SAndroid Build Coastguard Worker 
getVertexArraysForCapture()767*8975f5c5SAndroid Build Coastguard Worker     const VertexArrayMap &getVertexArraysForCapture() const { return mVertexArrayMap; }
getQueriesForCapture()768*8975f5c5SAndroid Build Coastguard Worker     const QueryMap &getQueriesForCapture() const { return mQueryMap; }
getTransformFeedbacksForCapture()769*8975f5c5SAndroid Build Coastguard Worker     const TransformFeedbackMap &getTransformFeedbacksForCapture() const
770*8975f5c5SAndroid Build Coastguard Worker     {
771*8975f5c5SAndroid Build Coastguard Worker         return mTransformFeedbackMap;
772*8975f5c5SAndroid Build Coastguard Worker     }
getErrorForCapture()773*8975f5c5SAndroid Build Coastguard Worker     GLenum getErrorForCapture() const { return mErrors.getErrorForCapture(); }
774*8975f5c5SAndroid Build Coastguard Worker 
775*8975f5c5SAndroid Build Coastguard Worker     void onPreSwap();
776*8975f5c5SAndroid Build Coastguard Worker 
777*8975f5c5SAndroid Build Coastguard Worker     Program *getActiveLinkedProgram() const;
778*8975f5c5SAndroid Build Coastguard Worker 
779*8975f5c5SAndroid Build Coastguard Worker     // EGL_ANGLE_power_preference implementation.
780*8975f5c5SAndroid Build Coastguard Worker     egl::Error releaseHighPowerGPU();
781*8975f5c5SAndroid Build Coastguard Worker     egl::Error reacquireHighPowerGPU();
782*8975f5c5SAndroid Build Coastguard Worker     void onGPUSwitch();
783*8975f5c5SAndroid Build Coastguard Worker 
784*8975f5c5SAndroid Build Coastguard Worker     // EGL_ANGLE_external_context_and_surface implementation.
785*8975f5c5SAndroid Build Coastguard Worker     egl::Error acquireExternalContext(egl::Surface *drawAndReadSurface);
786*8975f5c5SAndroid Build Coastguard Worker     egl::Error releaseExternalContext();
787*8975f5c5SAndroid Build Coastguard Worker 
788*8975f5c5SAndroid Build Coastguard Worker     bool noopDraw(PrimitiveMode mode, GLsizei count) const;
789*8975f5c5SAndroid Build Coastguard Worker     bool noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount) const;
790*8975f5c5SAndroid Build Coastguard Worker     bool noopMultiDraw(GLsizei drawcount) const;
791*8975f5c5SAndroid Build Coastguard Worker 
792*8975f5c5SAndroid Build Coastguard Worker     bool isClearBufferMaskedOut(GLenum buffer,
793*8975f5c5SAndroid Build Coastguard Worker                                 GLint drawbuffer,
794*8975f5c5SAndroid Build Coastguard Worker                                 GLuint framebufferStencilSize) const;
795*8975f5c5SAndroid Build Coastguard Worker     bool noopClearBuffer(GLenum buffer, GLint drawbuffer) const;
796*8975f5c5SAndroid Build Coastguard Worker 
addRef()797*8975f5c5SAndroid Build Coastguard Worker     void addRef() const { mRefCount++; }
release()798*8975f5c5SAndroid Build Coastguard Worker     void release() const { mRefCount--; }
isReferenced()799*8975f5c5SAndroid Build Coastguard Worker     bool isReferenced() const { return mRefCount > 0; }
800*8975f5c5SAndroid Build Coastguard Worker 
getShareGroup()801*8975f5c5SAndroid Build Coastguard Worker     egl::ShareGroup *getShareGroup() const { return mState.getShareGroup(); }
802*8975f5c5SAndroid Build Coastguard Worker 
803*8975f5c5SAndroid Build Coastguard Worker     // Warning! When need to store pointer to the mutex in other object use `getRoot()` pointer, do
804*8975f5c5SAndroid Build Coastguard Worker     // NOT get pointer of the `getContextMutex()` reference.
getContextMutex()805*8975f5c5SAndroid Build Coastguard Worker     egl::ContextMutex &getContextMutex() const { return mState.mContextMutex; }
806*8975f5c5SAndroid Build Coastguard Worker 
807*8975f5c5SAndroid Build Coastguard Worker     bool supportsGeometryOrTesselation() const;
808*8975f5c5SAndroid Build Coastguard Worker     void dirtyAllState();
809*8975f5c5SAndroid Build Coastguard Worker 
isDestroyed()810*8975f5c5SAndroid Build Coastguard Worker     bool isDestroyed() const { return mIsDestroyed; }
setIsDestroyed()811*8975f5c5SAndroid Build Coastguard Worker     void setIsDestroyed() { mIsDestroyed = true; }
812*8975f5c5SAndroid Build Coastguard Worker 
813*8975f5c5SAndroid Build Coastguard Worker     // This function acts as glEnable(GL_COLOR_LOGIC_OP), but it's called from the GLES1 emulation
814*8975f5c5SAndroid Build Coastguard Worker     // code to implement logicOp using the non-GLES1 functionality (i.e. GL_ANGLE_logic_op).  The
815*8975f5c5SAndroid Build Coastguard Worker     // ContextPrivateEnable() entry point implementation cannot be used (as ContextPrivate*
816*8975f5c5SAndroid Build Coastguard Worker     // functions are typically used by other frontend-emulated features) because it forwards this
817*8975f5c5SAndroid Build Coastguard Worker     // back to GLES1.
818*8975f5c5SAndroid Build Coastguard Worker     void setLogicOpEnabledForGLES1(bool enabled);
819*8975f5c5SAndroid Build Coastguard Worker 
820*8975f5c5SAndroid Build Coastguard Worker     // Needed by capture serialization logic that works with a "const" Context pointer.
821*8975f5c5SAndroid Build Coastguard Worker     void finishImmutable() const;
822*8975f5c5SAndroid Build Coastguard Worker 
823*8975f5c5SAndroid Build Coastguard Worker     const angle::PerfMonitorCounterGroups &getPerfMonitorCounterGroups() const;
824*8975f5c5SAndroid Build Coastguard Worker 
825*8975f5c5SAndroid Build Coastguard Worker     // Ends the currently active pixel local storage session with GL_STORE_OP_STORE on all planes.
826*8975f5c5SAndroid Build Coastguard Worker     void endPixelLocalStorageImplicit();
827*8975f5c5SAndroid Build Coastguard Worker 
828*8975f5c5SAndroid Build Coastguard Worker     bool areBlobCacheFuncsSet() const;
829*8975f5c5SAndroid Build Coastguard Worker 
830*8975f5c5SAndroid Build Coastguard Worker   private:
831*8975f5c5SAndroid Build Coastguard Worker     void initializeDefaultResources();
832*8975f5c5SAndroid Build Coastguard Worker     void releaseSharedObjects();
833*8975f5c5SAndroid Build Coastguard Worker 
834*8975f5c5SAndroid Build Coastguard Worker     angle::Result prepareForDraw(PrimitiveMode mode);
835*8975f5c5SAndroid Build Coastguard Worker     angle::Result prepareForClear(GLbitfield mask);
836*8975f5c5SAndroid Build Coastguard Worker     angle::Result prepareForClearBuffer(GLenum buffer, GLint drawbuffer);
837*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncState(const state::DirtyBits bitMask,
838*8975f5c5SAndroid Build Coastguard Worker                             const state::ExtendedDirtyBits extendedBitMask,
839*8975f5c5SAndroid Build Coastguard Worker                             const state::DirtyObjects &objectMask,
840*8975f5c5SAndroid Build Coastguard Worker                             Command command);
841*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncAllDirtyBits(Command command);
842*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncDirtyBits(const state::DirtyBits bitMask,
843*8975f5c5SAndroid Build Coastguard Worker                                 const state::ExtendedDirtyBits extendedBitMask,
844*8975f5c5SAndroid Build Coastguard Worker                                 Command command);
845*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncDirtyObjects(const state::DirtyObjects &objectMask, Command command);
846*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncStateForReadPixels();
847*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncStateForTexImage();
848*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncStateForBlit(GLbitfield mask);
849*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncStateForClear();
850*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncTextureForCopy(Texture *texture);
851*8975f5c5SAndroid Build Coastguard Worker 
852*8975f5c5SAndroid Build Coastguard Worker     VertexArray *checkVertexArrayAllocation(VertexArrayID vertexArrayHandle);
853*8975f5c5SAndroid Build Coastguard Worker     TransformFeedback *checkTransformFeedbackAllocation(TransformFeedbackID transformFeedback);
854*8975f5c5SAndroid Build Coastguard Worker 
855*8975f5c5SAndroid Build Coastguard Worker     void detachBuffer(Buffer *buffer);
856*8975f5c5SAndroid Build Coastguard Worker     void detachTexture(TextureID texture);
857*8975f5c5SAndroid Build Coastguard Worker     void detachFramebuffer(FramebufferID framebuffer);
858*8975f5c5SAndroid Build Coastguard Worker     void detachRenderbuffer(RenderbufferID renderbuffer);
859*8975f5c5SAndroid Build Coastguard Worker     void detachVertexArray(VertexArrayID vertexArray);
860*8975f5c5SAndroid Build Coastguard Worker     void detachTransformFeedback(TransformFeedbackID transformFeedback);
861*8975f5c5SAndroid Build Coastguard Worker     void detachSampler(SamplerID sampler);
862*8975f5c5SAndroid Build Coastguard Worker     void detachProgramPipeline(ProgramPipelineID pipeline);
863*8975f5c5SAndroid Build Coastguard Worker 
864*8975f5c5SAndroid Build Coastguard Worker     egl::Error setDefaultFramebuffer(egl::Surface *drawSurface, egl::Surface *readSurface);
865*8975f5c5SAndroid Build Coastguard Worker     egl::Error unsetDefaultFramebuffer();
866*8975f5c5SAndroid Build Coastguard Worker 
867*8975f5c5SAndroid Build Coastguard Worker     void initRendererString();
868*8975f5c5SAndroid Build Coastguard Worker     void initVendorString();
869*8975f5c5SAndroid Build Coastguard Worker     void initVersionStrings();
870*8975f5c5SAndroid Build Coastguard Worker     void initExtensionStrings();
871*8975f5c5SAndroid Build Coastguard Worker 
872*8975f5c5SAndroid Build Coastguard Worker     Extensions generateSupportedExtensions() const;
873*8975f5c5SAndroid Build Coastguard Worker     void initCaps();
874*8975f5c5SAndroid Build Coastguard Worker     void updateCaps();
875*8975f5c5SAndroid Build Coastguard Worker 
876*8975f5c5SAndroid Build Coastguard Worker     gl::LabeledObject *getLabeledObject(GLenum identifier, GLuint name) const;
877*8975f5c5SAndroid Build Coastguard Worker     gl::LabeledObject *getLabeledObjectFromPtr(const void *ptr) const;
878*8975f5c5SAndroid Build Coastguard Worker 
879*8975f5c5SAndroid Build Coastguard Worker     void setUniform1iImpl(Program *program,
880*8975f5c5SAndroid Build Coastguard Worker                           UniformLocation location,
881*8975f5c5SAndroid Build Coastguard Worker                           GLsizei count,
882*8975f5c5SAndroid Build Coastguard Worker                           const GLint *v);
883*8975f5c5SAndroid Build Coastguard Worker     void renderbufferStorageMultisampleImpl(GLenum target,
884*8975f5c5SAndroid Build Coastguard Worker                                             GLsizei samples,
885*8975f5c5SAndroid Build Coastguard Worker                                             GLenum internalformat,
886*8975f5c5SAndroid Build Coastguard Worker                                             GLsizei width,
887*8975f5c5SAndroid Build Coastguard Worker                                             GLsizei height,
888*8975f5c5SAndroid Build Coastguard Worker                                             MultisamplingMode mode);
889*8975f5c5SAndroid Build Coastguard Worker 
890*8975f5c5SAndroid Build Coastguard Worker     void onUniformBlockBindingUpdated(GLuint uniformBlockIndex);
891*8975f5c5SAndroid Build Coastguard Worker 
892*8975f5c5SAndroid Build Coastguard Worker     void endTilingImplicit();
893*8975f5c5SAndroid Build Coastguard Worker 
894*8975f5c5SAndroid Build Coastguard Worker     State mState;
895*8975f5c5SAndroid Build Coastguard Worker     bool mShared;
896*8975f5c5SAndroid Build Coastguard Worker     bool mDisplayTextureShareGroup;
897*8975f5c5SAndroid Build Coastguard Worker     bool mDisplaySemaphoreShareGroup;
898*8975f5c5SAndroid Build Coastguard Worker 
899*8975f5c5SAndroid Build Coastguard Worker     // Recorded errors
900*8975f5c5SAndroid Build Coastguard Worker     mutable ErrorSet mErrors;
901*8975f5c5SAndroid Build Coastguard Worker 
902*8975f5c5SAndroid Build Coastguard Worker     // Stores for each buffer binding type whether is it allowed to be used in this context.
903*8975f5c5SAndroid Build Coastguard Worker     angle::PackedEnumBitSet<BufferBinding> mValidBufferBindings;
904*8975f5c5SAndroid Build Coastguard Worker 
905*8975f5c5SAndroid Build Coastguard Worker     std::unique_ptr<rx::ContextImpl> mImplementation;
906*8975f5c5SAndroid Build Coastguard Worker 
907*8975f5c5SAndroid Build Coastguard Worker     EGLLabelKHR mLabel;
908*8975f5c5SAndroid Build Coastguard Worker 
909*8975f5c5SAndroid Build Coastguard Worker     // Extensions supported by the implementation plus extensions that are implemented entirely
910*8975f5c5SAndroid Build Coastguard Worker     // within the frontend.
911*8975f5c5SAndroid Build Coastguard Worker     Extensions mSupportedExtensions;
912*8975f5c5SAndroid Build Coastguard Worker 
913*8975f5c5SAndroid Build Coastguard Worker     // Shader compiler. Lazily initialized hence the mutable value.
914*8975f5c5SAndroid Build Coastguard Worker     mutable BindingPointer<Compiler> mCompiler;
915*8975f5c5SAndroid Build Coastguard Worker 
916*8975f5c5SAndroid Build Coastguard Worker     const egl::Config *mConfig;
917*8975f5c5SAndroid Build Coastguard Worker 
918*8975f5c5SAndroid Build Coastguard Worker     TextureMap mZeroTextures;
919*8975f5c5SAndroid Build Coastguard Worker 
920*8975f5c5SAndroid Build Coastguard Worker     ResourceMap<FenceNV, FenceNVID> mFenceNVMap;
921*8975f5c5SAndroid Build Coastguard Worker     HandleAllocator mFenceNVHandleAllocator;
922*8975f5c5SAndroid Build Coastguard Worker 
923*8975f5c5SAndroid Build Coastguard Worker     QueryMap mQueryMap;
924*8975f5c5SAndroid Build Coastguard Worker     HandleAllocator mQueryHandleAllocator;
925*8975f5c5SAndroid Build Coastguard Worker 
926*8975f5c5SAndroid Build Coastguard Worker     VertexArrayMap mVertexArrayMap;
927*8975f5c5SAndroid Build Coastguard Worker     HandleAllocator mVertexArrayHandleAllocator;
928*8975f5c5SAndroid Build Coastguard Worker 
929*8975f5c5SAndroid Build Coastguard Worker     TransformFeedbackMap mTransformFeedbackMap;
930*8975f5c5SAndroid Build Coastguard Worker     HandleAllocator mTransformFeedbackHandleAllocator;
931*8975f5c5SAndroid Build Coastguard Worker 
932*8975f5c5SAndroid Build Coastguard Worker     const char *mVendorString;
933*8975f5c5SAndroid Build Coastguard Worker     const char *mVersionString;
934*8975f5c5SAndroid Build Coastguard Worker     const char *mShadingLanguageString;
935*8975f5c5SAndroid Build Coastguard Worker     const char *mRendererString;
936*8975f5c5SAndroid Build Coastguard Worker     const char *mExtensionString;
937*8975f5c5SAndroid Build Coastguard Worker     std::vector<const char *> mExtensionStrings;
938*8975f5c5SAndroid Build Coastguard Worker     const char *mRequestableExtensionString;
939*8975f5c5SAndroid Build Coastguard Worker     std::vector<const char *> mRequestableExtensionStrings;
940*8975f5c5SAndroid Build Coastguard Worker 
941*8975f5c5SAndroid Build Coastguard Worker     // GLES1 renderer state
942*8975f5c5SAndroid Build Coastguard Worker     std::unique_ptr<GLES1Renderer> mGLES1Renderer;
943*8975f5c5SAndroid Build Coastguard Worker 
944*8975f5c5SAndroid Build Coastguard Worker     // Current/lost context flags
945*8975f5c5SAndroid Build Coastguard Worker     bool mHasBeenCurrent;
946*8975f5c5SAndroid Build Coastguard Worker     const bool mSurfacelessSupported;
947*8975f5c5SAndroid Build Coastguard Worker     egl::Surface *mCurrentDrawSurface;
948*8975f5c5SAndroid Build Coastguard Worker     egl::Surface *mCurrentReadSurface;
949*8975f5c5SAndroid Build Coastguard Worker     egl::Display *mDisplay;
950*8975f5c5SAndroid Build Coastguard Worker     const bool mWebGLContext;
951*8975f5c5SAndroid Build Coastguard Worker     bool mBufferAccessValidationEnabled;
952*8975f5c5SAndroid Build Coastguard Worker     const bool mExtensionsEnabled;
953*8975f5c5SAndroid Build Coastguard Worker     MemoryProgramCache *mMemoryProgramCache;
954*8975f5c5SAndroid Build Coastguard Worker     MemoryShaderCache *mMemoryShaderCache;
955*8975f5c5SAndroid Build Coastguard Worker 
956*8975f5c5SAndroid Build Coastguard Worker     state::DirtyObjects mDrawDirtyObjects;
957*8975f5c5SAndroid Build Coastguard Worker 
958*8975f5c5SAndroid Build Coastguard Worker     StateCache mStateCache;
959*8975f5c5SAndroid Build Coastguard Worker     PrivateStateCache mPrivateStateCache;
960*8975f5c5SAndroid Build Coastguard Worker 
961*8975f5c5SAndroid Build Coastguard Worker     state::DirtyObjects mTexImageDirtyObjects;
962*8975f5c5SAndroid Build Coastguard Worker     state::DirtyObjects mReadPixelsDirtyObjects;
963*8975f5c5SAndroid Build Coastguard Worker     state::DirtyObjects mClearDirtyObjects;
964*8975f5c5SAndroid Build Coastguard Worker     state::DirtyObjects mBlitDirtyObjects;
965*8975f5c5SAndroid Build Coastguard Worker     state::DirtyObjects mComputeDirtyObjects;
966*8975f5c5SAndroid Build Coastguard Worker     state::DirtyBits mCopyImageDirtyBits;
967*8975f5c5SAndroid Build Coastguard Worker     state::DirtyObjects mCopyImageDirtyObjects;
968*8975f5c5SAndroid Build Coastguard Worker 
969*8975f5c5SAndroid Build Coastguard Worker     // Binding to container objects that use dependent state updates.
970*8975f5c5SAndroid Build Coastguard Worker     angle::ObserverBinding mVertexArrayObserverBinding;
971*8975f5c5SAndroid Build Coastguard Worker     angle::ObserverBinding mDrawFramebufferObserverBinding;
972*8975f5c5SAndroid Build Coastguard Worker     angle::ObserverBinding mReadFramebufferObserverBinding;
973*8975f5c5SAndroid Build Coastguard Worker     angle::ObserverBinding mProgramObserverBinding;
974*8975f5c5SAndroid Build Coastguard Worker     angle::ObserverBinding mProgramPipelineObserverBinding;
975*8975f5c5SAndroid Build Coastguard Worker     std::vector<angle::ObserverBinding> mUniformBufferObserverBindings;
976*8975f5c5SAndroid Build Coastguard Worker     std::vector<angle::ObserverBinding> mAtomicCounterBufferObserverBindings;
977*8975f5c5SAndroid Build Coastguard Worker     std::vector<angle::ObserverBinding> mShaderStorageBufferObserverBindings;
978*8975f5c5SAndroid Build Coastguard Worker     std::vector<angle::ObserverBinding> mSamplerObserverBindings;
979*8975f5c5SAndroid Build Coastguard Worker     std::vector<angle::ObserverBinding> mImageObserverBindings;
980*8975f5c5SAndroid Build Coastguard Worker 
981*8975f5c5SAndroid Build Coastguard Worker     // Not really a property of context state. The size and contexts change per-api-call.
982*8975f5c5SAndroid Build Coastguard Worker     mutable Optional<angle::ScratchBuffer> mScratchBuffer;
983*8975f5c5SAndroid Build Coastguard Worker     mutable Optional<angle::ScratchBuffer> mZeroFilledBuffer;
984*8975f5c5SAndroid Build Coastguard Worker 
985*8975f5c5SAndroid Build Coastguard Worker     // Note: we use a raw pointer here so we can exclude frame capture sources from the build.
986*8975f5c5SAndroid Build Coastguard Worker     std::unique_ptr<angle::FrameCapture> mFrameCapture;
987*8975f5c5SAndroid Build Coastguard Worker 
988*8975f5c5SAndroid Build Coastguard Worker     // Cache representation of the serialized context string.
989*8975f5c5SAndroid Build Coastguard Worker     mutable std::string mCachedSerializedStateString;
990*8975f5c5SAndroid Build Coastguard Worker 
991*8975f5c5SAndroid Build Coastguard Worker     mutable size_t mRefCount;
992*8975f5c5SAndroid Build Coastguard Worker 
993*8975f5c5SAndroid Build Coastguard Worker     OverlayType mOverlay;
994*8975f5c5SAndroid Build Coastguard Worker 
995*8975f5c5SAndroid Build Coastguard Worker     bool mIsDestroyed;
996*8975f5c5SAndroid Build Coastguard Worker 
997*8975f5c5SAndroid Build Coastguard Worker     std::unique_ptr<Framebuffer> mDefaultFramebuffer;
998*8975f5c5SAndroid Build Coastguard Worker };
999*8975f5c5SAndroid Build Coastguard Worker 
1000*8975f5c5SAndroid Build Coastguard Worker class [[nodiscard]] ScopedContextRef
1001*8975f5c5SAndroid Build Coastguard Worker {
1002*8975f5c5SAndroid Build Coastguard Worker   public:
ScopedContextRef(Context * context)1003*8975f5c5SAndroid Build Coastguard Worker     ScopedContextRef(Context *context) : mContext(context)
1004*8975f5c5SAndroid Build Coastguard Worker     {
1005*8975f5c5SAndroid Build Coastguard Worker         if (mContext)
1006*8975f5c5SAndroid Build Coastguard Worker         {
1007*8975f5c5SAndroid Build Coastguard Worker             mContext->addRef();
1008*8975f5c5SAndroid Build Coastguard Worker         }
1009*8975f5c5SAndroid Build Coastguard Worker     }
~ScopedContextRef()1010*8975f5c5SAndroid Build Coastguard Worker     ~ScopedContextRef()
1011*8975f5c5SAndroid Build Coastguard Worker     {
1012*8975f5c5SAndroid Build Coastguard Worker         if (mContext)
1013*8975f5c5SAndroid Build Coastguard Worker         {
1014*8975f5c5SAndroid Build Coastguard Worker             mContext->release();
1015*8975f5c5SAndroid Build Coastguard Worker         }
1016*8975f5c5SAndroid Build Coastguard Worker     }
1017*8975f5c5SAndroid Build Coastguard Worker 
1018*8975f5c5SAndroid Build Coastguard Worker   private:
1019*8975f5c5SAndroid Build Coastguard Worker     Context *const mContext;
1020*8975f5c5SAndroid Build Coastguard Worker };
1021*8975f5c5SAndroid Build Coastguard Worker 
1022*8975f5c5SAndroid Build Coastguard Worker // Thread-local current valid context bound to the thread.
1023*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_APPLE) || defined(ANGLE_USE_STATIC_THREAD_LOCAL_VARIABLES)
1024*8975f5c5SAndroid Build Coastguard Worker extern Context *GetCurrentValidContextTLS();
1025*8975f5c5SAndroid Build Coastguard Worker extern void SetCurrentValidContextTLS(Context *context);
1026*8975f5c5SAndroid Build Coastguard Worker #else
1027*8975f5c5SAndroid Build Coastguard Worker extern thread_local Context *gCurrentValidContext;
1028*8975f5c5SAndroid Build Coastguard Worker #endif
1029*8975f5c5SAndroid Build Coastguard Worker 
1030*8975f5c5SAndroid Build Coastguard Worker extern void SetCurrentValidContext(Context *context);
1031*8975f5c5SAndroid Build Coastguard Worker 
1032*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
1033*8975f5c5SAndroid Build Coastguard Worker 
1034*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_CONTEXT_H_
1035