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